patch [#31636] no pressure with Genius Mousepen i608X tablet
[blender.git] / intern / ghost / intern / GHOST_SystemX11.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_SystemX11.h
29  *  \ingroup GHOST
30  * Declaration of GHOST_SystemX11 class.
31  */
32
33 #ifndef __GHOST_SYSTEMX11_H__
34 #define __GHOST_SYSTEMX11_H__
35
36 #include <X11/Xlib.h>
37 #include <GL/glx.h>
38
39 #include "GHOST_System.h"
40 #include "../GHOST_Types.h"
41
42 // For tablets
43 #ifdef WITH_X11_XINPUT
44 #  include <X11/extensions/XInput.h>
45 #endif
46
47 #if defined(WITH_X11_XINPUT) && defined(X_HAVE_UTF8_STRING)
48 #  define GHOST_X11_RES_NAME  "Blender" /* res_name */
49 #  define GHOST_X11_RES_CLASS "Blender" /* res_class */
50 #endif
51
52 /* generic error handlers */
53 int GHOST_X11_ApplicationErrorHandler(Display *display, XErrorEvent *theEvent);
54 int GHOST_X11_ApplicationIOErrorHandler(Display *display);
55
56 class GHOST_WindowX11;
57
58 /**
59  * X11 Implementation of GHOST_System class.
60  * \see GHOST_System.
61  * \author      Laurence Bourn
62  * \date        October 26, 2001
63  */
64
65 class GHOST_SystemX11 : public GHOST_System {
66 public:
67
68         /**
69          * Constructor
70          * this class should only be instanciated by GHOST_ISystem.
71          */
72
73         GHOST_SystemX11(
74             );
75         
76         /**
77          * Destructor.
78          */
79         virtual ~GHOST_SystemX11();
80
81
82         GHOST_TSuccess
83         init(
84             );
85
86
87         /**
88          * \section Interface Inherited from GHOST_ISystem
89          */
90
91         /**
92          * Returns the system time.
93          * Returns the number of milliseconds since the start of the system process.
94          * \return The number of milliseconds.
95          */
96         GHOST_TUns64
97         getMilliSeconds(
98             ) const;
99         
100
101         /**
102          * Returns the number of displays on this system.
103          * \return The number of displays.
104          */
105         GHOST_TUns8
106         getNumDisplays(
107             ) const;
108
109         /**
110          * Returns the dimensions of the main display on this system.
111          * \return The dimension of the main display.
112          */
113         void
114         getMainDisplayDimensions(
115             GHOST_TUns32& width,
116             GHOST_TUns32& height
117             ) const;
118
119         /**
120          * Returns the dimensions of all displays on this system.
121          * \return The dimension of the main display.
122          */
123         void
124         getAllDisplayDimensions(
125             GHOST_TUns32& width,
126             GHOST_TUns32& height
127             ) const;
128
129         /**
130          * Create a new window.
131          * The new window is added to the list of windows managed. 
132          * Never explicitly delete the window, use disposeWindow() instead.
133          * \param       title   The name of the window (displayed in the title bar of the window if the OS supports it).
134          * \param       left            The coordinate of the left edge of the window.
135          * \param       top             The coordinate of the top edge of the window.
136          * \param       width           The width the window.
137          * \param       height          The height the window.
138          * \param       state           The state of the window when opened.
139          * \param       type            The type of drawing context installed in this window.
140          * \param       stereoVisual    Create a stereo visual for quad buffered stereo.
141          * \param       parentWindow    Parent (embedder) window
142          * \return      The new window (or 0 if creation failed).
143          */
144         GHOST_IWindow *
145         createWindow(
146             const STR_String& title,
147             GHOST_TInt32 left,
148             GHOST_TInt32 top,
149             GHOST_TUns32 width,
150             GHOST_TUns32 height,
151             GHOST_TWindowState state,
152             GHOST_TDrawingContextType type,
153             const bool stereoVisual,
154             const GHOST_TUns16 numOfAASamples = 0,
155             const GHOST_TEmbedderWindowID parentWindow = 0
156             );
157
158         /**
159          * \section Interface Inherited from GHOST_ISystem
160          */
161
162         /**
163          * Retrieves events from the system and stores them in the queue.
164          * \param waitForEvent Flag to wait for an event (or return immediately).
165          * \return Indication of the presence of events.
166          */
167         bool
168         processEvents(
169             bool waitForEvent
170             );
171
172         /**
173          * \section Interface Inherited from GHOST_System
174          */
175         GHOST_TSuccess
176         getCursorPosition(
177             GHOST_TInt32& x,
178             GHOST_TInt32& y
179             ) const;
180         
181         GHOST_TSuccess
182         setCursorPosition(
183             GHOST_TInt32 x,
184             GHOST_TInt32 y
185             );
186
187         /**
188          * Returns the state of all modifier keys.
189          * \param keys  The state of all modifier keys (true == pressed).
190          * \return              Indication of success.
191          */
192         GHOST_TSuccess
193         getModifierKeys(
194             GHOST_ModifierKeys& keys
195             ) const;
196
197         /**
198          * Returns the state of the mouse buttons (ouside the message queue).
199          * \param buttons       The state of the buttons.
200          * \return                      Indication of success.
201          */
202         GHOST_TSuccess
203         getButtons(
204             GHOST_Buttons& buttons
205             ) const;
206
207         /**
208          * \section Interface Dirty
209          * Flag a window as dirty. This will
210          * generate a GHOST window update event on a call to processEvents() 
211          */
212
213         void
214         addDirtyWindow(
215             GHOST_WindowX11 *bad_wind
216             );
217   
218  
219         /**
220          * return a pointer to the X11 display structure
221          */
222
223         Display *
224         getXDisplay(
225                 ) {
226                 return m_display;
227         }       
228
229 #if defined(WITH_X11_XINPUT) && defined(X_HAVE_UTF8_STRING)
230         XIM
231         getX11_XIM()
232         {
233                 return m_xim;
234         }
235 #endif
236
237         /* Helped function for get data from the clipboard. */
238         void getClipboard_xcout(XEvent evt, Atom sel, Atom target,
239                                 unsigned char **txt, unsigned long *len,
240                                 unsigned int *context) const;
241
242         /**
243          * Returns unsinged char from CUT_BUFFER0
244          * \param selection             Get selection, X11 only feature
245          * \return                              Returns the Clipboard indicated by Flag
246          */
247         GHOST_TUns8 *getClipboard(bool selection) const;
248         
249         /**
250          * Puts buffer to system clipboard
251          * \param buffer        The buffer to copy to the clipboard
252          * \param selection     Set the selection into the clipboard, X11 only feature
253          */
254         void putClipboard(GHOST_TInt8 *buffer, bool selection) const;
255
256 #ifdef WITH_XDND
257         /**
258          * Creates a drag'n'drop event and pushes it immediately onto the event queue. 
259          * Called by GHOST_DropTargetX11 class.
260          * \param eventType The type of drag'n'drop event
261          * \param draggedObjectType The type object concerned (currently array of file names, string, ?bitmap)
262          * \param mouseX x mouse coordinate (in window coordinates)
263          * \param mouseY y mouse coordinate
264          * \param window The window on which the event occurred
265          * \return Indication whether the event was handled. 
266          */
267         static GHOST_TSuccess pushDragDropEvent(GHOST_TEventType eventType, GHOST_TDragnDropTypes draggedObjectType, GHOST_IWindow *window, int mouseX, int mouseY, void *data);
268 #endif
269
270         /**
271          * \see GHOST_ISystem
272          */
273         int toggleConsole(int action) {
274                 return 0;
275         }
276
277         /**
278          * Atom used for ICCCM, WM-spec and Motif.
279          * We only need get this atom at the start, it's relative
280          * to the display not the window and are public for every
281          * window that need it.
282          */
283         Atom m_wm_state;
284         Atom m_wm_change_state;
285         Atom m_net_state;
286         Atom m_net_max_horz;
287         Atom m_net_max_vert;
288         Atom m_net_fullscreen;
289         Atom m_motif;
290         Atom m_wm_take_focus;
291         Atom m_wm_protocols;
292         Atom m_delete_window_atom;
293
294         /* Atoms for Selection, copy & paste. */
295         Atom m_targets;
296         Atom m_string;
297         Atom m_compound_text;
298         Atom m_text;
299         Atom m_clipboard;
300         Atom m_primary;
301         Atom m_xclip_out;
302         Atom m_incr;
303         Atom m_utf8_string;
304 #ifdef WITH_X11_XINPUT
305         Atom m_xi_tablet;
306 #endif
307
308 #ifdef WITH_X11_XINPUT
309         typedef struct GHOST_TabletX11 {
310                 XDevice *StylusDevice;
311                 XDevice *EraserDevice;
312
313                 XID StylusID, EraserID;
314
315                 int MotionEvent;
316                 int ProxInEvent;
317                 int ProxOutEvent;
318
319                 int PressureLevels;
320                 int XtiltLevels, YtiltLevels;
321         } GHOST_TabletX11;
322
323         GHOST_TabletX11 &GetXTablet()
324         {
325                 return m_xtablet;
326         }
327 #endif // WITH_X11_XINPUT
328
329 private:
330
331         Display *m_display;
332 #if defined(WITH_X11_XINPUT) && defined(X_HAVE_UTF8_STRING)
333         XIM m_xim;
334 #endif
335
336 #ifdef WITH_X11_XINPUT
337         /* Tablet devices */
338         GHOST_TabletX11 m_xtablet;
339 #endif
340
341         /// The vector of windows that need to be updated.
342         std::vector<GHOST_WindowX11 *> m_dirty_windows;
343
344         /// Start time at initialization.
345         GHOST_TUns64 m_start_time;
346
347         /// A vector of keyboard key masks
348         char m_keyboard_vector[32];
349
350         /* to prevent multiple warp, we store the time of the last warp event
351          *  and stop accumulating all events generated before that */
352         Time m_last_warp;
353
354         /**
355          * Return the ghost window associated with the
356          * X11 window xwind
357          */
358
359 #if defined(WITH_X11_XINPUT) && defined(X_HAVE_UTF8_STRING)
360         bool openX11_IM();
361 #endif
362
363 #ifdef WITH_X11_XINPUT
364         void initXInputDevices();
365 #endif
366
367         GHOST_WindowX11 *
368         findGhostWindow(
369             Window xwind
370             ) const;
371
372         void
373         processEvent(
374             XEvent *xe
375             );
376
377         Time
378         lastEventTime(
379             Time default_time
380             );
381
382         bool
383         generateWindowExposeEvents(
384             );
385 };
386
387 #endif
388