Patch [#26799] 2.5x blenderplayer (BGE) anti-aliasing & embedding by Sebastian Korcza...
[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_TEmbedderWindowID parentWindowHwnd=0,
104                 GHOST_TSuccess msEnabled = GHOST_kFailure,
105                 int msPixelFormat = 0
106         );
107
108         /**
109          * Destructor.
110          * Closes the window and disposes resources allocated.
111          */
112         virtual ~GHOST_WindowWin32();
113
114         /**
115          * Returns the window to replace this one if it's getting replaced
116          * @return The window replacing this one.
117          */
118
119         GHOST_Window *getNextWindow();
120
121         /**
122          * Returns indication as to whether the window is valid.
123          * @return The validity of the window.
124          */
125         virtual bool getValid() const;
126
127         /**
128          * Access to the handle of the window.
129          * @return The handle of the window.
130          */
131         virtual HWND getHWND() const;
132
133         /**
134          * Sets the title displayed in the title bar.
135          * @param title The title to display in the title bar.
136          */
137         virtual void setTitle(const STR_String& title);
138
139         /**
140          * Returns the title displayed in the title bar.
141          * @param title The title displayed in the title bar.
142          */
143         virtual void getTitle(STR_String& title) const;
144
145         /**
146          * Returns the window rectangle dimensions.
147          * The dimensions are given in screen coordinates that are relative to the upper-left corner of the screen. 
148          * @param bounds The bounding rectangle of the window.
149          */
150         virtual void getWindowBounds(GHOST_Rect& bounds) const;
151         
152         /**
153          * Returns the client rectangle dimensions.
154          * The left and top members of the rectangle are always zero.
155          * @param bounds The bounding rectangle of the cleient area of the window.
156          */
157         virtual void getClientBounds(GHOST_Rect& bounds) const;
158
159         /**
160          * Resizes client rectangle width.
161          * @param width The new width of the client area of the window.
162          */
163         virtual GHOST_TSuccess setClientWidth(GHOST_TUns32 width);
164
165         /**
166          * Resizes client rectangle height.
167          * @param height The new height of the client area of the window.
168          */
169         virtual GHOST_TSuccess setClientHeight(GHOST_TUns32 height);
170
171         /**
172          * Resizes client rectangle.
173          * @param width         The new width of the client area of the window.
174          * @param height        The new height of the client area of the window.
175          */
176         virtual GHOST_TSuccess setClientSize(GHOST_TUns32 width, GHOST_TUns32 height);
177
178         /**
179          * Returns the state of the window (normal, minimized, maximized).
180          * @return The state of the window.
181          */
182         virtual GHOST_TWindowState getState() const;
183
184         /**
185          * Converts a point in screen coordinates to client rectangle coordinates
186          * @param inX   The x-coordinate on the screen.
187          * @param inY   The y-coordinate on the screen.
188          * @param outX  The x-coordinate in the client rectangle.
189          * @param outY  The y-coordinate in the client rectangle.
190          */
191         virtual void screenToClient(GHOST_TInt32 inX, GHOST_TInt32 inY, GHOST_TInt32& outX, GHOST_TInt32& outY) const;
192
193         /**
194          * Converts a point in screen coordinates to client rectangle coordinates
195          * @param inX   The x-coordinate in the client rectangle.
196          * @param inY   The y-coordinate in the client rectangle.
197          * @param outX  The x-coordinate on the screen.
198          * @param outY  The y-coordinate on the screen.
199          */
200         virtual void clientToScreen(GHOST_TInt32 inX, GHOST_TInt32 inY, GHOST_TInt32& outX, GHOST_TInt32& outY) const;
201
202         /**
203          * Sets the state of the window (normal, minimized, maximized).
204          * @param state The state of the window.
205          * @return Indication of success.
206          */
207         virtual GHOST_TSuccess setState(GHOST_TWindowState state);
208
209         /**
210          * Sets the order of the window (bottom, top).
211          * @param order The order of the window.
212          * @return Indication of success.
213          */
214         virtual GHOST_TSuccess setOrder(GHOST_TWindowOrder order);
215
216         /**
217          * Swaps front and back buffers of a window.
218          * @return Indication of success.
219          */
220         virtual GHOST_TSuccess swapBuffers();
221
222         /**
223          * Activates the drawing context of this window.
224          * @return Indication of success.
225          */
226         virtual GHOST_TSuccess activateDrawingContext();
227
228         /**
229          * Invalidates the contents of this window.
230          */
231         virtual GHOST_TSuccess invalidate();
232
233         /**
234      * Sets the progress bar value displayed in the window/application icon
235          * @param progress The progress %
236          */
237         virtual GHOST_TSuccess setProgressBar(float progress);
238         
239         /**
240          * Hides the progress bar in the icon
241          */
242         virtual GHOST_TSuccess endProgressBar();
243         
244         /**
245          * Returns the name of the window class.
246          * @return The name of the window class.
247          */
248         static LPCSTR getWindowClassName() { return s_windowClassName; }
249
250         /**
251          * Register a mouse click event (should be called 
252          * for any real button press, controls mouse
253          * capturing).
254          *
255          * @param press 
256          *              0 - mouse pressed
257          *              1 - mouse released
258          *              2 - operator grab
259          *              3 - operator ungrab
260          */
261         void registerMouseClickEvent(int press);
262
263         /**
264          * Inform the window that it has lost mouse capture,
265          * called in response to native window system messages.
266          */
267         void lostMouseCapture();
268
269         /**
270          * Loads the windows equivalent of a standard GHOST cursor.
271          * @param visible               Flag for cursor visibility.
272          * @param cursorShape   The cursor shape.
273          */
274         void loadCursor(bool visible, GHOST_TStandardCursor cursorShape) const;
275
276         const GHOST_TabletData* GetTabletData()
277         { return m_tabletData; }
278
279         void processWin32TabletInitEvent();
280         void processWin32TabletEvent(WPARAM wParam, LPARAM lParam);
281
282 protected:
283         GHOST_TSuccess initMultisample(PIXELFORMATDESCRIPTOR pfd);
284
285         /**
286          * Tries to install a rendering context in this window.
287          * @param type  The type of rendering context installed.
288          * @return Indication of success.
289          */
290         virtual GHOST_TSuccess installDrawingContext(GHOST_TDrawingContextType type);
291
292         /**
293          * Removes the current drawing context.
294          * @return Indication of success.
295          */
296         virtual GHOST_TSuccess removeDrawingContext();
297
298         /**
299          * Sets the cursor visibility on the window using
300          * native window system calls.
301          */
302         virtual GHOST_TSuccess setWindowCursorVisibility(bool visible);
303         
304         /**
305          * Sets the cursor grab on the window using native window system calls.
306          * Using registerMouseClickEvent.
307          * @param mode  GHOST_TGrabCursorMode.
308          */
309         virtual GHOST_TSuccess setWindowCursorGrab(GHOST_TGrabCursorMode mode);
310         
311         /**
312          * Sets the cursor shape on the window using
313          * native window system calls.
314          */
315         virtual GHOST_TSuccess setWindowCursorShape(GHOST_TStandardCursor shape);
316
317         /**
318          * Sets the cursor shape on the window using
319          * native window system calls.
320          */
321         virtual GHOST_TSuccess setWindowCustomCursorShape(GHOST_TUns8 bitmap[16][2], GHOST_TUns8 mask[16][2], int hotX, int hotY);
322
323         virtual GHOST_TSuccess setWindowCustomCursorShape(
324                 GHOST_TUns8 *bitmap, 
325                 GHOST_TUns8 *mask, 
326                 int sizex, 
327                 int sizey,
328                 int hotX, 
329                 int hotY,
330                 int fg_color, 
331                 int bg_color
332         );
333         
334         /** Pointer to system */
335         GHOST_SystemWin32 * m_system;
336         /** Pointer to COM IDropTarget implementor */
337         GHOST_DropTargetWin32 * m_dropTarget;
338         /** Window handle. */
339         HWND m_hWnd;
340         /** Device context handle. */
341         HDC m_hDC;
342         /** OpenGL rendering context. */
343         HGLRC m_hGlRc;
344         /** The first created OpenGL context (for sharing display lists) */
345         static HGLRC s_firsthGLRc;
346         /** The first created device context handle. */
347         static HDC s_firstHDC;
348         /** Flag for if window has captured the mouse */
349         bool m_hasMouseCaptured;
350         /** Flag if an operator grabs the mouse with WM_cursor_grab/ungrab() 
351          * Multiple grabs must be realesed with a single ungrab*/
352         bool m_hasGrabMouse;
353         /** Count of number of pressed buttons */
354         int m_nPressedButtons;
355         /** HCURSOR structure of the custom cursor */
356         HCURSOR m_customCursor;
357
358         /** ITaskbarList3 structure for progress bar*/
359         ITaskbarList3 * m_Bar;
360
361         static LPCSTR s_windowClassName;
362         static const int s_maxTitleLength;
363
364         /** WinTab dll handle */
365         HMODULE m_wintab;
366
367         /** Tablet data for GHOST */
368         GHOST_TabletData* m_tabletData;
369
370         /** Stores the Tablet context if detected Tablet features using WinTab.dll */
371         HCTX m_tablet;
372         LONG m_maxPressure;
373         LONG m_maxAzimuth, m_maxAltitude;
374
375         /** Preferred number of samples */
376         GHOST_TUns16 m_multisample;
377
378         /** Check if multisample is supported */
379         GHOST_TSuccess m_multisampleEnabled;
380
381         /** The pixelFormat to use for multisample */
382         int m_msPixelFormat;
383
384         /** We need to following to recreate the window */
385         const STR_String& m_title;
386         GHOST_TInt32 m_left;
387         GHOST_TInt32 m_top;
388         GHOST_TUns32 m_width;
389         GHOST_TUns32 m_height;
390         GHOST_TWindowState m_normal_state;
391         bool m_stereo;
392
393         /** The GHOST_System passes this to wm if this window is being replaced */
394         GHOST_Window *m_nextWindow;
395
396         /** Hwnd to parent window */
397         GHOST_TEmbedderWindowID m_parentWindowHwnd;
398 };
399
400 #endif // _GHOST_WINDOW_WIN32_H_