///////////////////////////////////////////////////////////////////////////// // Name: src/osx/utils_osx.cpp // Purpose: Various utilities // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// #include "wx/wxprec.h" #include "wx/utils.h" #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" #endif #endif #include "wx/apptrait.h" #include #include #include #include #include // #include "MoreFilesX.h" #include #include "wx/osx/private.h" #include "wx/osx/private/timer.h" #include "wx/evtloop.h" // Check whether this window wants to process messages, e.g. Stop button // in long calculations. bool wxCheckForInterrupt(wxWindow *WXUNUSED(wnd)) { // TODO return false; } // 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 = 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; } // Get size of display void wxDisplaySize(int *width, int *height) { // TODO adapt for multi-displays CGRect bounds = CGDisplayBounds(CGMainDisplayID()); if ( width ) *width = (int)bounds.size.width ; 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) { wxDisplaySize(width, height); // on mac 72 is fixed (at least now;-) double cvPt2Mm = 25.4 / 72; if (width != NULL) *width = int( *width * cvPt2Mm ); if (height != NULL) *height = int( *height * cvPt2Mm ); } wxPortId wxGUIAppTraits::GetToolkitVersion(int *verMaj, int *verMin) const { // We suppose that toolkit version is the same as OS version under Mac wxGetOsVersion(verMaj, verMin); return wxPORT_OSX; } wxEventLoopBase* wxGUIAppTraits::CreateEventLoop() { return new wxEventLoop; } wxWindow* wxFindWindowAtPoint(wxWindow* win, const wxPoint& pt); wxWindow* wxFindWindowAtPoint(const wxPoint& 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 } /* Return the generic RGB color space. This is a 'get' function and the caller should not release the returned value unless the caller retains it first. Usually callers of this routine will immediately use the returned colorspace with CoreGraphics so they typically do not need to retain it themselves. This function creates the generic RGB color space once and hangs onto it so it can return it whenever this function is called. */ CGColorSpaceRef wxMacGetGenericRGBColorSpace() { static wxCFRef genericRGBColorSpace; if (genericRGBColorSpace == NULL) { #if wxOSX_USE_IPHONE genericRGBColorSpace.reset( CGColorSpaceCreateDeviceRGB() ); #else genericRGBColorSpace.reset( CGColorSpaceCreateWithName( kCGColorSpaceGenericRGB ) ); #endif } return genericRGBColorSpace; } #if wxOSX_USE_COCOA_OR_CARBON CGColorRef wxMacCreateCGColorFromHITheme( ThemeBrush brush ) { 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 ]); } } //--------------------------------------------------------------------------- // Mac Specific string utility functions //--------------------------------------------------------------------------- void wxMacStringToPascal( const wxString&from , unsigned char * 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( const unsigned char * from ) { return wxString( (char*) &from[1] , wxConvLocal , from[0] ); } #endif // wxOSX_USE_COCOA_OR_CARBON