Ghost Context Refactor
[blender-staging.git] / intern / ghost / intern / GHOST_WindowX11.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_WindowX11.h
29  *  \ingroup GHOST
30  * Declaration of GHOST_WindowX11 class.
31  */
32
33 #ifndef __GHOST_WINDOWX11_H__
34 #define __GHOST_WINDOWX11_H__
35
36 #include "GHOST_Window.h"
37 #include <X11/Xlib.h>
38 // For tablets
39 #ifdef WITH_X11_XINPUT
40 #  include <X11/extensions/XInput.h>
41 #endif
42
43 #include <map>
44
45 class STR_String;
46 class GHOST_SystemX11;
47
48 #ifdef WITH_XDND
49 class GHOST_DropTargetX11;
50 #endif
51
52 /**
53  * X11 implementation of GHOST_IWindow.
54  * Dimensions are given in screen coordinates that are relative to the upper-left corner of the screen. 
55  * \author      Laurence Bourn
56  * \date        October 26, 2001
57  */
58
59 class GHOST_WindowX11 : public GHOST_Window
60 {
61 public:
62         /**
63          * Constructor.
64          * Creates a new window and opens it.
65          * To check if the window was created properly, use the getValid() method.
66          * \param title         The text shown in the title bar of the window.
67          * \param left          The coordinate of the left edge of the window.
68          * \param top           The coordinate of the top edge of the window.
69          * \param width         The width the window.
70          * \param height        The height the window.
71          * \param state         The state the window is initially opened with.
72          * \param parentWindow  Parent (embedder) window
73          * \param type          The type of drawing context installed in this window.
74          * \param stereoVisual  Stereo visual for quad buffered stereo.
75          * \param numOfAASamples        Number of samples used for AA (zero if no AA)
76          */
77         GHOST_WindowX11(
78             GHOST_SystemX11 *system,
79             Display *display,
80             const STR_String& title,
81             GHOST_TInt32 left,
82             GHOST_TInt32 top,
83             GHOST_TUns32 width,
84             GHOST_TUns32 height,
85             GHOST_TWindowState state,
86             const GHOST_TEmbedderWindowID parentWindow,
87             GHOST_TDrawingContextType type = GHOST_kDrawingContextTypeNone,
88             const bool stereoVisual = false,
89             const bool exclusive = false,
90             const GHOST_TUns16 numOfAASamples = 0
91             );
92
93         bool
94         getValid(
95             ) const;
96
97         void
98         setTitle(const STR_String& title);
99
100         void
101         getTitle(
102             STR_String& title
103             ) const;
104
105         void
106         getWindowBounds(
107             GHOST_Rect& bounds
108             ) const;
109         
110         void
111         getClientBounds(
112             GHOST_Rect& bounds
113             ) const;
114
115         GHOST_TSuccess
116         setClientWidth(
117             GHOST_TUns32 width
118             );
119
120         GHOST_TSuccess
121         setClientHeight(
122             GHOST_TUns32 height
123             );
124
125         GHOST_TSuccess
126         setClientSize(
127             GHOST_TUns32 width,
128             GHOST_TUns32 height
129             );
130
131         void
132         screenToClient(
133             GHOST_TInt32 inX,
134             GHOST_TInt32 inY,
135             GHOST_TInt32& outX,
136             GHOST_TInt32& outY
137             ) const;
138
139         void
140         clientToScreen(
141             GHOST_TInt32 inX,
142             GHOST_TInt32 inY,
143             GHOST_TInt32& outX,
144             GHOST_TInt32& outY
145             ) const;
146         
147         GHOST_TWindowState
148         getState(
149             ) const;
150
151         GHOST_TSuccess
152         setState(
153             GHOST_TWindowState state
154             );
155         
156         GHOST_TSuccess
157         setOrder(
158             GHOST_TWindowOrder order
159             );
160         
161         GHOST_TSuccess
162         invalidate(
163             );
164
165         /**
166          * Destructor.
167          * Closes the window and disposes resources allocated.
168          */
169         ~GHOST_WindowX11();
170
171         /**
172          * \section x11specific X11 system specific calls
173          */
174
175         /**
176          * The reverse of invalidate! Tells this window
177          * that all events for it have been pushed into
178          * the GHOST event queue.
179          */
180
181         void
182         validate(
183             );
184
185         /**     
186          * Return a handle to the x11 window type.
187          */
188         Window
189         getXWindow(
190             );
191 #ifdef WITH_X11_XINPUT
192         GHOST_TabletData *GetTabletData()
193         {
194                 return &m_tabletData;
195         }
196 #else // WITH_X11_XINPUT
197         const GHOST_TabletData *GetTabletData()
198         {
199                 return NULL;
200         }
201 #endif // WITH_X11_XINPUT
202
203 #if defined(WITH_X11_XINPUT) && defined(X_HAVE_UTF8_STRING)
204         XIC getX11_XIC() {
205                 return m_xic;
206         }
207
208         bool createX11_XIC();
209 #endif
210
211 #ifdef WITH_XDND
212         GHOST_DropTargetX11 *getDropTarget()
213         {
214                 return m_dropTarget;
215         }
216 #endif
217
218         /*
219          * Need this in case that we want start the window
220          * in FullScree or Maximized state.
221          * Check GHOST_WindowX11.cpp
222          */
223         bool m_post_init;
224         GHOST_TWindowState m_post_state;
225
226         GHOST_TSuccess beginFullScreen() const;
227
228         GHOST_TSuccess endFullScreen() const;
229
230 protected:
231         /**
232          * \param type  The type of rendering context create.
233          * \return Indication of success.
234          */
235         virtual GHOST_Context *newDrawingContext(GHOST_TDrawingContextType type);
236
237         /**
238          * Sets the cursor visibility on the window using
239          * native window system calls.
240          */
241         GHOST_TSuccess
242         setWindowCursorVisibility(
243             bool visible
244             );
245         
246         /**
247          * Sets the cursor grab on the window using
248          * native window system calls.
249          * \param warp  Only used when grab is enabled, hides the mouse and allows dragging outside the screen.
250          */
251         GHOST_TSuccess
252         setWindowCursorGrab(
253             GHOST_TGrabCursorMode mode
254             );
255
256         GHOST_TGrabCursorMode
257         getWindowCursorGrab() const;
258
259         /**
260          * Sets the cursor shape on the window using
261          * native window system calls.
262          */
263         GHOST_TSuccess
264         setWindowCursorShape(
265             GHOST_TStandardCursor shape
266             );
267
268         /**
269          * Sets the cursor shape on the window using
270          * native window system calls.
271          */
272         GHOST_TSuccess
273         setWindowCustomCursorShape(
274             GHOST_TUns8 bitmap[16][2],
275             GHOST_TUns8 mask[16][2],
276             int hotX,
277             int hotY
278             );
279         
280         /**
281          * Sets the cursor shape on the window using
282          * native window system calls (Arbitrary size/color).
283          */
284         GHOST_TSuccess
285         setWindowCustomCursorShape(
286             GHOST_TUns8 *bitmap,
287             GHOST_TUns8 *mask,
288             int sizex,
289             int sizey,
290             int hotX,
291             int hotY,
292             int fg_color,
293             int bg_color
294             );
295
296 private:
297
298         /// Force use of public constructor.
299         
300         GHOST_WindowX11(
301             );
302
303         GHOST_WindowX11(
304             const GHOST_WindowX11 &
305             );
306
307         Cursor
308         getStandardCursor(
309             GHOST_TStandardCursor g_cursor
310             );
311         
312         Cursor
313         getEmptyCursor(
314             );
315
316 #ifdef WITH_X11_XINPUT
317         void initXInputDevices();
318 #endif
319         
320         Window m_window;
321         Display *m_display;
322         GHOST_TWindowState m_normal_state;
323
324         /** A pointer to the typed system class. */
325         GHOST_SystemX11 *m_system;
326
327         bool m_valid_setup;
328
329         /** Used to concatenate calls to invalidate() on this window. */
330         bool m_invalid_window;
331
332         /** XCursor structure of an empty (blank) cursor */
333         Cursor m_empty_cursor;
334         
335         /** XCursor structure of the custom cursor */
336         Cursor m_custom_cursor;
337
338         /** XCursor to show when cursor is visible */
339         Cursor m_visible_cursor;
340         
341         /** Cache of XC_* ID's to XCursor structures */
342         std::map<unsigned int, Cursor> m_standard_cursors;
343
344 #ifdef WITH_XDND
345         GHOST_DropTargetX11 *m_dropTarget;
346 #endif
347
348 #ifdef WITH_X11_XINPUT
349         GHOST_TabletData m_tabletData;
350 #endif
351
352 #if defined(WITH_X11_XINPUT) && defined(X_HAVE_UTF8_STRING)
353         XIC m_xic;
354 #endif
355
356         void icccmSetState(int state);
357         int icccmGetState() const;
358
359         void netwmMaximized(bool set);
360         bool netwmIsMaximized() const;
361
362         void netwmFullScreen(bool set);
363         bool netwmIsFullScreen() const;
364
365         void motifFullScreen(bool set);
366         bool motifIsFullScreen() const;
367 };
368
369
370 #endif // __GHOST_WINDOWX11_H__