merged 29285:30707 from trunk
[blender.git] / intern / ghost / intern / GHOST_System.h
1 /**
2  * $Id$
3  * ***** BEGIN GPL LICENSE BLOCK *****
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License
7  * as published by the Free Software Foundation; either version 2
8  * of the License, or (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software Foundation,
17  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18  *
19  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
20  * All rights reserved.
21  *
22  * The Original Code is: all of this file.
23  *
24  * Contributor(s): none yet.
25  *
26  * ***** END GPL LICENSE BLOCK *****
27  */
28 /**
29  * @file        GHOST_System.h
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
43 #ifdef GHOST_DEBUG
44 #include "GHOST_EventPrinter.h"
45 #endif // GHOST_DEBUG
46
47 class GHOST_DisplayManager;
48 class GHOST_Event;
49 class GHOST_TimerManager;
50 class GHOST_Window;
51 class GHOST_WindowManager;
52 class GHOST_NDOFManager;
53
54 /**
55  * Implementation of platform independent functionality of the GHOST_ISystem
56  * interface.
57  * GHOST_System is an abstract class because not all methods of GHOST_ISystem
58  * are implemented.
59  * @see GHOST_ISystem.
60  * @author      Maarten Gribnau
61  * @date        May 7, 2001
62  */
63 class GHOST_System : public GHOST_ISystem
64 {
65 protected:
66         /**
67          * Constructor.
68          * Protected default constructor to force use of static createSystem member.
69          */
70         GHOST_System();
71
72         /**
73          * Destructor.
74          * Protected default constructor to force use of static dispose member.
75          */
76         virtual ~GHOST_System();
77
78 public:
79         /***************************************************************************************
80          ** Time(r) functionality
81          ***************************************************************************************/
82
83         /**
84          * Returns the system time.
85          * Returns the number of milliseconds since the start of the system process.
86          * Based on ANSI clock() routine.
87          * @return The number of milliseconds.
88          */
89         virtual GHOST_TUns64 getMilliSeconds() const;
90
91         /**
92          * Installs a timer.
93          * Note that, on most operating systems, messages need to be processed in order 
94          * for the timer callbacks to be invoked.
95          * @param delay         The time to wait for the first call to the timerProc (in milliseconds)
96          * @param interval      The interval between calls to the timerProc
97          * @param timerProc     The callback invoked when the interval expires,
98          * @param userData      Placeholder for user data.
99          * @return A timer task (0 if timer task installation failed).
100          */
101         virtual GHOST_ITimerTask* installTimer(GHOST_TUns64 delay, GHOST_TUns64 interval, GHOST_TimerProcPtr timerProc, GHOST_TUserDataPtr userData = 0);
102
103         /**
104          * Removes a timer.
105          * @param timerTask Timer task to be removed.
106          * @return Indication of success.
107          */
108         virtual GHOST_TSuccess removeTimer(GHOST_ITimerTask* timerTask);
109
110         /***************************************************************************************
111          ** Display/window management functionality
112          ***************************************************************************************/
113         
114         /**
115          * Inherited from GHOST_ISystem but left pure virtual
116          *
117          * virtual      GHOST_TUns8 getNumDisplays() const = 0;
118          * virtual void getMainDisplayDimensions(...) const = 0;
119          * virtual GHOST_IWindow* createWindow(..)
120          */
121
122         /**
123          * Dispose a window.
124          * @param       window Pointer to the window to be disposed.
125          * @return      Indication of success.
126          */
127         virtual GHOST_TSuccess disposeWindow(GHOST_IWindow* window);
128
129         /**
130          * Returns whether a window is valid.
131          * @param       window Pointer to the window to be checked.
132          * @return      Indication of validity.
133          */
134         virtual bool validWindow(GHOST_IWindow* window);
135
136         /**
137          * Begins full screen mode.
138          * @param setting       The new setting of the display.
139          * @param window        Window displayed in full screen.
140          * @param stereoVisual  Stereo visual for quad buffered stereo.
141          * This window is invalid after full screen has been ended.
142          * @return      Indication of success.
143          */
144         virtual GHOST_TSuccess beginFullScreen(const GHOST_DisplaySetting& setting, GHOST_IWindow** window,
145                 const bool stereoVisual);
146
147         /**
148          * Ends full screen mode.
149          * @return      Indication of success.
150          */
151         virtual GHOST_TSuccess endFullScreen(void);
152
153         /**
154          * Returns current full screen mode status.
155          * @return The current status.
156          */
157         virtual bool getFullScreen(void);
158
159
160         /***************************************************************************************
161          ** Event management functionality
162          ***************************************************************************************/
163
164         /**
165          * Inherited from GHOST_ISystem but left pure virtual
166          *
167          *      virtual bool processEvents(bool waitForEvent) = 0;
168          */
169
170
171
172         /**
173          * Dispatches all the events on the stack.
174          * The event stack will be empty afterwards.
175          * @return Indication as to whether any of the consumers handled the events.
176          */
177         virtual bool dispatchEvents();
178
179         /**
180          * Adds the given event consumer to our list.
181          * @param consumer The event consumer to add.
182          * @return Indication of success.
183          */
184         virtual GHOST_TSuccess addEventConsumer(GHOST_IEventConsumer* consumer);
185
186
187         /***************************************************************************************
188          ** Cursor management functionality
189          ***************************************************************************************/
190
191         /** Inherited from GHOST_ISystem but left pure virtual
192          *      GHOST_TSuccess getCursorPosition(GHOST_TInt32& x, GHOST_TInt32& y) const = 0;   
193          *  GHOST_TSuccess setCursorPosition(GHOST_TInt32 x, GHOST_TInt32 y)
194          */
195
196         /***************************************************************************************
197          ** Access to mouse button and keyboard states.
198          ***************************************************************************************/
199
200         /**
201          * Returns the state of a modifier key (ouside the message queue).
202          * @param mask          The modifier key state to retrieve.
203          * @param isDown        The state of a modifier key (true == pressed).
204          * @return                      Indication of success.
205          */
206         virtual GHOST_TSuccess getModifierKeyState(GHOST_TModifierKeyMask mask, bool& isDown) const;
207
208         /**
209          * Returns the state of a mouse button (ouside the message queue).
210          * @param mask          The button state to retrieve.
211          * @param isDown        Button state.
212          * @return                      Indication of success.
213          */
214         virtual GHOST_TSuccess getButtonState(GHOST_TButtonMask mask, bool& isDown) const;
215         
216         /***************************************************************************************
217          ** Other (internal) functionality.
218          ***************************************************************************************/
219
220         /**
221          * Pushes an event on the stack.
222          * To dispatch it, call dispatchEvent() or dispatchEvents().
223          * Do not delete the event!
224          * @param event The event to push on the stack.
225          */
226         virtual GHOST_TSuccess pushEvent(GHOST_IEvent* event);
227
228         /**
229          * Returns the timer manager.
230          * @return The timer manager.
231          */
232         inline virtual GHOST_TimerManager* getTimerManager() const;
233
234         /**
235          * Returns a pointer to our event manager.
236          * @return A pointer to our event manager.
237          */
238         virtual inline GHOST_EventManager* getEventManager() const;
239
240         /**
241          * Returns a pointer to our window manager.
242          * @return A pointer to our window manager.
243          */
244         virtual inline GHOST_WindowManager* getWindowManager() const;
245
246         /**
247          * Returns a pointer to our n-degree of freedeom manager.
248          * @return A pointer to our n-degree of freedeom manager.
249          */
250         virtual inline GHOST_NDOFManager* getNDOFManager() const;
251
252         /**
253          * Returns the state of all modifier keys.
254          * @param keys  The state of all modifier keys (true == pressed).
255          * @return              Indication of success.
256          */
257         virtual GHOST_TSuccess getModifierKeys(GHOST_ModifierKeys& keys) const = 0;
258
259         /**
260          * Returns the state of the mouse buttons (ouside the message queue).
261          * @param buttons       The state of the buttons.
262          * @return                      Indication of success.
263          */
264         virtual GHOST_TSuccess getButtons(GHOST_Buttons& buttons) const = 0;
265         
266         /**
267          * Requests input at a certain fidelity. Certain tools want very smooth input, others don't care.
268          * @param hint          Desired fidelity of mouse and pen events.
269          */
270         void setInputFidelity(InputFidelity hint);
271
272         /**
273          * Returns the selection buffer
274          * @param selection             Only used on X11
275          * @return                              Returns the clipboard data
276          *
277          */
278          virtual GHOST_TUns8* getClipboard(bool selection) const = 0;
279           
280           /**
281            * Put data to the Clipboard
282            * @param buffer              The buffer to copy to the clipboard
283            * @param selection   The clipboard to copy too only used on X11
284            */
285           virtual void putClipboard(GHOST_TInt8 *buffer, bool selection) const = 0;
286
287                 /**
288          * Determine the base dir in which shared resources are located. It will first try to use
289          * "unpack and run" path, then look for properly installed path, not including versioning.
290          * @return Unsigned char string pointing to system dir (eg /usr/share/blender/).
291          */
292         virtual const GHOST_TUns8* getSystemDir() const = 0;
293
294         /**
295          * Determine the base dir in which user configuration is stored, not including versioning.
296          * If needed, it will create the base directory.
297          * @return Unsigned char string pointing to user dir (eg ~/.blender/).
298          */
299         virtual const GHOST_TUns8* getUserDir() const = 0;
300
301         /**
302           * Determine the directory of the current binary
303           * @return Unsigned char string pointing to the binary dir
304           */
305          virtual const GHOST_TUns8* getBinaryDir() const = 0;
306 protected:
307         /**
308          * Initialize the system.
309          * @return Indication of success.
310          */
311         virtual GHOST_TSuccess init();
312
313         /**
314          * Shut the system down.
315          * @return Indication of success.
316          */
317         virtual GHOST_TSuccess exit();
318
319         /**
320          * Creates a fullscreen window.
321          * @param window The window created.
322          * @return Indication of success.
323          */
324         virtual GHOST_TSuccess createFullScreenWindow(GHOST_Window** window,
325                 const bool stereoVisual);
326
327         /** The display manager (platform dependant). */
328         GHOST_DisplayManager* m_displayManager;
329
330         /** The timer manager. */
331         GHOST_TimerManager* m_timerManager;
332
333         /** The window manager. */
334         GHOST_WindowManager* m_windowManager;
335
336         /** The event manager. */
337         GHOST_EventManager* m_eventManager;
338
339     /** The N-degree of freedom device manager */
340     GHOST_NDOFManager* m_ndofManager;
341         
342         /** Prints all the events. */
343 #ifdef GHOST_DEBUG
344         GHOST_EventPrinter* m_eventPrinter;
345 #endif // GHOST_DEBUG
346
347         /** Settings of the display before the display went fullscreen. */
348         GHOST_DisplaySetting m_preFullScreenSetting;
349         
350         InputFidelity m_input_fidelity_hint;
351 };
352
353 inline GHOST_TimerManager* GHOST_System::getTimerManager() const
354 {
355         return m_timerManager;
356 }
357
358 inline GHOST_EventManager* GHOST_System::getEventManager() const
359 {
360         return m_eventManager;
361 }
362
363 inline GHOST_WindowManager* GHOST_System::getWindowManager() const
364 {
365         return m_windowManager;
366 }
367
368 inline GHOST_NDOFManager* GHOST_System::getNDOFManager() const
369 {
370         return m_ndofManager;
371 }
372
373 #endif // _GHOST_SYSTEM_H_
374