Ghost Context Refactor
[blender-staging.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): none yet.
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 /**
51  * Window on Mac OSX/Cocoa.
52  * Carbon windows have a size widget in the lower right corner of the window.
53  * To force it to be visible, the height of the client rectangle is reduced so
54  * that applications do not draw in that area. GHOST will manage that area
55  * which is called the gutter.
56  * When OpenGL contexts are active, GHOST will use AGL_BUFFER_RECT to prevent
57  * OpenGL drawing outside the reduced client rectangle.
58  * XXX jwilkins: This comment seems out of date since we neither use Carbon nor AGL
59  * \author      Maarten Gribnau
60  * \date        May 23, 2001
61  */
62 class GHOST_WindowCocoa : public GHOST_Window {
63 public:
64         /**
65          * Constructor.
66          * Creates a new window and opens it.
67          * To check if the window was created properly, use the getValid() method.
68          * \param systemCocoa           The associated system class to forward events to
69          * \param title                         The text shown in the title bar of the window.
70          * \param left                          The coordinate of the left edge of the window.
71          * \param top                           The coordinate of the top edge of the window.
72          * \param width                         The width the window.
73          * \param height                        The height the window.
74          * \param state                         The state the window is initially opened with.
75          * \param type                          The type of drawing context installed in this window.
76          * \param stereoVisual          Stereo visual for quad buffered stereo.
77          * \param numOfAASamples        Number of samples used for AA (zero if no AA)
78          */
79         GHOST_WindowCocoa(
80             GHOST_SystemCocoa *systemCocoa,
81             const STR_String& title,
82             GHOST_TInt32 left,
83             GHOST_TInt32 bottom,
84             GHOST_TUns32 width,
85             GHOST_TUns32 height,
86             GHOST_TWindowState state,
87             GHOST_TDrawingContextType type = GHOST_kDrawingContextTypeNone,
88             const bool stereoVisual = false,
89             const GHOST_TUns16 numOfAASamples = 0
90             );
91
92         /**
93          * Destructor.
94          * Closes the window and disposes resources allocated.
95          */
96         virtual ~GHOST_WindowCocoa();
97
98         /**
99          * Returns indication as to whether the window is valid.
100          * \return The validity of the window.
101          */
102         virtual bool getValid() const;
103         
104         /**
105          * Returns the associated NSWindow object
106          * \return The associated NSWindow object
107          */
108         virtual void *getOSWindow() const;
109
110         /**
111          * Sets the title displayed in the title bar.
112          * \param title The title to display in the title bar.
113          */
114         virtual void setTitle(const STR_String& title);
115
116         /**
117          * Returns the title displayed in the title bar.
118          * \param title The title displayed in the title bar.
119          */
120         virtual void getTitle(STR_String& title) const;
121
122         /**
123          * Returns the window rectangle dimensions.
124          * The dimensions are given in screen coordinates that are relative to the upper-left corner of the screen. 
125          * \param bounds The bounding rectangle of the window.
126          */
127         virtual void getWindowBounds(GHOST_Rect& bounds) const;
128         
129         /**
130          * Returns the client rectangle dimensions.
131          * The left and top members of the rectangle are always zero.
132          * \param bounds The bounding rectangle of the client area of the window.
133          */
134         virtual void getClientBounds(GHOST_Rect& bounds) const;
135
136         /**
137          * Resizes client rectangle width.
138          * \param width The new width of the client area of the window.
139          */
140         virtual GHOST_TSuccess setClientWidth(GHOST_TUns32 width);
141
142         /**
143          * Resizes client rectangle height.
144          * \param height The new height of the client area of the window.
145          */
146         virtual GHOST_TSuccess setClientHeight(GHOST_TUns32 height);
147
148         /**
149          * Resizes client rectangle.
150          * \param width         The new width of the client area of the window.
151          * \param height        The new height of the client area of the window.
152          */
153         virtual GHOST_TSuccess setClientSize(GHOST_TUns32 width, GHOST_TUns32 height);
154
155         /**
156          * Returns the state of the window (normal, minimized, maximized).
157          * \return The state of the window.
158          */
159         virtual GHOST_TWindowState getState() const;
160
161         /**
162          * Sets the window "modified" status, indicating unsaved changes
163          * \param isUnsavedChanges Unsaved changes or not
164          * \return Indication of success.
165          */
166         virtual GHOST_TSuccess setModifiedState(bool isUnsavedChanges);
167         
168         /**
169          * Converts a point in screen coordinates to client rectangle coordinates
170          * \param inX   The x-coordinate on the screen.
171          * \param inY   The y-coordinate on the screen.
172          * \param outX  The x-coordinate in the client rectangle.
173          * \param outY  The y-coordinate in the client rectangle.
174          */
175         virtual void screenToClient(GHOST_TInt32 inX, GHOST_TInt32 inY, GHOST_TInt32& outX, GHOST_TInt32& outY) const;
176
177         /**
178          * Converts a point in screen coordinates to client rectangle coordinates
179          * \param inX   The x-coordinate in the client rectangle.
180          * \param inY   The y-coordinate in the client rectangle.
181          * \param outX  The x-coordinate on the screen.
182          * \param outY  The y-coordinate on the screen.
183          */
184         virtual void clientToScreen(GHOST_TInt32 inX, GHOST_TInt32 inY, GHOST_TInt32& outX, GHOST_TInt32& outY) const;
185
186         /**
187          * Converts a point in screen coordinates to client rectangle coordinates
188          * but without the y coordinate conversion needed for ghost compatibility.
189          * \param inX   The x-coordinate in the client rectangle.
190          * \param inY   The y-coordinate in the client rectangle.
191          * \param outX  The x-coordinate on the screen.
192          * \param outY  The y-coordinate on the screen.
193          */
194         void clientToScreenIntern(GHOST_TInt32 inX, GHOST_TInt32 inY, GHOST_TInt32& outX, GHOST_TInt32& outY) const;
195
196         /**
197          * Converts a point in screen coordinates to client rectangle coordinates,
198          * but without the y coordinate conversion needed for ghost compatibility.
199          * \param inX   The x-coordinate in the client rectangle.
200          * \param inY   The y-coordinate in the client rectangle.
201          * \param outX  The x-coordinate on the screen.
202          * \param outY  The y-coordinate on the screen.
203          */
204         void screenToClientIntern(GHOST_TInt32 inX, GHOST_TInt32 inY, GHOST_TInt32& outX, GHOST_TInt32& outY) const;
205
206         /**
207          * Gets the screen the window is displayed in
208          * \return The NSScreen object
209          */
210         NSScreen *getScreen();
211         
212         /**
213          * Sets the state of the window (normal, minimized, maximized).
214          * \param state The state of the window.
215          * \return Indication of success.
216          */
217         virtual GHOST_TSuccess setState(GHOST_TWindowState state);
218
219         /**
220          * Sets the order of the window (bottom, top).
221          * \param order The order of the window.
222          * \return Indication of success.
223          */
224         virtual GHOST_TSuccess setOrder(GHOST_TWindowOrder order);
225
226         virtual void loadCursor(bool visible, GHOST_TStandardCursor cursor) const;
227     
228         const GHOST_TabletData *GetTabletData()
229         {
230                 return &m_tablet;
231         }
232
233         GHOST_TabletData& GetCocoaTabletData()
234         {
235                 return m_tablet;
236         }
237         
238         /**
239          * Sets the progress bar value displayed in the window/application icon
240          * \param progress The progress % (0.0 to 1.0)
241          */
242         virtual GHOST_TSuccess setProgressBar(float progress);
243         
244         /**
245          * Hides the progress bar icon
246          */
247         virtual GHOST_TSuccess endProgressBar();
248         
249         
250         virtual void setNativePixelSize(void);
251
252         GHOST_TSuccess beginFullScreen() const {return GHOST_kFailure;}
253
254         GHOST_TSuccess endFullScreen() const {return GHOST_kFailure;}
255         
256         /** public function to get the window containing the OpenGL view */
257         CocoaWindow *getCocoaWindow() const {return m_window;};
258
259         /* Internal value to ensure proper redraws during animations */
260         void setImmediateDraw(bool value) { m_immediateDraw = value; }
261         bool getImmediateDraw(void) const { return m_immediateDraw; }
262         
263 protected:
264
265         /**
266          * \param type  The type of rendering context create.
267          * \return Indication of success.
268          */
269         virtual GHOST_Context *newDrawingContext(GHOST_TDrawingContextType type);
270
271         /**
272          * Invalidates the contents of this window.
273          * \return Indication of success.
274          */
275         virtual GHOST_TSuccess invalidate();
276
277         /**
278          * Sets the cursor visibility on the window using
279          * native window system calls.
280          */
281         virtual GHOST_TSuccess setWindowCursorVisibility(bool visible);
282         
283         /**
284          * Sets the cursor grab on the window using
285          * native window system calls.
286          */
287         virtual GHOST_TSuccess setWindowCursorGrab(GHOST_TGrabCursorMode mode);
288                 
289         /**
290          * Sets the cursor shape on the window using
291          * native window system calls.
292          */
293         virtual GHOST_TSuccess setWindowCursorShape(GHOST_TStandardCursor shape);
294
295         /**
296          * Sets the cursor shape on the window using
297          * native window system calls.
298          */
299         virtual GHOST_TSuccess setWindowCustomCursorShape(GHOST_TUns8 *bitmap, GHOST_TUns8 *mask,
300                                                           int sizex, int sizey, int hotX, int hotY, int fg_color, int bg_color);
301                                         
302         virtual GHOST_TSuccess setWindowCustomCursorShape(GHOST_TUns8 bitmap[16][2], GHOST_TUns8 mask[16][2], int hotX, int hotY);
303
304         /** The window containing the OpenGL view */
305         CocoaWindow *m_window;
306         
307         /** The openGL view */
308         CocoaOpenGLView *m_openGLView; 
309
310         /** The mother SystemCocoa class to send events */
311         GHOST_SystemCocoa *m_systemCocoa;
312
313         NSCursor *m_customCursor;
314
315         GHOST_TabletData m_tablet;
316
317         bool m_lionStyleFullScreen;
318
319         bool m_immediateDraw;
320 };
321
322 #endif // __GHOST_WINDOWCOCOA_H__