GPencil: Interpolate pressure in active Smooth
[blender.git] / intern / ghost / intern / GHOST_SystemCocoa.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  * Declaration of GHOST_SystemCocoa class.
23  */
24
25 #ifndef __GHOST_SYSTEMCOCOA_H__
26 #define __GHOST_SYSTEMCOCOA_H__
27
28 #ifndef __APPLE__
29 #  error Apple OSX only!
30 #endif  // __APPLE__
31
32 //#define __CARBONSOUND__
33
34 #include "GHOST_System.h"
35
36 class GHOST_EventCursor;
37 class GHOST_EventKey;
38 class GHOST_EventWindow;
39 class GHOST_WindowCocoa;
40
41 class GHOST_SystemCocoa : public GHOST_System {
42  public:
43   /**
44    * Constructor.
45    */
46   GHOST_SystemCocoa();
47
48   /**
49    * Destructor.
50    */
51   ~GHOST_SystemCocoa();
52
53   /***************************************************************************************
54    * Time(r) functionality
55    ***************************************************************************************/
56
57   /**
58    * Returns the system time.
59    * Returns the number of milliseconds since the start of the system process.
60    * Based on ANSI clock() routine.
61    * \return The number of milliseconds.
62    */
63   GHOST_TUns64 getMilliSeconds() const;
64
65   /***************************************************************************************
66    * Display/window management functionality
67    ***************************************************************************************/
68
69   /**
70    * Returns the number of displays on this system.
71    * \return The number of displays.
72    */
73   GHOST_TUns8 getNumDisplays() const;
74
75   /**
76    * Returns the dimensions of the main display on this system.
77    * \return The dimension of the main display.
78    */
79   void getMainDisplayDimensions(GHOST_TUns32 &width, GHOST_TUns32 &height) const;
80
81   /** Returns the combine dimensions of all monitors.
82    * \return The dimension of the workspace.
83    */
84   void getAllDisplayDimensions(GHOST_TUns32 &width, GHOST_TUns32 &height) const;
85
86   /**
87    * Create a new window.
88    * The new window is added to the list of windows managed.
89    * Never explicitly delete the window, use disposeWindow() instead.
90    * \param   title           The name of the window
91    * (displayed in the title bar of the window if the OS supports it).
92    * \param   left            The coordinate of the left edge of the window.
93    * \param   top             The coordinate of the top edge of the window.
94    * \param   width           The width the window.
95    * \param   height          The height the window.
96    * \param   state           The state of the window when opened.
97    * \param   type            The type of drawing context installed in this window.
98    * \param glSettings: Misc OpenGL settings.
99    * \param exclusive: Use to show the window ontop and ignore others (used fullscreen).
100    * \param   parentWindow    Parent (embedder) window
101    * \return  The new window (or 0 if creation failed).
102    */
103   GHOST_IWindow *createWindow(const STR_String &title,
104                               GHOST_TInt32 left,
105                               GHOST_TInt32 top,
106                               GHOST_TUns32 width,
107                               GHOST_TUns32 height,
108                               GHOST_TWindowState state,
109                               GHOST_TDrawingContextType type,
110                               GHOST_GLSettings glSettings,
111                               const bool exclusive = false,
112                               const GHOST_TEmbedderWindowID parentWindow = 0);
113
114   /**
115    * Create a new offscreen context.
116    * Never explicitly delete the context, use disposeContext() instead.
117    * \return  The new context (or 0 if creation failed).
118    */
119   GHOST_IContext *createOffscreenContext();
120
121   /**
122    * Dispose of a context.
123    * \param   context Pointer to the context to be disposed.
124    * \return  Indication of success.
125    */
126   GHOST_TSuccess disposeContext(GHOST_IContext *context);
127
128   /***************************************************************************************
129    * Event management functionality
130    ***************************************************************************************/
131
132   /**
133    * Gets events from the system and stores them in the queue.
134    * \param waitForEvent Flag to wait for an event (or return immediately).
135    * \return Indication of the presence of events.
136    */
137   bool processEvents(bool waitForEvent);
138
139   /**
140    * Handle User request to quit, from Menu bar Quit, and Cmd+Q
141    * Display alert panel if changes performed since last save
142    */
143   void handleQuitRequest();
144
145   /**
146    * Handle Cocoa openFile event
147    * Display confirmation request panel if changes performed since last save
148    */
149   bool handleOpenDocumentRequest(void *filepathStr);
150
151   /**
152    * Handles a drag'n'drop destination event. Called by GHOST_WindowCocoa window subclass
153    * \param eventType The type of drag'n'drop event
154    * \param draggedObjectType The type object concerned
155    * (currently array of file names, string, TIFF image)
156    * \param mouseX x mouse coordinate (in cocoa base window coordinates)
157    * \param mouseY y mouse coordinate
158    * \param window The window on which the event occurred
159    * \return Indication whether the event was handled.
160    */
161   GHOST_TSuccess handleDraggingEvent(GHOST_TEventType eventType,
162                                      GHOST_TDragnDropTypes draggedObjectType,
163                                      GHOST_WindowCocoa *window,
164                                      int mouseX,
165                                      int mouseY,
166                                      void *data);
167
168   /***************************************************************************************
169    * Cursor management functionality
170    ***************************************************************************************/
171
172   /**
173    * Returns the current location of the cursor (location in screen coordinates)
174    * \param x         The x-coordinate of the cursor.
175    * \param y         The y-coordinate of the cursor.
176    * \return          Indication of success.
177    */
178   GHOST_TSuccess getCursorPosition(GHOST_TInt32 &x, GHOST_TInt32 &y) const;
179
180   /**
181    * Updates the location of the cursor (location in screen coordinates).
182    * \param x         The x-coordinate of the cursor.
183    * \param y         The y-coordinate of the cursor.
184    * \return          Indication of success.
185    */
186   GHOST_TSuccess setCursorPosition(GHOST_TInt32 x, GHOST_TInt32 y);
187
188   /***************************************************************************************
189    * Access to mouse button and keyboard states.
190    ***************************************************************************************/
191
192   /**
193    * Returns the state of all modifier keys.
194    * \param keys  The state of all modifier keys (true == pressed).
195    * \return      Indication of success.
196    */
197   GHOST_TSuccess getModifierKeys(GHOST_ModifierKeys &keys) const;
198
199   /**
200    * Returns the state of the mouse buttons (ouside the message queue).
201    * \param buttons   The state of the buttons.
202    * \return          Indication of success.
203    */
204   GHOST_TSuccess getButtons(GHOST_Buttons &buttons) const;
205
206   /**
207    * Returns Clipboard data
208    * \param selection     Indicate which buffer to return
209    * \return              Returns the selected buffer
210    */
211   GHOST_TUns8 *getClipboard(bool selection) const;
212
213   /**
214    * Puts buffer to system clipboard
215    * \param buffer    The buffer to be copied
216    * \param selection Indicates which buffer to copy too, only used on X11
217    */
218   void putClipboard(GHOST_TInt8 *buffer, bool selection) const;
219
220   /**
221    * Handles a window event. Called by GHOST_WindowCocoa window delegate
222    * \param eventType The type of window event
223    * \param window The window on which the event occurred
224    * \return Indication whether the event was handled.
225    */
226   GHOST_TSuccess handleWindowEvent(GHOST_TEventType eventType, GHOST_WindowCocoa *window);
227
228   /**
229    * Handles the Cocoa event telling the application has become active (again)
230    * \return Indication whether the event was handled.
231    */
232   GHOST_TSuccess handleApplicationBecomeActiveEvent();
233
234   /**
235    * External objects should call this when they send an event outside processEvents.
236    */
237   void notifyExternalEventProcessed();
238
239   /**
240    * \see GHOST_ISystem
241    */
242   int toggleConsole(int action)
243   {
244     return 0;
245   }
246
247   /**
248    * Handles a tablet event.
249    * \param eventPtr  An NSEvent pointer (casted to void* to enable compilation in standard C++)
250    * \param eventType The type of the event.
251    * It needs to be passed separately as it can be either directly in the event type,
252    * or as a subtype if combined with a mouse button event.
253    * \return Indication whether the event was handled.
254    */
255   GHOST_TSuccess handleTabletEvent(void *eventPtr, short eventType);
256   bool handleTabletEvent(void *eventPtr);
257
258   /**
259    * Handles a mouse event.
260    * \param eventPtr  An NSEvent pointer (casted to void* to enable compilation in standard C++)
261    * \return Indication whether the event was handled.
262    */
263   GHOST_TSuccess handleMouseEvent(void *eventPtr);
264
265   /**
266    * Handles a key event.
267    * \param eventPtr  An NSEvent pointer (casted to void* to enable compilation in standard C++)
268    * \return Indication whether the event was handled.
269    */
270   GHOST_TSuccess handleKeyEvent(void *eventPtr);
271
272  protected:
273   /**
274    * Initializes the system.
275    * For now, it just registers the window class (WNDCLASS).
276    * \return A success value.
277    */
278   GHOST_TSuccess init();
279
280   /**
281    * Performs the actual cursor position update (location in screen coordinates).
282    * \param x         The x-coordinate of the cursor.
283    * \param y         The y-coordinate of the cursor.
284    * \return          Indication of success.
285    */
286   GHOST_TSuccess setMouseCursorPosition(GHOST_TInt32 x, GHOST_TInt32 y);
287
288   /** Start time at initialization. */
289   GHOST_TUns64 m_start_time;
290
291   /** Event has been processed directly by Cocoa (or NDOF manager)
292    * and has sent a ghost event to be dispatched */
293   bool m_outsideLoopEventProcessed;
294
295   /** Raised window is not yet known by the window manager,
296    * so delay application become active event handling */
297   bool m_needDelayedApplicationBecomeActiveEventProcessing;
298
299   /** State of the modifiers. */
300   GHOST_TUns32 m_modifierMask;
301
302   /** Ignores window size messages (when window is dragged). */
303   bool m_ignoreWindowSizedMessages;
304
305   /** Temporarily ignore momentum scroll events */
306   bool m_ignoreMomentumScroll;
307   /** Is the scroll wheel event generated by a multitouch trackpad or mouse? */
308   bool m_multiTouchScroll;
309 };
310
311 #endif  // __GHOST_SYSTEMCOCOA_H__