Fix a bug in the T34039 hack in case when a modifier key is not mapped.
[blender.git] / intern / ghost / GHOST_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) 2001-2002 by NaN Holding BV.
17  * All rights reserved.
18  */
19
20 /** \file
21  * \ingroup GHOST
22  */
23
24 #ifndef __GHOST_TYPES_H__
25 #define __GHOST_TYPES_H__
26
27 #ifdef WITH_CXX_GUARDEDALLOC
28 #  include "MEM_guardedalloc.h"
29 #endif
30
31 #if defined(WITH_CXX_GUARDEDALLOC) && defined(__cplusplus)
32 #  define GHOST_DECLARE_HANDLE(name) \
33     typedef struct name##__ { \
34       int unused; \
35       MEM_CXX_CLASS_ALLOC_FUNCS(#name) \
36     } * name
37 #else
38 #  define GHOST_DECLARE_HANDLE(name) \
39     typedef struct name##__ { \
40       int unused; \
41     } * name
42 #endif
43
44 typedef char GHOST_TInt8;
45 typedef unsigned char GHOST_TUns8;
46 typedef short GHOST_TInt16;
47 typedef unsigned short GHOST_TUns16;
48 typedef int GHOST_TInt32;
49 typedef unsigned int GHOST_TUns32;
50
51 typedef struct {
52   int flags;
53 } GHOST_GLSettings;
54
55 typedef enum {
56   GHOST_glStereoVisual = (1 << 0),
57   GHOST_glDebugContext = (1 << 1),
58   GHOST_glAlphaBackground = (1 << 2),
59 } GHOST_GLFlags;
60
61 typedef enum GHOST_DialogOptions {
62   GHOST_DialogWarning = (1 << 0),
63   GHOST_DialogError = (1 << 1),
64 } GHOST_DialogOptions;
65
66 #ifdef _MSC_VER
67 typedef __int64 GHOST_TInt64;
68 typedef unsigned __int64 GHOST_TUns64;
69 #else
70 typedef long long GHOST_TInt64;
71 typedef unsigned long long GHOST_TUns64;
72 #endif
73
74 typedef void *GHOST_TUserDataPtr;
75
76 typedef enum { GHOST_kFailure = 0, GHOST_kSuccess } GHOST_TSuccess;
77
78 /* Xtilt and Ytilt represent how much the pen is tilted away from
79  * vertically upright in either the X or Y direction, with X and Y the
80  * axes of the tablet surface.
81  * In other words, Xtilt and Ytilt are components of a vector created by projecting
82  * the pen's angle in 3D space vertically downwards on to the XY plane
83  * --Matt
84  */
85 typedef enum {
86   GHOST_kTabletModeNone = 0,
87   GHOST_kTabletModeStylus,
88   GHOST_kTabletModeEraser
89 } GHOST_TTabletMode;
90
91 typedef enum {
92   GHOST_kTabletAutomatic = 0,
93   GHOST_kTabletNative,
94   GHOST_kTabletWintab,
95 } GHOST_TTabletAPI;
96
97 typedef struct GHOST_TabletData {
98   GHOST_TTabletMode Active; /* 0=None, 1=Stylus, 2=Eraser */
99   float Pressure;           /* range 0.0 (not touching) to 1.0 (full pressure) */
100   float Xtilt; /* range 0.0 (upright) to 1.0 (tilted fully against the tablet surface) */
101   float Ytilt; /* as above */
102 } GHOST_TabletData;
103
104 typedef enum {
105   GHOST_kNotVisible = 0,
106   GHOST_kPartiallyVisible,
107   GHOST_kFullyVisible
108 } GHOST_TVisibility;
109
110 typedef enum { GHOST_kFireTimeNever = 0xFFFFFFFF } GHOST_TFireTimeConstant;
111
112 typedef enum {
113   GHOST_kModifierKeyLeftShift = 0,
114   GHOST_kModifierKeyRightShift,
115   GHOST_kModifierKeyLeftAlt,
116   GHOST_kModifierKeyRightAlt,
117   GHOST_kModifierKeyLeftControl,
118   GHOST_kModifierKeyRightControl,
119   GHOST_kModifierKeyOS,
120   GHOST_kModifierKeyNumMasks
121 } GHOST_TModifierKeyMask;
122
123 typedef enum {
124   GHOST_kWindowStateNormal = 0,
125   GHOST_kWindowStateMaximized,
126   GHOST_kWindowStateMinimized,
127   GHOST_kWindowStateFullScreen,
128   GHOST_kWindowStateEmbedded,
129   // GHOST_kWindowStateModified,
130   // GHOST_kWindowStateUnModified,
131 } GHOST_TWindowState;
132
133 typedef enum { GHOST_kWindowOrderTop = 0, GHOST_kWindowOrderBottom } GHOST_TWindowOrder;
134
135 typedef enum {
136   GHOST_kDrawingContextTypeNone = 0,
137   GHOST_kDrawingContextTypeOpenGL
138 } GHOST_TDrawingContextType;
139
140 typedef enum {
141   GHOST_kButtonMaskLeft = 0,
142   GHOST_kButtonMaskMiddle,
143   GHOST_kButtonMaskRight,
144   GHOST_kButtonMaskButton4,
145   GHOST_kButtonMaskButton5,
146   /* Trackballs and programmable buttons */
147   GHOST_kButtonMaskButton6,
148   GHOST_kButtonMaskButton7,
149   GHOST_kButtonNumMasks
150 } GHOST_TButtonMask;
151
152 typedef enum {
153   GHOST_kEventUnknown = 0,
154
155   GHOST_kEventCursorMove,  /// Mouse move event
156   GHOST_kEventButtonDown,  /// Mouse button event
157   GHOST_kEventButtonUp,    /// Mouse button event
158   GHOST_kEventWheel,       /// Mouse wheel event
159   GHOST_kEventTrackpad,    /// Trackpad event
160
161 #ifdef WITH_INPUT_NDOF
162   GHOST_kEventNDOFMotion,  /// N degree of freedom device motion event
163   GHOST_kEventNDOFButton,  /// N degree of freedom device button event
164 #endif
165
166   GHOST_kEventKeyDown,
167   GHOST_kEventKeyUp,
168   //  GHOST_kEventKeyAuto,
169
170   GHOST_kEventQuitRequest,
171
172   GHOST_kEventWindowClose,
173   GHOST_kEventWindowActivate,
174   GHOST_kEventWindowDeactivate,
175   GHOST_kEventWindowUpdate,
176   GHOST_kEventWindowSize,
177   GHOST_kEventWindowMove,
178   GHOST_kEventWindowDPIHintChanged,
179
180   GHOST_kEventDraggingEntered,
181   GHOST_kEventDraggingUpdated,
182   GHOST_kEventDraggingExited,
183   GHOST_kEventDraggingDropDone,
184
185   GHOST_kEventOpenMainFile,  // Needed for Cocoa to open double-clicked .blend file at startup
186   GHOST_kEventNativeResolutionChange,  // Needed for Cocoa when window moves to other display
187
188   GHOST_kEventTimer,
189
190   GHOST_kEventImeCompositionStart,
191   GHOST_kEventImeComposition,
192   GHOST_kEventImeCompositionEnd,
193
194   GHOST_kNumEventTypes
195 } GHOST_TEventType;
196
197 typedef enum {
198   GHOST_kStandardCursorFirstCursor = 0,
199   GHOST_kStandardCursorDefault = 0,
200   GHOST_kStandardCursorRightArrow,
201   GHOST_kStandardCursorLeftArrow,
202   GHOST_kStandardCursorInfo,
203   GHOST_kStandardCursorDestroy,
204   GHOST_kStandardCursorHelp,
205   GHOST_kStandardCursorWait,
206   GHOST_kStandardCursorText,
207   GHOST_kStandardCursorCrosshair,
208   GHOST_kStandardCursorCrosshairA,
209   GHOST_kStandardCursorCrosshairB,
210   GHOST_kStandardCursorCrosshairC,
211   GHOST_kStandardCursorPencil,
212   GHOST_kStandardCursorUpArrow,
213   GHOST_kStandardCursorDownArrow,
214   GHOST_kStandardCursorVerticalSplit,
215   GHOST_kStandardCursorHorizontalSplit,
216   GHOST_kStandardCursorEraser,
217   GHOST_kStandardCursorKnife,
218   GHOST_kStandardCursorEyedropper,
219   GHOST_kStandardCursorZoomIn,
220   GHOST_kStandardCursorZoomOut,
221   GHOST_kStandardCursorMove,
222   GHOST_kStandardCursorNSEWScroll,
223   GHOST_kStandardCursorNSScroll,
224   GHOST_kStandardCursorEWScroll,
225   GHOST_kStandardCursorStop,
226   GHOST_kStandardCursorUpDown,
227   GHOST_kStandardCursorLeftRight,
228   GHOST_kStandardCursorTopSide,
229   GHOST_kStandardCursorBottomSide,
230   GHOST_kStandardCursorLeftSide,
231   GHOST_kStandardCursorRightSide,
232   GHOST_kStandardCursorTopLeftCorner,
233   GHOST_kStandardCursorTopRightCorner,
234   GHOST_kStandardCursorBottomRightCorner,
235   GHOST_kStandardCursorBottomLeftCorner,
236   GHOST_kStandardCursorCopy,
237   GHOST_kStandardCursorCustom,
238
239   GHOST_kStandardCursorNumCursors
240 } GHOST_TStandardCursor;
241
242 typedef enum {
243   GHOST_kKeyUnknown = -1,
244   GHOST_kKeyBackSpace,
245   GHOST_kKeyTab,
246   GHOST_kKeyLinefeed,
247   GHOST_kKeyClear,
248   GHOST_kKeyEnter = 0x0D,
249
250   GHOST_kKeyEsc = 0x1B,
251   GHOST_kKeySpace = ' ',
252   GHOST_kKeyQuote = 0x27,
253   GHOST_kKeyComma = ',',
254   GHOST_kKeyMinus = '-',
255   GHOST_kKeyPlus = '+',
256   GHOST_kKeyPeriod = '.',
257   GHOST_kKeySlash = '/',
258
259   // Number keys
260   GHOST_kKey0 = '0',
261   GHOST_kKey1,
262   GHOST_kKey2,
263   GHOST_kKey3,
264   GHOST_kKey4,
265   GHOST_kKey5,
266   GHOST_kKey6,
267   GHOST_kKey7,
268   GHOST_kKey8,
269   GHOST_kKey9,
270
271   GHOST_kKeySemicolon = ';',
272   GHOST_kKeyEqual = '=',
273
274   // Character keys
275   GHOST_kKeyA = 'A',
276   GHOST_kKeyB,
277   GHOST_kKeyC,
278   GHOST_kKeyD,
279   GHOST_kKeyE,
280   GHOST_kKeyF,
281   GHOST_kKeyG,
282   GHOST_kKeyH,
283   GHOST_kKeyI,
284   GHOST_kKeyJ,
285   GHOST_kKeyK,
286   GHOST_kKeyL,
287   GHOST_kKeyM,
288   GHOST_kKeyN,
289   GHOST_kKeyO,
290   GHOST_kKeyP,
291   GHOST_kKeyQ,
292   GHOST_kKeyR,
293   GHOST_kKeyS,
294   GHOST_kKeyT,
295   GHOST_kKeyU,
296   GHOST_kKeyV,
297   GHOST_kKeyW,
298   GHOST_kKeyX,
299   GHOST_kKeyY,
300   GHOST_kKeyZ,
301
302   GHOST_kKeyLeftBracket = '[',
303   GHOST_kKeyRightBracket = ']',
304   GHOST_kKeyBackslash = 0x5C,
305   GHOST_kKeyAccentGrave = '`',
306
307   GHOST_kKeyLeftShift = 0x100,
308   GHOST_kKeyRightShift,
309   GHOST_kKeyLeftControl,
310   GHOST_kKeyRightControl,
311   GHOST_kKeyLeftAlt,
312   GHOST_kKeyRightAlt,
313   GHOST_kKeyOS,      // Command key on Apple, Windows key(s) on Windows
314   GHOST_kKeyGrLess,  // German PC only!
315
316   GHOST_kKeyCapsLock,
317   GHOST_kKeyNumLock,
318   GHOST_kKeyScrollLock,
319
320   GHOST_kKeyLeftArrow,
321   GHOST_kKeyRightArrow,
322   GHOST_kKeyUpArrow,
323   GHOST_kKeyDownArrow,
324
325   GHOST_kKeyPrintScreen,
326   GHOST_kKeyPause,
327
328   GHOST_kKeyInsert,
329   GHOST_kKeyDelete,
330   GHOST_kKeyHome,
331   GHOST_kKeyEnd,
332   GHOST_kKeyUpPage,
333   GHOST_kKeyDownPage,
334
335   // Numpad keys
336   GHOST_kKeyNumpad0,
337   GHOST_kKeyNumpad1,
338   GHOST_kKeyNumpad2,
339   GHOST_kKeyNumpad3,
340   GHOST_kKeyNumpad4,
341   GHOST_kKeyNumpad5,
342   GHOST_kKeyNumpad6,
343   GHOST_kKeyNumpad7,
344   GHOST_kKeyNumpad8,
345   GHOST_kKeyNumpad9,
346   GHOST_kKeyNumpadPeriod,
347   GHOST_kKeyNumpadEnter,
348   GHOST_kKeyNumpadPlus,
349   GHOST_kKeyNumpadMinus,
350   GHOST_kKeyNumpadAsterisk,
351   GHOST_kKeyNumpadSlash,
352
353   // Function keys
354   GHOST_kKeyF1,
355   GHOST_kKeyF2,
356   GHOST_kKeyF3,
357   GHOST_kKeyF4,
358   GHOST_kKeyF5,
359   GHOST_kKeyF6,
360   GHOST_kKeyF7,
361   GHOST_kKeyF8,
362   GHOST_kKeyF9,
363   GHOST_kKeyF10,
364   GHOST_kKeyF11,
365   GHOST_kKeyF12,
366   GHOST_kKeyF13,
367   GHOST_kKeyF14,
368   GHOST_kKeyF15,
369   GHOST_kKeyF16,
370   GHOST_kKeyF17,
371   GHOST_kKeyF18,
372   GHOST_kKeyF19,
373   GHOST_kKeyF20,
374   GHOST_kKeyF21,
375   GHOST_kKeyF22,
376   GHOST_kKeyF23,
377   GHOST_kKeyF24,
378
379   // Multimedia keypad buttons
380   GHOST_kKeyMediaPlay,
381   GHOST_kKeyMediaStop,
382   GHOST_kKeyMediaFirst,
383   GHOST_kKeyMediaLast
384 } GHOST_TKey;
385
386 typedef enum {
387   /** Grab not set. */
388   GHOST_kGrabDisable = 0,
389   /** No cursor adjustments. */
390   GHOST_kGrabNormal,
391   /** Wrap the mouse location to prevent limiting screen bounds. */
392   GHOST_kGrabWrap,
393   /** Hide the mouse while grabbing and restore the original location on release (numbuts). */
394   GHOST_kGrabHide,
395 } GHOST_TGrabCursorMode;
396
397 typedef enum {
398   /** Axis that cursor grab will wrap. */
399   GHOST_kGrabAxisNone = 0,
400   GHOST_kAxisX = (1 << 0),
401   GHOST_kGrabAxisY = (1 << 1),
402 } GHOST_TAxisFlag;
403
404 typedef void *GHOST_TEventDataPtr;
405
406 typedef struct {
407   /** The x-coordinate of the cursor position. */
408   GHOST_TInt32 x;
409   /** The y-coordinate of the cursor position. */
410   GHOST_TInt32 y;
411 } GHOST_TEventCursorData;
412
413 typedef struct {
414   /** The mask of the mouse button. */
415   GHOST_TButtonMask button;
416 } GHOST_TEventButtonData;
417
418 typedef struct {
419   /** Displacement of a mouse wheel. */
420   GHOST_TInt32 z;
421 } GHOST_TEventWheelData;
422
423 typedef enum {
424   GHOST_kTrackpadEventUnknown = 0,
425   GHOST_kTrackpadEventScroll,
426   GHOST_kTrackpadEventRotate,
427   GHOST_kTrackpadEventSwipe, /* Reserved, not used for now */
428   GHOST_kTrackpadEventMagnify
429 } GHOST_TTrackpadEventSubTypes;
430
431 typedef struct {
432   /** The event subtype */
433   GHOST_TTrackpadEventSubTypes subtype;
434   /** The x-location of the trackpad event */
435   GHOST_TInt32 x;
436   /** The y-location of the trackpad event */
437   GHOST_TInt32 y;
438   /** The x-delta or value of the trackpad event */
439   GHOST_TInt32 deltaX;
440   /** The y-delta (currently only for scroll subtype) of the trackpad event */
441   GHOST_TInt32 deltaY;
442 } GHOST_TEventTrackpadData;
443
444 typedef enum {
445   GHOST_kDragnDropTypeUnknown = 0,
446   GHOST_kDragnDropTypeFilenames, /*Array of strings representing file names (full path) */
447   GHOST_kDragnDropTypeString,    /* Unformatted text UTF-8 string */
448   GHOST_kDragnDropTypeBitmap     /*Bitmap image data */
449 } GHOST_TDragnDropTypes;
450
451 typedef struct {
452   /** The x-coordinate of the cursor position. */
453   GHOST_TInt32 x;
454   /** The y-coordinate of the cursor position. */
455   GHOST_TInt32 y;
456   /** The dropped item type */
457   GHOST_TDragnDropTypes dataType;
458   /** The "dropped content" */
459   GHOST_TEventDataPtr data;
460 } GHOST_TEventDragnDropData;
461
462 /** similar to wmImeData */
463 typedef struct {
464   /** size_t */
465   GHOST_TUserDataPtr result_len, composite_len;
466   /** char * utf8 encoding */
467   GHOST_TUserDataPtr result, composite;
468   /** Cursor position in the IME composition. */
469   int cursor_position;
470   /** Represents the position of the beginning of the selection */
471   int target_start;
472   /** Represents the position of the end of the selection */
473   int target_end;
474   /** custom temporal data */
475   GHOST_TUserDataPtr tmp;
476 } GHOST_TEventImeData;
477
478 typedef struct {
479   int count;
480   GHOST_TUns8 **strings;
481 } GHOST_TStringArray;
482
483 typedef enum {
484   GHOST_kNotStarted,
485   GHOST_kStarting,
486   GHOST_kInProgress,
487   GHOST_kFinishing,
488   GHOST_kFinished
489 } GHOST_TProgress;
490
491 #ifdef WITH_INPUT_NDOF
492 typedef struct {
493   /** N-degree of freedom device data v3 [GSoC 2010] */
494   // Each component normally ranges from -1 to +1, but can exceed that.
495   // These use blender standard view coordinates, with positive rotations being CCW about the axis.
496   float tx, ty, tz;  // translation
497   float rx, ry, rz;  // rotation:
498   // axis = (rx,ry,rz).normalized
499   // amount = (rx,ry,rz).magnitude [in revolutions, 1.0 = 360 deg]
500   float dt;                  // time since previous NDOF Motion event
501   GHOST_TProgress progress;  // Starting, InProgress or Finishing (for modal handlers)
502 } GHOST_TEventNDOFMotionData;
503
504 typedef enum { GHOST_kPress, GHOST_kRelease } GHOST_TButtonAction;
505 // good for mouse or other buttons too, hmmm?
506
507 typedef struct {
508   GHOST_TButtonAction action;
509   short button;
510 } GHOST_TEventNDOFButtonData;
511 #endif  // WITH_INPUT_NDOF
512
513 typedef struct {
514   /** The key code. */
515   GHOST_TKey key;
516
517   /* ascii / utf8: both should always be set when possible,
518    * - ascii may be '\0' however if the user presses a non ascii key
519    * - unicode may not be set if the system has no unicode support
520    *
521    * These values are intended to be used as follows.
522    * For text input use unicode when available, fallback to ascii.
523    * For areas where unicode is not needed, number input for example, always
524    * use ascii, unicode is ignored - campbell.
525    */
526   /** The ascii code for the key event ('\0' if none). */
527   char ascii;
528   /** The unicode character. if the length is 6, not NULL terminated if all 6 are set */
529   char utf8_buf[6];
530 } GHOST_TEventKeyData;
531
532 typedef struct {
533   /** Number of pixels on a line. */
534   GHOST_TUns32 xPixels;
535   /** Number of lines. */
536   GHOST_TUns32 yPixels;
537   /** Numberof bits per pixel. */
538   GHOST_TUns32 bpp;
539   /** Refresh rate (in Hertz). */
540   GHOST_TUns32 frequency;
541 } GHOST_DisplaySetting;
542
543 #ifdef _WIN32
544 typedef void *GHOST_TEmbedderWindowID;
545 #endif  // _WIN32
546
547 #ifndef _WIN32
548 // I can't use "Window" from "<X11/Xlib.h>" because it conflits with Window defined in winlay.h
549 typedef int GHOST_TEmbedderWindowID;
550 #endif  // _WIN32
551
552 /**
553  * A timer task callback routine.
554  * \param task The timer task object.
555  * \param time The current time.
556  */
557 #ifdef __cplusplus
558 class GHOST_ITimerTask;
559 typedef void (*GHOST_TimerProcPtr)(GHOST_ITimerTask *task, GHOST_TUns64 time);
560 #else
561 struct GHOST_TimerTaskHandle__;
562 typedef void (*GHOST_TimerProcPtr)(struct GHOST_TimerTaskHandle__ *task, GHOST_TUns64 time);
563 #endif
564
565 #endif  // __GHOST_TYPES_H__