doxygen: add newline after \file
[blender.git] / intern / ghost / intern / GHOST_WindowX11.h
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  *
16  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
17  * All rights reserved.
18  */
19
20 /** \file
21  * \ingroup GHOST
22  * Declaration of GHOST_WindowX11 class.
23  */
24
25 #ifndef __GHOST_WINDOWX11_H__
26 #define __GHOST_WINDOWX11_H__
27
28 #include "GHOST_Window.h"
29 #include <X11/Xlib.h>
30 #include <X11/Xutil.h>
31 // For tablets
32 #ifdef WITH_X11_XINPUT
33 #  include <X11/extensions/XInput.h>
34 #endif
35
36 #include "GHOST_TaskbarX11.h"
37
38 #include <map>
39
40 class STR_String;
41 class GHOST_SystemX11;
42
43 #ifdef WITH_XDND
44 class GHOST_DropTargetX11;
45 #endif
46
47 /**
48  * X11 implementation of GHOST_IWindow.
49  * Dimensions are given in screen coordinates that are relative to the upper-left corner of the screen.
50  */
51
52 class GHOST_WindowX11 : public GHOST_Window
53 {
54 public:
55         /**
56          * Constructor.
57          * Creates a new window and opens it.
58          * To check if the window was created properly, use the getValid() method.
59          * \param title         The text shown in the title bar of the window.
60          * \param left          The coordinate of the left edge of the window.
61          * \param top           The coordinate of the top edge of the window.
62          * \param width         The width the window.
63          * \param height        The height the window.
64          * \param state         The state the window is initially opened with.
65          * \param parentWindow  Parent (embedder) window
66          * \param type          The type of drawing context installed in this window.
67          * \param stereoVisual  Stereo visual for quad buffered stereo.
68          * \param alphaBackground Enable alpha blending of window with display background
69          * \param numOfAASamples        Number of samples used for AA (zero if no AA)
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             const GHOST_TEmbedderWindowID parentWindow,
81             GHOST_TDrawingContextType type = GHOST_kDrawingContextTypeNone,
82             const bool stereoVisual = false,
83             const bool exclusive = false,
84             const bool alphaBackground = false,
85             const GHOST_TUns16 numOfAASamples = 0,
86             const bool is_debug = false
87             );
88
89         bool
90         getValid(
91             ) const;
92
93         void
94         setTitle(const STR_String& title);
95
96         void
97         getTitle(
98             STR_String& title
99             ) const;
100
101         void
102         getWindowBounds(
103             GHOST_Rect& bounds
104             ) const;
105
106         void
107         getClientBounds(
108             GHOST_Rect& bounds
109             ) const;
110
111         GHOST_TSuccess
112         setClientWidth(
113             GHOST_TUns32 width
114             );
115
116         GHOST_TSuccess
117         setClientHeight(
118             GHOST_TUns32 height
119             );
120
121         GHOST_TSuccess
122         setClientSize(
123             GHOST_TUns32 width,
124             GHOST_TUns32 height
125             );
126
127         void
128         screenToClient(
129             GHOST_TInt32 inX,
130             GHOST_TInt32 inY,
131             GHOST_TInt32& outX,
132             GHOST_TInt32& outY
133             ) const;
134
135         void
136         clientToScreen(
137             GHOST_TInt32 inX,
138             GHOST_TInt32 inY,
139             GHOST_TInt32& outX,
140             GHOST_TInt32& outY
141             ) const;
142
143         GHOST_TWindowState
144         getState(
145             ) const;
146
147         GHOST_TSuccess
148         setState(
149             GHOST_TWindowState state
150             );
151
152         GHOST_TSuccess
153         setOrder(
154             GHOST_TWindowOrder order
155             );
156
157         GHOST_TSuccess
158         invalidate(
159             );
160
161         GHOST_TSuccess setProgressBar(float progress);
162         GHOST_TSuccess endProgressBar();
163
164         /**
165          * Destructor.
166          * Closes the window and disposes resources allocated.
167          */
168         ~GHOST_WindowX11();
169
170         /**
171          * \section x11specific 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 #ifdef WITH_X11_XINPUT
191         GHOST_TabletData *GetTabletData()
192         {
193                 return &m_tabletData;
194         }
195 #else // WITH_X11_XINPUT
196         const GHOST_TabletData *GetTabletData()
197         {
198                 return NULL;
199         }
200 #endif // WITH_X11_XINPUT
201
202 #if defined(WITH_X11_XINPUT) && defined(X_HAVE_UTF8_STRING)
203         XIC getX11_XIC() {
204                 return m_xic;
205         }
206
207         bool createX11_XIC();
208 #endif
209
210 #ifdef WITH_X11_XINPUT
211         void refreshXInputDevices();
212 #endif
213
214 #ifdef WITH_XDND
215         GHOST_DropTargetX11 *getDropTarget()
216         {
217                 return m_dropTarget;
218         }
219 #endif
220
221         /*
222          * Need this in case that we want start the window
223          * in FullScree or Maximized state.
224          * Check GHOST_WindowX11.cpp
225          */
226         bool m_post_init;
227         GHOST_TWindowState m_post_state;
228
229         GHOST_TSuccess beginFullScreen() const;
230
231         GHOST_TSuccess endFullScreen() const;
232
233         GHOST_TUns16 getDPIHint();
234
235 protected:
236         /**
237          * \param type  The type of rendering context create.
238          * \return Indication of success.
239          */
240         GHOST_Context *newDrawingContext(GHOST_TDrawingContextType type);
241
242         /**
243          * Sets the cursor visibility on the window using
244          * native window system calls.
245          */
246         GHOST_TSuccess
247         setWindowCursorVisibility(
248             bool visible
249             );
250
251         /**
252          * Sets the cursor grab on the window using
253          * native window system calls.
254          */
255         GHOST_TSuccess
256         setWindowCursorGrab(
257             GHOST_TGrabCursorMode mode
258             );
259
260         GHOST_TGrabCursorMode
261         getWindowCursorGrab() const;
262
263         /**
264          * Sets the cursor shape on the window using
265          * native window system calls.
266          */
267         GHOST_TSuccess
268         setWindowCursorShape(
269             GHOST_TStandardCursor shape
270             );
271
272         /**
273          * Sets the cursor shape on the window using
274          * native window system calls.
275          */
276         GHOST_TSuccess
277         setWindowCustomCursorShape(
278             GHOST_TUns8 bitmap[16][2],
279             GHOST_TUns8 mask[16][2],
280             int hotX,
281             int hotY
282             );
283
284         /**
285          * Sets the cursor shape on the window using
286          * native window system calls (Arbitrary size/color).
287          */
288         GHOST_TSuccess
289         setWindowCustomCursorShape(
290             GHOST_TUns8 *bitmap,
291             GHOST_TUns8 *mask,
292             int sizex,
293             int sizey,
294             int hotX,
295             int hotY,
296             int fg_color,
297             int bg_color
298             );
299
300 private:
301
302         /// Force use of public constructor.
303
304         GHOST_WindowX11(
305             );
306
307         GHOST_WindowX11(
308             const GHOST_WindowX11 &
309             );
310
311         Cursor
312         getStandardCursor(
313             GHOST_TStandardCursor g_cursor
314             );
315
316         Cursor
317         getEmptyCursor(
318             );
319
320         Window m_window;
321         Display *m_display;
322         XVisualInfo *m_visualInfo;
323         void *m_fbconfig;
324
325         GHOST_TWindowState m_normal_state;
326
327         /** A pointer to the typed system class. */
328         GHOST_SystemX11 *m_system;
329
330         /** Used to concatenate calls to invalidate() on this window. */
331         bool m_invalid_window;
332
333         /** XCursor structure of an empty (blank) cursor */
334         Cursor m_empty_cursor;
335
336         /** XCursor structure of the custom cursor */
337         Cursor m_custom_cursor;
338
339         /** XCursor to show when cursor is visible */
340         Cursor m_visible_cursor;
341
342         /** Cache of XC_* ID's to XCursor structures */
343         std::map<unsigned int, Cursor> m_standard_cursors;
344
345         GHOST_TaskBarX11 m_taskbar;
346
347 #ifdef WITH_XDND
348         GHOST_DropTargetX11 *m_dropTarget;
349 #endif
350
351 #ifdef WITH_X11_XINPUT
352         GHOST_TabletData m_tabletData;
353 #endif
354
355 #if defined(WITH_X11_XINPUT) && defined(X_HAVE_UTF8_STRING)
356         XIC m_xic;
357 #endif
358
359         bool m_valid_setup;
360         bool m_is_debug_context;
361
362         void icccmSetState(int state);
363         int icccmGetState() const;
364
365         void netwmMaximized(bool set);
366         bool netwmIsMaximized() const;
367
368         void netwmFullScreen(bool set);
369         bool netwmIsFullScreen() const;
370
371         void motifFullScreen(bool set);
372         bool motifIsFullScreen() const;
373 };
374
375
376 #endif // __GHOST_WINDOWX11_H__