Fix for lots of window size events during window drag
[blender.git] / intern / ghost / intern / GHOST_SystemCarbon.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_SystemCarbon.h
33  * Declaration of GHOST_SystemCarbon class.
34  */
35
36 #ifndef _GHOST_SYSTEM_CARBON_H_
37 #define _GHOST_SYSTEM_CARBON_H_
38
39 #ifndef __APPLE__
40 #error Apple OSX only!
41 #endif // __APPLE__
42
43 #include <Carbon/Carbon.h>
44
45 #include "GHOST_System.h"
46
47 class GHOST_EventCursor;
48 class GHOST_EventKey;
49 class GHOST_EventWindow;
50
51 /**
52  * OSX/Carbon Implementation of GHOST_System class.
53  * @see GHOST_System.
54  * @author      Maarten Gribnau
55  * @date        May 21, 2001
56  */
57 class GHOST_SystemCarbon : public GHOST_System {
58 public:
59     /**
60      * Constructor.
61      */
62     GHOST_SystemCarbon::GHOST_SystemCarbon();
63     
64     /** 
65      * Destructor.
66      */
67     GHOST_SystemCarbon::~GHOST_SystemCarbon();
68     
69         /***************************************************************************************
70          ** Time(r) functionality
71          ***************************************************************************************/
72
73         /**
74          * Returns the system time.
75          * Returns the number of milliseconds since the start of the system process.
76          * Based on ANSI clock() routine.
77          * @return The number of milliseconds.
78          */
79         virtual GHOST_TUns64 getMilliSeconds() const;
80
81         /***************************************************************************************
82          ** Display/window management functionality
83          ***************************************************************************************/
84
85         /**
86          * Returns the number of displays on this system.
87          * @return The number of displays.
88          */
89         virtual GHOST_TUns8 getNumDisplays() const;
90
91         /**
92          * Returns the dimensions of the main display on this system.
93          * @return The dimension of the main display.
94          */
95         virtual void getMainDisplayDimensions(GHOST_TUns32& width, GHOST_TUns32& height) const;
96         
97         /**
98          * Create a new window.
99          * The new window is added to the list of windows managed. 
100          * Never explicitly delete the window, use disposeWindow() instead.
101          * @param       title   The name of the window (displayed in the title bar of the window if the OS supports it).
102          * @param       left    The coordinate of the left edge of the window.
103          * @param       top             The coordinate of the top edge of the window.
104          * @param       width   The width the window.
105          * @param       height  The height the window.
106          * @param       state   The state of the window when opened.
107          * @param       type    The type of drawing context installed in this window.
108          * @return      The new window (or 0 if creation failed).
109          */
110         virtual GHOST_IWindow* createWindow(
111                 const STR_String& title,
112                 GHOST_TInt32 left,
113                 GHOST_TInt32 top,
114                 GHOST_TUns32 width,
115                 GHOST_TUns32 height,
116                 GHOST_TWindowState state,
117                 GHOST_TDrawingContextType type,
118                 const bool stereoVisual
119         );
120         
121         /***************************************************************************************
122          ** Event management functionality
123          ***************************************************************************************/
124
125         /**
126          * Gets events from the system and stores them in the queue.
127          * @param waitForEvent Flag to wait for an event (or return immediately).
128          * @return Indication of the presence of events.
129          */
130         virtual bool processEvents(bool waitForEvent);
131         
132         /***************************************************************************************
133          ** Cursor management functionality
134          ***************************************************************************************/
135
136         /**
137          * Returns the current location of the cursor (location in screen coordinates)
138          * @param x                     The x-coordinate of the cursor.
139          * @param y                     The y-coordinate of the cursor.
140          * @return                      Indication of success.
141          */
142         virtual GHOST_TSuccess getCursorPosition(GHOST_TInt32& x, GHOST_TInt32& y) const;
143
144         /**
145          * Updates the location of the cursor (location in screen coordinates).
146          * @param x                     The x-coordinate of the cursor.
147          * @param y                     The y-coordinate of the cursor.
148          * @return                      Indication of success.
149          */
150         virtual GHOST_TSuccess setCursorPosition(GHOST_TInt32 x, GHOST_TInt32 y) const;
151
152         /***************************************************************************************
153          ** Access to mouse button and keyboard states.
154          ***************************************************************************************/
155
156         /**
157          * Returns the state of all modifier keys.
158          * @param keys  The state of all modifier keys (true == pressed).
159          * @return              Indication of success.
160          */
161         virtual GHOST_TSuccess getModifierKeys(GHOST_ModifierKeys& keys) const;
162
163         /**
164          * Returns the state of the mouse buttons (ouside the message queue).
165          * @param buttons       The state of the buttons.
166          * @return                      Indication of success.
167          */
168         virtual GHOST_TSuccess getButtons(GHOST_Buttons& buttons) const;
169
170 protected:
171         /**
172          * Initializes the system.
173          * For now, it justs registers the window class (WNDCLASS).
174          * @return A success value.
175          */
176         virtual GHOST_TSuccess init();
177
178         /**
179          * Closes the system down.
180          * @return A success value.
181          */
182         virtual GHOST_TSuccess exit();
183
184     /**
185      * Handles a mouse event.
186      * @param event     A Mac event.
187      * @return Indication whether the event was handled. 
188      */
189     OSStatus handleMouseEvent(EventRef event);
190
191     /**
192      * Handles a key event.
193      * @param event     A Mac event.
194      * @return Indication whether the event was handled. 
195      */
196     OSStatus handleKeyEvent(EventRef event);
197
198    /**
199      * Handles a window event.
200      * @param event     A Mac event.
201      * @return Indication whether the event was handled. 
202      */
203     OSStatus handleWindowEvent(EventRef event);
204
205     /**
206      * Handles all basic Mac application stuff for a mouse down event.
207      * @param event     A Mac event.
208      * @return Indication whether the event was handled. 
209      */
210     bool handleMouseDown(EventRef event);
211
212     /**
213      * Handles a Mac menu command.
214      * @param menuResult A Mac menu/item identifier.
215      * @return Indication whether the event was handled. 
216      */
217     bool handleMenuCommand(GHOST_TInt32 menuResult);
218     
219     /**
220      * Callback for Carbon when it has events.
221      */
222         static OSStatus sEventHandlerProc(EventHandlerCallRef handler, EventRef event, void* userData);
223         
224         /** Apple Event Handlers */
225         static OSErr sAEHandlerLaunch(const AppleEvent *event, AppleEvent *reply, SInt32 refCon);
226         static OSErr sAEHandlerOpenDocs(const AppleEvent *event, AppleEvent *reply, SInt32 refCon);
227         static OSErr sAEHandlerPrintDocs(const AppleEvent *event, AppleEvent *reply, SInt32 refCon);
228         static OSErr sAEHandlerQuit(const AppleEvent *event, AppleEvent *reply, SInt32 refCon);
229
230     /**
231      * Callback for Mac Timer tasks that expire.
232      * @param tmTask Pointer to the timer task that expired.
233      */
234     //static void s_timerCallback(TMTaskPtr tmTask);
235     
236     /** Event handler reference. */
237     EventHandlerRef m_handler;
238         
239         /** Start time at initialization. */
240         GHOST_TUns64 m_start_time;
241         
242     /** State of the modifiers. */
243     UInt32 m_modifierMask;
244
245     /** Ignores window size messages (when window is dragged). */
246     bool m_ignoreWindowSizedMessages;    
247 };
248
249 #endif // _GHOST_SYSTEM_CARBON_H_
250