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