Commit of cursor framework. Cursors now defined in source/blender/src/cursors.c and
[blender.git] / intern / ghost / intern / GHOST_WindowCarbon.h
1 /**
2  * $Id$
3  * ***** BEGIN GPL/BL DUAL 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. The Blender
9  * Foundation also sells licenses for use in proprietary software under
10  * the Blender License.  See http://www.blender.org/BL/ for information
11  * about this.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software Foundation,
20  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
21  *
22  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
23  * All rights reserved.
24  *
25  * The Original Code is: all of this file.
26  *
27  * Contributor(s): none yet.
28  *
29  * ***** END GPL/BL DUAL LICENSE BLOCK *****
30  */
31 /**
32  * @file        GHOST_WindowCarbon.h
33  * Declaration of GHOST_WindowCarbon class.
34  */
35
36 #ifndef _GHOST_WINDOW_CARBON_H_
37 #define _GHOST_WINDOW_CARBON_H_
38
39 #ifndef __APPLE__
40 #error Apple OSX only!
41 #endif // __APPLE__
42
43 #include "GHOST_Window.h"
44 #include "STR_String.h"
45
46 #include <Carbon/Carbon.h>
47
48 #include <AGL/agl.h>
49
50
51 /**
52  * Window on Mac OSX/Carbon.
53  * Carbon windows have a size widget in the lower right corner of the window.
54  * To force it to be visible, the height of the client rectangle is reduced so
55  * that applications do not draw in that area. GHOST will manage that area
56  * which is called the gutter.
57  * When OpenGL contexts are active, GHOST will use AGL_BUFFER_RECT to prevent
58  * OpenGL drawing outside the reduced client rectangle.
59  * @author      Maarten Gribnau
60  * @date        May 23, 2001
61  */
62 class GHOST_WindowCarbon : 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 title         The text shown in the title bar of the window.
69          * @param left          The coordinate of the left edge of the window.
70          * @param top           The coordinate of the top edge of the window.
71          * @param width         The width the window.
72          * @param height        The height the window.
73          * @param state         The state the window is initially opened with.
74          * @param type          The type of drawing context installed in this window.
75          * @param stereoVisual  Stereo visual for quad buffered stereo.
76          */
77         GHOST_WindowCarbon(
78                 const STR_String& title,
79                 GHOST_TInt32 left,
80                 GHOST_TInt32 top,
81                 GHOST_TUns32 width,
82                 GHOST_TUns32 height,
83                 GHOST_TWindowState state,
84                 GHOST_TDrawingContextType type = GHOST_kDrawingContextTypeNone,
85                 const bool stereoVisual = false
86         );
87
88         /**
89          * Destructor.
90          * Closes the window and disposes resources allocated.
91          */
92         virtual ~GHOST_WindowCarbon();
93
94         /**
95          * Returns indication as to whether the window is valid.
96          * @return The validity of the window.
97          */
98         virtual bool getValid() const;
99
100         /**
101          * Sets the title displayed in the title bar.
102          * @param title The title to display in the title bar.
103          */
104         virtual void setTitle(const STR_String& title);
105
106         /**
107          * Returns the title displayed in the title bar.
108          * @param title The title displayed in the title bar.
109          */
110         virtual void getTitle(STR_String& title) const;
111
112         /**
113          * Returns the window rectangle dimensions.
114          * The dimensions are given in screen coordinates that are relative to the upper-left corner of the screen. 
115          * @param bounds The bounding rectangle of the window.
116          */
117         virtual void getWindowBounds(GHOST_Rect& bounds) const;
118         
119         /**
120          * Returns the client rectangle dimensions.
121          * The left and top members of the rectangle are always zero.
122          * @param bounds The bounding rectangle of the cleient area of the window.
123          */
124         virtual void getClientBounds(GHOST_Rect& bounds) const;
125
126         /**
127          * Resizes client rectangle width.
128          * @param width The new width of the client area of the window.
129          */
130         virtual GHOST_TSuccess setClientWidth(GHOST_TUns32 width);
131
132         /**
133          * Resizes client rectangle height.
134          * @param height The new height of the client area of the window.
135          */
136         virtual GHOST_TSuccess setClientHeight(GHOST_TUns32 height);
137
138         /**
139          * Resizes client rectangle.
140          * @param width         The new width of the client area of the window.
141          * @param height        The new height of the client area of the window.
142          */
143         virtual GHOST_TSuccess setClientSize(GHOST_TUns32 width, GHOST_TUns32 height);
144
145         /**
146          * Returns the state of the window (normal, minimized, maximized).
147          * @return The state of the window.
148          */
149         virtual GHOST_TWindowState getState() const;
150
151         /**
152          * Converts a point in screen coordinates to client rectangle coordinates
153          * @param inX   The x-coordinate on the screen.
154          * @param inY   The y-coordinate on the screen.
155          * @param outX  The x-coordinate in the client rectangle.
156          * @param outY  The y-coordinate in the client rectangle.
157          */
158         virtual void screenToClient(GHOST_TInt32 inX, GHOST_TInt32 inY, GHOST_TInt32& outX, GHOST_TInt32& outY) const;
159
160         /**
161          * Converts a point in screen coordinates to client rectangle coordinates
162          * @param inX   The x-coordinate in the client rectangle.
163          * @param inY   The y-coordinate in the client rectangle.
164          * @param outX  The x-coordinate on the screen.
165          * @param outY  The y-coordinate on the screen.
166          */
167         virtual void clientToScreen(GHOST_TInt32 inX, GHOST_TInt32 inY, GHOST_TInt32& outX, GHOST_TInt32& outY) const;
168
169         /**
170          * Sets the state of the window (normal, minimized, maximized).
171          * @param state The state of the window.
172          * @return Indication of success.
173          */
174         virtual GHOST_TSuccess setState(GHOST_TWindowState state);
175
176         /**
177          * Sets the order of the window (bottom, top).
178          * @param order The order of the window.
179          * @return Indication of success.
180          */
181         virtual GHOST_TSuccess setOrder(GHOST_TWindowOrder order);
182
183         /**
184          * Swaps front and back buffers of a window.
185          * @return      A boolean success indicator.
186          */
187         virtual GHOST_TSuccess swapBuffers();
188
189         /**
190          * Updates the drawing context of this window. Needed
191          * whenever the window is changed.
192          * @return Indication of success.
193          */
194         GHOST_TSuccess updateDrawingContext();
195
196         /**
197          * Activates the drawing context of this window.
198          * @return      A boolean success indicator.
199          */
200         virtual GHOST_TSuccess activateDrawingContext();
201
202         virtual void loadCursor(bool visible, GHOST_TStandardCursor cursor) const;
203     
204     /**
205      * Returns the dirty state of the window when in full-screen mode.
206      * @return Whether it is dirty.
207      */
208     virtual bool getFullScreenDirty();
209
210 protected:
211         /**
212          * Tries to install a rendering context in this window.
213          * @param type  The type of rendering context installed.
214          * @return Indication as to whether installation has succeeded.
215          */
216         virtual GHOST_TSuccess installDrawingContext(GHOST_TDrawingContextType type);
217
218         /**
219          * Removes the current drawing context.
220          * @return Indication as to whether removal has succeeded.
221          */
222         virtual GHOST_TSuccess removeDrawingContext();
223     
224         /**
225          * Invalidates the contents of this window.
226          * @return Indication of success.
227          */
228         virtual GHOST_TSuccess invalidate();
229
230         /**
231          * Sets the cursor visibility on the window using
232          * native window system calls.
233          */
234         virtual GHOST_TSuccess setWindowCursorVisibility(bool visible);
235         
236         /**
237          * Sets the cursor shape on the window using
238          * native window system calls.
239          */
240         virtual GHOST_TSuccess setWindowCursorShape(GHOST_TStandardCursor shape);
241
242         /**
243          * Sets the cursor shape on the window using
244          * native window system calls.
245          */
246         virtual GHOST_TSuccess setWindowCustomCursorShape(GHOST_TUns8 *bitmap, GHOST_TUns8 *mask,
247                                         int sizex, int sizey, int hotX, int hotY, int fg_color, int bg_color);
248                                         
249         virtual GHOST_TSuccess setWindowCustomCursorShape(GHOST_TUns8 bitmap[16][2], GHOST_TUns8 mask[16][2], int hotX, int hotY);
250     
251     /**
252      * Converts a string object to a Mac Pascal string.
253      * @param in        The string object to be converted.
254      * @param out       The converted string.
255      */
256     virtual void gen2mac(const STR_String& in, Str255 out) const;
257
258     /**
259      * Converts a Mac Pascal string to a string object.
260      * @param in        The string to be converted.
261      * @param out       The converted string object.
262      */
263     virtual void mac2gen(const Str255 in, STR_String& out) const;
264
265     WindowRef m_windowRef;
266     CGrafPtr m_grafPtr;
267     AGLContext m_aglCtx;
268
269         /** The first created OpenGL context (for sharing display lists) */
270         static AGLContext s_firstaglCtx;
271                 
272         Cursor* m_customCursor;
273     
274     /** When running in full-screen this tells whether to refresh the window. */
275     bool m_fullScreenDirty;
276
277     /**
278      * The width/height of the size rectangle in the lower right corner of a 
279      * Mac/Carbon window. This is also the height of the gutter area.
280      */
281 #ifdef GHOST_DRAW_CARBON_GUTTER
282     static const GHOST_TInt32 s_sizeRectSize;
283 #endif // GHOST_DRAW_CARBON_GUTTER
284 };
285
286 #endif // _GHOST_WINDOW_CARBON_H_
287