ClangFormat: apply to source, most of intern
[blender.git] / intern / ghost / intern / GHOST_System.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_System class.
23  */
24
25 #ifndef __GHOST_SYSTEM_H__
26 #define __GHOST_SYSTEM_H__
27
28 #include "GHOST_ISystem.h"
29
30 #include "GHOST_Debug.h"
31 #include "GHOST_Buttons.h"
32 #include "GHOST_ModifierKeys.h"
33 #include "GHOST_EventManager.h"
34 #ifdef GHOST_DEBUG
35 #  include "GHOST_EventPrinter.h"
36 #endif  // GHOST_DEBUG
37
38 class GHOST_DisplayManager;
39 class GHOST_Event;
40 class GHOST_TimerManager;
41 class GHOST_Window;
42 class GHOST_WindowManager;
43 #ifdef WITH_INPUT_NDOF
44 class GHOST_NDOFManager;
45 #endif
46
47 /**
48  * Implementation of platform independent functionality of the GHOST_ISystem
49  * interface.
50  * GHOST_System is an abstract class because not all methods of GHOST_ISystem
51  * are implemented.
52  * \see GHOST_ISystem.
53  */
54 class GHOST_System : public GHOST_ISystem {
55  protected:
56   /**
57    * Constructor.
58    * Protected default constructor to force use of static createSystem member.
59    */
60   GHOST_System();
61
62   /**
63    * Destructor.
64    * Protected default constructor to force use of static dispose member.
65    */
66   virtual ~GHOST_System();
67
68  public:
69   /***************************************************************************************
70    * Time(r) functionality
71    ***************************************************************************************/
72
73   /**
74    * Returns the system time.
75    * Returns the number of milliseconds since the start of the system process.
76    * Based on ANSI clock() routine.
77    * \return The number of milliseconds.
78    */
79   virtual GHOST_TUns64 getMilliSeconds() const;
80
81   /**
82    * Installs a timer.
83    * Note that, on most operating systems, messages need to be processed in order
84    * for the timer callbacks to be invoked.
85    * \param delay     The time to wait for the first call to the timerProc (in milliseconds)
86    * \param interval  The interval between calls to the timerProc
87    * \param timerProc The callback invoked when the interval expires,
88    * \param userData  Placeholder for user data.
89    * \return A timer task (0 if timer task installation failed).
90    */
91   GHOST_ITimerTask *installTimer(GHOST_TUns64 delay,
92                                  GHOST_TUns64 interval,
93                                  GHOST_TimerProcPtr timerProc,
94                                  GHOST_TUserDataPtr userData = NULL);
95
96   /**
97    * Removes a timer.
98    * \param timerTask Timer task to be removed.
99    * \return Indication of success.
100    */
101   GHOST_TSuccess removeTimer(GHOST_ITimerTask *timerTask);
102
103   /***************************************************************************************
104    * Display/window management functionality
105    ***************************************************************************************/
106
107   /**
108    * Inherited from GHOST_ISystem but left pure virtual
109    *
110    * virtual  GHOST_TUns8 getNumDisplays() const = 0;
111    * virtual void getMainDisplayDimensions(...) const = 0;
112    * virtual GHOST_IWindow* createWindow(..)
113    */
114
115   /**
116    * Dispose a window.
117    * \param   window Pointer to the window to be disposed.
118    * \return  Indication of success.
119    */
120   GHOST_TSuccess disposeWindow(GHOST_IWindow *window);
121
122   /**
123    * Returns whether a window is valid.
124    * \param   window Pointer to the window to be checked.
125    * \return  Indication of validity.
126    */
127   bool validWindow(GHOST_IWindow *window);
128
129   /**
130    * Begins full screen mode.
131    * \param setting   The new setting of the display.
132    * \param window    Window displayed in full screen.
133    * \param stereoVisual  Stereo visual for quad buffered stereo.
134    * This window is invalid after full screen has been ended.
135    * \return  Indication of success.
136    */
137   GHOST_TSuccess beginFullScreen(const GHOST_DisplaySetting &setting,
138                                  GHOST_IWindow **window,
139                                  const bool stereoVisual,
140                                  const bool alphaBackground,
141                                  const GHOST_TUns16 numOfAASamples = 0);
142
143   /**
144    * Updates the resolution while in fullscreen mode.
145    * \param setting   The new setting of the display.
146    * \param window    Window displayed in full screen.
147    *
148    * \return  Indication of success.
149    */
150   GHOST_TSuccess updateFullScreen(const GHOST_DisplaySetting &setting, GHOST_IWindow **window);
151
152   /**
153    * Ends full screen mode.
154    * \return  Indication of success.
155    */
156   GHOST_TSuccess endFullScreen(void);
157
158   /**
159    * Returns current full screen mode status.
160    * \return The current status.
161    */
162   bool getFullScreen(void);
163
164   /**
165    * Native pixel size support (MacBook 'retina').
166    * \return The pixel size in float.
167    */
168   bool useNativePixel(void);
169   bool m_nativePixel;
170
171   /**
172    * Focus window after opening, or put them in the background.
173    */
174   void useWindowFocus(const bool use_focus);
175   bool m_windowFocus;
176
177   /***************************************************************************************
178    * Event management functionality
179    ***************************************************************************************/
180
181   /**
182    * Inherited from GHOST_ISystem but left pure virtual
183    *
184    * virtual bool processEvents(bool waitForEvent) = 0;
185    */
186
187   /**
188    * Dispatches all the events on the stack.
189    * The event stack will be empty afterwards.
190    */
191   void dispatchEvents();
192
193   /**
194    * Adds the given event consumer to our list.
195    * \param consumer The event consumer to add.
196    * \return Indication of success.
197    */
198   GHOST_TSuccess addEventConsumer(GHOST_IEventConsumer *consumer);
199
200   /**
201    * Remove the given event consumer to our list.
202    * \param consumer The event consumer to remove.
203    * \return Indication of success.
204    */
205   GHOST_TSuccess removeEventConsumer(GHOST_IEventConsumer *consumer);
206
207   /***************************************************************************************
208    * Cursor management functionality
209    ***************************************************************************************/
210
211   /**
212    * Inherited from GHOST_ISystem but left pure virtual
213    * <pre>
214    * GHOST_TSuccess getCursorPosition(GHOST_TInt32& x, GHOST_TInt32& y) const = 0;
215    * GHOST_TSuccess setCursorPosition(GHOST_TInt32 x, GHOST_TInt32 y)
216    * </pre>
217    */
218
219   /***************************************************************************************
220    * Access to mouse button and keyboard states.
221    ***************************************************************************************/
222
223   /**
224    * Returns the state of a modifier key (ouside the message queue).
225    * \param mask      The modifier key state to retrieve.
226    * \param isDown    The state of a modifier key (true == pressed).
227    * \return          Indication of success.
228    */
229   GHOST_TSuccess getModifierKeyState(GHOST_TModifierKeyMask mask, bool &isDown) const;
230
231   /**
232    * Returns the state of a mouse button (ouside the message queue).
233    * \param mask      The button state to retrieve.
234    * \param isDown    Button state.
235    * \return          Indication of success.
236    */
237   GHOST_TSuccess getButtonState(GHOST_TButtonMask mask, bool &isDown) const;
238
239   /**
240    * Set which tablet API to use. Only affects Windows, other platforms have a single API.
241    * \param api Enum indicating which API to use.
242    */
243   void setTabletAPI(GHOST_TTabletAPI api);
244   GHOST_TTabletAPI getTabletAPI(void);
245
246 #ifdef WITH_INPUT_NDOF
247   /***************************************************************************************
248    * Access to 3D mouse.
249    ***************************************************************************************/
250
251   /**
252    * Sets 3D mouse deadzone
253    * \param deadzone: Deadzone of the 3D mouse (both for rotation and pan) relative to full range
254    */
255   void setNDOFDeadZone(float deadzone);
256 #endif
257
258   /***************************************************************************************
259    * Other (internal) functionality.
260    ***************************************************************************************/
261
262   /**
263    * Pushes an event on the stack.
264    * To dispatch it, call dispatchEvent() or dispatchEvents().
265    * Do not delete the event!
266    * \param event The event to push on the stack.
267    */
268   GHOST_TSuccess pushEvent(GHOST_IEvent *event);
269
270   /**
271    * \return The timer manager.
272    */
273   inline GHOST_TimerManager *getTimerManager() const;
274
275   /**
276    * \return A pointer to our event manager.
277    */
278   inline GHOST_EventManager *getEventManager() const;
279
280   /**
281    * \return A pointer to our window manager.
282    */
283   inline GHOST_WindowManager *getWindowManager() const;
284
285 #ifdef WITH_INPUT_NDOF
286   /**
287    * \return A pointer to our n-degree of freedom manager.
288    */
289   inline GHOST_NDOFManager *getNDOFManager() const;
290 #endif
291
292   /**
293    * Returns the state of all modifier keys.
294    * \param keys  The state of all modifier keys (true == pressed).
295    * \return      Indication of success.
296    */
297   virtual GHOST_TSuccess getModifierKeys(GHOST_ModifierKeys &keys) const = 0;
298
299   /**
300    * Returns the state of the mouse buttons (ouside the message queue).
301    * \param buttons   The state of the buttons.
302    * \return          Indication of success.
303    */
304   virtual GHOST_TSuccess getButtons(GHOST_Buttons &buttons) const = 0;
305
306   /**
307    * Returns the selection buffer
308    * \param selection     Only used on X11
309    * \return              Returns the clipboard data
310    *
311    */
312   virtual GHOST_TUns8 *getClipboard(bool selection) const = 0;
313
314   /**
315    * Put data to the Clipboard
316    * \param buffer        The buffer to copy to the clipboard
317    * \param selection The clipboard to copy too only used on X11
318    */
319   virtual void putClipboard(GHOST_TInt8 *buffer, bool selection) const = 0;
320
321   /**
322    * Confirms quitting he program when there is just one window left open
323    * in the application
324    */
325   virtual int confirmQuit(GHOST_IWindow *window) const;
326
327   /**
328    * Informs if the system provides native dialogs (eg. confirm quit)
329    */
330   virtual bool supportsNativeDialogs(void);
331
332  protected:
333   /**
334    * Initialize the system.
335    * \return Indication of success.
336    */
337   virtual GHOST_TSuccess init();
338
339   /**
340    * Shut the system down.
341    * \return Indication of success.
342    */
343   virtual GHOST_TSuccess exit();
344
345   /**
346    * Creates a fullscreen window.
347    * \param window The window created.
348    * \return Indication of success.
349    */
350   GHOST_TSuccess createFullScreenWindow(GHOST_Window **window,
351                                         const GHOST_DisplaySetting &settings,
352                                         const bool stereoVisual,
353                                         const bool alphaBackground = 0,
354                                         const GHOST_TUns16 numOfAASamples = 0);
355
356   /** The display manager (platform dependent). */
357   GHOST_DisplayManager *m_displayManager;
358
359   /** The timer manager. */
360   GHOST_TimerManager *m_timerManager;
361
362   /** The window manager. */
363   GHOST_WindowManager *m_windowManager;
364
365   /** The event manager. */
366   GHOST_EventManager *m_eventManager;
367
368 #ifdef WITH_INPUT_NDOF
369   /** The N-degree of freedom device manager */
370   GHOST_NDOFManager *m_ndofManager;
371 #endif
372
373   /** Prints all the events. */
374 #ifdef GHOST_DEBUG
375   GHOST_EventPrinter *m_eventPrinter;
376 #endif  // GHOST_DEBUG
377
378   /** Settings of the display before the display went fullscreen. */
379   GHOST_DisplaySetting m_preFullScreenSetting;
380
381   /** Which tablet API to use. */
382   GHOST_TTabletAPI m_tabletAPI;
383 };
384
385 inline GHOST_TimerManager *GHOST_System::getTimerManager() const
386 {
387   return m_timerManager;
388 }
389
390 inline GHOST_EventManager *GHOST_System::getEventManager() const
391 {
392   return m_eventManager;
393 }
394
395 inline GHOST_WindowManager *GHOST_System::getWindowManager() const
396 {
397   return m_windowManager;
398 }
399
400 #ifdef WITH_INPUT_NDOF
401 inline GHOST_NDOFManager *GHOST_System::getNDOFManager() const
402 {
403   return m_ndofManager;
404 }
405 #endif
406
407 #endif  // __GHOST_SYSTEM_H__