X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3ccc5735bfb404f46639d417c613ff77f413c612..7c60222510bc5e197b12f153c4bf05db66cb0f4a:/src/osx/utils_osx.cpp diff --git a/src/osx/utils_osx.cpp b/src/osx/utils_osx.cpp index 963451ea4a..438f7ddbf0 100644 --- a/src/osx/utils_osx.cpp +++ b/src/osx/utils_osx.cpp @@ -4,7 +4,7 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: utils.cpp 54886 2008-07-31 13:02:53Z SC $ +// RCS-ID: $Id$ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -17,6 +17,7 @@ #ifndef WX_PRECOMP #include "wx/intl.h" #include "wx/app.h" + #include "wx/log.h" #if wxUSE_GUI #include "wx/toplevel.h" #include "wx/font.h" @@ -34,109 +35,13 @@ // #include "MoreFilesX.h" -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 - #include -#endif +#include #include "wx/osx/private.h" - -#ifdef wxOSX_USE_COCOA -// to get the themeing APIs -#include -#endif - -#if wxUSE_GUI - #include "wx/osx/private/timer.h" -#endif // wxUSE_GUI +#include "wx/osx/private/timer.h" #include "wx/evtloop.h" -#if defined(__MWERKS__) && wxUSE_UNICODE -#if __MWERKS__ < 0x4100 - #include -#endif -#endif - -// -// TODO BEGIN move to utils_osx.cpp -// - -#if wxUSE_BASE - -extern bool WXDLLEXPORT wxIsDebuggerRunning() -{ - // TODO : try to find out ... - return false; -} - -#if wxOSX_USE_COCOA_OR_CARBON - -// have a fast version for mac code that returns the version as a return value - -long UMAGetSystemVersion() -{ - static SInt32 sUMASystemVersion = 0 ; - if ( sUMASystemVersion == 0 ) - { - verify_noerr(Gestalt(gestaltSystemVersion, &sUMASystemVersion)); - } - return sUMASystemVersion ; -} - -// our OS version is the same in non GUI and GUI cases -wxOperatingSystemId wxGetOsVersion(int *majorVsn, int *minorVsn) -{ - SInt32 theSystem; - Gestalt(gestaltSystemVersion, &theSystem); - - if ( majorVsn != NULL ) - *majorVsn = (theSystem >> 8); - - if ( minorVsn != NULL ) - *minorVsn = (theSystem & 0xFF); - - return wxOS_MAC_OSX_DARWIN; -} - -#include - -wxString wxGetOsDescription() -{ - struct utsname name; - uname(&name); - return wxString::Format(_T("Mac OS X (%s %s %s)"), - wxString::FromAscii(name.sysname).c_str(), - wxString::FromAscii(name.release).c_str(), - wxString::FromAscii(name.machine).c_str()); -} - -#endif // wxOSX_USE_COCOA_OR_CARBON - - -//--------------------------------------------------------------------------- -// wxMac Specific utility functions -//--------------------------------------------------------------------------- - -void wxMacStringToPascal( const wxString&from , StringPtr to ) -{ - wxCharBuffer buf = from.mb_str( wxConvLocal ); - int len = strlen(buf); - - if ( len > 255 ) - len = 255; - to[0] = len; - memcpy( (char*) &to[1] , buf , len ); -} - -wxString wxMacMakeStringFromPascal( ConstStringPtr from ) -{ - return wxString( (char*) &from[1] , wxConvLocal , from[0] ); -} - -#endif // wxUSE_BASE - -#if wxUSE_GUI - // Check whether this window wants to process messages, e.g. Stop button // in long calculations. bool wxCheckForInterrupt(wxWindow *WXUNUSED(wnd)) @@ -148,14 +53,50 @@ bool wxCheckForInterrupt(wxWindow *WXUNUSED(wnd)) // Return true if we have a colour display bool wxColourDisplay() { + // always the case on OS X return true; } + #if wxOSX_USE_COCOA_OR_CARBON + +#if (MAC_OS_X_VERSION_MAX_ALLOWED >= 1070) && (MAC_OS_X_VERSION_MIN_REQUIRED < 1060) +// bring back declaration so that we can support deployment targets < 10_6 +CG_EXTERN size_t CGDisplayBitsPerPixel(CGDirectDisplayID display) +CG_AVAILABLE_BUT_DEPRECATED(__MAC_10_0, __MAC_10_6, + __IPHONE_NA, __IPHONE_NA); +#endif + // Returns depth of screen int wxDisplayDepth() { - int theDepth = (int) CGDisplayBitsPerPixel(CGMainDisplayID()); + int theDepth = 0; + +#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1060 + if ( UMAGetSystemVersion() >= 0x1060 ) + { + CGDisplayModeRef currentMode = CGDisplayCopyDisplayMode(kCGDirectMainDisplay); + CFStringRef encoding = CGDisplayModeCopyPixelEncoding(currentMode); + + if(CFStringCompare(encoding, CFSTR(IO32BitDirectPixels), kCFCompareCaseInsensitive) == kCFCompareEqualTo) + theDepth = 32; + else if(CFStringCompare(encoding, CFSTR(IO16BitDirectPixels), kCFCompareCaseInsensitive) == kCFCompareEqualTo) + theDepth = 16; + else if(CFStringCompare(encoding, CFSTR(IO8BitIndexedPixels), kCFCompareCaseInsensitive) == kCFCompareEqualTo) + theDepth = 8; + else + theDepth = 32; // some reasonable default + + CFRelease(encoding); + CGDisplayModeRelease(currentMode); + } + else +#endif + { +#if MAC_OS_X_VERSION_MIN_REQUIRED < 1060 + theDepth = (int) CGDisplayBitsPerPixel(CGMainDisplayID()); +#endif + } return theDepth; } @@ -169,6 +110,57 @@ void wxDisplaySize(int *width, int *height) if ( height ) *height = (int)bounds.size.height; } + +#if wxUSE_GUI + +// ---------------------------------------------------------------------------- +// Launch document with default app +// ---------------------------------------------------------------------------- + +bool wxLaunchDefaultApplication(const wxString& document, int flags) +{ + wxUnusedVar(flags); + + wxCFRef cfMutableString(CFStringCreateMutableCopy(NULL, 0, wxCFStringRef(document))); + CFStringNormalize(cfMutableString,kCFStringNormalizationFormD); + wxCFRef curl(CFURLCreateWithFileSystemPath(kCFAllocatorDefault, cfMutableString , kCFURLPOSIXPathStyle, false)); + OSStatus err = LSOpenCFURLRef( curl , NULL ); + + if (err == noErr) + { + return true; + } + else + { + wxLogDebug(wxT("Default Application Launch error %d"), (int) err); + return false; + } +} + +// ---------------------------------------------------------------------------- +// Launch default browser +// ---------------------------------------------------------------------------- + +bool wxDoLaunchDefaultBrowser(const wxString& url, int flags) +{ + wxUnusedVar(flags); + wxCFRef< CFURLRef > curl( CFURLCreateWithString( kCFAllocatorDefault, + wxCFStringRef( url ), NULL ) ); + OSStatus err = LSOpenCFURLRef( curl , NULL ); + + if (err == noErr) + { + return true; + } + else + { + wxLogDebug(wxT("Browser Launch error %d"), (int) err); + return false; + } +} + +#endif // wxUSE_GUI + #endif void wxDisplaySizeMM(int *width, int *height) @@ -198,9 +190,30 @@ wxEventLoopBase* wxGUIAppTraits::CreateEventLoop() return new wxEventLoop; } +wxWindow* wxFindWindowAtPoint(wxWindow* win, const wxPoint& pt); + wxWindow* wxFindWindowAtPoint(const wxPoint& pt) { - return wxGenericFindWindowAtPoint(pt); +#if wxOSX_USE_CARBON + + Point screenPoint = { pt.y , pt.x }; + WindowRef windowRef; + + if ( FindWindow( screenPoint , &windowRef ) ) + { + wxNonOwnedWindow *nonOwned = wxNonOwnedWindow::GetFromWXWindow( windowRef ); + + if ( nonOwned ) + return wxFindWindowAtPoint( nonOwned , pt ); + } + + return NULL; + +#else + + return wxGenericFindWindowAtPoint( pt ); + +#endif } /* @@ -233,50 +246,46 @@ CGColorSpaceRef wxMacGetGenericRGBColorSpace() CGColorRef wxMacCreateCGColorFromHITheme( ThemeBrush brush ) { - CGColorRef color ; - HIThemeBrushCreateCGColor( brush, &color ); - return color; -} - -#endif // wxOSX_USE_COCOA_OR_CARBON - -IMPLEMENT_ABSTRACT_CLASS( wxWidgetImpl , wxObject ) - -wxWidgetImpl::wxWidgetImpl( wxWindowMac* peer , bool isRootControl ) -{ - Init(); - m_isRootControl = isRootControl; - m_wxPeer = peer; -} - -wxWidgetImpl::wxWidgetImpl() -{ - Init(); -} - -wxWidgetImpl::~wxWidgetImpl() -{ + const int maxcachedbrush = 58+5; // negative indices are for metabrushes, cache down to -5) + int brushindex = brush+5; + if ( brushindex < 0 || brushindex > maxcachedbrush ) + { + CGColorRef color ; + HIThemeBrushCreateCGColor( brush, &color ); + return color; + } + else + { + static bool inited = false; + static CGColorRef themecolors[maxcachedbrush+1]; + if ( !inited ) + { + for ( int i = 0 ; i <= maxcachedbrush ; ++i ) + HIThemeBrushCreateCGColor( i-5, &themecolors[i] ); + inited = true; + } + return CGColorRetain(themecolors[brushindex ]); + } } -void wxWidgetImpl::Init() -{ - m_isRootControl = false; - m_wxPeer = NULL; - m_needsFocusRect = false; -} +//--------------------------------------------------------------------------- +// Mac Specific string utility functions +//--------------------------------------------------------------------------- -void wxWidgetImpl::Destroy() +void wxMacStringToPascal( const wxString&from , unsigned char * to ) { -} + wxCharBuffer buf = from.mb_str( wxConvLocal ); + int len = strlen(buf); -void wxWidgetImpl::SetNeedsFocusRect( bool needs ) -{ - m_needsFocusRect = needs; + if ( len > 255 ) + len = 255; + to[0] = len; + memcpy( (char*) &to[1] , buf , len ); } -bool wxWidgetImpl::NeedsFocusRect() const +wxString wxMacMakeStringFromPascal( const unsigned char * from ) { - return m_needsFocusRect; + return wxString( (char*) &from[1] , wxConvLocal , from[0] ); } -#endif // wxUSE_GUI +#endif // wxOSX_USE_COCOA_OR_CARBON