Cleanup: strip ghost trailing space
[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          * Event management functionality
128          ***************************************************************************************/
129
130         /**
131          * Gets events from the system and stores them in the queue.
132          * \param waitForEvent Flag to wait for an event (or return immediately).
133          * \return Indication of the presence of events.
134          */
135         bool processEvents(bool waitForEvent);
136
137         /**
138          * Handle User request to quit, from Menu bar Quit, and Cmd+Q
139          * Display alert panel if changes performed since last save
140          */
141         GHOST_TUns8 handleQuitRequest();
142
143         /**
144          * Handle Cocoa openFile event
145          * Display confirmation request panel if changes performed since last save
146          */
147         bool handleOpenDocumentRequest(void *filepathStr);
148
149         /**
150          * Handles a drag'n'drop destination event. Called by GHOST_WindowCocoa window subclass
151          * \param eventType The type of drag'n'drop event
152          * \param draggedObjectType The type object concerned (currently array of file names, string, TIFF image)
153          * \param mouseX x mouse coordinate (in cocoa base window coordinates)
154          * \param mouseY y mouse coordinate
155          * \param window The window on which the event occurred
156          * \return Indication whether the event was handled.
157          */
158         GHOST_TSuccess handleDraggingEvent(GHOST_TEventType eventType, GHOST_TDragnDropTypes draggedObjectType,
159                                            GHOST_WindowCocoa *window, int mouseX, int mouseY, void *data);
160
161         /***************************************************************************************
162          * Cursor management functionality
163          ***************************************************************************************/
164
165         /**
166          * Returns the current location of the cursor (location in screen coordinates)
167          * \param x                     The x-coordinate of the cursor.
168          * \param y                     The y-coordinate of the cursor.
169          * \return                      Indication of success.
170          */
171         GHOST_TSuccess getCursorPosition(GHOST_TInt32& x, GHOST_TInt32& y) const;
172
173         /**
174          * Updates the location of the cursor (location in screen coordinates).
175          * \param x                     The x-coordinate of the cursor.
176          * \param y                     The y-coordinate of the cursor.
177          * \return                      Indication of success.
178          */
179         GHOST_TSuccess setCursorPosition(GHOST_TInt32 x, GHOST_TInt32 y);
180
181         /***************************************************************************************
182          * Access to mouse button and keyboard states.
183          ***************************************************************************************/
184
185         /**
186          * Returns the state of all modifier keys.
187          * \param keys  The state of all modifier keys (true == pressed).
188          * \return              Indication of success.
189          */
190         GHOST_TSuccess getModifierKeys(GHOST_ModifierKeys& keys) const;
191
192         /**
193          * Returns the state of the mouse buttons (ouside the message queue).
194          * \param buttons       The state of the buttons.
195          * \return                      Indication of success.
196          */
197         GHOST_TSuccess getButtons(GHOST_Buttons& buttons) const;
198
199         /**
200          * Returns Clipboard data
201          * \param selection             Indicate which buffer to return
202          * \return                              Returns the selected buffer
203          */
204         GHOST_TUns8 *getClipboard(bool selection) const;
205
206         /**
207          * Puts buffer to system clipboard
208          * \param buffer        The buffer to be copied
209          * \param selection     Indicates which buffer to copy too, only used on X11
210          */
211         void putClipboard(GHOST_TInt8 *buffer, bool selection) const;
212
213         /**
214          * Handles a window event. Called by GHOST_WindowCocoa window delegate
215          * \param eventType The type of window event
216          * \param window The window on which the event occurred
217          * \return Indication whether the event was handled.
218          */
219         GHOST_TSuccess handleWindowEvent(GHOST_TEventType eventType, GHOST_WindowCocoa *window);
220
221         /**
222          * Handles the Cocoa event telling the application has become active (again)
223          * \return Indication whether the event was handled.
224          */
225         GHOST_TSuccess handleApplicationBecomeActiveEvent();
226
227         /**
228          * External objects should call this when they send an event outside processEvents.
229          */
230         void notifyExternalEventProcessed();
231
232         /**
233          * \see GHOST_ISystem
234          */
235         int toggleConsole(int action) {
236                 return 0;
237         }
238
239         /**
240          * Handles a tablet event.
241          * \param eventPtr      An NSEvent pointer (casted to void* to enable compilation in standard C++)
242          * \param eventType The type of the event.
243          * It needs to be passed separately as it can be either directly in the event type,
244          * or as a subtype if combined with a mouse button event.
245          * \return Indication whether the event was handled.
246          */
247         GHOST_TSuccess handleTabletEvent(void *eventPtr, short eventType);
248         bool handleTabletEvent(void *eventPtr);
249
250         /**
251          * Handles a mouse event.
252          * \param eventPtr      An NSEvent pointer (casted to void* to enable compilation in standard C++)
253          * \return Indication whether the event was handled.
254          */
255         GHOST_TSuccess handleMouseEvent(void *eventPtr);
256
257         /**
258          * Handles a key event.
259          * \param eventPtr      An NSEvent pointer (casted to void* to enable compilation in standard C++)
260          * \return Indication whether the event was handled.
261          */
262         GHOST_TSuccess handleKeyEvent(void *eventPtr);
263
264         /**
265          * Informs if the system provides native dialogs (eg. confirm quit)
266          */
267         virtual bool supportsNativeDialogs(void);
268
269 protected:
270         /**
271          * Initializes the system.
272          * For now, it just registers the window class (WNDCLASS).
273          * \return A success value.
274          */
275         GHOST_TSuccess init();
276
277         /**
278          * Performs the actual cursor position update (location in screen coordinates).
279          * \param x                     The x-coordinate of the cursor.
280          * \param y                     The y-coordinate of the cursor.
281          * \return                      Indication of success.
282          */
283         GHOST_TSuccess setMouseCursorPosition(GHOST_TInt32 x, GHOST_TInt32 y);
284
285         /** Start time at initialization. */
286         GHOST_TUns64 m_start_time;
287
288         /** Event has been processed directly by Cocoa (or NDOF manager) and has sent a ghost event to be dispatched */
289         bool m_outsideLoopEventProcessed;
290
291         /** Raised window is not yet known by the window manager, so delay application become active event handling */
292         bool m_needDelayedApplicationBecomeActiveEventProcessing;
293
294         /** State of the modifiers. */
295         GHOST_TUns32 m_modifierMask;
296
297         /** Ignores window size messages (when window is dragged). */
298         bool m_ignoreWindowSizedMessages;
299
300         /** Temporarily ignore momentum scroll events */
301         bool m_ignoreMomentumScroll;
302         /** Is the scroll wheel event generated by a multitouch trackpad or mouse? */
303         bool m_multiTouchScroll;
304 };
305
306 #endif // __GHOST_SYSTEMCOCOA_H__
307