Commit of cursor framework. Cursors now defined in source/blender/src/cursors.c and
[blender.git] / intern / ghost / intern / GHOST_WindowX11.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  * @file        GHOST_WindowX11.h
33  * Declaration of GHOST_WindowX11 class.
34  */
35
36 #ifndef _GHOST_WINDOWX11_H_
37 #define _GHOST_WINDOWX11_H_
38
39 #include "GHOST_Window.h"
40 #include <X11/Xlib.h>
41 #include <GL/glx.h>
42
43 #include <map>
44
45 class STR_String;
46 class GHOST_SystemX11;
47
48 /**
49  * X11 implementation of GHOST_IWindow.
50  * Dimensions are given in screen coordinates that are relative to the upper-left corner of the screen. 
51  * @author      Laurence Bourn
52  * @date        October 26, 2001
53  */
54
55 class GHOST_WindowX11 : public GHOST_Window
56 {
57 public:
58         /**
59          * Constructor.
60          * Creates a new window and opens it.
61          * To check if the window was created properly, use the getValid() method.
62          * @param title         The text shown in the title bar of the window.
63          * @param left          The coordinate of the left edge of the window.
64          * @param top           The coordinate of the top edge of the window.
65          * @param width         The width the window.
66          * @param height        The height the window.
67          * @param state         The state the window is initially opened with.
68          * @param type          The type of drawing context installed in this window.
69          * @param stereoVisual  Stereo visual for quad buffered stereo.
70          */
71         GHOST_WindowX11(
72                 GHOST_SystemX11 *system,
73                 Display * display,
74                 const STR_String& title, 
75                 GHOST_TInt32 left,
76                 GHOST_TInt32 top,
77                 GHOST_TUns32 width,     
78                 GHOST_TUns32 height,
79                 GHOST_TWindowState state,
80                 GHOST_TDrawingContextType type = GHOST_kDrawingContextTypeNone,
81                 const bool stereoVisual = false
82         );
83
84                 bool 
85         getValid(
86         ) const;
87
88                 void 
89         setTitle(const STR_String& title);
90
91                 void 
92         getTitle(
93                 STR_String& title
94         ) const;
95
96                 void 
97         getWindowBounds(
98                 GHOST_Rect& bounds
99         ) const;
100         
101                 void 
102         getClientBounds(
103                 GHOST_Rect& bounds
104         ) const;
105
106                 GHOST_TSuccess 
107         setClientWidth(
108                 GHOST_TUns32 width
109         );
110
111                 GHOST_TSuccess 
112         setClientHeight(
113                 GHOST_TUns32 height
114         );
115
116                 GHOST_TSuccess 
117         setClientSize(
118                 GHOST_TUns32 width,
119                 GHOST_TUns32 height
120         );
121
122                 void 
123         screenToClient(
124                 GHOST_TInt32 inX,
125                 GHOST_TInt32 inY,
126                 GHOST_TInt32& outX,
127                 GHOST_TInt32& outY
128         ) const;
129
130                 void 
131         clientToScreen(
132                 GHOST_TInt32 inX,
133                 GHOST_TInt32 inY,
134                 GHOST_TInt32& outX,
135                 GHOST_TInt32& outY
136         ) const;
137         
138                 GHOST_TWindowState 
139         getState(
140         ) const ;
141
142                 GHOST_TSuccess 
143         setState(
144                 GHOST_TWindowState state
145         );
146         
147                 GHOST_TSuccess 
148         setOrder(
149                 GHOST_TWindowOrder order
150         );
151         
152                 GHOST_TSuccess 
153         swapBuffers(
154         );
155         
156                 GHOST_TSuccess 
157         activateDrawingContext(
158         );
159                 GHOST_TSuccess 
160         invalidate(
161         );
162
163         /**
164          * Destructor.
165          * Closes the window and disposes resources allocated.
166          */
167          ~GHOST_WindowX11();
168
169         /**
170          * @section 
171          * X11 system specific calls.
172          */
173
174         /**
175          * The reverse of invalidate! Tells this window
176          * that all events for it have been pushed into
177          * the GHOST event queue.
178          */
179
180                 void
181         validate(
182         );      
183
184         /**     
185          * Return a handle to the x11 window type.
186          */
187                 Window 
188         getXWindow(
189         );      
190
191 protected:
192         /**
193          * Tries to install a rendering context in this window.
194          * @param type  The type of rendering context installed.
195          * @return Indication as to whether installation has succeeded.
196          */
197                 GHOST_TSuccess 
198         installDrawingContext(
199                 GHOST_TDrawingContextType type
200         );
201
202         /**
203          * Removes the current drawing context.
204          * @return Indication as to whether removal has succeeded.
205          */
206                 GHOST_TSuccess 
207         removeDrawingContext(
208         );
209
210         /**
211          * Sets the cursor visibility on the window using
212          * native window system calls.
213          */
214                 GHOST_TSuccess 
215         setWindowCursorVisibility(
216                 bool visible
217         );
218         
219         /**
220          * Sets the cursor shape on the window using
221          * native window system calls.
222          */
223                 GHOST_TSuccess 
224         setWindowCursorShape(
225                 GHOST_TStandardCursor shape
226         );
227
228         /**
229          * Sets the cursor shape on the window using
230          * native window system calls.
231          */
232                 GHOST_TSuccess
233         setWindowCustomCursorShape(
234                 GHOST_TUns8 bitmap[16][2], 
235                 GHOST_TUns8 mask[16][2], 
236                 int hotX, 
237                 int hotY
238         );
239         
240         /**
241          * Sets the cursor shape on the window using
242          * native window system calls (Arbitrary size/color).
243          */
244                 GHOST_TSuccess
245         setWindowCustomCursorShape(
246                 GHOST_TUns8 *bitmap, 
247                 GHOST_TUns8 *mask, 
248                 int sizex, 
249                 int sizey,
250                 int hotX, 
251                 int hotY,
252                 int fg_color, 
253                 int bg_color
254         );
255
256 private :
257
258         /// Force use of public constructor.
259         
260         GHOST_WindowX11(
261         );
262
263         GHOST_WindowX11(
264                 const GHOST_WindowX11 &
265         );
266
267                 Cursor
268         getStandardCursor(
269                 GHOST_TStandardCursor g_cursor
270         );
271         
272                 Cursor 
273         getEmptyCursor(
274         );
275         
276         GLXContext      m_context;
277         Window  m_window;
278         Display         *m_display;
279         XVisualInfo     *m_visual;
280
281         /** The first created OpenGL context (for sharing display lists) */
282         static GLXContext s_firstContext;
283
284         /// A pointer to the typed system class.
285         
286         GHOST_SystemX11 * m_system;
287
288         bool m_valid_setup;
289
290         /** Used to concatenate calls to invalidate() on this window. */
291         bool m_invalid_window;
292
293         /** XCursor structure of an empty (blank) cursor */
294         Cursor m_empty_cursor;
295         
296         /** XCursor structure of the custom cursor */
297         Cursor m_custom_cursor;
298         
299         /** Cache of XC_* ID's to XCursor structures */
300         std::map<unsigned int, Cursor> m_standard_cursors;
301 };
302
303
304 #endif // _GHOST_WINDOWX11_H_
305