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