GSOC 2013 paint
[blender.git] / source / blender / makesdna / DNA_windowmanager_types.h
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version. 
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * The Original Code is Copyright (C) 2007 Blender Foundation.
19  * All rights reserved.
20  *
21  * 
22  * Contributor(s): Blender Foundation
23  *
24  * ***** END GPL LICENSE BLOCK *****
25  */
26
27 /** \file DNA_windowmanager_types.h
28  *  \ingroup DNA
29  */
30
31 #ifndef __DNA_WINDOWMANAGER_TYPES_H__
32 #define __DNA_WINDOWMANAGER_TYPES_H__
33
34 #include "DNA_listBase.h"
35 #include "DNA_vec_types.h"
36
37 #include "DNA_ID.h"
38
39 /* defined here: */
40 struct wmWindowManager;
41 struct wmWindow;
42
43 struct wmEvent;
44 struct wmGesture;
45 struct wmOperatorType;
46 struct wmOperator;
47 struct wmKeyMap;
48 struct wmKeyConfig;
49
50 /* forwards */
51 struct bContext;
52 struct wmLocal;
53 struct bScreen;
54 struct uiBlock;
55 struct wmSubWindow;
56 struct wmTimer;
57 struct StructRNA;
58 struct PointerRNA;
59 struct ReportList;
60 struct Report;
61 struct uiLayout;
62
63 #define OP_MAX_TYPENAME 64
64 #define KMAP_MAX_NAME   64
65
66 /* keep in sync with 'wm_report_items' in wm_rna.c */
67 typedef enum ReportType {
68         RPT_DEBUG                   = (1 << 0),
69         RPT_INFO                    = (1 << 1),
70         RPT_OPERATOR                = (1 << 2),
71         RPT_PROPERTY                = (1 << 3),
72         RPT_WARNING                 = (1 << 4),
73         RPT_ERROR                   = (1 << 5),
74         RPT_ERROR_INVALID_INPUT     = (1 << 6),
75         RPT_ERROR_INVALID_CONTEXT   = (1 << 7),
76         RPT_ERROR_OUT_OF_MEMORY     = (1 << 8),
77 } ReportType;
78
79 #define RPT_DEBUG_ALL       (RPT_DEBUG)
80 #define RPT_INFO_ALL        (RPT_INFO)
81 #define RPT_OPERATOR_ALL    (RPT_OPERATOR)
82 #define RPT_PROPERTY_ALL    (RPT_PROPERTY)
83 #define RPT_WARNING_ALL     (RPT_WARNING)
84 #define RPT_ERROR_ALL       (RPT_ERROR|RPT_ERROR_INVALID_INPUT|RPT_ERROR_INVALID_CONTEXT|RPT_ERROR_OUT_OF_MEMORY)
85
86 enum ReportListFlags {
87         RPT_PRINT   = (1 << 0),
88         RPT_STORE   = (1 << 1),
89         RPT_FREE    = (1 << 2),
90         RPT_OP_HOLD = (1 << 3), /* don't move them into the operator global list (caller will use) */
91 };
92
93 /* These two Lines with # tell makesdna this struct can be excluded. */
94 #
95 #
96 typedef struct Report {
97         struct Report *next, *prev;
98         short type;  /* ReportType */
99         short flag;
100         int len;  /* strlen(message), saves some time calculating the word wrap  */
101         const char *typestr;
102         const char *message;
103 } Report;
104
105 /* saved in the wm, don't remove */
106 typedef struct ReportList {
107         ListBase list;
108         int printlevel;  /* ReportType */
109         int storelevel;  /* ReportType */
110         int flag, pad;
111         struct wmTimer *reporttimer;
112 } ReportList;
113
114 /* timer customdata to control reports display */
115 /* These two Lines with # tell makesdna this struct can be excluded. */
116 #
117 #
118 typedef struct ReportTimerInfo {
119         float col[3];
120         float grayscale;
121         float widthfac;
122 } ReportTimerInfo;
123
124 /* reports need to be before wmWindowManager */
125
126
127 /* windowmanager is saved, tag WMAN */
128 typedef struct wmWindowManager {
129         ID id;
130
131         struct wmWindow *windrawable, *winactive;  /* separate active from drawable */
132         ListBase windows;
133
134         int initialized;                  /* set on file read */
135         short file_saved;                 /* indicator whether data was saved */
136         short op_undo_depth;              /* operator stack depth to avoid nested undo pushes */
137
138         ListBase operators;               /* operator registry */
139
140         ListBase queue;                   /* refresh/redraw wmNotifier structs */
141
142         struct ReportList reports;        /* information and error reports */
143
144         ListBase jobs;                    /* threaded jobs manager */
145
146         ListBase paintcursors;            /* extra overlay cursors to draw, like circles */
147
148         ListBase drags;                   /* active dragged items */
149
150         ListBase keyconfigs;              /* known key configurations */
151         struct wmKeyConfig *defaultconf;  /* default configuration */
152         struct wmKeyConfig *addonconf;    /* addon configuration */
153         struct wmKeyConfig *userconf;     /* user configuration */
154
155         ListBase timers;                  /* active timers */
156         struct wmTimer *autosavetimer;    /* timer for auto save */
157
158         char is_interface_locked;               /* indicates whether interface is locked for user interaction */
159         char par[7];
160 } wmWindowManager;
161
162 /* wmWindowManager.initialized */
163 enum {
164         WM_INIT_WINDOW = (1<<0),
165         WM_INIT_KEYMAP = (1<<1),
166 };
167
168 /* the savable part, rest of data is local in ghostwinlay */
169 typedef struct wmWindow {
170         struct wmWindow *next, *prev;
171
172         void *ghostwin;             /* don't want to include ghost.h stuff */
173
174         int winid;                  /* winid also in screens, is for retrieving this window after read */
175
176         short grabcursor;           /* cursor grab mode */
177         short pad;
178
179         struct bScreen *screen;     /* active screen */
180         struct bScreen *newscreen;  /* temporary when switching */
181         char screenname[64];        /* MAX_ID_NAME for matching window with active screen after file read */
182
183         short posx, posy, sizex, sizey;  /* window coords */
184         short windowstate;  /* borderless, full */
185         short monitor;      /* multiscreen... no idea how to store yet */
186         short active;       /* set to 1 if an active window, for quick rejects */
187         short cursor;       /* current mouse cursor type */
188         short lastcursor;   /* previous cursor when setting modal one */
189         short modalcursor;  /* the current modal cursor */
190         short addmousemove; /* internal: tag this for extra mousemove event, makes cursors/buttons active on UI switching */
191         short pad2;
192
193         struct wmEvent *eventstate;   /* storage for event system */
194
195         struct wmSubWindow *curswin;  /* internal for wm_subwindow.c only */
196
197         struct wmGesture *tweak;      /* internal for wm_operators.c */
198
199         int drawmethod, drawfail;     /* internal for wm_draw.c only */
200         void *drawdata;               /* internal for wm_draw.c only */
201
202         ListBase queue;               /* all events (ghost level events were handled) */
203         ListBase handlers;            /* window+screen handlers, handled last */
204         ListBase modalhandlers;       /* priority handlers, handled first */
205
206         ListBase subwindows;          /* opengl stuff for sub windows, see notes in wm_subwindow.c */
207         ListBase gesture;             /* gesture stuff */
208 } wmWindow;
209
210 /* These two Lines with # tell makesdna this struct can be excluded. */
211 /* should be something like DNA_EXCLUDE 
212  * but the preprocessor first removes all comments, spaces etc */
213 #
214 #
215 typedef struct wmOperatorTypeMacro {
216         struct wmOperatorTypeMacro *next, *prev;
217
218         /* operator id */
219         char idname[64];
220         /* rna pointer to access properties, like keymap */
221         struct IDProperty *properties;  /* operator properties, assigned to ptr->data and can be written to a file */
222         struct PointerRNA *ptr;
223 } wmOperatorTypeMacro;
224
225 /* partial copy of the event, for matching by eventhandler */
226 typedef struct wmKeyMapItem {
227         struct wmKeyMapItem *next, *prev;
228
229         /* operator */
230         char idname[64];                /* used to retrieve operator type pointer */
231         IDProperty *properties;         /* operator properties, assigned to ptr->data and can be written to a file */
232
233         /* modal */
234         char propvalue_str[64];         /* runtime temporary storage for loading */
235         short propvalue;                /* if used, the item is from modal map */
236
237         /* event */
238         short type;                     /* event code itself */
239         short val;                      /* KM_ANY, KM_PRESS, KM_NOTHING etc */
240         short shift, ctrl, alt, oskey;  /* oskey is apple or windowskey, value denotes order of pressed */
241         short keymodifier;              /* rawkey modifier */
242
243         /* flag: inactive, expanded */
244         short flag;
245
246         /* runtime */
247         short maptype;                  /* keymap editor */
248         short id;                       /* unique identifier. Positive for kmi that override builtins, negative otherwise */
249         short pad;
250         struct PointerRNA *ptr;         /* rna pointer to access properties */
251 } wmKeyMapItem;
252
253 /* used instead of wmKeyMapItem for diff keymaps */
254 typedef struct wmKeyMapDiffItem {
255         struct wmKeyMapDiffItem *next, *prev;
256
257         wmKeyMapItem *remove_item;
258         wmKeyMapItem *add_item;
259 } wmKeyMapDiffItem;
260
261 /* wmKeyMapItem.flag */
262 enum {
263         KMI_INACTIVE       = (1 << 0),
264         KMI_EXPANDED       = (1 << 1),
265         KMI_USER_MODIFIED  = (1 << 2),
266         KMI_UPDATE         = (1 << 3),
267 };
268
269 /* wmKeyMapItem.maptype */
270 enum {
271         KMI_TYPE_KEYBOARD   = 0,
272         KMI_TYPE_MOUSE      = 1,
273         KMI_TYPE_TWEAK      = 2,
274         KMI_TYPE_TEXTINPUT  = 3,
275         KMI_TYPE_TIMER      = 4,
276         KMI_TYPE_NDOF       = 5,
277 };
278
279 /* stored in WM, the actively used keymaps */
280 typedef struct wmKeyMap {
281         struct wmKeyMap *next, *prev;
282
283         ListBase items;
284         ListBase diff_items;
285
286         char idname[64];  /* global editor keymaps, or for more per space/region */
287         short spaceid;    /* same IDs as in DNA_space_types.h */
288         short regionid;   /* see above */
289
290         short flag;       /* general flags */
291         short kmi_id;     /* last kmi id */
292
293         /* runtime */
294         int (*poll)(struct bContext *);  /* verify if enabled in the current context */
295         void *modal_items;               /* for modal, EnumPropertyItem for now */
296 } wmKeyMap;
297
298 /* wmKeyMap.flag */
299 enum {
300         KEYMAP_MODAL              = (1 << 0),  /* modal map, not using operatornames */
301         KEYMAP_USER               = (1 << 1),  /* user keymap */
302         KEYMAP_EXPANDED           = (1 << 2),
303         KEYMAP_CHILDREN_EXPANDED  = (1 << 3),
304         KEYMAP_DIFF               = (1 << 4),  /* diff keymap for user preferences */
305         KEYMAP_USER_MODIFIED      = (1 << 5),  /* keymap has user modifications */
306         KEYMAP_UPDATE             = (1 << 6),
307 };
308
309 typedef struct wmKeyConfig {
310         struct wmKeyConfig *next, *prev;
311
312         char idname[64];    /* unique name */
313         char basename[64];  /* idname of configuration this is derives from, "" if none */
314
315         ListBase keymaps;
316         int actkeymap, flag;
317 } wmKeyConfig;
318
319 /* wmKeyConfig.flag */
320 enum {
321         KEYCONF_USER          = (1 << 1),  /* And what about (1 << 0)? */
322         KEYCONF_INIT_DEFAULT  = (1 << 2),
323 };
324
325 /* this one is the operator itself, stored in files for macros etc */
326 /* operator + operatortype should be able to redo entirely, but for different contextes */
327 typedef struct wmOperator {
328         struct wmOperator *next, *prev;
329
330         /* saved */
331         char idname[64];              /* used to retrieve type pointer */
332         IDProperty *properties;       /* saved, user-settable properties */
333
334         /* runtime */
335         struct wmOperatorType *type;  /* operator type definition from idname */
336         void *customdata;             /* custom storage, only while operator runs */
337         void *py_instance;            /* python stores the class instance here */
338
339         struct PointerRNA *ptr;       /* rna pointer to access properties */
340         struct ReportList *reports;   /* errors and warnings storage */
341
342         ListBase macro;               /* list of operators, can be a tree */
343         struct wmOperator *opm;       /* current running macro, not saved */
344         struct uiLayout *layout;      /* runtime for drawing */
345         short flag, pad[3];
346
347 } wmOperator;
348
349 /* operator type return flags: exec(), invoke() modal(), return values */
350 enum {
351         OPERATOR_RUNNING_MODAL  = (1 << 0),
352         OPERATOR_CANCELLED      = (1 << 1),
353         OPERATOR_FINISHED       = (1 << 2),
354 /* add this flag if the event should pass through */
355         OPERATOR_PASS_THROUGH   = (1 << 3),
356 /* in case operator got executed outside WM code... like via fileselect */
357         OPERATOR_HANDLED        = (1 << 4),
358 };
359 #define OPERATOR_FLAGS_ALL    (OPERATOR_RUNNING_MODAL | OPERATOR_CANCELLED | OPERATOR_FINISHED | \
360                                OPERATOR_PASS_THROUGH | OPERATOR_HANDLED)
361
362 /* sanity checks for debug mode only */
363 #define OPERATOR_RETVAL_CHECK(ret) (void)ret, BLI_assert(ret != 0 && (ret & OPERATOR_FLAGS_ALL) == ret)
364
365 /* wmOperator flag */
366 enum {
367         OP_GRAB_POINTER    = (1 << 0),
368         /* low level flag so exec() operators can tell if they were invoked, use with care.
369          * typically this shouldn't make any difference, but it rare cases its needed (see smooth-view) */
370         OP_IS_INVOKE       = (1 << 1),
371 };
372
373 #endif /* __DNA_WINDOWMANAGER_TYPES_H__ */