From 35a45a7de82d433aaea70d3bc1021bdb6a3366f8 Mon Sep 17 00:00:00 2001 From: Tom Musgrove Date: Thu, 22 Jul 2010 04:06:13 +0000 Subject: [PATCH] some things missed from head merging --- .../ghost/intern/GHOST_DisplayManagerCocoa.h | 2 +- .../ghost/intern/GHOST_DisplayManagerCocoa.mm | 330 +-- intern/ghost/intern/GHOST_EventDragnDrop.h | 2 +- intern/ghost/intern/GHOST_SystemCocoa.h | 6 +- intern/ghost/intern/GHOST_SystemCocoa.mm | 1790 +++++++---------- intern/ghost/intern/GHOST_SystemWin32.h | 2 +- intern/ghost/intern/GHOST_SystemX11.cpp | 6 +- intern/ghost/intern/GHOST_WindowCocoa.h | 2 +- intern/ghost/intern/GHOST_WindowCocoa.mm | 1374 ++++--------- 9 files changed, 1278 insertions(+), 2236 deletions(-) diff --git a/intern/ghost/intern/GHOST_DisplayManagerCocoa.h b/intern/ghost/intern/GHOST_DisplayManagerCocoa.h index 93782bbcf7b..7261ac3b8e5 100644 --- a/intern/ghost/intern/GHOST_DisplayManagerCocoa.h +++ b/intern/ghost/intern/GHOST_DisplayManagerCocoa.h @@ -1,5 +1,5 @@ /** - * $Id: GHOST_DisplayManagerCocoa.h 23603 2009-10-02 07:20:33Z damien78 $ + * $Id: GHOST_DisplayManagerCocoa.h 26841 2010-02-12 13:34:04Z campbellbarton $ * ***** BEGIN GPL LICENSE BLOCK ***** * * This program is free software; you can redistribute it and/or diff --git a/intern/ghost/intern/GHOST_DisplayManagerCocoa.mm b/intern/ghost/intern/GHOST_DisplayManagerCocoa.mm index 991188524df..0b2fee7f156 100644 --- a/intern/ghost/intern/GHOST_DisplayManagerCocoa.mm +++ b/intern/ghost/intern/GHOST_DisplayManagerCocoa.mm @@ -1,168 +1,168 @@ -/** - * $Id: GHOST_DisplayManagerCocoa.mm 23603 2009-10-02 07:20:33Z damien78 $ - * ***** BEGIN GPL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, +/** + * $Id: GHOST_DisplayManagerCocoa.mm 26841 2010-02-12 13:34:04Z campbellbarton $ + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. - * All rights reserved. - * - * The Original Code is: all of this file. - * - * Contributor(s): Maarten Gribnau 09/2001 - Damien Plisson 10/2009 - * - * ***** END GPL LICENSE BLOCK ***** - */ - -#include - -#include "GHOST_DisplayManagerCocoa.h" -#include "GHOST_Debug.h" - -// We do not support multiple monitors at the moment - - -GHOST_DisplayManagerCocoa::GHOST_DisplayManagerCocoa(void) -{ -} - - -GHOST_TSuccess GHOST_DisplayManagerCocoa::getNumDisplays(GHOST_TUns8& numDisplays) const -{ - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - numDisplays = (GHOST_TUns8) [[NSScreen screens] count]; - - [pool drain]; - return GHOST_kSuccess; -} - - -GHOST_TSuccess GHOST_DisplayManagerCocoa::getNumDisplaySettings(GHOST_TUns8 display, GHOST_TInt32& numSettings) const -{ - GHOST_ASSERT((display==kMainDisplay), "GHOST_DisplayManagerCocoa::getNumDisplaySettings(): only main display is supported"); - - numSettings = (GHOST_TInt32)3; //Width, Height, BitsPerPixel - - return GHOST_kSuccess; -} - - -GHOST_TSuccess GHOST_DisplayManagerCocoa::getDisplaySetting(GHOST_TUns8 display, GHOST_TInt32 index, GHOST_DisplaySetting& setting) const -{ - //Note that only current display setting is available - NSScreen *askedDisplay; - - GHOST_ASSERT((display==kMainDisplay), "GHOST_DisplayManagerCocoa::getDisplaySetting(): only main display is supported"); - - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - if (display == kMainDisplay) //Screen #0 may not be the main one - askedDisplay = [NSScreen mainScreen]; - else - askedDisplay = [[NSScreen screens] objectAtIndex:display]; - - if(askedDisplay == nil) { - [pool drain]; - return GHOST_kFailure; - } - - NSRect frame = [askedDisplay visibleFrame]; - setting.xPixels = frame.size.width; - setting.yPixels = frame.size.height; - - setting.bpp = NSBitsPerPixelFromDepth([askedDisplay depth]); - - setting.frequency = 0; //No more CRT display... - -#ifdef GHOST_DEBUG - printf("display mode: width=%d, height=%d, bpp=%d, frequency=%d\n", setting.xPixels, setting.yPixels, setting.bpp, setting.frequency); -#endif // GHOST_DEBUG - - [pool drain]; - return GHOST_kSuccess; -} - - -GHOST_TSuccess GHOST_DisplayManagerCocoa::getCurrentDisplaySetting(GHOST_TUns8 display, GHOST_DisplaySetting& setting) const -{ - NSScreen *askedDisplay; - - GHOST_ASSERT((display==kMainDisplay), "GHOST_DisplayManagerCocoa::getCurrentDisplaySetting(): only main display is supported"); - - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - if (display == kMainDisplay) //Screen #0 may not be the main one - askedDisplay = [NSScreen mainScreen]; - else - askedDisplay = [[NSScreen screens] objectAtIndex:display]; - - if(askedDisplay == nil) { - [pool drain]; - return GHOST_kFailure; - } - - NSRect frame = [askedDisplay visibleFrame]; - setting.xPixels = frame.size.width; - setting.yPixels = frame.size.height; - - setting.bpp = NSBitsPerPixelFromDepth([askedDisplay depth]); - - setting.frequency = 0; //No more CRT display... - -#ifdef GHOST_DEBUG - printf("current display mode: width=%d, height=%d, bpp=%d, frequency=%d\n", setting.xPixels, setting.yPixels, setting.bpp, setting.frequency); -#endif // GHOST_DEBUG - - [pool drain]; - return GHOST_kSuccess; -} - - -GHOST_TSuccess GHOST_DisplayManagerCocoa::setCurrentDisplaySetting(GHOST_TUns8 display, const GHOST_DisplaySetting& setting) -{ - GHOST_ASSERT((display==kMainDisplay), "GHOST_DisplayManagerCocoa::setCurrentDisplaySetting(): only main display is supported"); - -#ifdef GHOST_DEBUG - printf("GHOST_DisplayManagerCocoa::setCurrentDisplaySetting(): requested settings:\n"); - printf(" setting.xPixels=%d\n", setting.xPixels); - printf(" setting.yPixels=%d\n", setting.yPixels); - printf(" setting.bpp=%d\n", setting.bpp); - printf(" setting.frequency=%d\n", setting.frequency); -#endif // GHOST_DEBUG - - //Display configuration is no more available in 10.6 - -/* CFDictionaryRef displayModeValues = ::CGDisplayBestModeForParametersAndRefreshRate( - m_displayIDs[display], - (size_t)setting.bpp, - (size_t)setting.xPixels, - (size_t)setting.yPixels, - (CGRefreshRate)setting.frequency, - NULL);*/ - -#ifdef GHOST_DEBUG + * + * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): Maarten Gribnau 09/2001 + Damien Plisson 10/2009 + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#include + +#include "GHOST_DisplayManagerCocoa.h" +#include "GHOST_Debug.h" + +// We do not support multiple monitors at the moment + + +GHOST_DisplayManagerCocoa::GHOST_DisplayManagerCocoa(void) +{ +} + + +GHOST_TSuccess GHOST_DisplayManagerCocoa::getNumDisplays(GHOST_TUns8& numDisplays) const +{ + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + + numDisplays = (GHOST_TUns8) [[NSScreen screens] count]; + + [pool drain]; + return GHOST_kSuccess; +} + + +GHOST_TSuccess GHOST_DisplayManagerCocoa::getNumDisplaySettings(GHOST_TUns8 display, GHOST_TInt32& numSettings) const +{ + GHOST_ASSERT((display==kMainDisplay), "GHOST_DisplayManagerCocoa::getNumDisplaySettings(): only main display is supported"); + + numSettings = (GHOST_TInt32)3; //Width, Height, BitsPerPixel + + return GHOST_kSuccess; +} + + +GHOST_TSuccess GHOST_DisplayManagerCocoa::getDisplaySetting(GHOST_TUns8 display, GHOST_TInt32 index, GHOST_DisplaySetting& setting) const +{ + //Note that only current display setting is available + NSScreen *askedDisplay; + + GHOST_ASSERT((display==kMainDisplay), "GHOST_DisplayManagerCocoa::getDisplaySetting(): only main display is supported"); + + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + + if (display == kMainDisplay) //Screen #0 may not be the main one + askedDisplay = [NSScreen mainScreen]; + else + askedDisplay = [[NSScreen screens] objectAtIndex:display]; + + if(askedDisplay == nil) { + [pool drain]; + return GHOST_kFailure; + } + + NSRect frame = [askedDisplay visibleFrame]; + setting.xPixels = frame.size.width; + setting.yPixels = frame.size.height; + + setting.bpp = NSBitsPerPixelFromDepth([askedDisplay depth]); + + setting.frequency = 0; //No more CRT display... + +#ifdef GHOST_DEBUG + printf("display mode: width=%d, height=%d, bpp=%d, frequency=%d\n", setting.xPixels, setting.yPixels, setting.bpp, setting.frequency); +#endif // GHOST_DEBUG + + [pool drain]; + return GHOST_kSuccess; +} + + +GHOST_TSuccess GHOST_DisplayManagerCocoa::getCurrentDisplaySetting(GHOST_TUns8 display, GHOST_DisplaySetting& setting) const +{ + NSScreen *askedDisplay; + + GHOST_ASSERT((display==kMainDisplay), "GHOST_DisplayManagerCocoa::getCurrentDisplaySetting(): only main display is supported"); + + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + + if (display == kMainDisplay) //Screen #0 may not be the main one + askedDisplay = [NSScreen mainScreen]; + else + askedDisplay = [[NSScreen screens] objectAtIndex:display]; + + if(askedDisplay == nil) { + [pool drain]; + return GHOST_kFailure; + } + + NSRect frame = [askedDisplay visibleFrame]; + setting.xPixels = frame.size.width; + setting.yPixels = frame.size.height; + + setting.bpp = NSBitsPerPixelFromDepth([askedDisplay depth]); + + setting.frequency = 0; //No more CRT display... + +#ifdef GHOST_DEBUG + printf("current display mode: width=%d, height=%d, bpp=%d, frequency=%d\n", setting.xPixels, setting.yPixels, setting.bpp, setting.frequency); +#endif // GHOST_DEBUG + + [pool drain]; + return GHOST_kSuccess; +} + + +GHOST_TSuccess GHOST_DisplayManagerCocoa::setCurrentDisplaySetting(GHOST_TUns8 display, const GHOST_DisplaySetting& setting) +{ + GHOST_ASSERT((display==kMainDisplay), "GHOST_DisplayManagerCocoa::setCurrentDisplaySetting(): only main display is supported"); + +#ifdef GHOST_DEBUG + printf("GHOST_DisplayManagerCocoa::setCurrentDisplaySetting(): requested settings:\n"); + printf(" setting.xPixels=%d\n", setting.xPixels); + printf(" setting.yPixels=%d\n", setting.yPixels); + printf(" setting.bpp=%d\n", setting.bpp); + printf(" setting.frequency=%d\n", setting.frequency); +#endif // GHOST_DEBUG + + //Display configuration is no more available in 10.6 + +/* CFDictionaryRef displayModeValues = ::CGDisplayBestModeForParametersAndRefreshRate( + m_displayIDs[display], + (size_t)setting.bpp, + (size_t)setting.xPixels, + (size_t)setting.yPixels, + (CGRefreshRate)setting.frequency, + NULL);*/ + +#ifdef GHOST_DEBUG /* printf("GHOST_DisplayManagerCocoa::setCurrentDisplaySetting(): switching to:\n"); - printf(" setting.xPixels=%d\n", getValue(displayModeValues, kCGDisplayWidth)); - printf(" setting.yPixels=%d\n", getValue(displayModeValues, kCGDisplayHeight)); - printf(" setting.bpp=%d\n", getValue(displayModeValues, kCGDisplayBitsPerPixel)); + printf(" setting.xPixels=%d\n", getValue(displayModeValues, kCGDisplayWidth)); + printf(" setting.yPixels=%d\n", getValue(displayModeValues, kCGDisplayHeight)); + printf(" setting.bpp=%d\n", getValue(displayModeValues, kCGDisplayBitsPerPixel)); printf(" setting.frequency=%d\n", getValue(displayModeValues, kCGDisplayRefreshRate)); */ -#endif // GHOST_DEBUG - - //CGDisplayErr err = ::CGDisplaySwitchToMode(m_displayIDs[display], displayModeValues); - - return /*err == CGDisplayNoErr ? GHOST_kSuccess :*/ GHOST_kFailure; -} +#endif // GHOST_DEBUG + + //CGDisplayErr err = ::CGDisplaySwitchToMode(m_displayIDs[display], displayModeValues); + + return /*err == CGDisplayNoErr ? GHOST_kSuccess :*/ GHOST_kFailure; +} diff --git a/intern/ghost/intern/GHOST_EventDragnDrop.h b/intern/ghost/intern/GHOST_EventDragnDrop.h index ea13a33f889..1fcfddf5349 100644 --- a/intern/ghost/intern/GHOST_EventDragnDrop.h +++ b/intern/ghost/intern/GHOST_EventDragnDrop.h @@ -69,7 +69,7 @@ public: * @param time The time this event was generated. * @param type The type of this event. * @param dataType The type of the drop candidate object - * @param window The window where the event occured + * @param window The window where the event occurred * @param x The x-coordinate of the location the cursor was at at the time of the event. * @param y The y-coordinate of the location the cursor was at at the time of the event. * @param data The "content" dropped in the window diff --git a/intern/ghost/intern/GHOST_SystemCocoa.h b/intern/ghost/intern/GHOST_SystemCocoa.h index 56b4ceeedf7..6f9c90c7ed7 100644 --- a/intern/ghost/intern/GHOST_SystemCocoa.h +++ b/intern/ghost/intern/GHOST_SystemCocoa.h @@ -1,5 +1,5 @@ /** - * $Id: GHOST_SystemCocoa.h 23737 2009-10-09 12:48:28Z damien78 $ + * $Id: GHOST_SystemCocoa.h 30526 2010-07-20 10:41:08Z campbellbarton $ * ***** BEGIN GPL LICENSE BLOCK ***** * * This program is free software; you can redistribute it and/or @@ -155,7 +155,7 @@ public: * @param draggedObjectType The type object concerned (currently array of file names, string, TIFF image) * @param mouseX x mouse coordinate (in cocoa base window coordinates) * @param mouseY y mouse coordinate - * @param window The window on which the event occured + * @param window The window on which the event occurred * @return Indication whether the event was handled. */ GHOST_TSuccess handleDraggingEvent(GHOST_TEventType eventType, GHOST_TDragnDropTypes draggedObjectType, @@ -236,7 +236,7 @@ public: /** * Handles a window event. Called by GHOST_WindowCocoa window delegate * @param eventType The type of window event - * @param window The window on which the event occured + * @param window The window on which the event occurred * @return Indication whether the event was handled. */ GHOST_TSuccess handleWindowEvent(GHOST_TEventType eventType, GHOST_WindowCocoa* window); diff --git a/intern/ghost/intern/GHOST_SystemCocoa.mm b/intern/ghost/intern/GHOST_SystemCocoa.mm index a3089a76ece..a763309a09a 100644 --- a/intern/ghost/intern/GHOST_SystemCocoa.mm +++ b/intern/ghost/intern/GHOST_SystemCocoa.mm @@ -1,48 +1,20 @@ -/** - * $Id: GHOST_SystemCocoa.mm 23854 2009-10-15 08:27:31Z damien78 $ - * ***** BEGIN GPL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, +/** + * $Id: GHOST_SystemCocoa.mm 30526 2010-07-20 10:41:08Z campbellbarton $ + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -<<<<<<< .working - * - * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. - * All rights reserved. - * - * The Original Code is: all of this file. - * - * Contributor(s): Maarten Gribnau 05/2001 - * Damien Plisson 09/2009 - * - * ***** END GPL LICENSE BLOCK ***** - */ - -#import - -#include -#include -#include - -#include "GHOST_SystemCocoa.h" - -#include "GHOST_DisplayManagerCocoa.h" -#include "GHOST_EventKey.h" -#include "GHOST_EventButton.h" -#include "GHOST_EventCursor.h" -#include "GHOST_EventWheel.h" -#include "GHOST_EventNDOF.h" -======= * * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. * All rights reserved. @@ -72,344 +44,9 @@ #include "GHOST_EventCursor.h" #include "GHOST_EventWheel.h" #include "GHOST_EventNDOF.h" ->>>>>>> .merge-right.r30358 #include "GHOST_EventTrackpad.h" #include "GHOST_EventDragnDrop.h" #include "GHOST_EventString.h" -<<<<<<< .working - -#include "GHOST_TimerManager.h" -#include "GHOST_TimerTask.h" -#include "GHOST_WindowManager.h" -#include "GHOST_WindowCocoa.h" -#include "GHOST_NDOFManager.h" -#include "AssertMacros.h" - -#pragma mark KeyMap, mouse converters - - -/* Keycodes from Carbon include file */ -/* - * Summary: - * Virtual keycodes - * - * Discussion: - * These constants are the virtual keycodes defined originally in - * Inside Mac Volume V, pg. V-191. They identify physical keys on a - * keyboard. Those constants with "ANSI" in the name are labeled - * according to the key position on an ANSI-standard US keyboard. - * For example, kVK_ANSI_A indicates the virtual keycode for the key - * with the letter 'A' in the US keyboard layout. Other keyboard - * layouts may have the 'A' key label on a different physical key; - * in this case, pressing 'A' will generate a different virtual - * keycode. - */ -enum { - kVK_ANSI_A = 0x00, - kVK_ANSI_S = 0x01, - kVK_ANSI_D = 0x02, - kVK_ANSI_F = 0x03, - kVK_ANSI_H = 0x04, - kVK_ANSI_G = 0x05, - kVK_ANSI_Z = 0x06, - kVK_ANSI_X = 0x07, - kVK_ANSI_C = 0x08, - kVK_ANSI_V = 0x09, - kVK_ANSI_B = 0x0B, - kVK_ANSI_Q = 0x0C, - kVK_ANSI_W = 0x0D, - kVK_ANSI_E = 0x0E, - kVK_ANSI_R = 0x0F, - kVK_ANSI_Y = 0x10, - kVK_ANSI_T = 0x11, - kVK_ANSI_1 = 0x12, - kVK_ANSI_2 = 0x13, - kVK_ANSI_3 = 0x14, - kVK_ANSI_4 = 0x15, - kVK_ANSI_6 = 0x16, - kVK_ANSI_5 = 0x17, - kVK_ANSI_Equal = 0x18, - kVK_ANSI_9 = 0x19, - kVK_ANSI_7 = 0x1A, - kVK_ANSI_Minus = 0x1B, - kVK_ANSI_8 = 0x1C, - kVK_ANSI_0 = 0x1D, - kVK_ANSI_RightBracket = 0x1E, - kVK_ANSI_O = 0x1F, - kVK_ANSI_U = 0x20, - kVK_ANSI_LeftBracket = 0x21, - kVK_ANSI_I = 0x22, - kVK_ANSI_P = 0x23, - kVK_ANSI_L = 0x25, - kVK_ANSI_J = 0x26, - kVK_ANSI_Quote = 0x27, - kVK_ANSI_K = 0x28, - kVK_ANSI_Semicolon = 0x29, - kVK_ANSI_Backslash = 0x2A, - kVK_ANSI_Comma = 0x2B, - kVK_ANSI_Slash = 0x2C, - kVK_ANSI_N = 0x2D, - kVK_ANSI_M = 0x2E, - kVK_ANSI_Period = 0x2F, - kVK_ANSI_Grave = 0x32, - kVK_ANSI_KeypadDecimal = 0x41, - kVK_ANSI_KeypadMultiply = 0x43, - kVK_ANSI_KeypadPlus = 0x45, - kVK_ANSI_KeypadClear = 0x47, - kVK_ANSI_KeypadDivide = 0x4B, - kVK_ANSI_KeypadEnter = 0x4C, - kVK_ANSI_KeypadMinus = 0x4E, - kVK_ANSI_KeypadEquals = 0x51, - kVK_ANSI_Keypad0 = 0x52, - kVK_ANSI_Keypad1 = 0x53, - kVK_ANSI_Keypad2 = 0x54, - kVK_ANSI_Keypad3 = 0x55, - kVK_ANSI_Keypad4 = 0x56, - kVK_ANSI_Keypad5 = 0x57, - kVK_ANSI_Keypad6 = 0x58, - kVK_ANSI_Keypad7 = 0x59, - kVK_ANSI_Keypad8 = 0x5B, - kVK_ANSI_Keypad9 = 0x5C -}; - -/* keycodes for keys that are independent of keyboard layout*/ -enum { - kVK_Return = 0x24, - kVK_Tab = 0x30, - kVK_Space = 0x31, - kVK_Delete = 0x33, - kVK_Escape = 0x35, - kVK_Command = 0x37, - kVK_Shift = 0x38, - kVK_CapsLock = 0x39, - kVK_Option = 0x3A, - kVK_Control = 0x3B, - kVK_RightShift = 0x3C, - kVK_RightOption = 0x3D, - kVK_RightControl = 0x3E, - kVK_Function = 0x3F, - kVK_F17 = 0x40, - kVK_VolumeUp = 0x48, - kVK_VolumeDown = 0x49, - kVK_Mute = 0x4A, - kVK_F18 = 0x4F, - kVK_F19 = 0x50, - kVK_F20 = 0x5A, - kVK_F5 = 0x60, - kVK_F6 = 0x61, - kVK_F7 = 0x62, - kVK_F3 = 0x63, - kVK_F8 = 0x64, - kVK_F9 = 0x65, - kVK_F11 = 0x67, - kVK_F13 = 0x69, - kVK_F16 = 0x6A, - kVK_F14 = 0x6B, - kVK_F10 = 0x6D, - kVK_F12 = 0x6F, - kVK_F15 = 0x71, - kVK_Help = 0x72, - kVK_Home = 0x73, - kVK_PageUp = 0x74, - kVK_ForwardDelete = 0x75, - kVK_F4 = 0x76, - kVK_End = 0x77, - kVK_F2 = 0x78, - kVK_PageDown = 0x79, - kVK_F1 = 0x7A, - kVK_LeftArrow = 0x7B, - kVK_RightArrow = 0x7C, - kVK_DownArrow = 0x7D, - kVK_UpArrow = 0x7E -}; - -/* ISO keyboards only*/ -enum { - kVK_ISO_Section = 0x0A -}; - -/* JIS keyboards only*/ -enum { - kVK_JIS_Yen = 0x5D, - kVK_JIS_Underscore = 0x5E, - kVK_JIS_KeypadComma = 0x5F, - kVK_JIS_Eisu = 0x66, - kVK_JIS_Kana = 0x68 -}; - - -static GHOST_TButtonMask convertButton(int button) -{ - switch (button) { - case 0: - return GHOST_kButtonMaskLeft; - case 1: - return GHOST_kButtonMaskRight; - case 2: - return GHOST_kButtonMaskMiddle; - case 3: - return GHOST_kButtonMaskButton4; - case 4: - return GHOST_kButtonMaskButton5; - default: - return GHOST_kButtonMaskLeft; - } -} - -/** - * Converts Mac rawkey codes (same for Cocoa & Carbon) - * into GHOST key codes - * @param rawCode The raw physical key code - * @param recvChar the character ignoring modifiers (except for shift) - * @return Ghost key code - */ -static GHOST_TKey convertKey(int rawCode, unichar recvChar) -{ - - //printf("\nrecvchar %c 0x%x",recvChar,recvChar); - switch (rawCode) { - /*Physical keycodes not used due to map changes in int'l keyboards - case kVK_ANSI_A: return GHOST_kKeyA; - case kVK_ANSI_B: return GHOST_kKeyB; - case kVK_ANSI_C: return GHOST_kKeyC; - case kVK_ANSI_D: return GHOST_kKeyD; - case kVK_ANSI_E: return GHOST_kKeyE; - case kVK_ANSI_F: return GHOST_kKeyF; - case kVK_ANSI_G: return GHOST_kKeyG; - case kVK_ANSI_H: return GHOST_kKeyH; - case kVK_ANSI_I: return GHOST_kKeyI; - case kVK_ANSI_J: return GHOST_kKeyJ; - case kVK_ANSI_K: return GHOST_kKeyK; - case kVK_ANSI_L: return GHOST_kKeyL; - case kVK_ANSI_M: return GHOST_kKeyM; - case kVK_ANSI_N: return GHOST_kKeyN; - case kVK_ANSI_O: return GHOST_kKeyO; - case kVK_ANSI_P: return GHOST_kKeyP; - case kVK_ANSI_Q: return GHOST_kKeyQ; - case kVK_ANSI_R: return GHOST_kKeyR; - case kVK_ANSI_S: return GHOST_kKeyS; - case kVK_ANSI_T: return GHOST_kKeyT; - case kVK_ANSI_U: return GHOST_kKeyU; - case kVK_ANSI_V: return GHOST_kKeyV; - case kVK_ANSI_W: return GHOST_kKeyW; - case kVK_ANSI_X: return GHOST_kKeyX; - case kVK_ANSI_Y: return GHOST_kKeyY; - case kVK_ANSI_Z: return GHOST_kKeyZ;*/ - - /* Numbers keys mapped to handle some int'l keyboard (e.g. French)*/ - case kVK_ISO_Section: return GHOST_kKeyUnknown; - case kVK_ANSI_1: return GHOST_kKey1; - case kVK_ANSI_2: return GHOST_kKey2; - case kVK_ANSI_3: return GHOST_kKey3; - case kVK_ANSI_4: return GHOST_kKey4; - case kVK_ANSI_5: return GHOST_kKey5; - case kVK_ANSI_6: return GHOST_kKey6; - case kVK_ANSI_7: return GHOST_kKey7; - case kVK_ANSI_8: return GHOST_kKey8; - case kVK_ANSI_9: return GHOST_kKey9; - case kVK_ANSI_0: return GHOST_kKey0; - - case kVK_ANSI_Keypad0: return GHOST_kKeyNumpad0; - case kVK_ANSI_Keypad1: return GHOST_kKeyNumpad1; - case kVK_ANSI_Keypad2: return GHOST_kKeyNumpad2; - case kVK_ANSI_Keypad3: return GHOST_kKeyNumpad3; - case kVK_ANSI_Keypad4: return GHOST_kKeyNumpad4; - case kVK_ANSI_Keypad5: return GHOST_kKeyNumpad5; - case kVK_ANSI_Keypad6: return GHOST_kKeyNumpad6; - case kVK_ANSI_Keypad7: return GHOST_kKeyNumpad7; - case kVK_ANSI_Keypad8: return GHOST_kKeyNumpad8; - case kVK_ANSI_Keypad9: return GHOST_kKeyNumpad9; - case kVK_ANSI_KeypadDecimal: return GHOST_kKeyNumpadPeriod; - case kVK_ANSI_KeypadEnter: return GHOST_kKeyNumpadEnter; - case kVK_ANSI_KeypadPlus: return GHOST_kKeyNumpadPlus; - case kVK_ANSI_KeypadMinus: return GHOST_kKeyNumpadMinus; - case kVK_ANSI_KeypadMultiply: return GHOST_kKeyNumpadAsterisk; - case kVK_ANSI_KeypadDivide: return GHOST_kKeyNumpadSlash; - case kVK_ANSI_KeypadClear: return GHOST_kKeyUnknown; - - case kVK_F1: return GHOST_kKeyF1; - case kVK_F2: return GHOST_kKeyF2; - case kVK_F3: return GHOST_kKeyF3; - case kVK_F4: return GHOST_kKeyF4; - case kVK_F5: return GHOST_kKeyF5; - case kVK_F6: return GHOST_kKeyF6; - case kVK_F7: return GHOST_kKeyF7; - case kVK_F8: return GHOST_kKeyF8; - case kVK_F9: return GHOST_kKeyF9; - case kVK_F10: return GHOST_kKeyF10; - case kVK_F11: return GHOST_kKeyF11; - case kVK_F12: return GHOST_kKeyF12; - case kVK_F13: return GHOST_kKeyF13; - case kVK_F14: return GHOST_kKeyF14; - case kVK_F15: return GHOST_kKeyF15; - case kVK_F16: return GHOST_kKeyF16; - case kVK_F17: return GHOST_kKeyF17; - case kVK_F18: return GHOST_kKeyF18; - case kVK_F19: return GHOST_kKeyF19; - case kVK_F20: return GHOST_kKeyF20; - - case kVK_UpArrow: return GHOST_kKeyUpArrow; - case kVK_DownArrow: return GHOST_kKeyDownArrow; - case kVK_LeftArrow: return GHOST_kKeyLeftArrow; - case kVK_RightArrow: return GHOST_kKeyRightArrow; - - case kVK_Return: return GHOST_kKeyEnter; - case kVK_Delete: return GHOST_kKeyBackSpace; - case kVK_ForwardDelete: return GHOST_kKeyDelete; - case kVK_Escape: return GHOST_kKeyEsc; - case kVK_Tab: return GHOST_kKeyTab; - case kVK_Space: return GHOST_kKeySpace; - - case kVK_Home: return GHOST_kKeyHome; - case kVK_End: return GHOST_kKeyEnd; - case kVK_PageUp: return GHOST_kKeyUpPage; - case kVK_PageDown: return GHOST_kKeyDownPage; - - /*case kVK_ANSI_Minus: return GHOST_kKeyMinus; - case kVK_ANSI_Equal: return GHOST_kKeyEqual; - case kVK_ANSI_Comma: return GHOST_kKeyComma; - case kVK_ANSI_Period: return GHOST_kKeyPeriod; - case kVK_ANSI_Slash: return GHOST_kKeySlash; - case kVK_ANSI_Semicolon: return GHOST_kKeySemicolon; - case kVK_ANSI_Quote: return GHOST_kKeyQuote; - case kVK_ANSI_Backslash: return GHOST_kKeyBackslash; - case kVK_ANSI_LeftBracket: return GHOST_kKeyLeftBracket; - case kVK_ANSI_RightBracket: return GHOST_kKeyRightBracket; - case kVK_ANSI_Grave: return GHOST_kKeyAccentGrave;*/ - - case kVK_VolumeUp: - case kVK_VolumeDown: - case kVK_Mute: - return GHOST_kKeyUnknown; - - default: - /*Then detect on character value for "remappable" keys in int'l keyboards*/ - if ((recvChar >= 'A') && (recvChar <= 'Z')) { - return (GHOST_TKey) (recvChar - 'A' + GHOST_kKeyA); - } else if ((recvChar >= 'a') && (recvChar <= 'z')) { - return (GHOST_TKey) (recvChar - 'a' + GHOST_kKeyA); - } else - switch (recvChar) { - case '-': return GHOST_kKeyMinus; - case '=': return GHOST_kKeyEqual; - case ',': return GHOST_kKeyComma; - case '.': return GHOST_kKeyPeriod; - case '/': return GHOST_kKeySlash; - case ';': return GHOST_kKeySemicolon; - case '\'': return GHOST_kKeyQuote; - case '\\': return GHOST_kKeyBackslash; - case '[': return GHOST_kKeyLeftBracket; - case ']': return GHOST_kKeyRightBracket; - case '`': return GHOST_kKeyAccentGrave; - default: - return GHOST_kKeyUnknown; - } - } - return GHOST_kKeyUnknown; -} - - -======= #include "GHOST_TimerManager.h" #include "GHOST_TimerTask.h" @@ -783,7 +420,6 @@ static GHOST_TKey convertKey(int rawCode, unichar recvChar, UInt16 keyAction) } ->>>>>>> .merge-right.r30358 #pragma mark defines for 10.6 api not documented in 10.5 #ifndef MAC_OS_X_VERSION_10_6 enum { @@ -810,21 +446,21 @@ enum { #pragma mark Utility functions -#define FIRSTFILEBUFLG 512 -static bool g_hasFirstFile = false; -static char g_firstFileBuf[512]; - -//TODO:Need to investigate this. Function called too early in creator.c to have g_hasFirstFile == true -extern "C" int GHOST_HACK_getFirstFile(char buf[FIRSTFILEBUFLG]) { - if (g_hasFirstFile) { - strncpy(buf, g_firstFileBuf, FIRSTFILEBUFLG - 1); - buf[FIRSTFILEBUFLG - 1] = '\0'; - return 1; - } else { - return 0; - } -} - +#define FIRSTFILEBUFLG 512 +static bool g_hasFirstFile = false; +static char g_firstFileBuf[512]; + +//TODO:Need to investigate this. Function called too early in creator.c to have g_hasFirstFile == true +extern "C" int GHOST_HACK_getFirstFile(char buf[FIRSTFILEBUFLG]) { + if (g_hasFirstFile) { + strncpy(buf, g_firstFileBuf, FIRSTFILEBUFLG - 1); + buf[FIRSTFILEBUFLG - 1] = '\0'; + return 1; + } else { + return 0; + } +} + #if defined(WITH_QUICKTIME) && !defined(USE_QTKIT) //Need to place this quicktime function in an ObjC file //It is used to avoid memory leak when raising the quicktime "compression settings" standard dialog @@ -832,7 +468,7 @@ extern "C" { struct bContext; struct wmOperator; extern int fromcocoa_request_qtcodec_settings(bContext *C, wmOperator *op); - + int cocoa_request_qtcodec_settings(bContext *C, wmOperator *op) { @@ -848,89 +484,89 @@ int cocoa_request_qtcodec_settings(bContext *C, wmOperator *op) #endif -#pragma mark Cocoa objects - -/** - * CocoaAppDelegate - * ObjC object to capture applicationShouldTerminate, and send quit event - **/ -@interface CocoaAppDelegate : NSObject { - GHOST_SystemCocoa *systemCocoa; -} +#pragma mark Cocoa objects + +/** + * CocoaAppDelegate + * ObjC object to capture applicationShouldTerminate, and send quit event + **/ +@interface CocoaAppDelegate : NSObject { + GHOST_SystemCocoa *systemCocoa; +} - (void)setSystemCocoa:(GHOST_SystemCocoa *)sysCocoa; - (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filename; -- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender; -- (void)applicationWillTerminate:(NSNotification *)aNotification; +- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender; +- (void)applicationWillTerminate:(NSNotification *)aNotification; - (void)applicationWillBecomeActive:(NSNotification *)aNotification; -@end - -@implementation CocoaAppDelegate : NSObject --(void)setSystemCocoa:(GHOST_SystemCocoa *)sysCocoa -{ - systemCocoa = sysCocoa; -} - +@end + +@implementation CocoaAppDelegate : NSObject +-(void)setSystemCocoa:(GHOST_SystemCocoa *)sysCocoa +{ + systemCocoa = sysCocoa; +} + - (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filename { return systemCocoa->handleOpenDocumentRequest(filename); } -- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender -{ - //TODO: implement graceful termination through Cocoa mechanism to avoid session log off to be cancelled - //Note that Cmd+Q is already handled by keyhandler - if (systemCocoa->handleQuitRequest() == GHOST_kExitNow) - return NSTerminateCancel;//NSTerminateNow; - else - return NSTerminateCancel; -} - -// To avoid cancelling a log off process, we must use Cocoa termination process -// And this function is the only chance to perform clean up -// So WM_exit needs to be called directly, as the event loop will never run before termination -- (void)applicationWillTerminate:(NSNotification *)aNotification -{ - /*G.afbreek = 0; //Let Cocoa perform the termination at the end - WM_exit(C);*/ -} +- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender +{ + //TODO: implement graceful termination through Cocoa mechanism to avoid session log off to be cancelled + //Note that Cmd+Q is already handled by keyhandler + if (systemCocoa->handleQuitRequest() == GHOST_kExitNow) + return NSTerminateCancel;//NSTerminateNow; + else + return NSTerminateCancel; +} + +// To avoid cancelling a log off process, we must use Cocoa termination process +// And this function is the only chance to perform clean up +// So WM_exit needs to be called directly, as the event loop will never run before termination +- (void)applicationWillTerminate:(NSNotification *)aNotification +{ + /*G.afbreek = 0; //Let Cocoa perform the termination at the end + WM_exit(C);*/ +} - (void)applicationWillBecomeActive:(NSNotification *)aNotification { systemCocoa->handleApplicationBecomeActiveEvent(); } -@end - - - -#pragma mark initialization/finalization - - -GHOST_SystemCocoa::GHOST_SystemCocoa() -{ +@end + + + +#pragma mark initialization/finalization + + +GHOST_SystemCocoa::GHOST_SystemCocoa() +{ int mib[2]; struct timeval boottime; size_t len; char *rstring = NULL; - m_modifierMask =0; - m_pressedMouseButtons =0; + m_modifierMask =0; + m_pressedMouseButtons =0; m_isGestureInProgress = false; m_cursorDelta_x=0; m_cursorDelta_y=0; m_outsideLoopEventProcessed = false; m_needDelayedApplicationBecomeActiveEventProcessing = false; - m_displayManager = new GHOST_DisplayManagerCocoa (); - GHOST_ASSERT(m_displayManager, "GHOST_SystemCocoa::GHOST_SystemCocoa(): m_displayManager==0\n"); - m_displayManager->initialize(); - - //NSEvent timeStamp is given in system uptime, state start date is boot time - mib[0] = CTL_KERN; - mib[1] = KERN_BOOTTIME; - len = sizeof(struct timeval); - - sysctl(mib, 2, &boottime, &len, NULL, 0); - m_start_time = ((boottime.tv_sec*1000)+(boottime.tv_usec/1000)); - + m_displayManager = new GHOST_DisplayManagerCocoa (); + GHOST_ASSERT(m_displayManager, "GHOST_SystemCocoa::GHOST_SystemCocoa(): m_displayManager==0\n"); + m_displayManager->initialize(); + + //NSEvent timeStamp is given in system uptime, state start date is boot time + mib[0] = CTL_KERN; + mib[1] = KERN_BOOTTIME; + len = sizeof(struct timeval); + + sysctl(mib, 2, &boottime, &len, NULL, 0); + m_start_time = ((boottime.tv_sec*1000)+(boottime.tv_usec/1000)); + //Detect multitouch trackpad mib[0] = CTL_HW; mib[1] = HW_MODEL; @@ -947,214 +583,169 @@ GHOST_SystemCocoa::GHOST_SystemCocoa() free( rstring ); rstring = NULL; - m_ignoreWindowSizedMessages = false; -} - -GHOST_SystemCocoa::~GHOST_SystemCocoa() -{ -} - - -GHOST_TSuccess GHOST_SystemCocoa::init() -{ - - GHOST_TSuccess success = GHOST_System::init(); - if (success) { - //ProcessSerialNumber psn; - - //Carbon stuff to move window & menu to foreground - /*if (!GetCurrentProcess(&psn)) { - TransformProcessType(&psn, kProcessTransformToForegroundApplication); - SetFrontProcess(&psn); - }*/ - - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - if (NSApp == nil) { - [NSApplication sharedApplication]; - - if ([NSApp mainMenu] == nil) { - NSMenu *mainMenubar = [[NSMenu alloc] init]; - NSMenuItem *menuItem; - NSMenu *windowMenu; - NSMenu *appMenu; - - //Create the application menu - appMenu = [[NSMenu alloc] initWithTitle:@"Blender"]; - - [appMenu addItemWithTitle:@"About Blender" action:@selector(orderFrontStandardAboutPanel:) keyEquivalent:@""]; - [appMenu addItem:[NSMenuItem separatorItem]]; - - menuItem = [appMenu addItemWithTitle:@"Hide Blender" action:@selector(hide:) keyEquivalent:@"h"]; - [menuItem setKeyEquivalentModifierMask:NSCommandKeyMask]; - - menuItem = [appMenu addItemWithTitle:@"Hide others" action:@selector(hideOtherApplications:) keyEquivalent:@"h"]; - [menuItem setKeyEquivalentModifierMask:(NSAlternateKeyMask | NSCommandKeyMask)]; - - [appMenu addItemWithTitle:@"Show All" action:@selector(unhideAllApplications:) keyEquivalent:@""]; - - menuItem = [appMenu addItemWithTitle:@"Quit Blender" action:@selector(terminate:) keyEquivalent:@"q"]; - [menuItem setKeyEquivalentModifierMask:NSCommandKeyMask]; - - menuItem = [[NSMenuItem alloc] init]; - [menuItem setSubmenu:appMenu]; - - [mainMenubar addItem:menuItem]; - [menuItem release]; - [NSApp performSelector:@selector(setAppleMenu:) withObject:appMenu]; //Needed for 10.5 - [appMenu release]; - - //Create the window menu - windowMenu = [[NSMenu alloc] initWithTitle:@"Window"]; - - menuItem = [windowMenu addItemWithTitle:@"Minimize" action:@selector(performMiniaturize:) keyEquivalent:@"m"]; - [menuItem setKeyEquivalentModifierMask:NSCommandKeyMask]; - - [windowMenu addItemWithTitle:@"Zoom" action:@selector(performZoom:) keyEquivalent:@""]; - + m_ignoreWindowSizedMessages = false; +} + +GHOST_SystemCocoa::~GHOST_SystemCocoa() +{ +} + + +GHOST_TSuccess GHOST_SystemCocoa::init() +{ + + GHOST_TSuccess success = GHOST_System::init(); + if (success) { + //ProcessSerialNumber psn; + + //Carbon stuff to move window & menu to foreground + /*if (!GetCurrentProcess(&psn)) { + TransformProcessType(&psn, kProcessTransformToForegroundApplication); + SetFrontProcess(&psn); + }*/ + + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + if (NSApp == nil) { + [NSApplication sharedApplication]; + + if ([NSApp mainMenu] == nil) { + NSMenu *mainMenubar = [[NSMenu alloc] init]; + NSMenuItem *menuItem; + NSMenu *windowMenu; + NSMenu *appMenu; + + //Create the application menu + appMenu = [[NSMenu alloc] initWithTitle:@"Blender"]; + + [appMenu addItemWithTitle:@"About Blender" action:@selector(orderFrontStandardAboutPanel:) keyEquivalent:@""]; + [appMenu addItem:[NSMenuItem separatorItem]]; + + menuItem = [appMenu addItemWithTitle:@"Hide Blender" action:@selector(hide:) keyEquivalent:@"h"]; + [menuItem setKeyEquivalentModifierMask:NSCommandKeyMask]; + + menuItem = [appMenu addItemWithTitle:@"Hide others" action:@selector(hideOtherApplications:) keyEquivalent:@"h"]; + [menuItem setKeyEquivalentModifierMask:(NSAlternateKeyMask | NSCommandKeyMask)]; + + [appMenu addItemWithTitle:@"Show All" action:@selector(unhideAllApplications:) keyEquivalent:@""]; + + menuItem = [appMenu addItemWithTitle:@"Quit Blender" action:@selector(terminate:) keyEquivalent:@"q"]; + [menuItem setKeyEquivalentModifierMask:NSCommandKeyMask]; + + menuItem = [[NSMenuItem alloc] init]; + [menuItem setSubmenu:appMenu]; + + [mainMenubar addItem:menuItem]; + [menuItem release]; + [NSApp performSelector:@selector(setAppleMenu:) withObject:appMenu]; //Needed for 10.5 + [appMenu release]; + + //Create the window menu + windowMenu = [[NSMenu alloc] initWithTitle:@"Window"]; + + menuItem = [windowMenu addItemWithTitle:@"Minimize" action:@selector(performMiniaturize:) keyEquivalent:@"m"]; + [menuItem setKeyEquivalentModifierMask:NSCommandKeyMask]; + + [windowMenu addItemWithTitle:@"Zoom" action:@selector(performZoom:) keyEquivalent:@""]; + menuItem = [windowMenu addItemWithTitle:@"Close" action:@selector(performClose:) keyEquivalent:@"w"]; [menuItem setKeyEquivalentModifierMask:NSCommandKeyMask]; - menuItem = [[NSMenuItem alloc] init]; - [menuItem setSubmenu:windowMenu]; - - [mainMenubar addItem:menuItem]; - [menuItem release]; - - [NSApp setMainMenu:mainMenubar]; - [NSApp setWindowsMenu:windowMenu]; - [windowMenu release]; - } - } - if ([NSApp delegate] == nil) { - CocoaAppDelegate *appDelegate = [[CocoaAppDelegate alloc] init]; - [appDelegate setSystemCocoa:this]; - [NSApp setDelegate:appDelegate]; - } + menuItem = [[NSMenuItem alloc] init]; + [menuItem setSubmenu:windowMenu]; + + [mainMenubar addItem:menuItem]; + [menuItem release]; + + [NSApp setMainMenu:mainMenubar]; + [NSApp setWindowsMenu:windowMenu]; + [windowMenu release]; + } + } + if ([NSApp delegate] == nil) { + CocoaAppDelegate *appDelegate = [[CocoaAppDelegate alloc] init]; + [appDelegate setSystemCocoa:this]; + [NSApp setDelegate:appDelegate]; + } [NSApp finishLaunching]; - [pool drain]; - } - return success; -} - - -#pragma mark window management - -GHOST_TUns64 GHOST_SystemCocoa::getMilliSeconds() const -{ - //Cocoa equivalent exists in 10.6 ([[NSProcessInfo processInfo] systemUptime]) + [pool drain]; + } + return success; +} + + +#pragma mark window management + +GHOST_TUns64 GHOST_SystemCocoa::getMilliSeconds() const +{ + //Cocoa equivalent exists in 10.6 ([[NSProcessInfo processInfo] systemUptime]) struct timeval currentTime; - + gettimeofday(¤tTime, NULL); - + //Return timestamp of system uptime return ((currentTime.tv_sec*1000)+(currentTime.tv_usec/1000)-m_start_time); -} - - -GHOST_TUns8 GHOST_SystemCocoa::getNumDisplays() const -{ - //Note that OS X supports monitor hot plug - // We do not support multiple monitors at the moment - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - GHOST_TUns8 count = [[NSScreen screens] count]; - - [pool drain]; - return count; -} - - -void GHOST_SystemCocoa::getMainDisplayDimensions(GHOST_TUns32& width, GHOST_TUns32& height) const -{ - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - //Get visible frame, that is frame excluding dock and top menu bar - NSRect frame = [[NSScreen mainScreen] visibleFrame]; - - //Returns max window contents (excluding title bar...) - NSRect contentRect = [NSWindow contentRectForFrameRect:frame - styleMask:(NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask)]; - - width = contentRect.size.width; - height = contentRect.size.height; - - [pool drain]; -} - - -GHOST_IWindow* GHOST_SystemCocoa::createWindow( - const STR_String& title, - GHOST_TInt32 left, - GHOST_TInt32 top, - GHOST_TUns32 width, - GHOST_TUns32 height, - GHOST_TWindowState state, - GHOST_TDrawingContextType type, - bool stereoVisual, +} + + +GHOST_TUns8 GHOST_SystemCocoa::getNumDisplays() const +{ + //Note that OS X supports monitor hot plug + // We do not support multiple monitors at the moment + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + + GHOST_TUns8 count = [[NSScreen screens] count]; + + [pool drain]; + return count; +} + + +void GHOST_SystemCocoa::getMainDisplayDimensions(GHOST_TUns32& width, GHOST_TUns32& height) const +{ + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + //Get visible frame, that is frame excluding dock and top menu bar + NSRect frame = [[NSScreen mainScreen] visibleFrame]; + + //Returns max window contents (excluding title bar...) + NSRect contentRect = [NSWindow contentRectForFrameRect:frame + styleMask:(NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask)]; + + width = contentRect.size.width; + height = contentRect.size.height; + + [pool drain]; +} + + +GHOST_IWindow* GHOST_SystemCocoa::createWindow( + const STR_String& title, + GHOST_TInt32 left, + GHOST_TInt32 top, + GHOST_TUns32 width, + GHOST_TUns32 height, + GHOST_TWindowState state, + GHOST_TDrawingContextType type, + bool stereoVisual, const GHOST_TUns16 numOfAASamples, - const GHOST_TEmbedderWindowID parentWindow -) -{ - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - GHOST_IWindow* window = 0; - - //Get the available rect for including window contents - NSRect frame = [[NSScreen mainScreen] visibleFrame]; - NSRect contentRect = [NSWindow contentRectForFrameRect:frame - styleMask:(NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask)]; - - //Ensures window top left is inside this available rect - left = left > contentRect.origin.x ? left : contentRect.origin.x; - top = top > contentRect.origin.y ? top : contentRect.origin.y; - + const GHOST_TEmbedderWindowID parentWindow +) +{ + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + GHOST_IWindow* window = 0; + + //Get the available rect for including window contents + NSRect frame = [[NSScreen mainScreen] visibleFrame]; + NSRect contentRect = [NSWindow contentRectForFrameRect:frame + styleMask:(NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask)]; + + //Ensures window top left is inside this available rect + left = left > contentRect.origin.x ? left : contentRect.origin.x; + top = top > contentRect.origin.y ? top : contentRect.origin.y; + window = new GHOST_WindowCocoa (this, title, left, top, width, height, state, type, stereoVisual, numOfAASamples); -<<<<<<< .working - - if (window) { - if (window->getValid()) { - // Store the pointer to the window - GHOST_ASSERT(m_windowManager, "m_windowManager not initialized"); - m_windowManager->addWindow(window); - m_windowManager->setActiveWindow(window); - //Need to tell window manager the new window is the active one (Cocoa does not send the event activate upon window creation) - pushEvent(new GHOST_Event(getMilliSeconds(), GHOST_kEventWindowActivate, window)); - pushEvent(new GHOST_Event(getMilliSeconds(), GHOST_kEventWindowSize, window)); - - } - else { - GHOST_PRINT("GHOST_SystemCocoa::createWindow(): window invalid\n"); - delete window; - window = 0; - } - } - else { - GHOST_PRINT("GHOST_SystemCocoa::createWindow(): could not create window\n"); - } - [pool drain]; - return window; -} - -GHOST_TSuccess GHOST_SystemCocoa::beginFullScreen(const GHOST_DisplaySetting& setting, GHOST_IWindow** window, const bool stereoVisual) -{ - GHOST_IWindow* currentWindow = m_windowManager->getActiveWindow(); - - *window = currentWindow; - - return currentWindow->setState(GHOST_kWindowStateFullScreen); -} - -GHOST_TSuccess GHOST_SystemCocoa::endFullScreen(void) -{ - GHOST_IWindow* currentWindow = m_windowManager->getActiveWindow(); - - return currentWindow->setState(GHOST_kWindowStateNormal); -} - - - -======= if (window) { if (window->getValid()) { @@ -1200,28 +791,22 @@ GHOST_TSuccess GHOST_SystemCocoa::endFullScreen(void) ->>>>>>> .merge-right.r30358 /** * @note : returns coordinates in Cocoa screen coordinates */ -GHOST_TSuccess GHOST_SystemCocoa::getCursorPosition(GHOST_TInt32& x, GHOST_TInt32& y) const -{ - NSPoint mouseLoc = [NSEvent mouseLocation]; - - // Returns the mouse location in screen coordinates - x = (GHOST_TInt32)mouseLoc.x; - y = (GHOST_TInt32)mouseLoc.y; - return GHOST_kSuccess; -} - +GHOST_TSuccess GHOST_SystemCocoa::getCursorPosition(GHOST_TInt32& x, GHOST_TInt32& y) const +{ + NSPoint mouseLoc = [NSEvent mouseLocation]; + + // Returns the mouse location in screen coordinates + x = (GHOST_TInt32)mouseLoc.x; + y = (GHOST_TInt32)mouseLoc.y; + return GHOST_kSuccess; +} + /** * @note : expect Cocoa screen coordinates */ -<<<<<<< .working -GHOST_TSuccess GHOST_SystemCocoa::setCursorPosition(GHOST_TInt32 x, GHOST_TInt32 y) const -{ - float xf=(float)x, yf=(float)y; -======= GHOST_TSuccess GHOST_SystemCocoa::setCursorPosition(GHOST_TInt32 x, GHOST_TInt32 y) { GHOST_TInt32 wx,wy; @@ -1245,31 +830,22 @@ GHOST_TSuccess GHOST_SystemCocoa::setCursorPosition(GHOST_TInt32 x, GHOST_TInt32 GHOST_TSuccess GHOST_SystemCocoa::setMouseCursorPosition(GHOST_TInt32 x, GHOST_TInt32 y) { float xf=(float)x, yf=(float)y; ->>>>>>> .merge-right.r30358 GHOST_WindowCocoa* window = (GHOST_WindowCocoa*)m_windowManager->getActiveWindow(); if (!window) return GHOST_kFailure; NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSScreen *windowScreen = window->getScreen(); NSRect screenRect = [windowScreen frame]; - + //Set position relative to current screen xf -= screenRect.origin.x; yf -= screenRect.origin.y; - //Quartz Display Services uses the old coordinates (top left origin) + //Quartz Display Services uses the old coordinates (top left origin) yf = screenRect.size.height -yf; - + CGDisplayMoveCursorToPoint((CGDirectDisplayID)[[[windowScreen deviceDescription] objectForKey:@"NSScreenNumber"] unsignedIntValue], CGPointMake(xf, yf)); -<<<<<<< .working - return GHOST_kSuccess; -} - - -GHOST_TSuccess GHOST_SystemCocoa::getModifierKeys(GHOST_ModifierKeys& keys) const -{ -======= [pool drain]; return GHOST_kSuccess; } @@ -1277,141 +853,140 @@ GHOST_TSuccess GHOST_SystemCocoa::getModifierKeys(GHOST_ModifierKeys& keys) cons GHOST_TSuccess GHOST_SystemCocoa::getModifierKeys(GHOST_ModifierKeys& keys) const { ->>>>>>> .merge-right.r30358 keys.set(GHOST_kModifierKeyCommand, (m_modifierMask & NSCommandKeyMask) ? true : false); keys.set(GHOST_kModifierKeyLeftAlt, (m_modifierMask & NSAlternateKeyMask) ? true : false); keys.set(GHOST_kModifierKeyLeftShift, (m_modifierMask & NSShiftKeyMask) ? true : false); keys.set(GHOST_kModifierKeyLeftControl, (m_modifierMask & NSControlKeyMask) ? true : false); - - return GHOST_kSuccess; -} - -GHOST_TSuccess GHOST_SystemCocoa::getButtons(GHOST_Buttons& buttons) const -{ - buttons.clear(); - buttons.set(GHOST_kButtonMaskLeft, m_pressedMouseButtons & GHOST_kButtonMaskLeft); - buttons.set(GHOST_kButtonMaskRight, m_pressedMouseButtons & GHOST_kButtonMaskRight); - buttons.set(GHOST_kButtonMaskMiddle, m_pressedMouseButtons & GHOST_kButtonMaskMiddle); - buttons.set(GHOST_kButtonMaskButton4, m_pressedMouseButtons & GHOST_kButtonMaskButton4); - buttons.set(GHOST_kButtonMaskButton5, m_pressedMouseButtons & GHOST_kButtonMaskButton5); - return GHOST_kSuccess; -} - - - -#pragma mark Event handlers - -/** - * The event queue polling function - */ -bool GHOST_SystemCocoa::processEvents(bool waitForEvent) -{ - bool anyProcessed = false; - NSEvent *event; - - // SetMouseCoalescingEnabled(false, NULL); - //TODO : implement timer ?? - - /*do { - GHOST_TimerManager* timerMgr = getTimerManager(); - - if (waitForEvent) { - GHOST_TUns64 next = timerMgr->nextFireTime(); - double timeOut; - - if (next == GHOST_kFireTimeNever) { - timeOut = kEventDurationForever; - } else { - timeOut = (double)(next - getMilliSeconds())/1000.0; - if (timeOut < 0.0) - timeOut = 0.0; - } - - ::ReceiveNextEvent(0, NULL, timeOut, false, &event); - } - - if (timerMgr->fireTimers(getMilliSeconds())) { - anyProcessed = true; - }*/ - - do { - NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; - event = [NSApp nextEventMatchingMask:NSAnyEventMask - untilDate:[NSDate distantPast] - inMode:NSDefaultRunLoopMode - dequeue:YES]; - if (event==nil) { - [pool drain]; - break; - } - - anyProcessed = true; - - switch ([event type]) { - case NSKeyDown: - case NSKeyUp: - case NSFlagsChanged: - handleKeyEvent(event); - + + return GHOST_kSuccess; +} + +GHOST_TSuccess GHOST_SystemCocoa::getButtons(GHOST_Buttons& buttons) const +{ + buttons.clear(); + buttons.set(GHOST_kButtonMaskLeft, m_pressedMouseButtons & GHOST_kButtonMaskLeft); + buttons.set(GHOST_kButtonMaskRight, m_pressedMouseButtons & GHOST_kButtonMaskRight); + buttons.set(GHOST_kButtonMaskMiddle, m_pressedMouseButtons & GHOST_kButtonMaskMiddle); + buttons.set(GHOST_kButtonMaskButton4, m_pressedMouseButtons & GHOST_kButtonMaskButton4); + buttons.set(GHOST_kButtonMaskButton5, m_pressedMouseButtons & GHOST_kButtonMaskButton5); + return GHOST_kSuccess; +} + + + +#pragma mark Event handlers + +/** + * The event queue polling function + */ +bool GHOST_SystemCocoa::processEvents(bool waitForEvent) +{ + bool anyProcessed = false; + NSEvent *event; + + // SetMouseCoalescingEnabled(false, NULL); + //TODO : implement timer ?? + + /*do { + GHOST_TimerManager* timerMgr = getTimerManager(); + + if (waitForEvent) { + GHOST_TUns64 next = timerMgr->nextFireTime(); + double timeOut; + + if (next == GHOST_kFireTimeNever) { + timeOut = kEventDurationForever; + } else { + timeOut = (double)(next - getMilliSeconds())/1000.0; + if (timeOut < 0.0) + timeOut = 0.0; + } + + ::ReceiveNextEvent(0, NULL, timeOut, false, &event); + } + + if (timerMgr->fireTimers(getMilliSeconds())) { + anyProcessed = true; + }*/ + + do { + NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; + event = [NSApp nextEventMatchingMask:NSAnyEventMask + untilDate:[NSDate distantPast] + inMode:NSDefaultRunLoopMode + dequeue:YES]; + if (event==nil) { + [pool drain]; + break; + } + + anyProcessed = true; + + switch ([event type]) { + case NSKeyDown: + case NSKeyUp: + case NSFlagsChanged: + handleKeyEvent(event); + /* Support system-wide keyboard shortcuts, like Expos√©, ...) =>included in always NSApp sendEvent */ - /* if (([event modifierFlags] & NSCommandKeyMask) || [event type] == NSFlagsChanged) { - [NSApp sendEvent:event]; - }*/ - break; - - case NSLeftMouseDown: - case NSLeftMouseUp: - case NSRightMouseDown: - case NSRightMouseUp: - case NSMouseMoved: - case NSLeftMouseDragged: - case NSRightMouseDragged: - case NSScrollWheel: - case NSOtherMouseDown: - case NSOtherMouseUp: + /* if (([event modifierFlags] & NSCommandKeyMask) || [event type] == NSFlagsChanged) { + [NSApp sendEvent:event]; + }*/ + break; + + case NSLeftMouseDown: + case NSLeftMouseUp: + case NSRightMouseDown: + case NSRightMouseUp: + case NSMouseMoved: + case NSLeftMouseDragged: + case NSRightMouseDragged: + case NSScrollWheel: + case NSOtherMouseDown: + case NSOtherMouseUp: case NSOtherMouseDragged: case NSEventTypeMagnify: case NSEventTypeRotate: case NSEventTypeBeginGesture: case NSEventTypeEndGesture: - handleMouseEvent(event); - break; - - case NSTabletPoint: - case NSTabletProximity: - handleTabletEvent(event,[event type]); - break; - + handleMouseEvent(event); + break; + + case NSTabletPoint: + case NSTabletProximity: + handleTabletEvent(event,[event type]); + break; + /* Trackpad features, fired only from OS X 10.5.2 - case NSEventTypeGesture: - case NSEventTypeSwipe: - break; */ - - /*Unused events - NSMouseEntered = 8, - NSMouseExited = 9, - NSAppKitDefined = 13, - NSSystemDefined = 14, - NSApplicationDefined = 15, - NSPeriodic = 16, - NSCursorUpdate = 17,*/ - - default: - break; - } - //Resend event to NSApp to ensure Mac wide events are handled - [NSApp sendEvent:event]; - [pool drain]; - } while (event!= nil); - //} while (waitForEvent && !anyProcessed); Needed only for timer implementation - + case NSEventTypeGesture: + case NSEventTypeSwipe: + break; */ + + /*Unused events + NSMouseEntered = 8, + NSMouseExited = 9, + NSAppKitDefined = 13, + NSSystemDefined = 14, + NSApplicationDefined = 15, + NSPeriodic = 16, + NSCursorUpdate = 17,*/ + + default: + break; + } + //Resend event to NSApp to ensure Mac wide events are handled + [NSApp sendEvent:event]; + [pool drain]; + } while (event!= nil); + //} while (waitForEvent && !anyProcessed); Needed only for timer implementation + if (m_needDelayedApplicationBecomeActiveEventProcessing) handleApplicationBecomeActiveEvent(); if (m_outsideLoopEventProcessed) { m_outsideLoopEventProcessed = false; return true; } - + return anyProcessed; } @@ -1430,7 +1005,7 @@ GHOST_TSuccess GHOST_SystemCocoa::handleApplicationBecomeActiveEvent() else m_needDelayedApplicationBecomeActiveEventProcessing = false; modifiers = [[[NSApplication sharedApplication] currentEvent] modifierFlags]; - + if ((modifiers & NSShiftKeyMask) != (m_modifierMask & NSShiftKeyMask)) { pushEvent( new GHOST_EventKey(getMilliSeconds(), (modifiers & NSShiftKeyMask)?GHOST_kEventKeyDown:GHOST_kEventKeyUp, window, GHOST_kKeyLeftShift) ); } @@ -1448,50 +1023,50 @@ GHOST_TSuccess GHOST_SystemCocoa::handleApplicationBecomeActiveEvent() m_outsideLoopEventProcessed = true; return GHOST_kSuccess; -} - -//Note: called from NSWindow delegate -GHOST_TSuccess GHOST_SystemCocoa::handleWindowEvent(GHOST_TEventType eventType, GHOST_WindowCocoa* window) -{ - if (!validWindow(window)) { - return GHOST_kFailure; - } - switch(eventType) - { - case GHOST_kEventWindowClose: - pushEvent( new GHOST_Event(getMilliSeconds(), GHOST_kEventWindowClose, window) ); - break; - case GHOST_kEventWindowActivate: - m_windowManager->setActiveWindow(window); - window->loadCursor(window->getCursorVisibility(), window->getCursorShape()); - pushEvent( new GHOST_Event(getMilliSeconds(), GHOST_kEventWindowActivate, window) ); - break; - case GHOST_kEventWindowDeactivate: - m_windowManager->setWindowInactive(window); - pushEvent( new GHOST_Event(getMilliSeconds(), GHOST_kEventWindowDeactivate, window) ); - break; - case GHOST_kEventWindowUpdate: - pushEvent( new GHOST_Event(getMilliSeconds(), GHOST_kEventWindowUpdate, window) ); - break; +} + +//Note: called from NSWindow delegate +GHOST_TSuccess GHOST_SystemCocoa::handleWindowEvent(GHOST_TEventType eventType, GHOST_WindowCocoa* window) +{ + if (!validWindow(window)) { + return GHOST_kFailure; + } + switch(eventType) + { + case GHOST_kEventWindowClose: + pushEvent( new GHOST_Event(getMilliSeconds(), GHOST_kEventWindowClose, window) ); + break; + case GHOST_kEventWindowActivate: + m_windowManager->setActiveWindow(window); + window->loadCursor(window->getCursorVisibility(), window->getCursorShape()); + pushEvent( new GHOST_Event(getMilliSeconds(), GHOST_kEventWindowActivate, window) ); + break; + case GHOST_kEventWindowDeactivate: + m_windowManager->setWindowInactive(window); + pushEvent( new GHOST_Event(getMilliSeconds(), GHOST_kEventWindowDeactivate, window) ); + break; + case GHOST_kEventWindowUpdate: + pushEvent( new GHOST_Event(getMilliSeconds(), GHOST_kEventWindowUpdate, window) ); + break; case GHOST_kEventWindowMove: pushEvent( new GHOST_Event(getMilliSeconds(), GHOST_kEventWindowMove, window) ); break; - case GHOST_kEventWindowSize: - if (!m_ignoreWindowSizedMessages) - { - window->updateDrawingContext(); - pushEvent( new GHOST_Event(getMilliSeconds(), GHOST_kEventWindowSize, window) ); - } - break; - default: - return GHOST_kFailure; - break; - } + case GHOST_kEventWindowSize: + if (!m_ignoreWindowSizedMessages) + { + window->updateDrawingContext(); + pushEvent( new GHOST_Event(getMilliSeconds(), GHOST_kEventWindowSize, window) ); + } + break; + default: + return GHOST_kFailure; + break; + } m_outsideLoopEventProcessed = true; - return GHOST_kSuccess; -} - + return GHOST_kSuccess; +} + //Note: called from NSWindow subclass GHOST_TSuccess GHOST_SystemCocoa::handleDraggingEvent(GHOST_TEventType eventType, GHOST_TDragnDropTypes draggedObjectType, GHOST_WindowCocoa* window, int mouseX, int mouseY, void* data) @@ -1702,41 +1277,41 @@ GHOST_TSuccess GHOST_SystemCocoa::handleDraggingEvent(GHOST_TEventType eventType } -GHOST_TUns8 GHOST_SystemCocoa::handleQuitRequest() -{ +GHOST_TUns8 GHOST_SystemCocoa::handleQuitRequest() +{ GHOST_Window* window = (GHOST_Window*)m_windowManager->getActiveWindow(); //Discard quit event if we are in cursor grab sequence if (window && (window->getCursorGrabMode() != GHOST_kGrabDisable) && (window->getCursorGrabMode() != GHOST_kGrabNormal)) return GHOST_kExitCancel; - //Check open windows if some changes are not saved - if (m_windowManager->getAnyModifiedState()) - { + //Check open windows if some changes are not saved + if (m_windowManager->getAnyModifiedState()) + { int shouldQuit = NSRunAlertPanel(@"Exit Blender", @"Some changes have not been saved.\nDo you really want to quit ?", @"Cancel", @"Quit Anyway", nil); - if (shouldQuit == NSAlertAlternateReturn) - { - pushEvent( new GHOST_Event(getMilliSeconds(), GHOST_kEventQuit, NULL) ); - return GHOST_kExitNow; + if (shouldQuit == NSAlertAlternateReturn) + { + pushEvent( new GHOST_Event(getMilliSeconds(), GHOST_kEventQuit, NULL) ); + return GHOST_kExitNow; } else { //Give back focus to the blender window if user selected cancel quit NSArray *windowsList = [NSApp orderedWindows]; if ([windowsList count]) { [[windowsList objectAtIndex:0] makeKeyAndOrderFront:nil]; } - } + } - } - else { - pushEvent( new GHOST_Event(getMilliSeconds(), GHOST_kEventQuit, NULL) ); + } + else { + pushEvent( new GHOST_Event(getMilliSeconds(), GHOST_kEventQuit, NULL) ); m_outsideLoopEventProcessed = true; - return GHOST_kExitNow; - } - - return GHOST_kExitCancel; -} - + return GHOST_kExitNow; + } + + return GHOST_kExitCancel; +} + bool GHOST_SystemCocoa::handleOpenDocumentRequest(void *filepathStr) { NSString *filepath = (NSString*)filepathStr; @@ -1761,7 +1336,7 @@ bool GHOST_SystemCocoa::handleOpenDocumentRequest(void *filepathStr) @"Current document has not been saved.\nDo you really want to proceed?", @"Cancel", @"Open", nil); } - + //Give back focus to the blender window windowsList = [NSApp orderedWindows]; if ([windowsList count]) { @@ -1789,9 +1364,9 @@ bool GHOST_SystemCocoa::handleOpenDocumentRequest(void *filepathStr) else return NO; } -GHOST_TSuccess GHOST_SystemCocoa::handleTabletEvent(void *eventPtr, short eventType) -{ - NSEvent *event = (NSEvent *)eventPtr; +GHOST_TSuccess GHOST_SystemCocoa::handleTabletEvent(void *eventPtr, short eventType) +{ + NSEvent *event = (NSEvent *)eventPtr; GHOST_IWindow* window; window = m_windowManager->getWindowAssociatedWithOSWindow((void*)[event window]); @@ -1800,116 +1375,116 @@ GHOST_TSuccess GHOST_SystemCocoa::handleTabletEvent(void *eventPtr, short eventT return GHOST_kFailure; } - GHOST_TabletData& ct=((GHOST_WindowCocoa*)window)->GetCocoaTabletData(); - - switch (eventType) { - case NSTabletPoint: + GHOST_TabletData& ct=((GHOST_WindowCocoa*)window)->GetCocoaTabletData(); + + switch (eventType) { + case NSTabletPoint: ct.Pressure = [event pressure]; - ct.Xtilt = [event tilt].x; - ct.Ytilt = [event tilt].y; - break; - - case NSTabletProximity: - ct.Pressure = 0; - ct.Xtilt = 0; - ct.Ytilt = 0; - if ([event isEnteringProximity]) - { - //pointer is entering tablet area proximity - switch ([event pointingDeviceType]) { - case NSPenPointingDevice: - ct.Active = GHOST_kTabletModeStylus; - break; - case NSEraserPointingDevice: - ct.Active = GHOST_kTabletModeEraser; - break; - case NSCursorPointingDevice: - case NSUnknownPointingDevice: - default: - ct.Active = GHOST_kTabletModeNone; - break; - } - } else { - // pointer is leaving - return to mouse - ct.Active = GHOST_kTabletModeNone; - } - break; - - default: - GHOST_ASSERT(FALSE,"GHOST_SystemCocoa::handleTabletEvent : unknown event received"); - return GHOST_kFailure; - break; - } - return GHOST_kSuccess; -} - - -GHOST_TSuccess GHOST_SystemCocoa::handleMouseEvent(void *eventPtr) -{ - NSEvent *event = (NSEvent *)eventPtr; + ct.Xtilt = [event tilt].x; + ct.Ytilt = [event tilt].y; + break; + + case NSTabletProximity: + ct.Pressure = 0; + ct.Xtilt = 0; + ct.Ytilt = 0; + if ([event isEnteringProximity]) + { + //pointer is entering tablet area proximity + switch ([event pointingDeviceType]) { + case NSPenPointingDevice: + ct.Active = GHOST_kTabletModeStylus; + break; + case NSEraserPointingDevice: + ct.Active = GHOST_kTabletModeEraser; + break; + case NSCursorPointingDevice: + case NSUnknownPointingDevice: + default: + ct.Active = GHOST_kTabletModeNone; + break; + } + } else { + // pointer is leaving - return to mouse + ct.Active = GHOST_kTabletModeNone; + } + break; + + default: + GHOST_ASSERT(FALSE,"GHOST_SystemCocoa::handleTabletEvent : unknown event received"); + return GHOST_kFailure; + break; + } + return GHOST_kSuccess; +} + + +GHOST_TSuccess GHOST_SystemCocoa::handleMouseEvent(void *eventPtr) +{ + NSEvent *event = (NSEvent *)eventPtr; GHOST_Window* window; - + window = (GHOST_Window*)m_windowManager->getWindowAssociatedWithOSWindow((void*)[event window]); - if (!window) { + if (!window) { //printf("\nW failure for event 0x%x",[event type]); - return GHOST_kFailure; - } - - switch ([event type]) - { - case NSLeftMouseDown: - case NSRightMouseDown: - case NSOtherMouseDown: + return GHOST_kFailure; + } + + switch ([event type]) + { + case NSLeftMouseDown: + case NSRightMouseDown: + case NSOtherMouseDown: pushEvent(new GHOST_EventButton([event timestamp]*1000, GHOST_kEventButtonDown, window, convertButton([event buttonNumber]))); - //Handle tablet events combined with mouse events - switch ([event subtype]) { - case NX_SUBTYPE_TABLET_POINT: - handleTabletEvent(eventPtr, NSTabletPoint); - break; - case NX_SUBTYPE_TABLET_PROXIMITY: - handleTabletEvent(eventPtr, NSTabletProximity); - break; - default: - //No tablet event included : do nothing - break; - } - break; - - case NSLeftMouseUp: - case NSRightMouseUp: - case NSOtherMouseUp: + //Handle tablet events combined with mouse events + switch ([event subtype]) { + case NX_SUBTYPE_TABLET_POINT: + handleTabletEvent(eventPtr, NSTabletPoint); + break; + case NX_SUBTYPE_TABLET_PROXIMITY: + handleTabletEvent(eventPtr, NSTabletProximity); + break; + default: + //No tablet event included : do nothing + break; + } + break; + + case NSLeftMouseUp: + case NSRightMouseUp: + case NSOtherMouseUp: pushEvent(new GHOST_EventButton([event timestamp]*1000, GHOST_kEventButtonUp, window, convertButton([event buttonNumber]))); - //Handle tablet events combined with mouse events - switch ([event subtype]) { - case NX_SUBTYPE_TABLET_POINT: - handleTabletEvent(eventPtr, NSTabletPoint); - break; - case NX_SUBTYPE_TABLET_PROXIMITY: - handleTabletEvent(eventPtr, NSTabletProximity); - break; - default: - //No tablet event included : do nothing - break; - } - break; - - case NSLeftMouseDragged: - case NSRightMouseDragged: - case NSOtherMouseDragged: - //Handle tablet events combined with mouse events - switch ([event subtype]) { - case NX_SUBTYPE_TABLET_POINT: - handleTabletEvent(eventPtr, NSTabletPoint); - break; - case NX_SUBTYPE_TABLET_PROXIMITY: - handleTabletEvent(eventPtr, NSTabletProximity); - break; - default: - //No tablet event included : do nothing - break; - } + //Handle tablet events combined with mouse events + switch ([event subtype]) { + case NX_SUBTYPE_TABLET_POINT: + handleTabletEvent(eventPtr, NSTabletPoint); + break; + case NX_SUBTYPE_TABLET_PROXIMITY: + handleTabletEvent(eventPtr, NSTabletProximity); + break; + default: + //No tablet event included : do nothing + break; + } + break; - case NSMouseMoved: + case NSLeftMouseDragged: + case NSRightMouseDragged: + case NSOtherMouseDragged: + //Handle tablet events combined with mouse events + switch ([event subtype]) { + case NX_SUBTYPE_TABLET_POINT: + handleTabletEvent(eventPtr, NSTabletPoint); + break; + case NX_SUBTYPE_TABLET_PROXIMITY: + handleTabletEvent(eventPtr, NSTabletProximity); + break; + default: + //No tablet event included : do nothing + break; + } + + case NSMouseMoved: switch (window->getCursorGrabMode()) { case GHOST_kGrabHide: //Cursor hidden grab operation : no cursor move { @@ -1975,14 +1550,14 @@ GHOST_TSuccess GHOST_SystemCocoa::handleMouseEvent(void *eventPtr) NSPoint mousePos = [event locationInWindow]; pushEvent(new GHOST_EventCursor([event timestamp]*1000, GHOST_kEventCursorMove, window, mousePos.x, mousePos.y)); m_cursorDelta_x=0; - m_cursorDelta_y=0; //Mouse motion occured between two cursor warps, so we can reset the delta counter + m_cursorDelta_y=0; //Mouse motion occurred between two cursor warps, so we can reset the delta counter } break; - } - break; - - case NSScrollWheel: - { + } + break; + + case NSScrollWheel: + { /* Send trackpad event if inside a trackpad gesture, send wheel event otherwise */ if (!m_hasMultiTouchTrackpad || !m_isGestureInProgress) { GHOST_TInt32 delta; @@ -2013,9 +1588,9 @@ GHOST_TSuccess GHOST_SystemCocoa::handleMouseEvent(void *eventPtr) pushEvent(new GHOST_EventTrackpad([event timestamp]*1000, window, GHOST_kTrackpadEventScroll, mousePos.x, mousePos.y, dx, dy)); } - } - break; - + } + break; + case NSEventTypeMagnify: { NSPoint mousePos = [event locationInWindow]; @@ -2036,47 +1611,43 @@ GHOST_TSuccess GHOST_SystemCocoa::handleMouseEvent(void *eventPtr) case NSEventTypeEndGesture: m_isGestureInProgress = false; break; - default: - return GHOST_kFailure; - break; - } - - return GHOST_kSuccess; -} - - -GHOST_TSuccess GHOST_SystemCocoa::handleKeyEvent(void *eventPtr) -{ - NSEvent *event = (NSEvent *)eventPtr; + default: + return GHOST_kFailure; + break; + } + + return GHOST_kSuccess; +} + + +GHOST_TSuccess GHOST_SystemCocoa::handleKeyEvent(void *eventPtr) +{ + NSEvent *event = (NSEvent *)eventPtr; GHOST_IWindow* window; - unsigned int modifiers; - NSString *characters; + unsigned int modifiers; + NSString *characters; NSData *convertedCharacters; - GHOST_TKey keyCode; - unsigned char ascii; + GHOST_TKey keyCode; + unsigned char ascii; NSString* charsIgnoringModifiers; - + window = m_windowManager->getWindowAssociatedWithOSWindow((void*)[event window]); - if (!window) { + if (!window) { //printf("\nW failure for event 0x%x",[event type]); - return GHOST_kFailure; - } - - switch ([event type]) { - case NSKeyDown: - case NSKeyUp: + return GHOST_kFailure; + } + + switch ([event type]) { + case NSKeyDown: + case NSKeyUp: charsIgnoringModifiers = [event charactersIgnoringModifiers]; if ([charsIgnoringModifiers length]>0) - keyCode = convertKey([event keyCode], + keyCode = convertKey([event keyCode], [charsIgnoringModifiers characterAtIndex:0], [event type] == NSKeyDown?kUCKeyActionDown:kUCKeyActionUp); else -<<<<<<< .working - keyCode = convertKey([event keyCode],0); -======= keyCode = convertKey([event keyCode],0, [event type] == NSKeyDown?kUCKeyActionDown:kUCKeyActionUp); ->>>>>>> .merge-right.r30358 characters = [event characters]; @@ -2087,145 +1658,132 @@ GHOST_TSuccess GHOST_SystemCocoa::handleKeyEvent(void *eventPtr) ascii =((char*)[convertedCharacters bytes])[0]; else ascii = 0; //Character not available in iso latin 1 encoding - } + } else ascii= 0; - - if ((keyCode == GHOST_kKeyQ) && (m_modifierMask & NSCommandKeyMask)) - break; //Cmd-Q is directly handled by Cocoa - - if ([event type] == NSKeyDown) { + + if ((keyCode == GHOST_kKeyQ) && (m_modifierMask & NSCommandKeyMask)) + break; //Cmd-Q is directly handled by Cocoa + + if ([event type] == NSKeyDown) { pushEvent( new GHOST_EventKey([event timestamp]*1000, GHOST_kEventKeyDown, window, keyCode, ascii) ); -<<<<<<< .working - //printf("\nKey pressed keyCode=%u ascii=%i %c",keyCode,ascii,ascii); - } else { -======= //printf("\nKey down rawCode=0x%x charsIgnoringModifiers=%c keyCode=%u ascii=%i %c",[event keyCode],[charsIgnoringModifiers length]>0?[charsIgnoringModifiers characterAtIndex:0]:' ',keyCode,ascii,ascii); } else { ->>>>>>> .merge-right.r30358 pushEvent( new GHOST_EventKey([event timestamp]*1000, GHOST_kEventKeyUp, window, keyCode, ascii) ); -<<<<<<< .working - } - break; - - case NSFlagsChanged: - modifiers = [event modifierFlags]; -======= //printf("\nKey up rawCode=0x%x charsIgnoringModifiers=%c keyCode=%u ascii=%i %c",[event keyCode],[charsIgnoringModifiers length]>0?[charsIgnoringModifiers characterAtIndex:0]:' ',keyCode,ascii,ascii); } break; case NSFlagsChanged: modifiers = [event modifierFlags]; ->>>>>>> .merge-right.r30358 - if ((modifiers & NSShiftKeyMask) != (m_modifierMask & NSShiftKeyMask)) { + if ((modifiers & NSShiftKeyMask) != (m_modifierMask & NSShiftKeyMask)) { pushEvent( new GHOST_EventKey([event timestamp]*1000, (modifiers & NSShiftKeyMask)?GHOST_kEventKeyDown:GHOST_kEventKeyUp, window, GHOST_kKeyLeftShift) ); - } - if ((modifiers & NSControlKeyMask) != (m_modifierMask & NSControlKeyMask)) { + } + if ((modifiers & NSControlKeyMask) != (m_modifierMask & NSControlKeyMask)) { pushEvent( new GHOST_EventKey([event timestamp]*1000, (modifiers & NSControlKeyMask)?GHOST_kEventKeyDown:GHOST_kEventKeyUp, window, GHOST_kKeyLeftControl) ); - } - if ((modifiers & NSAlternateKeyMask) != (m_modifierMask & NSAlternateKeyMask)) { + } + if ((modifiers & NSAlternateKeyMask) != (m_modifierMask & NSAlternateKeyMask)) { pushEvent( new GHOST_EventKey([event timestamp]*1000, (modifiers & NSAlternateKeyMask)?GHOST_kEventKeyDown:GHOST_kEventKeyUp, window, GHOST_kKeyLeftAlt) ); - } - if ((modifiers & NSCommandKeyMask) != (m_modifierMask & NSCommandKeyMask)) { + } + if ((modifiers & NSCommandKeyMask) != (m_modifierMask & NSCommandKeyMask)) { pushEvent( new GHOST_EventKey([event timestamp]*1000, (modifiers & NSCommandKeyMask)?GHOST_kEventKeyDown:GHOST_kEventKeyUp, window, GHOST_kKeyCommand) ); - } - - m_modifierMask = modifiers; - break; - - default: - return GHOST_kFailure; - break; - } - - return GHOST_kSuccess; -} - - - -#pragma mark Clipboard get/set - -GHOST_TUns8* GHOST_SystemCocoa::getClipboard(bool selection) const -{ - GHOST_TUns8 * temp_buff; - size_t pastedTextSize; - - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - NSPasteboard *pasteBoard = [NSPasteboard generalPasteboard]; - - if (pasteBoard == nil) { - [pool drain]; - return NULL; - } - - NSArray *supportedTypes = + } + + m_modifierMask = modifiers; + break; + + default: + return GHOST_kFailure; + break; + } + + return GHOST_kSuccess; +} + + + +#pragma mark Clipboard get/set + +GHOST_TUns8* GHOST_SystemCocoa::getClipboard(bool selection) const +{ + GHOST_TUns8 * temp_buff; + size_t pastedTextSize; + + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + + NSPasteboard *pasteBoard = [NSPasteboard generalPasteboard]; + + if (pasteBoard == nil) { + [pool drain]; + return NULL; + } + + NSArray *supportedTypes = [NSArray arrayWithObjects: NSStringPboardType, nil]; - - NSString *bestType = [[NSPasteboard generalPasteboard] - availableTypeFromArray:supportedTypes]; - - if (bestType == nil) { - [pool drain]; - return NULL; - } - + + NSString *bestType = [[NSPasteboard generalPasteboard] + availableTypeFromArray:supportedTypes]; + + if (bestType == nil) { + [pool drain]; + return NULL; + } + NSString * textPasted = [pasteBoard stringForType:NSStringPboardType]; - - if (textPasted == nil) { - [pool drain]; - return NULL; - } - + + if (textPasted == nil) { + [pool drain]; + return NULL; + } + pastedTextSize = [textPasted lengthOfBytesUsingEncoding:NSISOLatin1StringEncoding]; - - temp_buff = (GHOST_TUns8*) malloc(pastedTextSize+1); - - if (temp_buff == NULL) { - [pool drain]; - return NULL; - } - + + temp_buff = (GHOST_TUns8*) malloc(pastedTextSize+1); + + if (temp_buff == NULL) { + [pool drain]; + return NULL; + } + strncpy((char*)temp_buff, [textPasted cStringUsingEncoding:NSISOLatin1StringEncoding], pastedTextSize); - - temp_buff[pastedTextSize] = '\0'; - - [pool drain]; - - if(temp_buff) { - return temp_buff; - } else { - return NULL; - } -} - -void GHOST_SystemCocoa::putClipboard(GHOST_TInt8 *buffer, bool selection) const -{ - NSString *textToCopy; - - if(selection) {return;} // for copying the selection, used on X11 - - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - NSPasteboard *pasteBoard = [NSPasteboard generalPasteboard]; - - if (pasteBoard == nil) { - [pool drain]; - return; - } - + + temp_buff[pastedTextSize] = '\0'; + + [pool drain]; + + if(temp_buff) { + return temp_buff; + } else { + return NULL; + } +} + +void GHOST_SystemCocoa::putClipboard(GHOST_TInt8 *buffer, bool selection) const +{ + NSString *textToCopy; + + if(selection) {return;} // for copying the selection, used on X11 + + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + + NSPasteboard *pasteBoard = [NSPasteboard generalPasteboard]; + + if (pasteBoard == nil) { + [pool drain]; + return; + } + NSArray *supportedTypes = [NSArray arrayWithObject:NSStringPboardType]; - - [pasteBoard declareTypes:supportedTypes owner:nil]; - + + [pasteBoard declareTypes:supportedTypes owner:nil]; + textToCopy = [NSString stringWithCString:buffer encoding:NSISOLatin1StringEncoding]; - + [pasteBoard setString:textToCopy forType:NSStringPboardType]; - - [pool drain]; -} + + [pool drain]; +} #pragma mark Base directories retrieval diff --git a/intern/ghost/intern/GHOST_SystemWin32.h b/intern/ghost/intern/GHOST_SystemWin32.h index 888d9c0ab3e..35b8debf6b4 100644 --- a/intern/ghost/intern/GHOST_SystemWin32.h +++ b/intern/ghost/intern/GHOST_SystemWin32.h @@ -214,7 +214,7 @@ public: * @param draggedObjectType The type object concerned (currently array of file names, string, ?bitmap) * @param mouseX x mouse coordinate (in window coordinates) * @param mouseY y mouse coordinate - * @param window The window on which the event occured + * @param window The window on which the event occurred * @return Indication whether the event was handled. */ static GHOST_TSuccess pushDragDropEvent(GHOST_TEventType eventType, GHOST_TDragnDropTypes draggedObjectType,GHOST_IWindow* window, int mouseX, int mouseY, void* data); diff --git a/intern/ghost/intern/GHOST_SystemX11.cpp b/intern/ghost/intern/GHOST_SystemX11.cpp index c9228e68e54..961a637e616 100644 --- a/intern/ghost/intern/GHOST_SystemX11.cpp +++ b/intern/ghost/intern/GHOST_SystemX11.cpp @@ -67,6 +67,10 @@ #include // for fprintf only #include // for exit +#ifndef PREFIX +# define PREFIX "/usr/local" +#endif + typedef struct NDOFPlatformInfo { Display *display; Window window; @@ -1461,7 +1465,7 @@ void GHOST_SystemX11::putClipboard(GHOST_TInt8 *buffer, bool selection) const const GHOST_TUns8* GHOST_SystemX11::getSystemDir() const { - return (GHOST_TUns8*)"/usr/share"; + return (GHOST_TUns8*) PREFIX "/share"; } const GHOST_TUns8* GHOST_SystemX11::getUserDir() const diff --git a/intern/ghost/intern/GHOST_WindowCocoa.h b/intern/ghost/intern/GHOST_WindowCocoa.h index 4b492a6b0b5..410febe11eb 100644 --- a/intern/ghost/intern/GHOST_WindowCocoa.h +++ b/intern/ghost/intern/GHOST_WindowCocoa.h @@ -1,5 +1,5 @@ /** - * $Id: GHOST_WindowCocoa.h 23789 2009-10-12 16:51:36Z damien78 $ + * $Id: GHOST_WindowCocoa.h 29143 2010-06-01 20:21:40Z damien78 $ * ***** BEGIN GPL LICENSE BLOCK ***** * * This program is free software; you can redistribute it and/or diff --git a/intern/ghost/intern/GHOST_WindowCocoa.mm b/intern/ghost/intern/GHOST_WindowCocoa.mm index 233edfc9d65..bc28ffb7223 100644 --- a/intern/ghost/intern/GHOST_WindowCocoa.mm +++ b/intern/ghost/intern/GHOST_WindowCocoa.mm @@ -1,51 +1,51 @@ -/** - * $Id: GHOST_WindowCocoa.mm 23873 2009-10-15 20:09:50Z damien78 $ - * ***** BEGIN GPL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, +/** + * $Id: GHOST_WindowCocoa.mm 30325 2010-07-14 14:11:03Z jwilkins $ + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. - * All rights reserved. - * - * The Original Code is: all of this file. - * - * Contributor(s): Maarten Gribnau 05/2001 - Damien Plisson 10/2009 - * - * ***** END GPL LICENSE BLOCK ***** - */ - -#include - -#ifndef MAC_OS_X_VERSION_10_6 -//Use of the SetSystemUIMode function (64bit compatible) -#include -#endif - + * + * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): Maarten Gribnau 05/2001 + Damien Plisson 10/2009 + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#include + +#ifndef MAC_OS_X_VERSION_10_6 +//Use of the SetSystemUIMode function (64bit compatible) +#include +#endif + #include /***** Multithreaded opengl code : uncomment for enabling #include */ -#include "GHOST_WindowCocoa.h" -#include "GHOST_SystemCocoa.h" -#include "GHOST_Debug.h" - - -#pragma mark Cocoa window delegate object +#include "GHOST_WindowCocoa.h" +#include "GHOST_SystemCocoa.h" +#include "GHOST_Debug.h" + + +#pragma mark Cocoa window delegate object /* live resize ugly patch extern "C" { struct bContext; @@ -57,52 +57,52 @@ extern "C" { extern void wm_event_do_notifiers(bContext *C); extern void wm_draw_update(bContext *C); };*/ -@interface CocoaWindowDelegate : NSObject +@interface CocoaWindowDelegate : NSObject #ifdef MAC_OS_X_VERSION_10_6 #endif -{ - GHOST_SystemCocoa *systemCocoa; - GHOST_WindowCocoa *associatedWindow; -} - +{ + GHOST_SystemCocoa *systemCocoa; + GHOST_WindowCocoa *associatedWindow; +} + - (void)setSystemAndWindowCocoa:(GHOST_SystemCocoa *)sysCocoa windowCocoa:(GHOST_WindowCocoa *)winCocoa; -- (void)windowWillClose:(NSNotification *)notification; -- (void)windowDidBecomeKey:(NSNotification *)notification; -- (void)windowDidResignKey:(NSNotification *)notification; +- (void)windowWillClose:(NSNotification *)notification; +- (void)windowDidBecomeKey:(NSNotification *)notification; +- (void)windowDidResignKey:(NSNotification *)notification; - (void)windowDidExpose:(NSNotification *)notification; -- (void)windowDidResize:(NSNotification *)notification; +- (void)windowDidResize:(NSNotification *)notification; - (void)windowDidMove:(NSNotification *)notification; - (void)windowWillMove:(NSNotification *)notification; -@end - -@implementation CocoaWindowDelegate : NSObject -- (void)setSystemAndWindowCocoa:(GHOST_SystemCocoa *)sysCocoa windowCocoa:(GHOST_WindowCocoa *)winCocoa -{ - systemCocoa = sysCocoa; - associatedWindow = winCocoa; -} - -- (void)windowWillClose:(NSNotification *)notification -{ - systemCocoa->handleWindowEvent(GHOST_kEventWindowClose, associatedWindow); -} - -- (void)windowDidBecomeKey:(NSNotification *)notification -{ - systemCocoa->handleWindowEvent(GHOST_kEventWindowActivate, associatedWindow); -} - -- (void)windowDidResignKey:(NSNotification *)notification -{ - systemCocoa->handleWindowEvent(GHOST_kEventWindowDeactivate, associatedWindow); -} - +@end + +@implementation CocoaWindowDelegate : NSObject +- (void)setSystemAndWindowCocoa:(GHOST_SystemCocoa *)sysCocoa windowCocoa:(GHOST_WindowCocoa *)winCocoa +{ + systemCocoa = sysCocoa; + associatedWindow = winCocoa; +} + +- (void)windowWillClose:(NSNotification *)notification +{ + systemCocoa->handleWindowEvent(GHOST_kEventWindowClose, associatedWindow); +} + +- (void)windowDidBecomeKey:(NSNotification *)notification +{ + systemCocoa->handleWindowEvent(GHOST_kEventWindowActivate, associatedWindow); +} + +- (void)windowDidResignKey:(NSNotification *)notification +{ + systemCocoa->handleWindowEvent(GHOST_kEventWindowDeactivate, associatedWindow); +} + - (void)windowDidExpose:(NSNotification *)notification -{ - systemCocoa->handleWindowEvent(GHOST_kEventWindowUpdate, associatedWindow); -} - +{ + systemCocoa->handleWindowEvent(GHOST_kEventWindowUpdate, associatedWindow); +} + - (void)windowDidMove:(NSNotification *)notification { systemCocoa->handleWindowEvent(GHOST_kEventWindowMove, associatedWindow); @@ -113,8 +113,8 @@ extern "C" { systemCocoa->handleWindowEvent(GHOST_kEventWindowMove, associatedWindow); } -- (void)windowDidResize:(NSNotification *)notification -{ +- (void)windowDidResize:(NSNotification *)notification +{ #ifdef MAC_OS_X_VERSION_10_6 //if (![[notification object] inLiveResize]) { //Send event only once, at end of resize operation (when user has released mouse button) @@ -131,31 +131,31 @@ extern "C" { wm_event_do_notifiers(ghostC); wm_draw_update(ghostC); }*/ -} -@end - -#pragma mark NSWindow subclass -//We need to subclass it to tell that even borderless (fullscreen), it can become key (receive user events) -@interface CocoaWindow: NSWindow -{ +} +@end + +#pragma mark NSWindow subclass +//We need to subclass it to tell that even borderless (fullscreen), it can become key (receive user events) +@interface CocoaWindow: NSWindow +{ GHOST_SystemCocoa *systemCocoa; GHOST_WindowCocoa *associatedWindow; GHOST_TDragnDropTypes m_draggedObjectType; -} +} - (void)setSystemAndWindowCocoa:(GHOST_SystemCocoa *)sysCocoa windowCocoa:(GHOST_WindowCocoa *)winCocoa; -@end -@implementation CocoaWindow +@end +@implementation CocoaWindow - (void)setSystemAndWindowCocoa:(GHOST_SystemCocoa *)sysCocoa windowCocoa:(GHOST_WindowCocoa *)winCocoa { systemCocoa = sysCocoa; associatedWindow = winCocoa; } - --(BOOL)canBecomeKeyWindow -{ - return YES; -} - + +-(BOOL)canBecomeKeyWindow +{ + return YES; +} + //The drag'n'drop dragging destination methods - (NSDragOperation)draggingEntered:(id < NSDraggingInfo >)sender { @@ -228,27 +228,27 @@ extern "C" { return YES; } -@end - - - -#pragma mark NSOpenGLView subclass -//We need to subclass it in order to give Cocoa the feeling key events are trapped -@interface CocoaOpenGLView : NSOpenGLView -{ -} -@end -@implementation CocoaOpenGLView - -- (BOOL)acceptsFirstResponder -{ - return YES; -} - -//The trick to prevent Cocoa from complaining (beeping) -- (void)keyDown:(NSEvent *)theEvent -{} - +@end + + + +#pragma mark NSOpenGLView subclass +//We need to subclass it in order to give Cocoa the feeling key events are trapped +@interface CocoaOpenGLView : NSOpenGLView +{ +} +@end +@implementation CocoaOpenGLView + +- (BOOL)acceptsFirstResponder +{ + return YES; +} + +//The trick to prevent Cocoa from complaining (beeping) +- (void)keyDown:(NSEvent *)theEvent +{} + #if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 //Cmd+key are handled differently before 10.5 - (BOOL)performKeyEquivalent:(NSEvent *)theEvent @@ -275,59 +275,59 @@ extern "C" { } #endif -- (BOOL)isOpaque -{ - return YES; -} - -@end - - -#pragma mark initialization / finalization - -NSOpenGLContext* GHOST_WindowCocoa::s_firstOpenGLcontext = nil; - -GHOST_WindowCocoa::GHOST_WindowCocoa( - GHOST_SystemCocoa *systemCocoa, - const STR_String& title, - GHOST_TInt32 left, - GHOST_TInt32 top, - GHOST_TUns32 width, - GHOST_TUns32 height, - GHOST_TWindowState state, - GHOST_TDrawingContextType type, +- (BOOL)isOpaque +{ + return YES; +} + +@end + + +#pragma mark initialization / finalization + +NSOpenGLContext* GHOST_WindowCocoa::s_firstOpenGLcontext = nil; + +GHOST_WindowCocoa::GHOST_WindowCocoa( + GHOST_SystemCocoa *systemCocoa, + const STR_String& title, + GHOST_TInt32 left, + GHOST_TInt32 top, + GHOST_TUns32 width, + GHOST_TUns32 height, + GHOST_TWindowState state, + GHOST_TDrawingContextType type, const bool stereoVisual, const GHOST_TUns16 numOfAASamples -) : +) : GHOST_Window(title, left, top, width, height, state, GHOST_kDrawingContextTypeNone, stereoVisual, numOfAASamples), - m_customCursor(0) -{ + m_customCursor(0) +{ NSOpenGLPixelFormatAttribute pixelFormatAttrsWindow[40]; NSOpenGLPixelFormat *pixelFormat = nil; int i; - m_systemCocoa = systemCocoa; - m_fullScreen = false; - - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - - //Creates the window - NSRect rect; + m_systemCocoa = systemCocoa; + m_fullScreen = false; + + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + + + //Creates the window + NSRect rect; NSSize minSize; - - rect.origin.x = left; - rect.origin.y = top; - rect.size.width = width; - rect.size.height = height; - - m_window = [[CocoaWindow alloc] initWithContentRect:rect - styleMask:NSTitledWindowMask | NSClosableWindowMask | NSResizableWindowMask | NSMiniaturizableWindowMask - backing:NSBackingStoreBuffered defer:NO]; - if (m_window == nil) { - [pool drain]; - return; - } - + + rect.origin.x = left; + rect.origin.y = top; + rect.size.width = width; + rect.size.height = height; + + m_window = [[CocoaWindow alloc] initWithContentRect:rect + styleMask:NSTitledWindowMask | NSClosableWindowMask | NSResizableWindowMask | NSMiniaturizableWindowMask + backing:NSBackingStoreBuffered defer:NO]; + if (m_window == nil) { + [pool drain]; + return; + } + [m_window setSystemAndWindowCocoa:systemCocoa windowCocoa:this]; //Forbid to resize the window below the blender defined minimum one @@ -335,9 +335,9 @@ GHOST_WindowCocoa::GHOST_WindowCocoa( minSize.height = 240; [m_window setContentMinSize:minSize]; - setTitle(title); - - + setTitle(title); + + // Pixel Format Attributes for the windowed NSOpenGLContext i=0; pixelFormatAttrsWindow[i++] = NSOpenGLPFADoubleBuffer; @@ -405,296 +405,77 @@ GHOST_WindowCocoa::GHOST_WindowCocoa( } } - //Creates the OpenGL View inside the window - m_openGLView = [[CocoaOpenGLView alloc] initWithFrame:rect - pixelFormat:pixelFormat]; - - [pixelFormat release]; - - m_openGLContext = [m_openGLView openGLContext]; //This context will be replaced by the proper one just after - - [m_window setContentView:m_openGLView]; - [m_window setInitialFirstResponder:m_openGLView]; - - [m_window setReleasedWhenClosed:NO]; //To avoid bad pointer exception in case of user closing the window - - [m_window makeKeyAndOrderFront:nil]; - - setDrawingContextType(type); - updateDrawingContext(); - activateDrawingContext(); - - m_tablet.Active = GHOST_kTabletModeNone; - - CocoaWindowDelegate *windowDelegate = [[CocoaWindowDelegate alloc] init]; - [windowDelegate setSystemAndWindowCocoa:systemCocoa windowCocoa:this]; - [m_window setDelegate:windowDelegate]; - - [m_window setAcceptsMouseMovedEvents:YES]; - + //Creates the OpenGL View inside the window + m_openGLView = [[CocoaOpenGLView alloc] initWithFrame:rect + pixelFormat:pixelFormat]; + + [pixelFormat release]; + + m_openGLContext = [m_openGLView openGLContext]; //This context will be replaced by the proper one just after + + [m_window setContentView:m_openGLView]; + [m_window setInitialFirstResponder:m_openGLView]; + + [m_window setReleasedWhenClosed:NO]; //To avoid bad pointer exception in case of user closing the window + + [m_window makeKeyAndOrderFront:nil]; + + setDrawingContextType(type); + updateDrawingContext(); + activateDrawingContext(); + + m_tablet.Active = GHOST_kTabletModeNone; + + CocoaWindowDelegate *windowDelegate = [[CocoaWindowDelegate alloc] init]; + [windowDelegate setSystemAndWindowCocoa:systemCocoa windowCocoa:this]; + [m_window setDelegate:windowDelegate]; + + [m_window setAcceptsMouseMovedEvents:YES]; + [m_window registerForDraggedTypes:[NSArray arrayWithObjects:NSFilenamesPboardType, NSStringPboardType, NSTIFFPboardType, nil]]; - if (state == GHOST_kWindowStateFullScreen) - setState(GHOST_kWindowStateFullScreen); - - [pool drain]; -} - - -GHOST_WindowCocoa::~GHOST_WindowCocoa() -{ - if (m_customCursor) delete m_customCursor; - - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [m_openGLView release]; - - if (m_window) { - [m_window close]; - [[m_window delegate] release]; - [m_window release]; - m_window = nil; - } - - //Check for other blender opened windows and make the frontmost key - NSArray *windowsList = [NSApp orderedWindows]; - if ([windowsList count]) { - [[windowsList objectAtIndex:0] makeKeyAndOrderFront:nil]; - } - [pool drain]; -} - -#pragma mark accessors - -bool GHOST_WindowCocoa::getValid() const -{ + if (state == GHOST_kWindowStateFullScreen) + setState(GHOST_kWindowStateFullScreen); + + [pool drain]; +} + + +GHOST_WindowCocoa::~GHOST_WindowCocoa() +{ + if (m_customCursor) delete m_customCursor; + + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + [m_openGLView release]; + + if (m_window) { + [m_window close]; + [[m_window delegate] release]; + [m_window release]; + m_window = nil; + } + + //Check for other blender opened windows and make the frontmost key + NSArray *windowsList = [NSApp orderedWindows]; + if ([windowsList count]) { + [[windowsList objectAtIndex:0] makeKeyAndOrderFront:nil]; + } + [pool drain]; +} + +#pragma mark accessors + +bool GHOST_WindowCocoa::getValid() const +{ return (m_window != 0); -} - +} + void* GHOST_WindowCocoa::getOSWindow() const { return (void*)m_window; } - -void GHOST_WindowCocoa::setTitle(const STR_String& title) -{ - GHOST_ASSERT(getValid(), "GHOST_WindowCocoa::setTitle(): window invalid") - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - NSString *windowTitle = [[NSString alloc] initWithUTF8String:title]; - - //Set associated file if applicable - if ([windowTitle hasPrefix:@"Blender"]) - { - NSRange fileStrRange; - NSString *associatedFileName; - int len; - - fileStrRange.location = [windowTitle rangeOfString:@"["].location+1; - len = [windowTitle rangeOfString:@"]"].location - fileStrRange.location; - - if (len >0) - { - fileStrRange.length = len; - associatedFileName = [windowTitle substringWithRange:fileStrRange]; - @try { - [m_window setRepresentedFilename:associatedFileName]; - } - @catch (NSException * e) { - printf("\nInvalid file path given in window title"); - } - [m_window setTitle:[associatedFileName lastPathComponent]]; - } - else { - [m_window setTitle:windowTitle]; - [m_window setRepresentedFilename:@""]; - } - - } else { - [m_window setTitle:windowTitle]; - [m_window setRepresentedFilename:@""]; - } - - - [windowTitle release]; - [pool drain]; -} - - -void GHOST_WindowCocoa::getTitle(STR_String& title) const -{ - GHOST_ASSERT(getValid(), "GHOST_WindowCocoa::getTitle(): window invalid") - - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - NSString *windowTitle = [m_window title]; - - if (windowTitle != nil) { - title = [windowTitle UTF8String]; - } - - [pool drain]; -} - - -void GHOST_WindowCocoa::getWindowBounds(GHOST_Rect& bounds) const -{ - NSRect rect; - GHOST_ASSERT(getValid(), "GHOST_WindowCocoa::getWindowBounds(): window invalid") - - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - NSRect screenSize = [[m_window screen] visibleFrame]; - - rect = [m_window frame]; - - bounds.m_b = screenSize.size.height - (rect.origin.y -screenSize.origin.y); - bounds.m_l = rect.origin.x -screenSize.origin.x; - bounds.m_r = rect.origin.x-screenSize.origin.x + rect.size.width; - bounds.m_t = screenSize.size.height - (rect.origin.y + rect.size.height -screenSize.origin.y); - - [pool drain]; -} - - -void GHOST_WindowCocoa::getClientBounds(GHOST_Rect& bounds) const -{ - NSRect rect; - GHOST_ASSERT(getValid(), "GHOST_WindowCocoa::getClientBounds(): window invalid") - - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - if (!m_fullScreen) - { - NSRect screenSize = [[m_window screen] visibleFrame]; - - //Max window contents as screen size (excluding title bar...) - NSRect contentRect = [CocoaWindow contentRectForFrameRect:screenSize - styleMask:(NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask | NSResizableWindowMask)]; - - rect = [m_window contentRectForFrameRect:[m_window frame]]; - - bounds.m_b = contentRect.size.height - (rect.origin.y -contentRect.origin.y); - bounds.m_l = rect.origin.x -contentRect.origin.x; - bounds.m_r = rect.origin.x-contentRect.origin.x + rect.size.width; - bounds.m_t = contentRect.size.height - (rect.origin.y + rect.size.height -contentRect.origin.y); - } - else { - NSRect screenSize = [[m_window screen] frame]; - - bounds.m_b = screenSize.origin.y + screenSize.size.height; - bounds.m_l = screenSize.origin.x; - bounds.m_r = screenSize.origin.x + screenSize.size.width; - bounds.m_t = screenSize.origin.y; - } - [pool drain]; -} - - -GHOST_TSuccess GHOST_WindowCocoa::setClientWidth(GHOST_TUns32 width) -{ - GHOST_ASSERT(getValid(), "GHOST_WindowCocoa::setClientWidth(): window invalid") - GHOST_Rect cBnds, wBnds; - getClientBounds(cBnds); - if (((GHOST_TUns32)cBnds.getWidth()) != width) { - NSSize size; - size.width=width; - size.height=cBnds.getHeight(); - [m_window setContentSize:size]; - } - return GHOST_kSuccess; -} - - -GHOST_TSuccess GHOST_WindowCocoa::setClientHeight(GHOST_TUns32 height) -{ - GHOST_ASSERT(getValid(), "GHOST_WindowCocoa::setClientHeight(): window invalid") - GHOST_Rect cBnds, wBnds; - getClientBounds(cBnds); - if (((GHOST_TUns32)cBnds.getHeight()) != height) { - NSSize size; - size.width=cBnds.getWidth(); - size.height=height; - [m_window setContentSize:size]; - } - return GHOST_kSuccess; -} - - -GHOST_TSuccess GHOST_WindowCocoa::setClientSize(GHOST_TUns32 width, GHOST_TUns32 height) -{ - GHOST_ASSERT(getValid(), "GHOST_WindowCocoa::setClientSize(): window invalid") - GHOST_Rect cBnds, wBnds; - getClientBounds(cBnds); - if ((((GHOST_TUns32)cBnds.getWidth()) != width) || - (((GHOST_TUns32)cBnds.getHeight()) != height)) { - NSSize size; - size.width=width; - size.height=height; - [m_window setContentSize:size]; - } - return GHOST_kSuccess; -} - - -GHOST_TWindowState GHOST_WindowCocoa::getState() const -{ - GHOST_ASSERT(getValid(), "GHOST_WindowCocoa::getState(): window invalid") - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - GHOST_TWindowState state; - if (m_fullScreen) { - state = GHOST_kWindowStateFullScreen; - } - else if ([m_window isMiniaturized]) { - state = GHOST_kWindowStateMinimized; - } - else if ([m_window isZoomed]) { - state = GHOST_kWindowStateMaximized; - } - else { - state = GHOST_kWindowStateNormal; - } - [pool drain]; - return state; -} - - -void GHOST_WindowCocoa::screenToClient(GHOST_TInt32 inX, GHOST_TInt32 inY, GHOST_TInt32& outX, GHOST_TInt32& outY) const -{ - GHOST_ASSERT(getValid(), "GHOST_WindowCocoa::screenToClient(): window invalid") - - NSPoint screenCoord; - NSPoint baseCoord; - - screenCoord.x = inX; - screenCoord.y = inY; - - baseCoord = [m_window convertScreenToBase:screenCoord]; - - outX = baseCoord.x; - outY = baseCoord.y; -} - - -void GHOST_WindowCocoa::clientToScreen(GHOST_TInt32 inX, GHOST_TInt32 inY, GHOST_TInt32& outX, GHOST_TInt32& outY) const -{ - GHOST_ASSERT(getValid(), "GHOST_WindowCocoa::clientToScreen(): window invalid") - - NSPoint screenCoord; - NSPoint baseCoord; - - baseCoord.x = inX; - baseCoord.y = inY; - - screenCoord = [m_window convertBaseToScreen:baseCoord]; - - outX = screenCoord.x; - outY = screenCoord.y; -} - -<<<<<<< .working -======= void GHOST_WindowCocoa::setTitle(const STR_String& title) { GHOST_ASSERT(getValid(), "GHOST_WindowCocoa::setTitle(): window invalid") @@ -918,50 +699,12 @@ void GHOST_WindowCocoa::clientToScreen(GHOST_TInt32 inX, GHOST_TInt32 inY, GHOST } ->>>>>>> .merge-right.r30358 NSScreen* GHOST_WindowCocoa::getScreen() { return [m_window screen]; } -<<<<<<< .working -/** - * @note Fullscreen switch is not actual fullscreen with display capture. As this capture removes all OS X window manager features. - * Instead, the menu bar and the dock are hidden, and the window is made borderless and enlarged. - * Thus, process switch, exposé, spaces, ... still work in fullscreen mode - */ -GHOST_TSuccess GHOST_WindowCocoa::setState(GHOST_TWindowState state) -{ - GHOST_ASSERT(getValid(), "GHOST_WindowCocoa::setState(): window invalid") - switch (state) { - case GHOST_kWindowStateMinimized: - [m_window miniaturize:nil]; - break; - case GHOST_kWindowStateMaximized: - [m_window zoom:nil]; - break; - - case GHOST_kWindowStateFullScreen: - if (!m_fullScreen) - { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - //This status change needs to be done before Cocoa call to enter fullscreen mode - //to give window delegate hint not to forward its deactivation to ghost wm that doesn't know view/window difference - m_fullScreen = true; - -#ifdef MAC_OS_X_VERSION_10_6 - //10.6 provides Cocoa functions to autoshow menu bar, and to change a window style - //Hide menu & dock if needed - if ([[m_window screen] isEqual:[NSScreen mainScreen]]) - { - [NSApp setPresentationOptions:(NSApplicationPresentationHideDock | NSApplicationPresentationAutoHideMenuBar)]; - } - //Make window borderless and enlarge it - [m_window setStyleMask:NSBorderlessWindowMask]; - [m_window setFrame:[[m_window screen] frame] display:YES]; -======= /** * @note Fullscreen switch is not actual fullscreen with display capture. As this capture removes all OS X window manager features. * Instead, the menu bar and the dock are hidden, and the window is made borderless and enlarged. @@ -997,67 +740,7 @@ GHOST_TSuccess GHOST_WindowCocoa::setState(GHOST_TWindowState state) //Make window borderless and enlarge it [m_window setStyleMask:NSBorderlessWindowMask]; [m_window setFrame:[[m_window screen] frame] display:YES]; ->>>>>>> .merge-right.r30358 [m_window makeFirstResponder:m_openGLView]; -<<<<<<< .working -#else - //With 10.5, we need to create a new window to change its style to borderless - //Hide menu & dock if needed - if ([[m_window screen] isEqual:[NSScreen mainScreen]]) - { - //Cocoa function in 10.5 does not allow to set the menu bar in auto-show mode [NSMenu setMenuBarVisible:NO]; - //One of the very few 64bit compatible Carbon function - SetSystemUIMode(kUIModeAllHidden,kUIOptionAutoShowMenuBar); - } - //Create a fullscreen borderless window - CocoaWindow *tmpWindow = [[CocoaWindow alloc] - initWithContentRect:[[m_window screen] frame] - styleMask:NSBorderlessWindowMask - backing:NSBackingStoreBuffered - defer:YES]; - //Copy current window parameters - [tmpWindow setTitle:[m_window title]]; - [tmpWindow setRepresentedFilename:[m_window representedFilename]]; - [tmpWindow setReleasedWhenClosed:NO]; - [tmpWindow setAcceptsMouseMovedEvents:YES]; - [tmpWindow setDelegate:[m_window delegate]]; - - //Assign the openGL view to the new window - [tmpWindow setContentView:m_openGLView]; - - //Show the new window - [tmpWindow makeKeyAndOrderFront:nil]; - //Close and release old window - [m_window setDelegate:nil]; // To avoid the notification of "window closed" event - [m_window close]; - [m_window release]; - m_window = tmpWindow; -#endif - - //Tell WM of view new size - m_systemCocoa->handleWindowEvent(GHOST_kEventWindowSize, this); - - [pool drain]; - } - break; - case GHOST_kWindowStateNormal: - default: - if (m_fullScreen) - { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - m_fullScreen = false; - - //Exit fullscreen -#ifdef MAC_OS_X_VERSION_10_6 - //Show again menu & dock if needed - if ([[m_window screen] isEqual:[NSScreen mainScreen]]) - { - [NSApp setPresentationOptions:NSApplicationPresentationDefault]; - } - //Make window normal and resize it - [m_window setStyleMask:(NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask | NSResizableWindowMask)]; - [m_window setFrame:[[m_window screen] visibleFrame] display:YES]; -======= #else //With 10.5, we need to create a new window to change its style to borderless //Hide menu & dock if needed @@ -1115,164 +798,163 @@ GHOST_TSuccess GHOST_WindowCocoa::setState(GHOST_TWindowState state) //Make window normal and resize it [m_window setStyleMask:(NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask | NSResizableWindowMask)]; [m_window setFrame:[[m_window screen] visibleFrame] display:YES]; ->>>>>>> .merge-right.r30358 //TODO for 10.6 only : window title is forgotten after the style change [m_window makeFirstResponder:m_openGLView]; -#else - //With 10.5, we need to create a new window to change its style to borderless - //Show menu & dock if needed - if ([[m_window screen] isEqual:[NSScreen mainScreen]]) - { - //Cocoa function in 10.5 does not allow to set the menu bar in auto-show mode [NSMenu setMenuBarVisible:YES]; - SetSystemUIMode(kUIModeNormal, 0); //One of the very few 64bit compatible Carbon function - } - //Create a fullscreen borderless window - CocoaWindow *tmpWindow = [[CocoaWindow alloc] - initWithContentRect:[[m_window screen] frame] - styleMask:(NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask | NSResizableWindowMask) - backing:NSBackingStoreBuffered - defer:YES]; - //Copy current window parameters - [tmpWindow setTitle:[m_window title]]; - [tmpWindow setRepresentedFilename:[m_window representedFilename]]; - [tmpWindow setReleasedWhenClosed:NO]; - [tmpWindow setAcceptsMouseMovedEvents:YES]; - [tmpWindow setDelegate:[m_window delegate]]; - - //Assign the openGL view to the new window - [tmpWindow setContentView:m_openGLView]; - - //Show the new window - [tmpWindow makeKeyAndOrderFront:nil]; - //Close and release old window - [m_window setDelegate:nil]; // To avoid the notification of "window closed" event - [m_window close]; - [m_window release]; - m_window = tmpWindow; -#endif - - //Tell WM of view new size - m_systemCocoa->handleWindowEvent(GHOST_kEventWindowSize, this); - - [pool drain]; - } - else if ([m_window isMiniaturized]) - [m_window deminiaturize:nil]; - else if ([m_window isZoomed]) - [m_window zoom:nil]; - break; - } - return GHOST_kSuccess; -} - -GHOST_TSuccess GHOST_WindowCocoa::setModifiedState(bool isUnsavedChanges) -{ - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - [m_window setDocumentEdited:isUnsavedChanges]; - - [pool drain]; - return GHOST_Window::setModifiedState(isUnsavedChanges); -} - - - -GHOST_TSuccess GHOST_WindowCocoa::setOrder(GHOST_TWindowOrder order) -{ +#else + //With 10.5, we need to create a new window to change its style to borderless + //Show menu & dock if needed + if ([[m_window screen] isEqual:[NSScreen mainScreen]]) + { + //Cocoa function in 10.5 does not allow to set the menu bar in auto-show mode [NSMenu setMenuBarVisible:YES]; + SetSystemUIMode(kUIModeNormal, 0); //One of the very few 64bit compatible Carbon function + } + //Create a fullscreen borderless window + CocoaWindow *tmpWindow = [[CocoaWindow alloc] + initWithContentRect:[[m_window screen] frame] + styleMask:(NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask | NSResizableWindowMask) + backing:NSBackingStoreBuffered + defer:YES]; + //Copy current window parameters + [tmpWindow setTitle:[m_window title]]; + [tmpWindow setRepresentedFilename:[m_window representedFilename]]; + [tmpWindow setReleasedWhenClosed:NO]; + [tmpWindow setAcceptsMouseMovedEvents:YES]; + [tmpWindow setDelegate:[m_window delegate]]; + + //Assign the openGL view to the new window + [tmpWindow setContentView:m_openGLView]; + + //Show the new window + [tmpWindow makeKeyAndOrderFront:nil]; + //Close and release old window + [m_window setDelegate:nil]; // To avoid the notification of "window closed" event + [m_window close]; + [m_window release]; + m_window = tmpWindow; +#endif + + //Tell WM of view new size + m_systemCocoa->handleWindowEvent(GHOST_kEventWindowSize, this); + + [pool drain]; + } + else if ([m_window isMiniaturized]) + [m_window deminiaturize:nil]; + else if ([m_window isZoomed]) + [m_window zoom:nil]; + break; + } + return GHOST_kSuccess; +} + +GHOST_TSuccess GHOST_WindowCocoa::setModifiedState(bool isUnsavedChanges) +{ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - GHOST_ASSERT(getValid(), "GHOST_WindowCocoa::setOrder(): window invalid") - if (order == GHOST_kWindowOrderTop) { + [m_window setDocumentEdited:isUnsavedChanges]; + + [pool drain]; + return GHOST_Window::setModifiedState(isUnsavedChanges); +} + + + +GHOST_TSuccess GHOST_WindowCocoa::setOrder(GHOST_TWindowOrder order) +{ + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + + GHOST_ASSERT(getValid(), "GHOST_WindowCocoa::setOrder(): window invalid") + if (order == GHOST_kWindowOrderTop) { [m_window makeKeyAndOrderFront:nil]; - } - else { + } + else { NSArray *windowsList; - [m_window orderBack:nil]; + [m_window orderBack:nil]; //Check for other blender opened windows and make the frontmost key windowsList = [NSApp orderedWindows]; if ([windowsList count]) { [[windowsList objectAtIndex:0] makeKeyAndOrderFront:nil]; } - } + } [pool drain]; - return GHOST_kSuccess; -} - -#pragma mark Drawing context - -/*#define WAIT_FOR_VSYNC 1*/ - -GHOST_TSuccess GHOST_WindowCocoa::swapBuffers() -{ - if (m_drawingContextType == GHOST_kDrawingContextTypeOpenGL) { - if (m_openGLContext != nil) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [m_openGLContext flushBuffer]; - [pool drain]; - return GHOST_kSuccess; - } - } - return GHOST_kFailure; -} - -GHOST_TSuccess GHOST_WindowCocoa::updateDrawingContext() -{ - if (m_drawingContextType == GHOST_kDrawingContextTypeOpenGL) { - if (m_openGLContext != nil) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [m_openGLContext update]; - [pool drain]; - return GHOST_kSuccess; - } - } - return GHOST_kFailure; -} - -GHOST_TSuccess GHOST_WindowCocoa::activateDrawingContext() -{ - if (m_drawingContextType == GHOST_kDrawingContextTypeOpenGL) { - if (m_openGLContext != nil) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [m_openGLContext makeCurrentContext]; + return GHOST_kSuccess; +} + +#pragma mark Drawing context + +/*#define WAIT_FOR_VSYNC 1*/ + +GHOST_TSuccess GHOST_WindowCocoa::swapBuffers() +{ + if (m_drawingContextType == GHOST_kDrawingContextTypeOpenGL) { + if (m_openGLContext != nil) { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + [m_openGLContext flushBuffer]; + [pool drain]; + return GHOST_kSuccess; + } + } + return GHOST_kFailure; +} + +GHOST_TSuccess GHOST_WindowCocoa::updateDrawingContext() +{ + if (m_drawingContextType == GHOST_kDrawingContextTypeOpenGL) { + if (m_openGLContext != nil) { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + [m_openGLContext update]; + [pool drain]; + return GHOST_kSuccess; + } + } + return GHOST_kFailure; +} + +GHOST_TSuccess GHOST_WindowCocoa::activateDrawingContext() +{ + if (m_drawingContextType == GHOST_kDrawingContextTypeOpenGL) { + if (m_openGLContext != nil) { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + [m_openGLContext makeCurrentContext]; // Disable AA by default if (m_numOfAASamples > 0) glDisable(GL_MULTISAMPLE_ARB); - [pool drain]; - return GHOST_kSuccess; - } - } - return GHOST_kFailure; -} - - -GHOST_TSuccess GHOST_WindowCocoa::installDrawingContext(GHOST_TDrawingContextType type) -{ - GHOST_TSuccess success = GHOST_kFailure; - - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - NSOpenGLPixelFormat *pixelFormat; - NSOpenGLContext *tmpOpenGLContext; - + [pool drain]; + return GHOST_kSuccess; + } + } + return GHOST_kFailure; +} + + +GHOST_TSuccess GHOST_WindowCocoa::installDrawingContext(GHOST_TDrawingContextType type) +{ + GHOST_TSuccess success = GHOST_kFailure; + + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + + NSOpenGLPixelFormat *pixelFormat; + NSOpenGLContext *tmpOpenGLContext; + /***** Multithreaded opengl code : uncomment for enabling CGLContextObj cglCtx; */ - switch (type) { - case GHOST_kDrawingContextTypeOpenGL: - if (!getValid()) break; - - pixelFormat = [m_openGLView pixelFormat]; - tmpOpenGLContext = [[NSOpenGLContext alloc] initWithFormat:pixelFormat - shareContext:s_firstOpenGLcontext]; - if (tmpOpenGLContext == nil) { - success = GHOST_kFailure; - break; - } - + switch (type) { + case GHOST_kDrawingContextTypeOpenGL: + if (!getValid()) break; + + pixelFormat = [m_openGLView pixelFormat]; + tmpOpenGLContext = [[NSOpenGLContext alloc] initWithFormat:pixelFormat + shareContext:s_firstOpenGLcontext]; + if (tmpOpenGLContext == nil) { + success = GHOST_kFailure; + break; + } + //Switch openGL to multhreaded mode /******* Multithreaded opengl code : uncomment for enabling cglCtx = (CGLContextObj)[tmpOpenGLContext CGLContextObj]; @@ -1280,130 +962,20 @@ GHOST_TSuccess GHOST_WindowCocoa::installDrawingContext(GHOST_TDrawingContextTyp printf("\nSwitched openGL to multithreaded mode"); */ - if (!s_firstOpenGLcontext) s_firstOpenGLcontext = tmpOpenGLContext; -#ifdef WAIT_FOR_VSYNC + if (!s_firstOpenGLcontext) s_firstOpenGLcontext = tmpOpenGLContext; +#ifdef WAIT_FOR_VSYNC { GLint swapInt = 1; - /* wait for vsync, to avoid tearing artifacts */ + /* wait for vsync, to avoid tearing artifacts */ [tmpOpenGLContext setValues:&swapInt forParameter:NSOpenGLCPSwapInterval]; } -#endif +#endif [m_openGLView setOpenGLContext:tmpOpenGLContext]; [tmpOpenGLContext setView:m_openGLView]; m_openGLContext = tmpOpenGLContext; - break; + break; -<<<<<<< .working - case GHOST_kDrawingContextTypeNone: - success = GHOST_kSuccess; - break; - - default: - break; - } - [pool drain]; - return success; -} - - -GHOST_TSuccess GHOST_WindowCocoa::removeDrawingContext() -{ - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - switch (m_drawingContextType) { - case GHOST_kDrawingContextTypeOpenGL: - if (m_openGLContext) - { - [m_openGLView clearGLContext]; - if (s_firstOpenGLcontext == m_openGLContext) s_firstOpenGLcontext = nil; - m_openGLContext = nil; - } - [pool drain]; - return GHOST_kSuccess; - case GHOST_kDrawingContextTypeNone: - [pool drain]; - return GHOST_kSuccess; - break; - default: - [pool drain]; - return GHOST_kFailure; - } -} - - -GHOST_TSuccess GHOST_WindowCocoa::invalidate() -{ - GHOST_ASSERT(getValid(), "GHOST_WindowCocoa::invalidate(): window invalid") - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [m_openGLView setNeedsDisplay:YES]; - [pool drain]; - return GHOST_kSuccess; -} - -#pragma mark Cursor handling - -void GHOST_WindowCocoa::loadCursor(bool visible, GHOST_TStandardCursor cursor) const -{ - static bool systemCursorVisible = true; - - NSAutoreleasePool *pool =[[NSAutoreleasePool alloc] init]; - - NSCursor *tmpCursor =nil; - - if (visible != systemCursorVisible) { - if (visible) { - [NSCursor unhide]; - systemCursorVisible = true; - } - else { - [NSCursor hide]; - systemCursorVisible = false; - } - } - - if (cursor == GHOST_kStandardCursorCustom && m_customCursor) { - tmpCursor = m_customCursor; - } else { - switch (cursor) { - case GHOST_kStandardCursorDestroy: - tmpCursor = [NSCursor disappearingItemCursor]; - break; - case GHOST_kStandardCursorText: - tmpCursor = [NSCursor IBeamCursor]; - break; - case GHOST_kStandardCursorCrosshair: - tmpCursor = [NSCursor crosshairCursor]; - break; - case GHOST_kStandardCursorUpDown: - tmpCursor = [NSCursor resizeUpDownCursor]; - break; - case GHOST_kStandardCursorLeftRight: - tmpCursor = [NSCursor resizeLeftRightCursor]; - break; - case GHOST_kStandardCursorTopSide: - tmpCursor = [NSCursor resizeUpCursor]; - break; - case GHOST_kStandardCursorBottomSide: - tmpCursor = [NSCursor resizeDownCursor]; - break; - case GHOST_kStandardCursorLeftSide: - tmpCursor = [NSCursor resizeLeftCursor]; - break; - case GHOST_kStandardCursorRightSide: - tmpCursor = [NSCursor resizeRightCursor]; - break; - case GHOST_kStandardCursorRightArrow: - case GHOST_kStandardCursorInfo: - case GHOST_kStandardCursorLeftArrow: - case GHOST_kStandardCursorHelp: - case GHOST_kStandardCursorCycle: - case GHOST_kStandardCursorSpray: - case GHOST_kStandardCursorWait: - case GHOST_kStandardCursorTopLeftCorner: - case GHOST_kStandardCursorTopRightCorner: - case GHOST_kStandardCursorBottomRightCorner: - case GHOST_kStandardCursorBottomLeftCorner: -======= case GHOST_kDrawingContextTypeNone: success = GHOST_kSuccess; break; @@ -1570,32 +1142,7 @@ void GHOST_WindowCocoa::loadCursor(bool visible, GHOST_TStandardCursor cursor) c case GHOST_kStandardCursorTopRightCorner: case GHOST_kStandardCursorBottomRightCorner: case GHOST_kStandardCursorBottomLeftCorner: ->>>>>>> .merge-right.r30358 case GHOST_kStandardCursorCopy: -<<<<<<< .working - case GHOST_kStandardCursorDefault: - default: - tmpCursor = [NSCursor arrowCursor]; - break; - }; - } - [tmpCursor set]; - [pool drain]; -} - - - -GHOST_TSuccess GHOST_WindowCocoa::setWindowCursorVisibility(bool visible) -{ - if ([m_window isVisible]) { - loadCursor(visible, getCursorShape()); - } - - return GHOST_kSuccess; -} - - -======= case GHOST_kStandardCursorDefault: default: tmpCursor = [NSCursor arrowCursor]; @@ -1620,21 +1167,20 @@ GHOST_TSuccess GHOST_WindowCocoa::setWindowCursorVisibility(bool visible) } ->>>>>>> .merge-right.r30358 GHOST_TSuccess GHOST_WindowCocoa::setWindowCursorGrab(GHOST_TGrabCursorMode mode) -{ +{ GHOST_TSuccess err = GHOST_kSuccess; - + if (mode != GHOST_kGrabDisable) - { - //No need to perform grab without warp as it is always on in OS X + { + //No need to perform grab without warp as it is always on in OS X if(mode != GHOST_kGrabNormal) { - GHOST_TInt32 x_old,y_old; + GHOST_TInt32 x_old,y_old; NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - m_systemCocoa->getCursorPosition(x_old,y_old); + + m_systemCocoa->getCursorPosition(x_old,y_old); screenToClient(x_old, y_old, m_cursorGrabInitPos[0], m_cursorGrabInitPos[1]); - //Warp position is stored in client (window base) coordinates + //Warp position is stored in client (window base) coordinates setCursorGrabAccum(0, 0); if(mode == GHOST_kGrabHide) { @@ -1648,86 +1194,21 @@ GHOST_TSuccess GHOST_WindowCocoa::setWindowCursorGrab(GHOST_TGrabCursorMode mode err = CGAssociateMouseAndMouseCursorPosition(false) == kCGErrorSuccess ? GHOST_kSuccess : GHOST_kFailure; [pool drain]; - } - } - else { + } + } + else { if(m_cursorGrab==GHOST_kGrabHide) { //No need to set again cursor position, as it has not changed for Cocoa - setWindowCursorVisibility(true); - } + setWindowCursorVisibility(true); + } err = CGAssociateMouseAndMouseCursorPosition(true) == kCGErrorSuccess ? GHOST_kSuccess : GHOST_kFailure; /* Almost works without but important otherwise the mouse GHOST location can be incorrect on exit */ setCursorGrabAccum(0, 0); m_cursorGrabBounds.m_l= m_cursorGrabBounds.m_r= -1; /* disable */ - } + } return err; -<<<<<<< .working -} - -GHOST_TSuccess GHOST_WindowCocoa::setWindowCursorShape(GHOST_TStandardCursor shape) -{ - if (m_customCursor) { - [m_customCursor release]; - m_customCursor = nil; - } - - if ([m_window isVisible]) { - loadCursor(getCursorVisibility(), shape); - } - - return GHOST_kSuccess; -} - -/** Reverse the bits in a GHOST_TUns8 -static GHOST_TUns8 uns8ReverseBits(GHOST_TUns8 ch) -{ - ch= ((ch>>1)&0x55) | ((ch<<1)&0xAA); - ch= ((ch>>2)&0x33) | ((ch<<2)&0xCC); - ch= ((ch>>4)&0x0F) | ((ch<<4)&0xF0); - return ch; -} -*/ - - -/** Reverse the bits in a GHOST_TUns16 */ -static GHOST_TUns16 uns16ReverseBits(GHOST_TUns16 shrt) -{ - shrt= ((shrt>>1)&0x5555) | ((shrt<<1)&0xAAAA); - shrt= ((shrt>>2)&0x3333) | ((shrt<<2)&0xCCCC); - shrt= ((shrt>>4)&0x0F0F) | ((shrt<<4)&0xF0F0); - shrt= ((shrt>>8)&0x00FF) | ((shrt<<8)&0xFF00); - return shrt; -} - -GHOST_TSuccess GHOST_WindowCocoa::setWindowCustomCursorShape(GHOST_TUns8 *bitmap, GHOST_TUns8 *mask, - int sizex, int sizey, int hotX, int hotY, int fg_color, int bg_color) -{ - int y,nbUns16; - NSPoint hotSpotPoint; - NSBitmapImageRep *cursorImageRep; - NSImage *cursorImage; - NSSize imSize; - GHOST_TUns16 *cursorBitmap; - - - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - if (m_customCursor) { - [m_customCursor release]; - m_customCursor = nil; - } - - - cursorImageRep = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:nil - pixelsWide:sizex - pixelsHigh:sizey - bitsPerSample:1 - samplesPerPixel:2 - hasAlpha:YES - isPlanar:YES -======= } GHOST_TSuccess GHOST_WindowCocoa::setWindowCursorShape(GHOST_TStandardCursor shape) @@ -1794,51 +1275,50 @@ GHOST_TSuccess GHOST_WindowCocoa::setWindowCustomCursorShape(GHOST_TUns8 *bitmap samplesPerPixel:2 hasAlpha:YES isPlanar:YES ->>>>>>> .merge-right.r30358 colorSpaceName:NSDeviceWhiteColorSpace - bytesPerRow:(sizex/8 + (sizex%8 >0 ?1:0)) - bitsPerPixel:1]; - - - cursorBitmap = (GHOST_TUns16*)[cursorImageRep bitmapData]; - nbUns16 = [cursorImageRep bytesPerPlane]/2; - - for (y=0; y0 ?1:0)) + bitsPerPixel:1]; + + + cursorBitmap = (GHOST_TUns16*)[cursorImageRep bitmapData]; + nbUns16 = [cursorImageRep bytesPerPlane]/2; + + for (y=0; y