spaces -> tabs (only whitespace changes)
[blender.git] / intern / ghost / intern / GHOST_WindowCarbon.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_WindowCarbon.h
30  *  \ingroup GHOST
31  * Declaration of GHOST_WindowCarbon class.
32  */
33
34 #ifndef _GHOST_WINDOW_CARBON_H_
35 #define _GHOST_WINDOW_CARBON_H_
36
37 #ifndef __APPLE__
38 #error Apple OSX only!
39 #endif // __APPLE__
40
41 #include "GHOST_Window.h"
42 #include "STR_String.h"
43
44 #define __CARBONSOUND__
45 #include <Carbon/Carbon.h>
46
47 #include <AGL/agl.h>
48
49
50 /**
51  * Window on Mac OSX/Carbon.
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  * @author      Maarten Gribnau
59  * @date        May 23, 2001
60  */
61 class GHOST_WindowCarbon : public GHOST_Window {
62 public:
63         /**
64          * Constructor.
65          * Creates a new window and opens it.
66          * To check if the window was created properly, use the getValid() method.
67          * @param title         The text shown in the title bar of the window.
68          * @param left          The coordinate of the left edge of the window.
69          * @param top           The coordinate of the top edge of the window.
70          * @param width         The width the window.
71          * @param height        The height the window.
72          * @param state         The state the window is initially opened with.
73          * @param type          The type of drawing context installed in this window.
74          * @param stereoVisual  Stereo visual for quad buffered stereo.
75          */
76         GHOST_WindowCarbon(
77                 const STR_String& title,
78                 GHOST_TInt32 left,
79                 GHOST_TInt32 top,
80                 GHOST_TUns32 width,
81                 GHOST_TUns32 height,
82                 GHOST_TWindowState state,
83                 GHOST_TDrawingContextType type = GHOST_kDrawingContextTypeNone,
84                 const bool stereoVisual = false,
85                 const GHOST_TUns16 numOfAASamples = 0
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                 /* accessor for fullscreen window */
211         virtual void setMac_windowState(short value);
212         virtual short getMac_windowState();
213
214
215         const GHOST_TabletData* GetTabletData()
216         { return &m_tablet; }
217
218         GHOST_TabletData& GetCarbonTabletData()
219         { return m_tablet; }
220 protected:
221         /**
222          * Tries to install a rendering context in this window.
223          * @param type  The type of rendering context installed.
224          * @return Indication as to whether installation has succeeded.
225          */
226         virtual GHOST_TSuccess installDrawingContext(GHOST_TDrawingContextType type);
227
228         /**
229          * Removes the current drawing context.
230          * @return Indication as to whether removal has succeeded.
231          */
232         virtual GHOST_TSuccess removeDrawingContext();
233     
234         /**
235          * Invalidates the contents of this window.
236          * @return Indication of success.
237          */
238         virtual GHOST_TSuccess invalidate();
239
240         /**
241          * Sets the cursor visibility on the window using
242          * native window system calls.
243          */
244         virtual GHOST_TSuccess setWindowCursorVisibility(bool visible);
245         
246         /**
247          * Sets the cursor shape on the window using
248          * native window system calls.
249          */
250         virtual GHOST_TSuccess setWindowCursorShape(GHOST_TStandardCursor shape);
251
252         /**
253          * Sets the cursor shape on the window using
254          * native window system calls.
255          */
256         virtual GHOST_TSuccess setWindowCustomCursorShape(GHOST_TUns8 *bitmap, GHOST_TUns8 *mask,
257                                         int sizex, int sizey, int hotX, int hotY, int fg_color, int bg_color);
258                                         
259         virtual GHOST_TSuccess setWindowCustomCursorShape(GHOST_TUns8 bitmap[16][2], GHOST_TUns8 mask[16][2], int hotX, int hotY);
260
261         /**
262          * Converts a string object to a Mac Pascal string.
263          * @param in    The string object to be converted.
264          * @param out   The converted string.
265          */
266         virtual void gen2mac(const STR_String& in, Str255 out) const;
267
268         /**
269          * Converts a Mac Pascal string to a string object.
270          * @param in    The string to be converted.
271          * @param out   The converted string object.
272          */
273         virtual void mac2gen(const Str255 in, STR_String& out) const;
274         
275         WindowRef m_windowRef;
276         CGrafPtr m_grafPtr;
277         AGLContext m_aglCtx;
278
279         /** The first created OpenGL context (for sharing display lists) */
280         static AGLContext s_firstaglCtx;
281                 
282         Cursor* m_customCursor;
283
284         GHOST_TabletData m_tablet;
285
286         /** When running in full-screen this tells whether to refresh the window. */
287         bool m_fullScreenDirty;
288         
289         /** specific MacOs X full screen window setting as we use partially system mechanism 
290             values :      0       not maximizable default
291                               1       normal state
292                                           2               maximized state
293         
294              this will be reworked when rebuilding GHOST carbon to use new OS X apis 
295                 in order to be unified with GHOST fullscreen/maximised settings
296                  
297                  (lukep)
298         **/
299
300         short mac_windowState;
301         
302
303         /**
304          * The width/height of the size rectangle in the lower right corner of a
305          * Mac/Carbon window. This is also the height of the gutter area.
306          */
307 #ifdef GHOST_DRAW_CARBON_GUTTER
308         static const GHOST_TInt32 s_sizeRectSize;
309 #endif // GHOST_DRAW_CARBON_GUTTER
310 };
311
312 #endif // _GHOST_WINDOW_CARBON_H_
313