macOS: officially upgrade to 10.9 libraries from lib/darwin.
[blender.git] / intern / ghost / intern / GHOST_WindowCocoa.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): Maarten Gribnau, Jason Wilkins
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  */
27
28 /** \file ghost/intern/GHOST_WindowCocoa.h
29  *  \ingroup GHOST
30  * Declaration of GHOST_WindowCocoa class.
31  */
32
33 #ifndef __GHOST_WINDOWCOCOA_H__
34 #define __GHOST_WINDOWCOCOA_H__
35
36 #ifndef __APPLE__
37 #error Apple OSX only!
38 #endif // __APPLE__
39
40 #include "GHOST_Window.h"
41 #include "STR_String.h"
42
43 @class CocoaWindow;
44 @class CocoaOpenGLView;
45 @class NSCursor;
46 @class NSScreen;
47
48 class GHOST_SystemCocoa;
49
50 class GHOST_WindowCocoa : public GHOST_Window {
51 public:
52         /**
53          * Constructor.
54          * Creates a new window and opens it.
55          * To check if the window was created properly, use the getValid() method.
56          * \param systemCocoa           The associated system class to forward events to
57          * \param title                         The text shown in the title bar of the window.
58          * \param left                          The coordinate of the left edge of the window.
59          * \param bottom                        The coordinate of the bottom edge of the window.
60          * \param width                         The width the window.
61          * \param height                        The height the window.
62          * \param state                         The state the window is initially opened with.
63          * \param type                          The type of drawing context installed in this window.
64          * \param stereoVisual          Stereo visual for quad buffered stereo.
65          * \param numOfAASamples        Number of samples used for AA (zero if no AA)
66          */
67         GHOST_WindowCocoa(
68             GHOST_SystemCocoa *systemCocoa,
69             const STR_String& title,
70             GHOST_TInt32 left,
71             GHOST_TInt32 bottom,
72             GHOST_TUns32 width,
73             GHOST_TUns32 height,
74             GHOST_TWindowState state,
75             GHOST_TDrawingContextType type = GHOST_kDrawingContextTypeNone,
76             const bool stereoVisual = false,
77             const GHOST_TUns16 numOfAASamples = 0,
78             bool is_debug = false
79             );
80
81         /**
82          * Destructor.
83          * Closes the window and disposes resources allocated.
84          */
85         ~GHOST_WindowCocoa();
86
87         /**
88          * Returns indication as to whether the window is valid.
89          * \return The validity of the window.
90          */
91         bool getValid() const;
92         
93         /**
94          * Returns the associated NSWindow object
95          * \return The associated NSWindow object
96          */
97         void *getOSWindow() const;
98
99         /**
100          * Sets the title displayed in the title bar.
101          * \param title The title to display in the title bar.
102          */
103         void setTitle(const STR_String& title);
104
105         /**
106          * Returns the title displayed in the title bar.
107          * \param title The title displayed in the title bar.
108          */
109         void getTitle(STR_String& title) const;
110
111         /**
112          * Returns the window rectangle dimensions.
113          * The dimensions are given in screen coordinates that are relative to the upper-left corner of the screen. 
114          * \param bounds The bounding rectangle of the window.
115          */
116         void getWindowBounds(GHOST_Rect& bounds) const;
117         
118         /**
119          * Returns the client rectangle dimensions.
120          * The left and top members of the rectangle are always zero.
121          * \param bounds The bounding rectangle of the client area of the window.
122          */
123         void getClientBounds(GHOST_Rect& bounds) const;
124
125         /**
126          * Resizes client rectangle width.
127          * \param width The new width of the client area of the window.
128          */
129         GHOST_TSuccess setClientWidth(GHOST_TUns32 width);
130
131         /**
132          * Resizes client rectangle height.
133          * \param height The new height of the client area of the window.
134          */
135         GHOST_TSuccess setClientHeight(GHOST_TUns32 height);
136
137         /**
138          * Resizes client rectangle.
139          * \param width         The new width of the client area of the window.
140          * \param height        The new height of the client area of the window.
141          */
142         GHOST_TSuccess setClientSize(GHOST_TUns32 width, GHOST_TUns32 height);
143
144         /**
145          * Returns the state of the window (normal, minimized, maximized).
146          * \return The state of the window.
147          */
148         GHOST_TWindowState getState() const;
149
150         /**
151          * Sets the window "modified" status, indicating unsaved changes
152          * \param isUnsavedChanges Unsaved changes or not
153          * \return Indication of success.
154          */
155         GHOST_TSuccess setModifiedState(bool isUnsavedChanges);
156         
157         /**
158          * Converts a point in screen coordinates to client rectangle coordinates
159          * \param inX   The x-coordinate on the screen.
160          * \param inY   The y-coordinate on the screen.
161          * \param outX  The x-coordinate in the client rectangle.
162          * \param outY  The y-coordinate in the client rectangle.
163          */
164         void screenToClient(GHOST_TInt32 inX, GHOST_TInt32 inY, GHOST_TInt32& outX, GHOST_TInt32& outY) const;
165
166         /**
167          * Converts a point in screen coordinates to client rectangle coordinates
168          * \param inX   The x-coordinate in the client rectangle.
169          * \param inY   The y-coordinate in the client rectangle.
170          * \param outX  The x-coordinate on the screen.
171          * \param outY  The y-coordinate on the screen.
172          */
173         void clientToScreen(GHOST_TInt32 inX, GHOST_TInt32 inY, GHOST_TInt32& outX, GHOST_TInt32& outY) const;
174
175         /**
176          * Converts a point in screen coordinates to client rectangle coordinates
177          * but without the y coordinate conversion needed for ghost compatibility.
178          * \param inX   The x-coordinate in the client rectangle.
179          * \param inY   The y-coordinate in the client rectangle.
180          * \param outX  The x-coordinate on the screen.
181          * \param outY  The y-coordinate on the screen.
182          */
183         void clientToScreenIntern(GHOST_TInt32 inX, GHOST_TInt32 inY, GHOST_TInt32& outX, GHOST_TInt32& outY) const;
184
185         /**
186          * Converts a point in screen coordinates to client rectangle coordinates,
187          * but without the y coordinate conversion needed for ghost compatibility.
188          * \param inX   The x-coordinate in the client rectangle.
189          * \param inY   The y-coordinate in the client rectangle.
190          * \param outX  The x-coordinate on the screen.
191          * \param outY  The y-coordinate on the screen.
192          */
193         void screenToClientIntern(GHOST_TInt32 inX, GHOST_TInt32 inY, GHOST_TInt32& outX, GHOST_TInt32& outY) const;
194
195         /**
196          * Gets the screen the window is displayed in
197          * \return The NSScreen object
198          */
199         NSScreen *getScreen();
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         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         GHOST_TSuccess setOrder(GHOST_TWindowOrder order);
214
215         void loadCursor(bool visible, GHOST_TStandardCursor cursor) const;
216     
217         const GHOST_TabletData *GetTabletData()
218         {
219                 return &m_tablet;
220         }
221
222         GHOST_TabletData& GetCocoaTabletData()
223         {
224                 return m_tablet;
225         }
226         
227         /**
228          * Sets the progress bar value displayed in the window/application icon
229          * \param progress The progress % (0.0 to 1.0)
230          */
231         GHOST_TSuccess setProgressBar(float progress);
232         
233         /**
234          * Hides the progress bar icon
235          */
236         GHOST_TSuccess endProgressBar();
237         
238         
239         void setNativePixelSize(void);
240
241         GHOST_TSuccess beginFullScreen() const {return GHOST_kFailure;}
242
243         GHOST_TSuccess endFullScreen() const {return GHOST_kFailure;}
244         
245         /** public function to get the window containing the OpenGL view */
246         CocoaWindow *getCocoaWindow() const {return m_window;};
247
248         /* Internal value to ensure proper redraws during animations */
249         void setImmediateDraw(bool value) { m_immediateDraw = value; }
250         bool getImmediateDraw(void) const { return m_immediateDraw; }
251         
252 protected:
253
254         /**
255          * \param type  The type of rendering context create.
256          * \return Indication of success.
257          */
258         GHOST_Context *newDrawingContext(GHOST_TDrawingContextType type);
259
260         /**
261          * Invalidates the contents of this window.
262          * \return Indication of success.
263          */
264         GHOST_TSuccess invalidate();
265
266         /**
267          * Sets the cursor visibility on the window using
268          * native window system calls.
269          */
270         GHOST_TSuccess setWindowCursorVisibility(bool visible);
271         
272         /**
273          * Sets the cursor grab on the window using
274          * native window system calls.
275          */
276         GHOST_TSuccess setWindowCursorGrab(GHOST_TGrabCursorMode mode);
277                 
278         /**
279          * Sets the cursor shape on the window using
280          * native window system calls.
281          */
282         GHOST_TSuccess setWindowCursorShape(GHOST_TStandardCursor shape);
283
284         /**
285          * Sets the cursor shape on the window using
286          * native window system calls.
287          */
288         GHOST_TSuccess setWindowCustomCursorShape(GHOST_TUns8 *bitmap, GHOST_TUns8 *mask,
289                                                           int sizex, int sizey, int hotX, int hotY, int fg_color, int bg_color);
290                                         
291         GHOST_TSuccess setWindowCustomCursorShape(GHOST_TUns8 bitmap[16][2], GHOST_TUns8 mask[16][2], int hotX, int hotY);
292
293         /** The window containing the OpenGL view */
294         CocoaWindow *m_window;
295         
296         /** The openGL view */
297         CocoaOpenGLView *m_openGLView; 
298
299         /** The mother SystemCocoa class to send events */
300         GHOST_SystemCocoa *m_systemCocoa;
301
302         NSCursor *m_customCursor;
303
304         GHOST_TabletData m_tablet;
305
306         bool m_immediateDraw;
307         bool m_debug_context; // for debug messages during context setup
308 };
309
310 #endif // __GHOST_WINDOWCOCOA_H__