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