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