msvc: Use debug versions of tbb malloc for debug builds
[blender.git] / source / blender / makesdna / DNA_windowmanager_types.h
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  *
16  * The Original Code is Copyright (C) 2007 Blender Foundation.
17  * All rights reserved.
18  */
19
20 /** \file
21  * \ingroup DNA
22  */
23
24 #ifndef __DNA_WINDOWMANAGER_TYPES_H__
25 #define __DNA_WINDOWMANAGER_TYPES_H__
26
27 #include "DNA_listBase.h"
28 #include "DNA_screen_types.h"
29 #include "DNA_vec_types.h"
30 #include "DNA_userdef_types.h"
31
32 #include "DNA_ID.h"
33
34 /* defined here: */
35 struct wmWindow;
36 struct wmWindowManager;
37
38 struct wmEvent;
39 struct wmGesture;
40 struct wmKeyConfig;
41 struct wmKeyMap;
42 struct wmMsgBus;
43 struct wmOperator;
44 struct wmOperatorType;
45
46 /* forwards */
47 struct PointerRNA;
48 struct Report;
49 struct ReportList;
50 struct Stereo3dFormat;
51 struct bContext;
52 struct bScreen;
53 struct uiLayout;
54 struct wmTimer;
55
56 #define OP_MAX_TYPENAME 64
57 #define KMAP_MAX_NAME 64
58
59 /* keep in sync with 'rna_enum_wm_report_items' in wm_rna.c */
60 typedef enum ReportType {
61   RPT_DEBUG = (1 << 0),
62   RPT_INFO = (1 << 1),
63   RPT_OPERATOR = (1 << 2),
64   RPT_PROPERTY = (1 << 3),
65   RPT_WARNING = (1 << 4),
66   RPT_ERROR = (1 << 5),
67   RPT_ERROR_INVALID_INPUT = (1 << 6),
68   RPT_ERROR_INVALID_CONTEXT = (1 << 7),
69   RPT_ERROR_OUT_OF_MEMORY = (1 << 8),
70 } ReportType;
71
72 #define RPT_DEBUG_ALL (RPT_DEBUG)
73 #define RPT_INFO_ALL (RPT_INFO)
74 #define RPT_OPERATOR_ALL (RPT_OPERATOR)
75 #define RPT_PROPERTY_ALL (RPT_PROPERTY)
76 #define RPT_WARNING_ALL (RPT_WARNING)
77 #define RPT_ERROR_ALL \
78   (RPT_ERROR | RPT_ERROR_INVALID_INPUT | RPT_ERROR_INVALID_CONTEXT | RPT_ERROR_OUT_OF_MEMORY)
79
80 enum ReportListFlags {
81   RPT_PRINT = (1 << 0),
82   RPT_STORE = (1 << 1),
83   RPT_FREE = (1 << 2),
84   RPT_OP_HOLD = (1 << 3), /* don't move them into the operator global list (caller will use) */
85 };
86
87 /* These two Lines with # tell makesdna this struct can be excluded. */
88 #
89 #
90 typedef struct Report {
91   struct Report *next, *prev;
92   /** ReportType. */
93   short type;
94   short flag;
95   /** `strlen(message)`, saves some time calculating the word wrap . */
96   int len;
97   const char *typestr;
98   const char *message;
99 } Report;
100
101 /* saved in the wm, don't remove */
102 typedef struct ReportList {
103   ListBase list;
104   /** ReportType. */
105   int printlevel;
106   /** ReportType. */
107   int storelevel;
108   int flag;
109   char _pad[4];
110   struct wmTimer *reporttimer;
111 } ReportList;
112
113 /* timer customdata to control reports display */
114 /* These two Lines with # tell makesdna this struct can be excluded. */
115 #
116 #
117 typedef struct ReportTimerInfo {
118   float col[4];
119   float widthfac;
120 } ReportTimerInfo;
121
122 /* reports need to be before wmWindowManager */
123
124 /* windowmanager is saved, tag WMAN */
125 typedef struct wmWindowManager {
126   ID id;
127
128   /** Separate active from drawable. */
129   struct wmWindow *windrawable, *winactive;
130   ListBase windows;
131
132   /** Set on file read. */
133   short initialized;
134   /** Indicator whether data was saved. */
135   short file_saved;
136   /** Operator stack depth to avoid nested undo pushes. */
137   short op_undo_depth;
138
139   /** Set after selection to notify outliner to sync. Stores type of selection */
140   short outliner_sync_select_dirty;
141
142   /** Operator registry. */
143   ListBase operators;
144
145   /** Refresh/redraw wmNotifier structs. */
146   ListBase queue;
147
148   /** Information and error reports. */
149   struct ReportList reports;
150
151   /** Threaded jobs manager. */
152   ListBase jobs;
153
154   /** Extra overlay cursors to draw, like circles. */
155   ListBase paintcursors;
156
157   /** Active dragged items. */
158   ListBase drags;
159
160   /** Known key configurations. */
161   ListBase keyconfigs;
162   /** Default configuration. */
163   struct wmKeyConfig *defaultconf;
164   /** Addon configuration. */
165   struct wmKeyConfig *addonconf;
166   /** User configuration. */
167   struct wmKeyConfig *userconf;
168
169   /** Active timers. */
170   ListBase timers;
171   /** Timer for auto save. */
172   struct wmTimer *autosavetimer;
173
174   /** All undo history (runtime only). */
175   struct UndoStack *undo_stack;
176
177   /** Indicates whether interface is locked for user interaction. */
178   char is_interface_locked;
179   char _pad[7];
180
181   struct wmMsgBus *message_bus;
182
183 } wmWindowManager;
184
185 /* wmWindowManager.initialized */
186 enum {
187   WM_WINDOW_IS_INITIALIZED = (1 << 0),
188   WM_KEYCONFIG_IS_INITIALIZED = (1 << 1),
189 };
190
191 /* wmWindowManager.outliner_sync_select_dirty */
192 enum {
193   WM_OUTLINER_SYNC_SELECT_FROM_OBJECT = (1 << 0),
194   WM_OUTLINER_SYNC_SELECT_FROM_EDIT_BONE = (1 << 1),
195   WM_OUTLINER_SYNC_SELECT_FROM_POSE_BONE = (1 << 2),
196   WM_OUTLINER_SYNC_SELECT_FROM_SEQUENCE = (1 << 3),
197 };
198
199 #define WM_OUTLINER_SYNC_SELECT_FROM_ALL \
200   (WM_OUTLINER_SYNC_SELECT_FROM_OBJECT | WM_OUTLINER_SYNC_SELECT_FROM_EDIT_BONE | \
201    WM_OUTLINER_SYNC_SELECT_FROM_POSE_BONE | WM_OUTLINER_SYNC_SELECT_FROM_SEQUENCE)
202
203 #define WM_KEYCONFIG_STR_DEFAULT "blender"
204
205 /* IME is win32 only! */
206 #if !defined(WIN32) && !defined(DNA_DEPRECATED)
207 #  ifdef __GNUC__
208 #    define ime_data ime_data __attribute__((deprecated))
209 #  endif
210 #endif
211
212 /* the saveable part, rest of data is local in ghostwinlay */
213 typedef struct wmWindow {
214   struct wmWindow *next, *prev;
215
216   /** Don't want to include ghost.h stuff. */
217   void *ghostwin;
218   /** Don't want to include gpu stuff. */
219   void *gpuctx;
220
221   /** Parent window. */
222   struct wmWindow *parent;
223
224   /** Active scene displayed in this window. */
225   struct Scene *scene;
226   /** Temporary when switching. */
227   struct Scene *new_scene;
228   /** Active view layer displayed in this window. */
229   char view_layer_name[64];
230
231   struct WorkSpaceInstanceHook *workspace_hook;
232
233   /** Global areas aren't part of the screen, but part of the window directly.
234    * \note Code assumes global areas with fixed height, fixed width not supported yet */
235   ScrAreaMap global_areas;
236
237   struct bScreen *screen DNA_DEPRECATED;
238
239   /** Window coords. */
240   short posx, posy, sizex, sizey;
241   /** Borderless, full. */
242   short windowstate;
243   /** Multiscreen... no idea how to store yet. */
244   short monitor;
245   /** Set to 1 if an active window, for quick rejects. */
246   short active;
247   /** Current mouse cursor type. */
248   short cursor;
249   /** Previous cursor when setting modal one. */
250   short lastcursor;
251   /** The current modal cursor. */
252   short modalcursor;
253   /** Cursor grab mode. */
254   short grabcursor;
255   /** Internal: tag this for extra mousemove event,
256    * makes cursors/buttons active on UI switching. */
257   short addmousemove;
258
259   /** Winid also in screens, is for retrieving this window after read. */
260   int winid;
261
262   /** Internal, lock pie creation from this event until released. */
263   short lock_pie_event;
264   /**
265    * Exception to the above rule for nested pies, store last pie event for operators
266    * that spawn a new pie right after destruction of last pie.
267    */
268   short last_pie_event;
269
270   /** Storage for event system. */
271   struct wmEvent *eventstate;
272
273   /** Internal for wm_operators.c. */
274   struct wmGesture *tweak;
275
276   /* Input Method Editor data - complex character input (esp. for asian character input)
277    * Currently WIN32, runtime-only data */
278   struct wmIMEData *ime_data;
279
280   /** All events (ghost level events were handled). */
281   ListBase queue;
282   /** Window+screen handlers, handled last. */
283   ListBase handlers;
284   /** Priority handlers, handled first. */
285   ListBase modalhandlers;
286
287   /** Gesture stuff. */
288   ListBase gesture;
289
290   /** Properties for stereoscopic displays. */
291   struct Stereo3dFormat *stereo3d_format;
292
293   /* custom drawing callbacks */
294   ListBase drawcalls;
295
296   /* Private runtime info to show text in the status bar. */
297   void *cursor_keymap_status;
298 } wmWindow;
299
300 #ifdef ime_data
301 #  undef ime_data
302 #endif
303
304 /* These two Lines with # tell makesdna this struct can be excluded. */
305 /* should be something like DNA_EXCLUDE
306  * but the preprocessor first removes all comments, spaces etc */
307 #
308 #
309 typedef struct wmOperatorTypeMacro {
310   struct wmOperatorTypeMacro *next, *prev;
311
312   /* operator id */
313   char idname[64];
314   /* rna pointer to access properties, like keymap */
315   /** Operator properties, assigned to ptr->data and can be written to a file. */
316   struct IDProperty *properties;
317   struct PointerRNA *ptr;
318 } wmOperatorTypeMacro;
319
320 /* Partial copy of the event, for matching by event handler. */
321 typedef struct wmKeyMapItem {
322   struct wmKeyMapItem *next, *prev;
323
324   /* operator */
325   /** Used to retrieve operator type pointer. */
326   char idname[64];
327   /** Operator properties, assigned to ptr->data and can be written to a file. */
328   IDProperty *properties;
329
330   /* modal */
331   /** Runtime temporary storage for loading. */
332   char propvalue_str[64];
333   /** If used, the item is from modal map. */
334   short propvalue;
335
336   /* event */
337   /** Event code itself. */
338   short type;
339   /** KM_ANY, KM_PRESS, KM_NOTHING etc. */
340   short val;
341   /** Oskey is apple or windowskey, value denotes order of pressed. */
342   short shift, ctrl, alt, oskey;
343   /** Rawkey modifier. */
344   short keymodifier;
345
346   /* flag: inactive, expanded */
347   short flag;
348
349   /* runtime */
350   /** Keymap editor. */
351   short maptype;
352   /** Unique identifier. Positive for kmi that override builtins, negative otherwise. */
353   short id;
354   char _pad[2];
355   /** Rna pointer to access properties. */
356   struct PointerRNA *ptr;
357 } wmKeyMapItem;
358
359 /** Used instead of wmKeyMapItem for diff keymaps. */
360 typedef struct wmKeyMapDiffItem {
361   struct wmKeyMapDiffItem *next, *prev;
362
363   wmKeyMapItem *remove_item;
364   wmKeyMapItem *add_item;
365 } wmKeyMapDiffItem;
366
367 /** #wmKeyMapItem.flag */
368 enum {
369   KMI_INACTIVE = (1 << 0),
370   KMI_EXPANDED = (1 << 1),
371   KMI_USER_MODIFIED = (1 << 2),
372   KMI_UPDATE = (1 << 3),
373 };
374
375 /** #wmKeyMapItem.maptype */
376 enum {
377   KMI_TYPE_KEYBOARD = 0,
378   KMI_TYPE_MOUSE = 1,
379   KMI_TYPE_TWEAK = 2,
380   KMI_TYPE_TEXTINPUT = 3,
381   KMI_TYPE_TIMER = 4,
382   KMI_TYPE_NDOF = 5,
383 };
384
385 /* stored in WM, the actively used keymaps */
386 typedef struct wmKeyMap {
387   struct wmKeyMap *next, *prev;
388
389   ListBase items;
390   ListBase diff_items;
391
392   /** Global editor keymaps, or for more per space/region. */
393   char idname[64];
394   /** Same IDs as in DNA_space_types.h. */
395   short spaceid;
396   /** See above. */
397   short regionid;
398   /** Optional, see: #wmOwnerID. */
399   char owner_id[64];
400
401   /** General flags. */
402   short flag;
403   /** Last kmi id. */
404   short kmi_id;
405
406   /* runtime */
407   /** Verify if enabled in the current context, use #WM_keymap_poll instead of direct calls. */
408   bool (*poll)(struct bContext *);
409   bool (*poll_modal_item)(const struct wmOperator *op, int value);
410
411   /** For modal, #EnumPropertyItem for now. */
412   const void *modal_items;
413 } wmKeyMap;
414
415 /** #wmKeyMap.flag */
416 enum {
417   KEYMAP_MODAL = (1 << 0), /* modal map, not using operatornames */
418   KEYMAP_USER = (1 << 1),  /* user keymap */
419   KEYMAP_EXPANDED = (1 << 2),
420   KEYMAP_CHILDREN_EXPANDED = (1 << 3),
421   KEYMAP_DIFF = (1 << 4),          /* diff keymap for user preferences */
422   KEYMAP_USER_MODIFIED = (1 << 5), /* keymap has user modifications */
423   KEYMAP_UPDATE = (1 << 6),
424   KEYMAP_TOOL = (1 << 7), /* keymap for active tool system */
425 };
426
427 /**
428  * This is similar to addon-preferences,
429  * however unlike add-ons key-config's aren't saved to disk.
430  *
431  * #wmKeyConfigPref is written to DNA,
432  * #wmKeyConfigPrefType_Runtime has the RNA type.
433  */
434 typedef struct wmKeyConfigPref {
435   struct wmKeyConfigPref *next, *prev;
436   /** Unique name. */
437   char idname[64];
438   IDProperty *prop;
439 } wmKeyConfigPref;
440
441 typedef struct wmKeyConfig {
442   struct wmKeyConfig *next, *prev;
443
444   /** Unique name. */
445   char idname[64];
446   /** Idname of configuration this is derives from, "" if none. */
447   char basename[64];
448
449   ListBase keymaps;
450   int actkeymap;
451   short flag;
452   char _pad0[2];
453 } wmKeyConfig;
454
455 /** #wmKeyConfig.flag */
456 enum {
457   KEYCONF_USER = (1 << 1),         /* And what about (1 << 0)? */
458   KEYCONF_INIT_DEFAULT = (1 << 2), /* Has default keymap been initialized? */
459 };
460
461 /**
462  * This one is the operator itself, stored in files for macros etc.
463  * operator + operator-type should be able to redo entirely, but for different context's.
464  */
465 typedef struct wmOperator {
466   struct wmOperator *next, *prev;
467
468   /* saved */
469   /** Used to retrieve type pointer. */
470   char idname[64];
471   /** Saved, user-settable properties. */
472   IDProperty *properties;
473
474   /* runtime */
475   /** Operator type definition from idname. */
476   struct wmOperatorType *type;
477   /** Custom storage, only while operator runs. */
478   void *customdata;
479   /** Python stores the class instance here. */
480   void *py_instance;
481
482   /** Rna pointer to access properties. */
483   struct PointerRNA *ptr;
484   /** Errors and warnings storage. */
485   struct ReportList *reports;
486
487   /** List of operators, can be a tree. */
488   ListBase macro;
489   /** Current running macro, not saved. */
490   struct wmOperator *opm;
491   /** Runtime for drawing. */
492   struct uiLayout *layout;
493   short flag;
494   char _pad[6];
495 } wmOperator;
496
497 /**
498  * Operator type return flags: exec(), invoke() modal(), return values.
499  */
500 enum {
501   OPERATOR_RUNNING_MODAL = (1 << 0),
502   OPERATOR_CANCELLED = (1 << 1),
503   OPERATOR_FINISHED = (1 << 2),
504   /* add this flag if the event should pass through */
505   OPERATOR_PASS_THROUGH = (1 << 3),
506   /* in case operator got executed outside WM code... like via fileselect */
507   OPERATOR_HANDLED = (1 << 4),
508   /* used for operators that act indirectly (eg. popup menu)
509    * note: this isn't great design (using operators to trigger UI) avoid where possible. */
510   OPERATOR_INTERFACE = (1 << 5),
511 };
512 #define OPERATOR_FLAGS_ALL \
513   (OPERATOR_RUNNING_MODAL | OPERATOR_CANCELLED | OPERATOR_FINISHED | OPERATOR_PASS_THROUGH | \
514    OPERATOR_HANDLED | OPERATOR_INTERFACE | 0)
515
516 /* sanity checks for debug mode only */
517 #define OPERATOR_RETVAL_CHECK(ret) \
518   (void)ret, BLI_assert(ret != 0 && (ret & OPERATOR_FLAGS_ALL) == ret)
519
520 /** #wmOperator.flag */
521 enum {
522   /** low level flag so exec() operators can tell if they were invoked, use with care.
523    * Typically this shouldn't make any difference, but it rare cases its needed
524    * (see smooth-view) */
525   OP_IS_INVOKE = (1 << 0),
526   /** So we can detect if an operators exec() call is activated by adjusting the last action. */
527   OP_IS_REPEAT = (1 << 1),
528   /**
529    * So we can detect if an operators exec() call is activated from #SCREEN_OT_repeat_last.
530    *
531    * This difference can be important because previous settings may be used,
532    * even with #PROP_SKIP_SAVE the repeat last operator will use the previous settings.
533    * Unlike #OP_IS_REPEAT the selection (and context generally) may be be different each time.
534    * See T60777 for an example of when this is needed.
535    */
536   OP_IS_REPEAT_LAST = (1 << 1),
537
538   /** When the cursor is grabbed */
539   OP_IS_MODAL_GRAB_CURSOR = (1 << 2),
540
541   /** Allow modal operators to have the region under the cursor for their context
542    * (the regiontype is maintained to prevent errors) */
543   OP_IS_MODAL_CURSOR_REGION = (1 << 3),
544 };
545
546 #endif /* __DNA_WINDOWMANAGER_TYPES_H__ */