// 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
/////////////////////////////////////////////////////////////////////////////
#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"
// #include "MoreFilesX.h"
-#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
- #include <AudioToolbox/AudioServices.h>
-#endif
+#include <AudioToolbox/AudioServices.h>
#include "wx/osx/private.h"
-
-#ifdef wxOSX_USE_COCOA
-// to get the themeing APIs
-#include <Carbon/Carbon.h>
-#endif
-
#include "wx/osx/private/timer.h"
#include "wx/evtloop.h"
-#if defined(__MWERKS__) && wxUSE_UNICODE
-#if __MWERKS__ < 0x4100
- #include <wtime.h>
-#endif
-#endif
-
// Check whether this window wants to process messages, e.g. Stop button
// in long calculations.
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;
}
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<CFMutableStringRef> cfMutableString(CFStringCreateMutableCopy(NULL, 0, wxCFStringRef(document)));
+ CFStringNormalize(cfMutableString,kCFStringNormalizationFormD);
+ wxCFRef<CFURLRef> 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)
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
}
/*
CGColorRef wxMacCreateCGColorFromHITheme( ThemeBrush brush )
{
- CGColorRef color ;
- HIThemeBrushCreateCGColor( brush, &color );
- return color;
+ 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 ]);
+ }
}
//---------------------------------------------------------------------------