Initial revision
[blender.git] / intern / ghost / intern / GHOST_SystemX11.h
1 /**
2  * $Id$
3  * ***** BEGIN GPL/BL DUAL 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. The Blender
9  * Foundation also sells licenses for use in proprietary software under
10  * the Blender License.  See http://www.blender.org/BL/ for information
11  * about this.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software Foundation,
20  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
21  *
22  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
23  * All rights reserved.
24  *
25  * The Original Code is: all of this file.
26  *
27  * Contributor(s): none yet.
28  *
29  * ***** END GPL/BL DUAL LICENSE BLOCK *****
30  */
31
32 /**
33
34  * $Id$
35  * Copyright (C) 2001 NaN Technologies B.V.
36  * @author      Maarten Gribnau
37  * @date        May 10, 2001
38  */
39
40 #ifndef _GHOST_SYSTEM_X11_H_
41 #define _GHOST_SYSTEM_X11_H_
42
43 #include "GHOST_System.h"
44 #include "../GHOST_Types.h"
45
46 #include <X11/Xlib.h>
47 #include <GL/glx.h>
48
49 class GHOST_WindowX11;
50
51 /**
52  * X11 Implementation of GHOST_System class.
53  * @see GHOST_System.
54  * @author      Laurence Bourn
55  * @date        October 26, 2001
56  */
57
58 class GHOST_SystemX11 : public GHOST_System {
59 public:
60
61         /**
62          * Constructor
63          * this class should only be instanciated by GHOST_ISystem.
64          */
65
66         GHOST_SystemX11(
67         );
68         
69                 GHOST_TSuccess 
70         init(
71         );
72
73
74         /**
75          * @section Interface Inherited from GHOST_ISystem 
76          */
77
78         /**
79          * Returns the system time.
80          * Returns the number of milliseconds since the start of the system process.
81          * @return The number of milliseconds.
82          */
83                 GHOST_TUns64 
84         getMilliSeconds(
85         ) const;
86         
87
88         /**
89          * Returns the number of displays on this system.
90          * @return The number of displays.
91          */
92                 GHOST_TUns8 
93         getNumDisplays(
94         ) const;
95
96         /**
97          * Returns the dimensions of the main display on this system.
98          * @return The dimension of the main display.
99          */
100                 void 
101         getMainDisplayDimensions(
102                 GHOST_TUns32& width,
103                 GHOST_TUns32& height
104         ) const;
105
106         /**
107          * Create a new window.
108          * The new window is added to the list of windows managed. 
109          * Never explicitly delete the window, use disposeWindow() instead.
110          * @param       title   The name of the window (displayed in the title bar of the window if the OS supports it).
111          * @param       left            The coordinate of the left edge of the window.
112          * @param       top             The coordinate of the top edge of the window.
113          * @param       width           The width the window.
114          * @param       height          The height the window.
115          * @param       state           The state of the window when opened.
116          * @param       type            The type of drawing context installed in this window.
117          * @param       stereoVisual    Create a stereo visual for quad buffered stereo.
118          * @return      The new window (or 0 if creation failed).
119          */
120                 GHOST_IWindow* 
121         createWindow(
122                 const STR_String& title,
123                 GHOST_TInt32 left,
124                 GHOST_TInt32 top,
125                 GHOST_TUns32 width,
126                 GHOST_TUns32 height,
127                 GHOST_TWindowState state,
128                 GHOST_TDrawingContextType type,
129                 const bool stereoVisual
130         );
131          
132         /**
133          * @section Interface Inherited from GHOST_ISystem 
134          */
135
136         /**
137          * Retrieves events from the system and stores them in the queue.
138          * @param waitForEvent Flag to wait for an event (or return immediately).
139          * @return Indication of the presence of events.
140          */
141                 bool 
142         processEvents(
143                 bool waitForEvent
144         );
145
146         /**
147          * @section Interface Inherited from GHOST_System 
148          */
149                 GHOST_TSuccess 
150         getCursorPosition(
151                 GHOST_TInt32& x,
152                 GHOST_TInt32& y
153         ) const;
154         
155                 GHOST_TSuccess 
156         setCursorPosition(
157                 GHOST_TInt32 x,
158                 GHOST_TInt32 y
159         ) const;
160
161         /**
162          * Returns the state of all modifier keys.
163          * @param keys  The state of all modifier keys (true == pressed).
164          * @return              Indication of success.
165          */
166                 GHOST_TSuccess 
167         getModifierKeys(
168                 GHOST_ModifierKeys& keys
169         ) const ;
170
171         /**
172          * Returns the state of the mouse buttons (ouside the message queue).
173          * @param buttons       The state of the buttons.
174          * @return                      Indication of success.
175          */
176                 GHOST_TSuccess 
177         getButtons(
178                 GHOST_Buttons& buttons
179         ) const;
180
181         /**
182          * @section
183          * Flag a window as dirty. This will
184          * generate a GHOST window update event on a call to processEvents() 
185          */
186
187                 void
188         addDirtyWindow(
189                 GHOST_WindowX11 * bad_wind
190         );
191   
192  
193         /**
194          * return a pointer to the X11 display structure
195          */
196
197                 Display *
198         getXDisplay(
199         ) {
200                 return m_display;
201         }       
202
203         
204 private :
205
206         Display * m_display;
207
208         /**
209          * Atom used to detect window close events
210          */
211         Atom m_delete_window_atom;
212
213         /// The vector of windows that need to be updated.
214         std::vector<GHOST_WindowX11 *> m_dirty_windows;
215
216         /// Start time at initialization.
217         GHOST_TUns64 m_start_time;
218
219         /// A vector of keyboard key masks
220         char *m_keyboard_vector;
221
222         /**
223          * Return the ghost window associated with the
224          * X11 window xwind
225          */
226
227                 GHOST_WindowX11 * 
228         findGhostWindow(
229                 Window xwind
230         ) const ;
231
232                 void
233         processEvent(
234                 XEvent *xe
235         );
236
237                 bool
238         generateWindowExposeEvents(
239         );
240  
241                 GHOST_TKey
242         convertXKey(
243                 unsigned int key
244         );
245
246 };
247
248 #endif
249
250
251
252