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