Added Copy and Paste functions to GHOST.
[blender-staging.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  * @file        GHOST_SystemX11.h
33  * Declaration of GHOST_SystemX11 class.
34  */
35
36 #ifndef _GHOST_SYSTEM_X11_H_
37 #define _GHOST_SYSTEM_X11_H_
38
39 #include <X11/Xlib.h>
40 #include <GL/glx.h>
41
42 #include "GHOST_System.h"
43 #include "../GHOST_Types.h"
44
45 class GHOST_WindowX11;
46
47 /**
48  * X11 Implementation of GHOST_System class.
49  * @see GHOST_System.
50  * @author      Laurence Bourn
51  * @date        October 26, 2001
52  */
53
54 class GHOST_SystemX11 : public GHOST_System {
55 public:
56
57         /**
58          * Constructor
59          * this class should only be instanciated by GHOST_ISystem.
60          */
61
62         GHOST_SystemX11(
63         );
64         
65                 GHOST_TSuccess 
66         init(
67         );
68
69
70         /**
71          * @section Interface Inherited from GHOST_ISystem 
72          */
73
74         /**
75          * Returns the system time.
76          * Returns the number of milliseconds since the start of the system process.
77          * @return The number of milliseconds.
78          */
79                 GHOST_TUns64 
80         getMilliSeconds(
81         ) const;
82         
83
84         /**
85          * Returns the number of displays on this system.
86          * @return The number of displays.
87          */
88                 GHOST_TUns8 
89         getNumDisplays(
90         ) const;
91
92         /**
93          * Returns the dimensions of the main display on this system.
94          * @return The dimension of the main display.
95          */
96                 void 
97         getMainDisplayDimensions(
98                 GHOST_TUns32& width,
99                 GHOST_TUns32& height
100         ) const;
101
102         /**
103          * Create a new window.
104          * The new window is added to the list of windows managed. 
105          * Never explicitly delete the window, use disposeWindow() instead.
106          * @param       title   The name of the window (displayed in the title bar of the window if the OS supports it).
107          * @param       left            The coordinate of the left edge of the window.
108          * @param       top             The coordinate of the top edge of the window.
109          * @param       width           The width the window.
110          * @param       height          The height the window.
111          * @param       state           The state of the window when opened.
112          * @param       type            The type of drawing context installed in this window.
113          * @param       stereoVisual    Create a stereo visual for quad buffered stereo.
114          * @return      The new window (or 0 if creation failed).
115          */
116                 GHOST_IWindow* 
117         createWindow(
118                 const STR_String& title,
119                 GHOST_TInt32 left,
120                 GHOST_TInt32 top,
121                 GHOST_TUns32 width,
122                 GHOST_TUns32 height,
123                 GHOST_TWindowState state,
124                 GHOST_TDrawingContextType type,
125                 const bool stereoVisual
126         );
127          
128         /**
129          * @section Interface Inherited from GHOST_ISystem 
130          */
131
132         /**
133          * Retrieves events from the system and stores them in the queue.
134          * @param waitForEvent Flag to wait for an event (or return immediately).
135          * @return Indication of the presence of events.
136          */
137                 bool 
138         processEvents(
139                 bool waitForEvent
140         );
141
142         /**
143          * @section Interface Inherited from GHOST_System 
144          */
145                 GHOST_TSuccess 
146         getCursorPosition(
147                 GHOST_TInt32& x,
148                 GHOST_TInt32& y
149         ) const;
150         
151                 GHOST_TSuccess 
152         setCursorPosition(
153                 GHOST_TInt32 x,
154                 GHOST_TInt32 y
155         ) const;
156
157         /**
158          * Returns the state of all modifier keys.
159          * @param keys  The state of all modifier keys (true == pressed).
160          * @return              Indication of success.
161          */
162                 GHOST_TSuccess 
163         getModifierKeys(
164                 GHOST_ModifierKeys& keys
165         ) const ;
166
167         /**
168          * Returns the state of the mouse buttons (ouside the message queue).
169          * @param buttons       The state of the buttons.
170          * @return                      Indication of success.
171          */
172                 GHOST_TSuccess 
173         getButtons(
174                 GHOST_Buttons& buttons
175         ) const;
176
177         /**
178          * @section
179          * Flag a window as dirty. This will
180          * generate a GHOST window update event on a call to processEvents() 
181          */
182
183                 void
184         addDirtyWindow(
185                 GHOST_WindowX11 * bad_wind
186         );
187   
188  
189         /**
190          * return a pointer to the X11 display structure
191          */
192
193                 Display *
194         getXDisplay(
195         ) {
196                 return m_display;
197         }       
198
199         /**
200          * Returns unsinged char from CUT_BUFFER0
201          * @param flag          Flag indicates which buffer to return 0 for clipboard 1 for selection
202          * @return              Returns the Clipboard indicated by Flag
203          */
204                 GHOST_TUns8*
205         getClipboard(int flag) const;
206         
207         /**
208          * Puts buffer to system clipboard
209          * @param buffer        The buffer to copy to the clipboard     
210          * @param flag          Flag indicates which buffer to set ownership of 0 for clipboard 1 for selection
211          */
212         virtual void putClipboard(GHOST_TInt8 *buffer, int flag) const;
213
214 private :
215
216         Display * m_display;
217
218         /**
219          * Atom used to detect window close events
220          */
221         Atom m_delete_window_atom;
222
223         /// The vector of windows that need to be updated.
224         std::vector<GHOST_WindowX11 *> m_dirty_windows;
225
226         /// Start time at initialization.
227         GHOST_TUns64 m_start_time;
228
229         /// A vector of keyboard key masks
230         char *m_keyboard_vector;
231
232         /**
233          * Return the ghost window associated with the
234          * X11 window xwind
235          */
236
237                 GHOST_WindowX11 * 
238         findGhostWindow(
239                 Window xwind
240         ) const ;
241
242                 void
243         processEvent(
244                 XEvent *xe
245         );
246
247                 bool
248         generateWindowExposeEvents(
249         );
250  
251                 GHOST_TKey
252         convertXKey(
253                 KeySym key
254         );
255
256 };
257
258 #endif
259