9ec34ac38233591214fe6d60de0259d4b0ef6a7e
[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 #include "DNA_userdef_types.h"
37
38 #include "DNA_ID.h"
39
40 /* defined here: */
41 struct wmWindowManager;
42 struct wmWindow;
43
44 struct wmMsgBus;
45 struct wmEvent;
46 struct wmGesture;
47 struct wmOperatorType;
48 struct wmOperator;
49 struct wmKeyMap;
50 struct wmKeyConfig;
51
52 /* forwards */
53 struct bContext;
54 struct bScreen;
55 struct wmSubWindow;
56 struct wmTimer;
57 struct PointerRNA;
58 struct ReportList;
59 struct Report;
60 struct uiLayout;
61 struct Stereo3dFormat;
62
63 #define OP_MAX_TYPENAME 64
64 #define KMAP_MAX_NAME   64
65
66 /* keep in sync with 'rna_enum_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
161         struct wmMsgBus *message_bus;
162
163 } wmWindowManager;
164
165 /* wmWindowManager.initialized */
166 enum {
167         WM_WINDOW_IS_INITIALIZED = (1<<0),
168         WM_KEYMAP_IS_INITIALIZED = (1<<1),
169 };
170
171 /* IME is win32 only! */
172 #ifndef WIN32
173 #  ifdef __GNUC__
174 #    define ime_data ime_data __attribute__ ((deprecated))
175 #  endif
176 #endif
177
178 /* the savable part, rest of data is local in ghostwinlay */
179 typedef struct wmWindow {
180         struct wmWindow *next, *prev;
181
182         void *ghostwin;             /* don't want to include ghost.h stuff */
183
184         struct Scene *scene;     /* The scene displayed in this window. */
185         struct Scene *new_scene; /* temporary when switching */
186
187         struct WorkSpaceInstanceHook *workspace_hook;
188
189         struct bScreen *screen DNA_DEPRECATED;
190
191         short posx, posy, sizex, sizey;  /* window coords */
192         short windowstate;  /* borderless, full */
193         short monitor;      /* multiscreen... no idea how to store yet */
194         short active;       /* set to 1 if an active window, for quick rejects */
195         short cursor;       /* current mouse cursor type */
196         short lastcursor;   /* previous cursor when setting modal one */
197         short modalcursor;  /* the current modal cursor */
198         short grabcursor;           /* cursor grab mode */
199         short addmousemove; /* internal: tag this for extra mousemove event, makes cursors/buttons active on UI switching */
200         short multisamples; /* amount of samples for OpenGL FSA the ghost window was created with, if zero no FSA */
201         short pad[3];
202
203         int winid;                  /* winid also in screens, is for retrieving this window after read */
204
205         short lock_pie_event;      /* internal, lock pie creation from this event until released */
206         short last_pie_event;      /* exception to the above rule for nested pies, store last pie event for operators
207                                     * that spawn a new pie right after destruction of last pie */
208
209         struct wmEvent *eventstate;   /* storage for event system */
210
211         struct wmSubWindow *curswin;  /* internal for wm_subwindow.c only */
212
213         struct wmGesture *tweak;      /* internal for wm_operators.c */
214
215         /* Input Method Editor data - complex character input (esp. for asian character input)
216          * Currently WIN32, runtime-only data */
217         struct wmIMEData *ime_data;
218
219         int drawmethod, drawfail;     /* internal for wm_draw.c only */
220         ListBase drawdata;            /* internal for wm_draw.c only */
221
222         ListBase queue;               /* all events (ghost level events were handled) */
223         ListBase handlers;            /* window+screen handlers, handled last */
224         ListBase modalhandlers;       /* priority handlers, handled first */
225
226         ListBase subwindows;          /* opengl stuff for sub windows, see notes in wm_subwindow.c */
227         ListBase gesture;             /* gesture stuff */
228
229         struct Stereo3dFormat *stereo3d_format; /* properties for stereoscopic displays */
230
231         /* custom drawing callbacks */
232         ListBase drawcalls;
233 } wmWindow;
234
235 #ifdef ime_data
236 #  undef ime_data
237 #endif
238
239 /* These two Lines with # tell makesdna this struct can be excluded. */
240 /* should be something like DNA_EXCLUDE 
241  * but the preprocessor first removes all comments, spaces etc */
242 #
243 #
244 typedef struct wmOperatorTypeMacro {
245         struct wmOperatorTypeMacro *next, *prev;
246
247         /* operator id */
248         char idname[64];
249         /* rna pointer to access properties, like keymap */
250         struct IDProperty *properties;  /* operator properties, assigned to ptr->data and can be written to a file */
251         struct PointerRNA *ptr;
252 } wmOperatorTypeMacro;
253
254 /* partial copy of the event, for matching by eventhandler */
255 typedef struct wmKeyMapItem {
256         struct wmKeyMapItem *next, *prev;
257
258         /* operator */
259         char idname[64];                /* used to retrieve operator type pointer */
260         IDProperty *properties;         /* operator properties, assigned to ptr->data and can be written to a file */
261
262         /* modal */
263         char propvalue_str[64];         /* runtime temporary storage for loading */
264         short propvalue;                /* if used, the item is from modal map */
265
266         /* event */
267         short type;                     /* event code itself */
268         short val;                      /* KM_ANY, KM_PRESS, KM_NOTHING etc */
269         short shift, ctrl, alt, oskey;  /* oskey is apple or windowskey, value denotes order of pressed */
270         short keymodifier;              /* rawkey modifier */
271
272         /* flag: inactive, expanded */
273         short flag;
274
275         /* runtime */
276         short maptype;                  /* keymap editor */
277         short id;                       /* unique identifier. Positive for kmi that override builtins, negative otherwise */
278         short pad;
279         struct PointerRNA *ptr;         /* rna pointer to access properties */
280 } wmKeyMapItem;
281
282 /* used instead of wmKeyMapItem for diff keymaps */
283 typedef struct wmKeyMapDiffItem {
284         struct wmKeyMapDiffItem *next, *prev;
285
286         wmKeyMapItem *remove_item;
287         wmKeyMapItem *add_item;
288 } wmKeyMapDiffItem;
289
290 /* wmKeyMapItem.flag */
291 enum {
292         KMI_INACTIVE       = (1 << 0),
293         KMI_EXPANDED       = (1 << 1),
294         KMI_USER_MODIFIED  = (1 << 2),
295         KMI_UPDATE         = (1 << 3),
296 };
297
298 /* wmKeyMapItem.maptype */
299 enum {
300         KMI_TYPE_KEYBOARD   = 0,
301         KMI_TYPE_MOUSE      = 1,
302         KMI_TYPE_TWEAK      = 2,
303         KMI_TYPE_TEXTINPUT  = 3,
304         KMI_TYPE_TIMER      = 4,
305         KMI_TYPE_NDOF       = 5,
306 };
307
308 /* stored in WM, the actively used keymaps */
309 typedef struct wmKeyMap {
310         struct wmKeyMap *next, *prev;
311
312         ListBase items;
313         ListBase diff_items;
314
315         char idname[64];  /* global editor keymaps, or for more per space/region */
316         short spaceid;    /* same IDs as in DNA_space_types.h */
317         short regionid;   /* see above */
318
319         short flag;       /* general flags */
320         short kmi_id;     /* last kmi id */
321
322         /* runtime */
323         int (*poll)(struct bContext *);  /* verify if enabled in the current context */
324         const void *modal_items;         /* for modal, EnumPropertyItem for now */
325 } wmKeyMap;
326
327 /* wmKeyMap.flag */
328 enum {
329         KEYMAP_MODAL              = (1 << 0),  /* modal map, not using operatornames */
330         KEYMAP_USER               = (1 << 1),  /* user keymap */
331         KEYMAP_EXPANDED           = (1 << 2),
332         KEYMAP_CHILDREN_EXPANDED  = (1 << 3),
333         KEYMAP_DIFF               = (1 << 4),  /* diff keymap for user preferences */
334         KEYMAP_USER_MODIFIED      = (1 << 5),  /* keymap has user modifications */
335         KEYMAP_UPDATE             = (1 << 6),
336 };
337
338 typedef struct wmKeyConfig {
339         struct wmKeyConfig *next, *prev;
340
341         char idname[64];    /* unique name */
342         char basename[64];  /* idname of configuration this is derives from, "" if none */
343
344         ListBase keymaps;
345         int actkeymap, flag;
346 } wmKeyConfig;
347
348 /* wmKeyConfig.flag */
349 enum {
350         KEYCONF_USER          = (1 << 1),  /* And what about (1 << 0)? */
351         KEYCONF_INIT_DEFAULT  = (1 << 2),
352 };
353
354 /* this one is the operator itself, stored in files for macros etc */
355 /* operator + operatortype should be able to redo entirely, but for different contextes */
356 typedef struct wmOperator {
357         struct wmOperator *next, *prev;
358
359         /* saved */
360         char idname[64];              /* used to retrieve type pointer */
361         IDProperty *properties;       /* saved, user-settable properties */
362
363         /* runtime */
364         struct wmOperatorType *type;  /* operator type definition from idname */
365         void *customdata;             /* custom storage, only while operator runs */
366         void *py_instance;            /* python stores the class instance here */
367
368         struct PointerRNA *ptr;       /* rna pointer to access properties */
369         struct ReportList *reports;   /* errors and warnings storage */
370
371         ListBase macro;               /* list of operators, can be a tree */
372         struct wmOperator *opm;       /* current running macro, not saved */
373         struct uiLayout *layout;      /* runtime for drawing */
374         short flag, pad[3];
375
376 } wmOperator;
377
378 /* operator type return flags: exec(), invoke() modal(), return values */
379 enum {
380         OPERATOR_RUNNING_MODAL  = (1 << 0),
381         OPERATOR_CANCELLED      = (1 << 1),
382         OPERATOR_FINISHED       = (1 << 2),
383         /* add this flag if the event should pass through */
384         OPERATOR_PASS_THROUGH   = (1 << 3),
385         /* in case operator got executed outside WM code... like via fileselect */
386         OPERATOR_HANDLED        = (1 << 4),
387         /* used for operators that act indirectly (eg. popup menu)
388          * note: this isn't great design (using operators to trigger UI) avoid where possible. */
389         OPERATOR_INTERFACE      = (1 << 5),
390 };
391 #define OPERATOR_FLAGS_ALL ( \
392         OPERATOR_RUNNING_MODAL | \
393         OPERATOR_CANCELLED | \
394         OPERATOR_FINISHED | \
395         OPERATOR_PASS_THROUGH | \
396         OPERATOR_HANDLED | \
397         OPERATOR_INTERFACE | \
398         0)
399
400 /* sanity checks for debug mode only */
401 #define OPERATOR_RETVAL_CHECK(ret) (void)ret, BLI_assert(ret != 0 && (ret & OPERATOR_FLAGS_ALL) == ret)
402
403 /* wmOperator flag */
404 enum {
405         /* low level flag so exec() operators can tell if they were invoked, use with care.
406          * typically this shouldn't make any difference, but it rare cases its needed (see smooth-view) */
407         OP_IS_INVOKE = (1 << 0),
408         /* So we can detect if an operators exec() call is activated from an interactive repeat. */
409         OP_IS_REPEAT = (1 << 1),
410
411         /* When the cursor is grabbed */
412         OP_IS_MODAL_GRAB_CURSOR    = (1 << 2),
413
414         /* allow modal operators to have the region under the cursor for their context
415          * (the regiontype is maintained to prevent errors) */
416         OP_IS_MODAL_CURSOR_REGION = (1 << 3),
417 };
418
419 #endif /* __DNA_WINDOWMANAGER_TYPES_H__ */