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