20212bbc2afd6d45f86dcbbe2981929ababcc5bc
[blender-staging.git] / intern / ghost / intern / GHOST_WindowWin32.h
1 /*
2  * $Id$
3  * ***** BEGIN GPL 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.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software Foundation,
17  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18  *
19  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
20  * All rights reserved.
21  *
22  * The Original Code is: all of this file.
23  *
24  * Contributor(s): none yet.
25  *
26  * ***** END GPL LICENSE BLOCK *****
27  */
28
29 /** \file ghost/intern/GHOST_WindowWin32.h
30  *  \ingroup GHOST
31  * Declaration of GHOST_WindowWin32 class.
32  */
33
34 #ifndef _GHOST_WINDOW_WIN32_H_
35 #define _GHOST_WINDOW_WIN32_H_
36
37 #ifndef WIN32
38 #error WIN32 only!
39 #endif // WIN32
40
41 #include "GHOST_Window.h"
42
43 /* MinGW needs it */
44 #ifdef FREE_WINDOWS
45 #ifdef WINVER
46 #undef WINVER
47 #endif
48 #define WINVER 0x0501
49 #endif
50
51
52
53 #include <windows.h>
54 #include "GHOST_TaskbarWin32.h"
55
56
57 #include <wintab.h>
58 #define PACKETDATA      (PK_BUTTONS | PK_NORMAL_PRESSURE | PK_ORIENTATION | PK_CURSOR)
59 #define PACKETMODE      PK_BUTTONS
60 #include <pktdef.h>
61
62 class GHOST_SystemWin32;
63 class GHOST_DropTargetWin32;
64
65 // typedefs for WinTab functions to allow dynamic loading
66 typedef UINT (API * GHOST_WIN32_WTInfo) ( UINT, UINT, LPVOID );
67 typedef HCTX (API * GHOST_WIN32_WTOpen) (HWND, LPLOGCONTEXTA, BOOL);
68 typedef BOOL (API * GHOST_WIN32_WTClose) (HCTX);
69 typedef BOOL (API * GHOST_WIN32_WTPacket) (HCTX, UINT, LPVOID);
70
71 /**
72  * GHOST window on M$ Windows OSs.
73  * @author      Maarten Gribnau
74  * @date        May 10, 2001
75  */
76 class GHOST_WindowWin32 : public GHOST_Window {
77 public:
78         /**
79          * Constructor.
80          * Creates a new window and opens it.
81          * To check if the window was created properly, use the getValid() method.
82          * @param title         The text shown in the title bar of the window.
83          * @param left          The coordinate of the left edge of the window.
84          * @param top           The coordinate of the top edge of the window.
85          * @param width         The width the window.
86          * @param height        The height the window.
87          * @param state         The state the window is initially opened with.
88          * @param type          The type of drawing context installed in this window.
89          * @param stereoVisual  Stereo visual for quad buffered stereo.
90          * @param numOfAASamples        Number of samples used for AA (zero if no AA)
91          */
92         GHOST_WindowWin32(
93                 GHOST_SystemWin32 * system,
94                 const STR_String& title,
95                 GHOST_TInt32 left,
96                 GHOST_TInt32 top,
97                 GHOST_TUns32 width,
98                 GHOST_TUns32 height,
99                 GHOST_TWindowState state,
100                 GHOST_TDrawingContextType type = GHOST_kDrawingContextTypeNone,
101                 const bool stereoVisual = false,
102                 const GHOST_TUns16 numOfAASamples = 0,
103                 GHOST_TSuccess msEnabled = GHOST_kFailure,
104                 int msPixelFormat = 0
105         );
106
107         /**
108          * Destructor.
109          * Closes the window and disposes resources allocated.
110          */
111         virtual ~GHOST_WindowWin32();
112
113         /**
114          * Returns the window to replace this one if it's getting replaced
115          * @return The window replacing this one.
116          */
117
118         GHOST_Window *getNextWindow();
119
120         /**
121          * Returns indication as to whether the window is valid.
122          * @return The validity of the window.
123          */
124         virtual bool getValid() const;
125
126         /**
127          * Access to the handle of the window.
128          * @return The handle of the window.
129          */
130         virtual HWND getHWND() const;
131
132         /**
133          * Sets the title displayed in the title bar.
134          * @param title The title to display in the title bar.
135          */
136         virtual void setTitle(const STR_String& title);
137
138         /**
139          * Returns the title displayed in the title bar.
140          * @param title The title displayed in the title bar.
141          */
142         virtual void getTitle(STR_String& title) const;
143
144         /**
145          * Returns the window rectangle dimensions.
146          * The dimensions are given in screen coordinates that are relative to the upper-left corner of the screen. 
147          * @param bounds The bounding rectangle of the window.
148          */
149         virtual void getWindowBounds(GHOST_Rect& bounds) const;
150         
151         /**
152          * Returns the client rectangle dimensions.
153          * The left and top members of the rectangle are always zero.
154          * @param bounds The bounding rectangle of the cleient area of the window.
155          */
156         virtual void getClientBounds(GHOST_Rect& bounds) const;
157
158         /**
159          * Resizes client rectangle width.
160          * @param width The new width of the client area of the window.
161          */
162         virtual GHOST_TSuccess setClientWidth(GHOST_TUns32 width);
163
164         /**
165          * Resizes client rectangle height.
166          * @param height The new height of the client area of the window.
167          */
168         virtual GHOST_TSuccess setClientHeight(GHOST_TUns32 height);
169
170         /**
171          * Resizes client rectangle.
172          * @param width         The new width of the client area of the window.
173          * @param height        The new height of the client area of the window.
174          */
175         virtual GHOST_TSuccess setClientSize(GHOST_TUns32 width, GHOST_TUns32 height);
176
177         /**
178          * Returns the state of the window (normal, minimized, maximized).
179          * @return The state of the window.
180          */
181         virtual GHOST_TWindowState getState() const;
182
183         /**
184          * Converts a point in screen coordinates to client rectangle coordinates
185          * @param inX   The x-coordinate on the screen.
186          * @param inY   The y-coordinate on the screen.
187          * @param outX  The x-coordinate in the client rectangle.
188          * @param outY  The y-coordinate in the client rectangle.
189          */
190         virtual void screenToClient(GHOST_TInt32 inX, GHOST_TInt32 inY, GHOST_TInt32& outX, GHOST_TInt32& outY) const;
191
192         /**
193          * Converts a point in screen coordinates to client rectangle coordinates
194          * @param inX   The x-coordinate in the client rectangle.
195          * @param inY   The y-coordinate in the client rectangle.
196          * @param outX  The x-coordinate on the screen.
197          * @param outY  The y-coordinate on the screen.
198          */
199         virtual void clientToScreen(GHOST_TInt32 inX, GHOST_TInt32 inY, GHOST_TInt32& outX, GHOST_TInt32& outY) const;
200
201         /**
202          * Sets the state of the window (normal, minimized, maximized).
203          * @param state The state of the window.
204          * @return Indication of success.
205          */
206         virtual GHOST_TSuccess setState(GHOST_TWindowState state);
207
208         /**
209          * Sets the order of the window (bottom, top).
210          * @param order The order of the window.
211          * @return Indication of success.
212          */
213         virtual GHOST_TSuccess setOrder(GHOST_TWindowOrder order);
214
215         /**
216          * Swaps front and back buffers of a window.
217          * @return Indication of success.
218          */
219         virtual GHOST_TSuccess swapBuffers();
220
221         /**
222          * Activates the drawing context of this window.
223          * @return Indication of success.
224          */
225         virtual GHOST_TSuccess activateDrawingContext();
226
227         /**
228          * Invalidates the contents of this window.
229          */
230         virtual GHOST_TSuccess invalidate();
231
232         /**
233      * Sets the progress bar value displayed in the window/application icon
234          * @param progress The progress %
235          */
236         virtual GHOST_TSuccess setProgressBar(float progress);
237         
238         /**
239          * Hides the progress bar in the icon
240          */
241         virtual GHOST_TSuccess endProgressBar();
242         
243         /**
244          * Returns the name of the window class.
245          * @return The name of the window class.
246          */
247         static LPCSTR getWindowClassName() { return s_windowClassName; }
248
249         /**
250          * Register a mouse click event (should be called 
251          * for any real button press, controls mouse
252          * capturing).
253          *
254          * @param press 
255          *              0 - mouse pressed
256          *              1 - mouse released
257          *              2 - operator grab
258          *              3 - operator ungrab
259          */
260         void registerMouseClickEvent(int press);
261
262         /**
263          * Inform the window that it has lost mouse capture,
264          * called in response to native window system messages.
265          */
266         void lostMouseCapture();
267
268         /**
269          * Loads the windows equivalent of a standard GHOST cursor.
270          * @param visible               Flag for cursor visibility.
271          * @param cursorShape   The cursor shape.
272          */
273         void loadCursor(bool visible, GHOST_TStandardCursor cursorShape) const;
274
275         const GHOST_TabletData* GetTabletData()
276         { return m_tabletData; }
277
278         void processWin32TabletInitEvent();
279         void processWin32TabletEvent(WPARAM wParam, LPARAM lParam);
280
281 protected:
282         GHOST_TSuccess initMultisample(PIXELFORMATDESCRIPTOR pfd);
283
284         /**
285          * Tries to install a rendering context in this window.
286          * @param type  The type of rendering context installed.
287          * @return Indication of success.
288          */
289         virtual GHOST_TSuccess installDrawingContext(GHOST_TDrawingContextType type);
290
291         /**
292          * Removes the current drawing context.
293          * @return Indication of success.
294          */
295         virtual GHOST_TSuccess removeDrawingContext();
296
297         /**
298          * Sets the cursor visibility on the window using
299          * native window system calls.
300          */
301         virtual GHOST_TSuccess setWindowCursorVisibility(bool visible);
302         
303         /**
304          * Sets the cursor grab on the window using native window system calls.
305          * Using registerMouseClickEvent.
306          * @param mode  GHOST_TGrabCursorMode.
307          */
308         virtual GHOST_TSuccess setWindowCursorGrab(GHOST_TGrabCursorMode mode);
309         
310         /**
311          * Sets the cursor shape on the window using
312          * native window system calls.
313          */
314         virtual GHOST_TSuccess setWindowCursorShape(GHOST_TStandardCursor shape);
315
316         /**
317          * Sets the cursor shape on the window using
318          * native window system calls.
319          */
320         virtual GHOST_TSuccess setWindowCustomCursorShape(GHOST_TUns8 bitmap[16][2], GHOST_TUns8 mask[16][2], int hotX, int hotY);
321
322         virtual GHOST_TSuccess setWindowCustomCursorShape(
323                 GHOST_TUns8 *bitmap, 
324                 GHOST_TUns8 *mask, 
325                 int sizex, 
326                 int sizey,
327                 int hotX, 
328                 int hotY,
329                 int fg_color, 
330                 int bg_color
331         );
332         
333         /** Pointer to system */
334         GHOST_SystemWin32 * m_system;
335         /** Pointer to COM IDropTarget implementor */
336         GHOST_DropTargetWin32 * m_dropTarget;
337         /** Window handle. */
338         HWND m_hWnd;
339         /** Device context handle. */
340         HDC m_hDC;
341         /** OpenGL rendering context. */
342         HGLRC m_hGlRc;
343         /** The first created OpenGL context (for sharing display lists) */
344         static HGLRC s_firsthGLRc;
345         /** The first created device context handle. */
346         static HDC s_firstHDC;
347         /** Flag for if window has captured the mouse */
348         bool m_hasMouseCaptured;
349         /** Flag if an operator grabs the mouse with WM_cursor_grab/ungrab() 
350          * Multiple grabs must be realesed with a single ungrab*/
351         bool m_hasGrabMouse;
352         /** Count of number of pressed buttons */
353         int m_nPressedButtons;
354         /** HCURSOR structure of the custom cursor */
355         HCURSOR m_customCursor;
356
357         /** ITaskbarList3 structure for progress bar*/
358         ITaskbarList3 * m_Bar;
359
360         static LPCSTR s_windowClassName;
361         static const int s_maxTitleLength;
362
363         /** WinTab dll handle */
364         HMODULE m_wintab;
365
366         /** Tablet data for GHOST */
367         GHOST_TabletData* m_tabletData;
368
369         /** Stores the Tablet context if detected Tablet features using WinTab.dll */
370         HCTX m_tablet;
371         LONG m_maxPressure;
372         LONG m_maxAzimuth, m_maxAltitude;
373
374         /** Preferred number of samples */
375         GHOST_TUns16 m_multisample;
376
377         /** Check if multisample is supported */
378         GHOST_TSuccess m_multisampleEnabled;
379
380         /** The pixelFormat to use for multisample */
381         int m_msPixelFormat;
382
383         /** We need to following to recreate the window */
384         const STR_String& m_title;
385         GHOST_TInt32 m_left;
386         GHOST_TInt32 m_top;
387         GHOST_TUns32 m_width;
388         GHOST_TUns32 m_height;
389         GHOST_TWindowState m_normal_state;
390         bool m_stereo;
391
392         /** The GHOST_System passes this to wm if this window is being replaced */
393         GHOST_Window *m_nextWindow;
394 };
395
396 #endif // _GHOST_WINDOW_WIN32_H_