126b6c47b63572563e0776dfed18195dec4dc215
[blender-staging.git] / source / blender / makesdna / DNA_windowmanager_types.h
1 /**
2  * $Id:
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version. 
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19  *
20  * The Original Code is Copyright (C) 2007 Blender Foundation.
21  * All rights reserved.
22  *
23  * 
24  * Contributor(s): Blender Foundation
25  *
26  * ***** END GPL LICENSE BLOCK *****
27  */
28 #ifndef DNA_WINDOWMANAGER_TYPES_H
29 #define DNA_WINDOWMANAGER_TYPES_H
30
31 #include "DNA_listBase.h"
32 #include "DNA_vec_types.h"
33
34 #include "DNA_ID.h"
35
36 /* defined here: */
37 struct wmWindowManager;
38 struct wmWindow;
39
40 struct wmEvent;
41 struct wmGesture;
42 struct wmOperatorType;
43 struct wmOperator;
44
45 /* forwards */
46 struct bContext;
47 struct wmLocal;
48 struct bScreen;
49 struct uiBlock;
50 struct wmSubWindow;
51 struct wmTimer;
52 struct StructRNA;
53 struct PointerRNA;
54 struct ReportList;
55 struct Report;
56
57 typedef enum ReportType {
58         RPT_DEBUG                                       = 1<<0,
59         RPT_INFO                                        = 1<<1,
60         RPT_OPERATOR                            = 1<<2,
61         RPT_WARNING                                     = 1<<3,
62         RPT_ERROR                                       = 1<<4,
63         RPT_ERROR_INVALID_INPUT         = 1<<5,
64         RPT_ERROR_INVALID_CONTEXT       = 1<<6,
65         RPT_ERROR_OUT_OF_MEMORY         = 1<<7
66 } ReportType;
67
68 #define RPT_DEBUG_ALL           (RPT_DEBUG)
69 #define RPT_INFO_ALL            (RPT_INFO)
70 #define RPT_OPERATOR_ALL        (RPT_OPERATOR)
71 #define RPT_WARNING_ALL         (RPT_WARNING)
72 #define RPT_ERROR_ALL           (RPT_ERROR|RPT_ERROR_INVALID_INPUT|RPT_ERROR_INVALID_CONTEXT|RPT_ERROR_OUT_OF_MEMORY)
73
74 enum ReportListFlags {
75         RPT_PRINT = 1,
76         RPT_STORE = 2,
77 };
78 typedef struct Report {
79         struct Report *next, *prev;
80         int type; /* ReportType */
81         int len; /* strlen(message), saves some time calculating the word wrap  */
82         char *typestr;
83         char *message;
84 } Report;
85 typedef struct ReportList {
86         ListBase list;
87         int printlevel; /* ReportType */
88         int storelevel; /* ReportType */
89         int flag, pad;
90 } ReportList;
91 /* reports need to be before wmWindowManager */
92
93
94 /* windowmanager is saved, tag WMAN */
95 typedef struct wmWindowManager {
96         ID id;
97         
98         struct wmWindow *windrawable, *winactive;               /* separate active from drawable */
99         ListBase windows;
100         
101         int initialized;                /* set on file read */
102         short file_saved;               /* indicator whether data was saved */
103         short pad;
104         
105         ListBase operators;             /* operator registry */
106         
107         ListBase queue;                 /* refresh/redraw wmNotifier structs */
108         
109         struct ReportList reports;      /* information and error reports */
110         
111         ListBase jobs;                  /* threaded jobs manager */
112         
113         ListBase paintcursors;  /* extra overlay cursors to draw, like circles */
114         
115         /* used keymaps, optionally/partially saved */
116         ListBase keymaps;
117         
118 } wmWindowManager;
119
120 /* wmWindowManager.initialized */
121 #define WM_INIT_WINDOW          1<<0
122 #define WM_INIT_KEYMAP          1<<1
123
124 /* the savable part, rest of data is local in ghostwinlay */
125 typedef struct wmWindow {
126         struct wmWindow *next, *prev;
127         
128         void *ghostwin;         /* dont want to include ghost.h stuff */
129         
130         int winid, pad;         /* winid also in screens, is for retrieving this window after read */
131         
132         struct bScreen *screen;         /* active screen */
133         struct bScreen *newscreen;      /* temporary when switching */
134         char screenname[32];    /* MAX_ID_NAME for matching window with active screen after file read */
135         
136         short posx, posy, sizex, sizey; /* window coords */
137         short windowstate;      /* borderless, full */
138         short monitor;          /* multiscreen... no idea how to store yet */
139         short active;           /* set to 1 if an active window, for quick rejects */
140         short cursor;           /* current mouse cursor type */
141         short lastcursor;       /* for temp waitcursor */
142         short addmousemove;     /* internal: tag this for extra mousemove event, makes cursors/buttons active on UI switching */
143         int pad3;
144         
145         struct wmEvent *eventstate;     /* storage for event system */
146         
147         struct wmSubWindow *curswin;    /* internal for wm_subwindow.c only */
148
149         struct wmGesture *tweak;        /* internal for wm_operators.c */
150         
151         int drawmethod, drawfail;       /* internal for wm_draw.c only */
152         void *drawdata;                         /* internal for wm_draw.c only */
153         
154         ListBase timers;
155         
156         ListBase queue;                         /* all events (ghost level events were handled) */
157         ListBase handlers;                      /* window+screen handlers, overriding all queues */
158         
159         ListBase subwindows;    /* opengl stuff for sub windows, see notes in wm_subwindow.c */
160         ListBase gesture;               /* gesture stuff */
161 } wmWindow;
162
163 /* should be somthing like DNA_EXCLUDE 
164  * but the preprocessor first removes all comments, spaces etc */
165
166 #
167 #
168 typedef struct wmOperatorType {
169         struct wmOperatorType *next, *prev;
170         
171         char *name;             /* text for ui, undo */
172         char *idname;           /* unique identifier */
173         char *description;      /* tooltips and python docs */
174         
175         /* this callback executes the operator without any interactive input,
176          * parameters may be provided through operator properties. cannot use
177          * any interface code or input device state.
178          * - see defines below for return values */
179         int (*exec)(struct bContext *, struct wmOperator *);
180
181         /* for modal temporary operators, initially invoke is called. then
182          * any further events are handled in modal. if the operation is
183          * cancelled due to some external reason, cancel is called
184          * - see defines below for return values */
185         int (*invoke)(struct bContext *, struct wmOperator *, struct wmEvent *);
186         int (*cancel)(struct bContext *, struct wmOperator *);
187         int (*modal)(struct bContext *, struct wmOperator *, struct wmEvent *);
188
189         /* verify if the operator can be executed in the current context, note
190          * that the operator might still fail to execute even if this return true */
191         int (*poll)(struct bContext *);
192         
193         /* panel for redo and repeat */
194         void *(*uiBlock)(struct wmOperator *);
195         
196         /* rna for properties */
197         struct StructRNA *srna;
198         
199         short flag;
200
201         /* only used for operators defined with python
202          * use to store pointers to python functions */
203         void *pyop_data;
204
205 } wmOperatorType;
206
207 #define OP_MAX_TYPENAME 64
208
209 /* partial copy of the event, for matching by eventhandler */
210 typedef struct wmKeymapItem {
211         struct wmKeymapItem *next, *prev;
212         
213         char idname[64];                                /* used to retrieve operator type pointer */
214         struct PointerRNA *ptr;                 /* rna pointer to access properties */
215         
216         short type;                                             /* event code itself */
217         short val;                                              /* 0=any, 1=click, 2=release, or wheelvalue, or... */
218         short shift, ctrl, alt, oskey;  /* oskey is apple or windowskey, value denotes order of pressed */
219         short keymodifier;                              /* rawkey modifier */
220         
221         short pad;
222 } wmKeymapItem;
223
224 #define KMAP_MAX_NAME   64
225
226 /* stored in WM, the actively used keymaps */
227 typedef struct wmKeyMap {
228         struct wmKeyMap *next, *prev;
229         
230         ListBase keymap;
231         
232         char nameid[64];        /* global editor keymaps, or for more per space/region */
233         int spaceid;    /* same IDs as in DNA_space_types.h */
234         int regionid;   /* see above */
235 } wmKeyMap;
236
237
238 /* this one is the operator itself, stored in files for macros etc */
239 /* operator + operatortype should be able to redo entirely, but for different contextes */
240 typedef struct wmOperator {
241         struct wmOperator *next, *prev;
242
243         /* saved */
244         char idname[64];                        /* used to retrieve type pointer */
245         IDProperty *properties;         /* saved, user-settable properties */
246         
247         /* runtime */
248         wmOperatorType *type;           /* operator type definition from idname */
249         void *customdata;                       /* custom storage, only while operator runs */
250         struct PointerRNA *ptr;         /* rna pointer to access properties */
251         struct ReportList *reports;     /* errors and warnings storage */
252 } wmOperator;
253
254 /* operator type exec(), invoke() modal(), return values */
255 #define OPERATOR_RUNNING_MODAL  1
256 #define OPERATOR_CANCELLED              2
257 #define OPERATOR_FINISHED               4
258 /* add this flag if the event should pass through */
259 #define OPERATOR_PASS_THROUGH   8
260
261
262 /* ************** wmEvent ************************ */
263 /* for read-only rna access, dont save this */
264
265 /* each event should have full modifier state */
266 /* event comes from eventmanager and from keymap */
267 typedef struct wmEvent {
268         struct wmEvent *next, *prev;
269         
270         short type;                     /* event code itself (short, is also in keymap) */
271         short val;                      /* press, release, scrollvalue */
272         short x, y;                     /* mouse pointer position, screen coord */
273         short mval[2];          /* region mouse position, name convention pre 2.5 :) */
274         short prevx, prevy;     /* previous mouse pointer position */
275         short unicode;          /* future, ghost? */
276         char ascii;                     /* from ghost */
277         char pad;
278         
279         /* modifier states */
280         short shift, ctrl, alt, oskey;  /* oskey is apple or windowskey, value denotes order of pressed */
281         short keymodifier;                              /* rawkey modifier */
282         
283         short pad1;
284         
285         /* keymap item, set by handler (weak?) */
286         const char *keymap_idname;
287         
288         /* custom data */
289         short custom;           /* custom data type, stylus, 6dof, see wm_event_types.h */
290         short customdatafree;
291         int pad2;
292         void *customdata;       /* ascii, unicode, mouse coords, angles, vectors, dragdrop info */
293         
294 } wmEvent;
295
296 typedef enum wmRadialControlMode {
297         WM_RADIALCONTROL_SIZE,
298         WM_RADIALCONTROL_STRENGTH,
299         WM_RADIALCONTROL_ANGLE
300 } wmRadialControlMode;
301
302 #endif /* DNA_WINDOWMANAGER_TYPES_H */
303