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