Merge of itasc branch. Project files, scons and cmake should be working. Makefile...
[blender.git] / source / blender / makesdna / DNA_windowmanager_types.h
1 /**
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version. 
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19  *
20  * The Original Code is Copyright (C) 2007 Blender Foundation.
21  * All rights reserved.
22  *
23  * 
24  * Contributor(s): Blender Foundation
25  *
26  * ***** END GPL LICENSE BLOCK *****
27  */
28 #ifndef DNA_WINDOWMANAGER_TYPES_H
29 #define DNA_WINDOWMANAGER_TYPES_H
30
31 #include "DNA_listBase.h"
32 #include "DNA_vec_types.h"
33
34 #include "DNA_ID.h"
35
36 /* defined here: */
37 struct wmWindowManager;
38 struct wmWindow;
39
40 struct wmEvent;
41 struct wmGesture;
42 struct wmOperatorType;
43 struct wmOperator;
44 struct wmKeyMap;
45
46 /* forwards */
47 struct bContext;
48 struct wmLocal;
49 struct bScreen;
50 struct uiBlock;
51 struct wmSubWindow;
52 struct wmTimer;
53 struct StructRNA;
54 struct PointerRNA;
55 struct ReportList;
56 struct Report;
57 struct uiLayout;
58
59 #define OP_MAX_TYPENAME 64
60 #define KMAP_MAX_NAME   64
61
62
63 typedef enum ReportType {
64         RPT_DEBUG                                       = 1<<0,
65         RPT_INFO                                        = 1<<1,
66         RPT_OPERATOR                            = 1<<2,
67         RPT_WARNING                                     = 1<<3,
68         RPT_ERROR                                       = 1<<4,
69         RPT_ERROR_INVALID_INPUT         = 1<<5,
70         RPT_ERROR_INVALID_CONTEXT       = 1<<6,
71         RPT_ERROR_OUT_OF_MEMORY         = 1<<7
72 } ReportType;
73
74 #define RPT_DEBUG_ALL           (RPT_DEBUG)
75 #define RPT_INFO_ALL            (RPT_INFO)
76 #define RPT_OPERATOR_ALL        (RPT_OPERATOR)
77 #define RPT_WARNING_ALL         (RPT_WARNING)
78 #define RPT_ERROR_ALL           (RPT_ERROR|RPT_ERROR_INVALID_INPUT|RPT_ERROR_INVALID_CONTEXT|RPT_ERROR_OUT_OF_MEMORY)
79
80 enum ReportListFlags {
81         RPT_PRINT = 1,
82         RPT_STORE = 2,
83         RPT_FREE = 4,
84 };
85 typedef struct Report {
86         struct Report *next, *prev;
87         short type; /* ReportType */
88         short flag;
89         int len; /* strlen(message), saves some time calculating the word wrap  */
90         char *typestr;
91         char *message;
92 } Report;
93 typedef struct ReportList {
94         ListBase list;
95         int printlevel; /* ReportType */
96         int storelevel; /* ReportType */
97         int flag, pad;
98 } ReportList;
99 /* reports need to be before wmWindowManager */
100
101
102 /* windowmanager is saved, tag WMAN */
103 typedef struct wmWindowManager {
104         ID id;
105         
106         struct wmWindow *windrawable, *winactive;               /* separate active from drawable */
107         ListBase windows;
108         
109         int initialized;                /* set on file read */
110         short file_saved;               /* indicator whether data was saved */
111         short pad;
112         
113         ListBase operators;             /* operator registry */
114         
115         ListBase queue;                 /* refresh/redraw wmNotifier structs */
116         
117         struct ReportList reports;      /* information and error reports */
118         
119         ListBase jobs;                  /* threaded jobs manager */
120         
121         ListBase paintcursors;  /* extra overlay cursors to draw, like circles */
122         
123         /* used keymaps, optionally/partially saved */
124         ListBase keymaps;
125         
126 } wmWindowManager;
127
128 /* wmWindowManager.initialized */
129 #define WM_INIT_WINDOW          1<<0
130 #define WM_INIT_KEYMAP          1<<1
131
132 /* the savable part, rest of data is local in ghostwinlay */
133 typedef struct wmWindow {
134         struct wmWindow *next, *prev;
135         
136         void *ghostwin;         /* dont want to include ghost.h stuff */
137         
138         int winid, pad;         /* winid also in screens, is for retrieving this window after read */
139         
140         struct bScreen *screen;         /* active screen */
141         struct bScreen *newscreen;      /* temporary when switching */
142         char screenname[32];    /* MAX_ID_NAME for matching window with active screen after file read */
143         
144         short posx, posy, sizex, sizey; /* window coords */
145         short windowstate;      /* borderless, full */
146         short monitor;          /* multiscreen... no idea how to store yet */
147         short active;           /* set to 1 if an active window, for quick rejects */
148         short cursor;           /* current mouse cursor type */
149         short lastcursor;       /* for temp waitcursor */
150         short addmousemove;     /* internal: tag this for extra mousemove event, makes cursors/buttons active on UI switching */
151         int pad3;
152         
153         struct wmEvent *eventstate;     /* storage for event system */
154         
155         struct wmSubWindow *curswin;    /* internal for wm_subwindow.c only */
156
157         struct wmGesture *tweak;        /* internal for wm_operators.c */
158         
159         int drawmethod, drawfail;       /* internal for wm_draw.c only */
160         void *drawdata;                         /* internal for wm_draw.c only */
161         
162         ListBase timers;
163         
164         ListBase queue;                         /* all events (ghost level events were handled) */
165         ListBase handlers;                      /* window+screen handlers, handled last */
166         ListBase modalhandlers;         /* priority handlers, handled first */
167         
168         ListBase subwindows;    /* opengl stuff for sub windows, see notes in wm_subwindow.c */
169         ListBase gesture;               /* gesture stuff */
170 } wmWindow;
171
172 /* should be somthing like DNA_EXCLUDE 
173  * but the preprocessor first removes all comments, spaces etc */
174
175 #
176 #
177 typedef struct wmOperatorTypeMacro {
178         struct wmOperatorTypeMacro *next, *prev;
179         
180         /* operator id */
181         char idname[MAX_ID_NAME];
182         /* rna pointer to access properties, like keymap */
183         struct PointerRNA *ptr; 
184
185 } wmOperatorTypeMacro;
186
187 #
188 #
189 typedef struct wmOperatorType {
190         struct wmOperatorType *next, *prev;
191         
192         char *name;             /* text for ui, undo */
193         char *idname;           /* unique identifier */
194         char *description;      /* tooltips and python docs */
195         
196         /* this callback executes the operator without any interactive input,
197          * parameters may be provided through operator properties. cannot use
198          * any interface code or input device state.
199          * - see defines below for return values */
200         int (*exec)(struct bContext *, struct wmOperator *);
201
202         /* for modal temporary operators, initially invoke is called. then
203          * any further events are handled in modal. if the operation is
204          * cancelled due to some external reason, cancel is called
205          * - see defines below for return values */
206         int (*invoke)(struct bContext *, struct wmOperator *, struct wmEvent *);
207         int (*cancel)(struct bContext *, struct wmOperator *);
208         int (*modal)(struct bContext *, struct wmOperator *, struct wmEvent *);
209
210         /* verify if the operator can be executed in the current context, note
211          * that the operator might still fail to execute even if this return true */
212         int (*poll)(struct bContext *);
213         
214         /* optional panel for redo and repeat, autogenerated if not set */
215         void (*ui)(struct bContext *, struct PointerRNA *, struct uiLayout *);
216         
217         /* rna for properties */
218         struct StructRNA *srna;
219         
220         /* struct wmOperatorTypeMacro */
221         ListBase macro;
222         
223         short flag;
224         
225         /* pointer to modal keymap, do not free! */
226         struct wmKeyMap *modalkeymap;
227         
228         /* only used for operators defined with python
229          * use to store pointers to python functions */
230         void *pyop_data;
231         int (*pyop_poll)(struct bContext *, struct wmOperatorType *ot);
232
233 } wmOperatorType;
234
235
236 /* partial copy of the event, for matching by eventhandler */
237 typedef struct wmKeymapItem {
238         struct wmKeymapItem *next, *prev;
239         
240         char idname[64];                                /* used to retrieve operator type pointer */
241         struct PointerRNA *ptr;                 /* rna pointer to access properties */
242         
243         short type;                                             /* event code itself */
244         short val;                                              /* 0=any, 1=click, 2=release, or wheelvalue, or... */
245         short shift, ctrl, alt, oskey;  /* oskey is apple or windowskey, value denotes order of pressed */
246         short keymodifier;                              /* rawkey modifier */
247         
248         short propvalue;                                /* if used, the item is from modal map */
249         
250         short inactive;                                 /* if set, deactivated item */
251         short maptype;                                          /* keymap editor */
252         short pad2, pad3;
253 } wmKeymapItem;
254
255
256 /* stored in WM, the actively used keymaps */
257 typedef struct wmKeyMap {
258         struct wmKeyMap *next, *prev;
259         
260         ListBase keymap;
261         
262         char nameid[64];        /* global editor keymaps, or for more per space/region */
263         short spaceid;          /* same IDs as in DNA_space_types.h */
264         short regionid;         /* see above */
265         
266         short is_modal;         /* modal map, not using operatornames */
267         short pad;
268         
269         void *items;            /* struct EnumPropertyItem for now */
270
271         /* verify if the keymap is enabled in the current context */
272         int (*poll)(struct bContext *);
273 } wmKeyMap;
274
275
276 /* this one is the operator itself, stored in files for macros etc */
277 /* operator + operatortype should be able to redo entirely, but for different contextes */
278 typedef struct wmOperator {
279         struct wmOperator *next, *prev;
280
281         /* saved */
282         char idname[64];                        /* used to retrieve type pointer */
283         IDProperty *properties;         /* saved, user-settable properties */
284         
285         /* runtime */
286         wmOperatorType *type;           /* operator type definition from idname */
287         void *customdata;                       /* custom storage, only while operator runs */
288         
289         struct PointerRNA *ptr;         /* rna pointer to access properties */
290         struct ReportList *reports;     /* errors and warnings storage */
291         
292         ListBase macro;                         /* list of operators, can be a tree */
293         struct wmOperator *opm;         /* current running macro, not saved */
294         short flag, pad[3];
295         
296 } wmOperator;
297
298 /* operator type exec(), invoke() modal(), return values */
299 #define OPERATOR_RUNNING_MODAL  1
300 #define OPERATOR_CANCELLED              2
301 #define OPERATOR_FINISHED               4
302 /* add this flag if the event should pass through */
303 #define OPERATOR_PASS_THROUGH   8
304
305 /* wmOperator flag */
306
307
308 /* ************** wmEvent ************************ */
309 /* for read-only rna access, dont save this */
310
311 /* each event should have full modifier state */
312 /* event comes from eventmanager and from keymap */
313 typedef struct wmEvent {
314         struct wmEvent *next, *prev;
315         
316         short type;                     /* event code itself (short, is also in keymap) */
317         short val;                      /* press, release, scrollvalue */
318         short x, y;                     /* mouse pointer position, screen coord */
319         short mval[2];          /* region mouse position, name convention pre 2.5 :) */
320         short prevx, prevy;     /* previous mouse pointer position */
321         short unicode;          /* future, ghost? */
322         char ascii;                     /* from ghost */
323         char pad;
324         
325         /* modifier states */
326         short shift, ctrl, alt, oskey;  /* oskey is apple or windowskey, value denotes order of pressed */
327         short keymodifier;                              /* rawkey modifier */
328         
329         short pad1;
330         
331         /* keymap item, set by handler (weak?) */
332         const char *keymap_idname;
333         
334         /* custom data */
335         short custom;           /* custom data type, stylus, 6dof, see wm_event_types.h */
336         short customdatafree;
337         int pad2;
338         void *customdata;       /* ascii, unicode, mouse coords, angles, vectors, dragdrop info */
339         
340 } wmEvent;
341
342 typedef enum wmRadialControlMode {
343         WM_RADIALCONTROL_SIZE,
344         WM_RADIALCONTROL_STRENGTH,
345         WM_RADIALCONTROL_ANGLE
346 } wmRadialControlMode;
347
348 #endif /* DNA_WINDOWMANAGER_TYPES_H */
349