X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/489468feaa08b8f504735eecca522fb8d0f825d2..76de2296f11750653010fe537a6e6046551cc647:/src/osx/carbon/utils.cpp diff --git a/src/osx/carbon/utils.cpp b/src/osx/carbon/utils.cpp index b690bac889..bf61f5b116 100644 --- a/src/osx/carbon/utils.cpp +++ b/src/osx/carbon/utils.cpp @@ -9,6 +9,7 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// + #include "wx/wxprec.h" #include "wx/utils.h" @@ -24,10 +25,6 @@ #include "wx/apptrait.h" -#if wxUSE_GUI - #include "wx/mac/uma.h" -#endif - #include #include @@ -41,14 +38,12 @@ #include #endif +#include "wx/osx/private.h" #if wxUSE_GUI - #include - #include - #include "wx/mac/private/timer.h" + #include "wx/osx/private/timer.h" #endif // wxUSE_GUI #include "wx/evtloop.h" -#include "wx/mac/private.h" #if defined(__MWERKS__) && wxUSE_UNICODE #if __MWERKS__ < 0x4100 @@ -56,8 +51,20 @@ #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 + // our OS version is the same in non GUI and GUI cases wxOperatingSystemId wxGetOsVersion(int *majorVsn, int *minorVsn) { @@ -70,120 +77,42 @@ wxOperatingSystemId wxGetOsVersion(int *majorVsn, int *minorVsn) if ( minorVsn != NULL ) *minorVsn = (theSystem & 0xFF); -#if defined( __DARWIN__ ) return wxOS_MAC_OSX_DARWIN; -#else - return wxOS_MAC_OS; -#endif -} - -extern bool WXDLLEXPORT wxIsDebuggerRunning() -{ - // TODO : try to find out ... - return false; -} - -// Emit a beeeeeep -void wxBell() -{ -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 - if ( AudioServicesPlayAlertSound ) - AudioServicesPlayAlertSound(kUserPreferredAlert); - else -#endif -#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 - SysBeep(30); -#else - { - } -#endif -} - - -#endif // wxUSE_BASE - -#if wxUSE_GUI - -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_MAC; -} - -wxEventLoopBase* wxGUIAppTraits::CreateEventLoop() -{ - return new wxEventLoop; -} - -wxTimerImpl* wxGUIAppTraits::CreateTimerImpl(wxTimer *timer) -{ - return new wxCarbonTimerImpl(timer); } -int gs_wxBusyCursorCount = 0; -extern wxCursor gMacCurrentCursor; -wxCursor gMacStoredActiveCursor; - -// Set the cursor to the busy cursor for all windows -void wxBeginBusyCursor(const wxCursor *cursor) -{ - if (gs_wxBusyCursorCount++ == 0) - { - gMacStoredActiveCursor = gMacCurrentCursor; - cursor->MacInstall(); - - wxSetCursor(*cursor); - } - //else: nothing to do, already set -} +#include -// Restore cursor to normal -void wxEndBusyCursor() +wxString wxGetOsDescription() { - wxCHECK_RET( gs_wxBusyCursorCount > 0, - wxT("no matching wxBeginBusyCursor() for wxEndBusyCursor()") ); - - if (--gs_wxBusyCursorCount == 0) - { - gMacStoredActiveCursor.MacInstall(); - gMacStoredActiveCursor = wxNullCursor; - - wxSetCursor(wxNullCursor); - } + 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()); } -// true if we're between the above two calls -bool wxIsBusy() -{ - return (gs_wxBusyCursorCount > 0); -} +#endif // wxOSX_USE_COCOA_OR_CARBON -#endif // wxUSE_GUI -#if wxUSE_BASE +//--------------------------------------------------------------------------- +// wxMac Specific utility functions +//--------------------------------------------------------------------------- -wxString wxMacFindFolderNoSeparator( short vol, - OSType folderType, - Boolean createFolder) +void wxMacStringToPascal( const wxString&from , StringPtr to ) { - FSRef fsRef; - wxString strDir; - - if ( FSFindFolder( vol, folderType, createFolder, &fsRef) == noErr) - { - strDir = wxMacFSRefToPath( &fsRef ); - } + wxCharBuffer buf = from.mb_str( wxConvLocal ); + int len = strlen(buf); - return strDir; + if ( len > 255 ) + len = 255; + to[0] = len; + memcpy( (char*) &to[1] , buf , len ); } -wxString wxMacFindFolder( short vol, - OSType folderType, - Boolean createFolder) +wxString wxMacMakeStringFromPascal( ConstStringPtr from ) { - return wxMacFindFolderNoSeparator(vol, folderType, createFolder) + wxFILE_SEP_PATH; + return wxString( (char*) &from[1] , wxConvLocal , from[0] ); } #endif // wxUSE_BASE @@ -198,41 +127,18 @@ bool wxCheckForInterrupt(wxWindow *WXUNUSED(wnd)) return false; } -void wxGetMousePosition( int* x, int* y ) -{ -#if wxMAC_USE_QUICKDRAW - Point pt; - GetGlobalMouse(&pt); - *x = pt.h; - *y = pt.v; -#else - // TODO -#endif -}; - // Return true if we have a colour display bool wxColourDisplay() { return true; } +#if wxOSX_USE_COCOA_OR_CARBON // Returns depth of screen int wxDisplayDepth() { -#if wxMAC_USE_QUICKDRAW int theDepth = (int) CGDisplayBitsPerPixel(CGMainDisplayID()); - Rect globRect; - SetRect(&globRect, -32760, -32760, 32760, 32760); - GDHandle theMaxDevice; - - theMaxDevice = GetMaxDevice(&globRect); - if (theMaxDevice != NULL) - theDepth = (**(**theMaxDevice).gdPMap).pixelSize; - return theDepth; -#else - return 32; // TODO -#endif } // Get size of display @@ -245,12 +151,13 @@ void wxDisplaySize(int *width, int *height) if ( height ) *height = (int)bounds.size.height; } +#endif void wxDisplaySizeMM(int *width, int *height) { wxDisplaySize(width, height); // on mac 72 is fixed (at least now;-) - float cvPt2Mm = 25.4 / 72; + double cvPt2Mm = 25.4 / 72; if (width != NULL) *width = int( *width * cvPt2Mm ); @@ -259,712 +166,340 @@ void wxDisplaySizeMM(int *width, int *height) *height = int( *height * cvPt2Mm ); } -void wxClientDisplayRect(int *x, int *y, int *width, int *height) -{ -#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 -#if wxMAC_USE_QUICKDRAW - - HIRect bounds ; - HIWindowGetAvailablePositioningBounds(kCGNullDirectDisplay,kHICoordSpace72DPIGlobal, - &bounds); - if ( x ) - *x = bounds.origin.x; - if ( y ) - *y = bounds.origin.y; - if ( width ) - *width = bounds.size.width; - if ( height ) - *height = bounds.size.height; -#else - int w, h; - wxDisplaySize(&w,&h); - if ( x ) - *x = 0; - if ( y ) - *y = 24; - if ( width ) - *width = w; - if ( height ) - *height = h-24; -#endif -#else - Rect r; - GetAvailableWindowPositioningBounds( GetMainDevice() , &r ); - if ( x ) - *x = r.left; - if ( y ) - *y = r.top; - if ( width ) - *width = r.right - r.left; - if ( height ) - *height = r.bottom - r.top; -#endif -} - -wxWindow* wxFindWindowAtPoint(const wxPoint& pt) -{ - return wxGenericFindWindowAtPoint(pt); -} - -#endif // wxUSE_GUI -#if wxUSE_BASE - -#include - -wxString wxGetOsDescription() +wxPortId wxGUIAppTraits::GetToolkitVersion(int *verMaj, int *verMin) const { - 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()); -} + // We suppose that toolkit version is the same as OS version under Mac + wxGetOsVersion(verMaj, verMin); -#ifndef __DARWIN__ -wxString wxGetUserHome (const wxString& user) -{ - // TODO - return wxString(); + return wxPORT_OSX; } -bool wxGetDiskSpace(const wxString& path, wxDiskspaceSize_t *pTotal, wxDiskspaceSize_t *pFree) +wxEventLoopBase* wxGUIAppTraits::CreateEventLoop() { - if ( path.empty() ) - return false; - - wxString p = path; - if (p[0u] == ':' ) - p = wxGetCwd() + p; - - int pos = p.Find(':'); - if ( pos != wxNOT_FOUND ) - p = p.Mid(1,pos); - - p = p + wxT(":"); - - OSErr err = noErr; - - FSRef fsRef; - err = wxMacPathToFSRef( p , &fsRef ); - if ( noErr == err ) - { - FSVolumeRefNum vRefNum; - err = FSGetVRefNum( &fsRef , &vRefNum ); - if ( noErr == err ) - { - UInt64 freeBytes , totalBytes; - err = FSGetVInfo( vRefNum , NULL , &freeBytes , &totalBytes ); - if ( noErr == err ) - { - if ( pTotal ) - *pTotal = wxDiskspaceSize_t( totalBytes ); - if ( pFree ) - *pFree = wxDiskspaceSize_t( freeBytes ); - } - } - } - - return err == noErr; + return new wxEventLoop; } -#endif // !__DARWIN__ -//--------------------------------------------------------------------------- -// wxMac Specific utility functions -//--------------------------------------------------------------------------- - -void wxMacStringToPascal( const wxString&from , StringPtr to ) +wxWindow* wxFindWindowAtPoint(const wxPoint& pt) { - wxCharBuffer buf = from.mb_str( wxConvLocal ); - int len = strlen(buf); - - if ( len > 255 ) - len = 255; - to[0] = len; - memcpy( (char*) &to[1] , buf , len ); + return wxGenericFindWindowAtPoint(pt); } -wxString wxMacMakeStringFromPascal( ConstStringPtr from ) -{ - return wxString( (char*) &from[1] , wxConvLocal , from[0] ); -} +/* + 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. -// ---------------------------------------------------------------------------- -// Common Event Support -// ---------------------------------------------------------------------------- + This function creates the generic RGB color space once and hangs onto it so it can + return it whenever this function is called. +*/ -void wxMacWakeUp() +CGColorSpaceRef wxMacGetGenericRGBColorSpace() { - OSStatus err = noErr; + static wxCFRef genericRGBColorSpace; -#if 0 - // lead sometimes to race conditions, although all calls used should be thread safe ... - static wxMacCarbonEvent s_wakeupEvent; - if ( !s_wakeupEvent.IsValid() ) - { - err = s_wakeupEvent.Create( 'WXMC', 'WXMC', GetCurrentEventTime(), - kEventAttributeNone ); - } - if ( err == noErr ) + if (genericRGBColorSpace == NULL) { - - if ( IsEventInQueue( GetMainEventQueue() , s_wakeupEvent ) ) - return; - s_wakeupEvent.SetCurrentTime(); - err = PostEventToQueue(GetMainEventQueue(), s_wakeupEvent, - kEventPriorityHigh ); - } +#if wxOSX_USE_IPHONE + genericRGBColorSpace.reset( CGColorSpaceCreateDeviceRGB() ); #else - wxMacCarbonEvent wakeupEvent; - wakeupEvent.Create( 'WXMC', 'WXMC', GetCurrentEventTime(), - kEventAttributeNone ); - err = PostEventToQueue(GetMainEventQueue(), wakeupEvent, - kEventPriorityHigh ); -#endif -} - -#endif // wxUSE_BASE - -#if wxUSE_GUI - -// ---------------------------------------------------------------------------- -// Native Struct Conversions -// ---------------------------------------------------------------------------- - -void wxMacRectToNative( const wxRect *wx , Rect *n ) -{ - n->left = wx->x; - n->top = wx->y; - n->right = wx->x + wx->width; - n->bottom = wx->y + wx->height; -} - -void wxMacNativeToRect( const Rect *n , wxRect* wx ) -{ - wx->x = n->left; - wx->y = n->top; - wx->width = n->right - n->left; - wx->height = n->bottom - n->top; -} - -void wxMacPointToNative( const wxPoint* wx , Point *n ) -{ - n->h = wx->x; - n->v = wx->y; -} - -void wxMacNativeToPoint( const Point *n , wxPoint* wx ) -{ - wx->x = n->h; - wx->y = n->v; -} - -// ---------------------------------------------------------------------------- -// Carbon Event Support -// ---------------------------------------------------------------------------- - -OSStatus wxMacCarbonEvent::GetParameter(EventParamName inName, EventParamType inDesiredType, UInt32 inBufferSize, void * outData) -{ - return ::GetEventParameter( m_eventRef , inName , inDesiredType , NULL , inBufferSize , NULL , outData ); -} - -OSStatus wxMacCarbonEvent::SetParameter(EventParamName inName, EventParamType inType, UInt32 inBufferSize, const void * inData) -{ - return ::SetEventParameter( m_eventRef , inName , inType , inBufferSize , inData ); -} - -// ---------------------------------------------------------------------------- -// Control Access Support -// ---------------------------------------------------------------------------- - -#if wxMAC_USE_QUICKDRAW - -IMPLEMENT_DYNAMIC_CLASS( wxMacControl , wxObject ) - -wxMacControl::wxMacControl() -{ - Init(); -} - -wxMacControl::wxMacControl(wxWindow* peer , bool isRootControl ) -{ - Init(); - m_peer = peer; - m_isRootControl = isRootControl; -} - -wxMacControl::wxMacControl( wxWindow* peer , ControlRef control ) -{ - Init(); - m_peer = peer; - m_controlRef = control; -} - -wxMacControl::wxMacControl( wxWindow* peer , WXWidget control ) -{ - Init(); - m_peer = peer; - m_controlRef = (ControlRef) control; -} - -wxMacControl::~wxMacControl() -{ -} - -void wxMacControl::Init() -{ - m_peer = NULL; - m_controlRef = NULL; - m_needsFocusRect = false; - m_isRootControl = false; -} - -void wxMacControl::Dispose() -{ - wxASSERT_MSG( m_controlRef != NULL , wxT("Control Handle already NULL, Dispose called twice ?") ); - wxASSERT_MSG( IsValidControlHandle(m_controlRef) , wxT("Invalid Control Handle (maybe already released) in Dispose") ); - - // we cannot check the ref count here anymore, as autorelease objects might delete their refs later - // we can have situations when being embedded, where the control gets deleted behind our back, so only - // CFRelease if we are safe - if ( IsValidControlHandle(m_controlRef) ) - CFRelease(m_controlRef); - m_controlRef = NULL; -} - -void wxMacControl::SetReference( URefCon data ) -{ - SetControlReference( m_controlRef , data ); -} - -OSStatus wxMacControl::GetData(ControlPartCode inPartCode , ResType inTag , Size inBufferSize , void * inOutBuffer , Size * outActualSize ) const -{ - return ::GetControlData( m_controlRef , inPartCode , inTag , inBufferSize , inOutBuffer , outActualSize ); -} - -OSStatus wxMacControl::GetDataSize(ControlPartCode inPartCode , ResType inTag , Size * outActualSize ) const -{ - return ::GetControlDataSize( m_controlRef , inPartCode , inTag , outActualSize ); -} - -OSStatus wxMacControl::SetData(ControlPartCode inPartCode , ResType inTag , Size inSize , const void * inData) -{ - return ::SetControlData( m_controlRef , inPartCode , inTag , inSize , inData ); -} - -OSStatus wxMacControl::SendEvent( EventRef event , OptionBits inOptions ) -{ - return SendEventToEventTargetWithOptions( event, - HIObjectGetEventTarget( (HIObjectRef) m_controlRef ), inOptions ); -} - -OSStatus wxMacControl::SendHICommand( HICommand &command , OptionBits inOptions ) -{ - wxMacCarbonEvent event( kEventClassCommand , kEventCommandProcess ); - - event.SetParameter(kEventParamDirectObject,command); - - return SendEvent( event , inOptions ); -} - -OSStatus wxMacControl::SendHICommand( UInt32 commandID , OptionBits inOptions ) -{ - HICommand command; - - memset( &command, 0 , sizeof(command) ); - command.commandID = commandID; - return SendHICommand( command , inOptions ); -} - -void wxMacControl::Flash( ControlPartCode part , UInt32 ticks ) -{ - unsigned long finalTicks; - - HiliteControl( m_controlRef , part ); - Delay( ticks , &finalTicks ); - HiliteControl( m_controlRef , kControlNoPart ); -} - -SInt32 wxMacControl::GetValue() const -{ - return ::GetControl32BitValue( m_controlRef ); -} - -SInt32 wxMacControl::GetMaximum() const -{ - return ::GetControl32BitMaximum( m_controlRef ); -} - -SInt32 wxMacControl::GetMinimum() const -{ - return ::GetControl32BitMinimum( m_controlRef ); -} - -void wxMacControl::SetValue( SInt32 v ) -{ - ::SetControl32BitValue( m_controlRef , v ); -} - -void wxMacControl::SetMinimum( SInt32 v ) -{ - ::SetControl32BitMinimum( m_controlRef , v ); -} - -void wxMacControl::SetMaximum( SInt32 v ) -{ - ::SetControl32BitMaximum( m_controlRef , v ); -} - -void wxMacControl::SetValueAndRange( SInt32 value , SInt32 minimum , SInt32 maximum ) -{ - ::SetControl32BitMinimum( m_controlRef , minimum ); - ::SetControl32BitMaximum( m_controlRef , maximum ); - ::SetControl32BitValue( m_controlRef , value ); -} - -OSStatus wxMacControl::SetFocus( ControlFocusPart focusPart ) -{ - return SetKeyboardFocus( GetControlOwner( m_controlRef ), m_controlRef, focusPart ); -} - -bool wxMacControl::HasFocus() const -{ - ControlRef control; - GetKeyboardFocus( GetUserFocusWindow() , &control ); - return control == m_controlRef; -} - -void wxMacControl::SetNeedsFocusRect( bool needs ) -{ - m_needsFocusRect = needs; -} - -bool wxMacControl::NeedsFocusRect() const -{ - return m_needsFocusRect; -} - -void wxMacControl::VisibilityChanged(bool WXUNUSED(shown)) -{ -} - -void wxMacControl::SuperChangedPosition() -{ -} - -void wxMacControl::SetFont( const wxFont & font , const wxColour& foreground , long windowStyle ) -{ - m_font = font; -#if wxMAC_USE_CORE_TEXT - if ( UMAGetSystemVersion() >= 0x1050 ) - { - HIViewPartCode part = 0; - HIThemeTextHorizontalFlush flush = kHIThemeTextHorizontalFlushDefault; - if ( ( windowStyle & wxALIGN_MASK ) & wxALIGN_CENTER_HORIZONTAL ) - flush = kHIThemeTextHorizontalFlushCenter; - else if ( ( windowStyle & wxALIGN_MASK ) & wxALIGN_RIGHT ) - flush = kHIThemeTextHorizontalFlushRight; - HIViewSetTextFont( m_controlRef , part , (CTFontRef) font.MacGetCTFont() ); - HIViewSetTextHorizontalFlush( m_controlRef, part, flush ); - - if ( foreground != *wxBLACK ) - { - ControlFontStyleRec fontStyle; - foreground.GetRGBColor( &fontStyle.foreColor ); - fontStyle.flags = kControlUseForeColorMask; - ::SetControlFontStyle( m_controlRef , &fontStyle ); - } - - } + genericRGBColorSpace.reset( CGColorSpaceCreateWithName( kCGColorSpaceGenericRGB ) ); #endif -#if wxMAC_USE_ATSU_TEXT - ControlFontStyleRec fontStyle; - if ( font.MacGetThemeFontID() != kThemeCurrentPortFont ) - { - switch ( font.MacGetThemeFontID() ) - { - case kThemeSmallSystemFont : - fontStyle.font = kControlFontSmallSystemFont; - break; - - case 109 : // mini font - fontStyle.font = -5; - break; - - case kThemeSystemFont : - fontStyle.font = kControlFontBigSystemFont; - break; - - default : - fontStyle.font = kControlFontBigSystemFont; - break; - } - - fontStyle.flags = kControlUseFontMask; } - else - { - fontStyle.font = font.MacGetFontNum(); - fontStyle.style = font.MacGetFontStyle(); - fontStyle.size = font.MacGetFontSize(); - fontStyle.flags = kControlUseFontMask | kControlUseFaceMask | kControlUseSizeMask; - } - - fontStyle.just = teJustLeft; - fontStyle.flags |= kControlUseJustMask; - if ( ( windowStyle & wxALIGN_MASK ) & wxALIGN_CENTER_HORIZONTAL ) - fontStyle.just = teJustCenter; - else if ( ( windowStyle & wxALIGN_MASK ) & wxALIGN_RIGHT ) - fontStyle.just = teJustRight; - - // we only should do this in case of a non-standard color, as otherwise 'disabled' controls - // won't get grayed out by the system anymore - - if ( foreground != *wxBLACK ) - { - foreground.GetRGBColor( &fontStyle.foreColor ); - fontStyle.flags |= kControlUseForeColorMask; - } - - ::SetControlFontStyle( m_controlRef , &fontStyle ); -#endif + return genericRGBColorSpace; } -void wxMacControl::SetBackgroundColour( const wxColour &WXUNUSED(col) ) -{ -// HITextViewSetBackgroundColor( m_textView , color ); -} +#if wxOSX_USE_COCOA_OR_CARBON -void wxMacControl::SetRange( SInt32 minimum , SInt32 maximum ) +CGColorRef wxMacCreateCGColorFromHITheme( ThemeBrush brush ) { - ::SetControl32BitMinimum( m_controlRef , minimum ); - ::SetControl32BitMaximum( m_controlRef , maximum ); + CGColorRef color ; + HIThemeBrushCreateCGColor( brush, &color ); + return color; } -short wxMacControl::HandleKey( SInt16 keyCode, SInt16 charCode, EventModifiers modifiers ) -{ -#ifndef __LP64__ - return HandleControlKey( m_controlRef , keyCode , charCode , modifiers ); -#else - return 0; -#endif -} +#endif // wxOSX_USE_COCOA_OR_CARBON + +IMPLEMENT_ABSTRACT_CLASS( wxWidgetImpl , wxObject ) -void wxMacControl::SetActionProc( ControlActionUPP actionProc ) +wxWidgetImpl::wxWidgetImpl( wxWindowMac* peer , bool isRootControl ) { - SetControlAction( m_controlRef , actionProc ); + Init(); + m_isRootControl = isRootControl; + m_wxPeer = peer; } -void wxMacControl::SetViewSize( SInt32 viewSize ) +wxWidgetImpl::wxWidgetImpl() { - SetControlViewSize(m_controlRef , viewSize ); + Init(); } -SInt32 wxMacControl::GetViewSize() const +wxWidgetImpl::~wxWidgetImpl() { - return GetControlViewSize( m_controlRef ); } -bool wxMacControl::IsVisible() const +void wxWidgetImpl::Init() { - return IsControlVisible( m_controlRef ); + m_isRootControl = false; + m_wxPeer = NULL; + m_needsFocusRect = false; } -void wxMacControl::SetVisibility( bool visible , bool redraw ) +void wxWidgetImpl::Destroy() { - SetControlVisibility( m_controlRef , visible , redraw ); } -bool wxMacControl::IsEnabled() const +void wxWidgetImpl::SetNeedsFocusRect( bool needs ) { - return IsControlEnabled( m_controlRef ); + m_needsFocusRect = needs; } -bool wxMacControl::IsActive() const +bool wxWidgetImpl::NeedsFocusRect() const { - return IsControlActive( m_controlRef ); + return m_needsFocusRect; } -void wxMacControl::Enable( bool enable ) -{ - if ( enable ) - EnableControl( m_controlRef ); - else - DisableControl( m_controlRef ); -} +#endif // wxUSE_GUI -void wxMacControl::SetDrawingEnabled( bool enable ) -{ - HIViewSetDrawingEnabled( m_controlRef , enable ); -} +// +// TODO END move to utils_osx.cpp +// -bool wxMacControl::GetNeedsDisplay() const -{ - return HIViewGetNeedsDisplay( m_controlRef ); -} +// +// carbon version +// -void wxMacControl::SetNeedsDisplay( RgnHandle where ) -{ - if ( !IsVisible() ) - return; +#if wxOSX_USE_CARBON - HIViewSetNeedsDisplayInRegion( m_controlRef , where , true ); -} +#if wxUSE_BASE -void wxMacControl::SetNeedsDisplay( Rect* where ) +// Emit a beeeeeep +void wxBell() { - if ( !IsVisible() ) - return; - - if ( where != NULL ) +#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 + if ( AudioServicesPlayAlertSound != NULL ) + AudioServicesPlayAlertSound(kUserPreferredAlert); + else +#endif +#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 + SysBeep(30); +#else { - RgnHandle update = NewRgn(); - RectRgn( update , where ); - HIViewSetNeedsDisplayInRegion( m_controlRef , update , true ); - DisposeRgn( update ); } - else - HIViewSetNeedsDisplay( m_controlRef , true ); +#endif } -void wxMacControl::Convert( wxPoint *pt , wxMacControl *from , wxMacControl *to ) -{ - HIPoint hiPoint; +#endif // wxUSE_BASE - hiPoint.x = pt->x; - hiPoint.y = pt->y; - HIViewConvertPoint( &hiPoint , from->m_controlRef , to->m_controlRef ); - pt->x = (int)hiPoint.x; - pt->y = (int)hiPoint.y; -} +#if wxUSE_GUI -void wxMacControl::SetRect( Rect *r ) +wxTimerImpl* wxGUIAppTraits::CreateTimerImpl(wxTimer *timer) { - //A HIRect is actually a CGRect on OSX - which consists of two structures - - //CGPoint and CGSize, which have two floats each - HIRect hir = { { r->left , r->top }, { r->right - r->left , r->bottom - r->top } }; - HIViewSetFrame ( m_controlRef , &hir ); - // eventuall we might have to do a SetVisibility( false , true ); - // before and a SetVisibility( true , true ); after + return new wxOSXTimerImpl(timer); } -void wxMacControl::GetRect( Rect *r ) +int gs_wxBusyCursorCount = 0; +extern wxCursor gMacCurrentCursor; +wxCursor gMacStoredActiveCursor; + +// Set the cursor to the busy cursor for all windows +void wxBeginBusyCursor(const wxCursor *cursor) { - GetControlBounds( m_controlRef , r ); + if (gs_wxBusyCursorCount++ == 0) + { + gMacStoredActiveCursor = gMacCurrentCursor; + cursor->MacInstall(); + + wxSetCursor(*cursor); + } + //else: nothing to do, already set } -void wxMacControl::GetRectInWindowCoords( Rect *r ) +// Restore cursor to normal +void wxEndBusyCursor() { - GetControlBounds( m_controlRef , r ) ; - - WindowRef tlwref = GetControlOwner( m_controlRef ) ; + wxCHECK_RET( gs_wxBusyCursorCount > 0, + wxT("no matching wxBeginBusyCursor() for wxEndBusyCursor()") ); - wxNonOwnedWindow* tlwwx = wxFindWinFromMacWindow( tlwref ) ; - if ( tlwwx != NULL ) + if (--gs_wxBusyCursorCount == 0) { - ControlRef rootControl = tlwwx->GetPeer()->GetControlRef() ; - HIPoint hiPoint = CGPointMake( 0 , 0 ) ; - HIViewConvertPoint( &hiPoint , HIViewGetSuperview(m_controlRef) , rootControl ) ; - OffsetRect( r , (short) hiPoint.x , (short) hiPoint.y ) ; + gMacStoredActiveCursor.MacInstall(); + gMacStoredActiveCursor = wxNullCursor; + + wxSetCursor(wxNullCursor); } } -void wxMacControl::GetBestRect( Rect *r ) +// true if we're between the above two calls +bool wxIsBusy() { - short baselineoffset; - - GetBestControlRect( m_controlRef , r , &baselineoffset ); + return (gs_wxBusyCursorCount > 0); } -void wxMacControl::SetLabel( const wxString &title ) +#endif // wxUSE_GUI + +#if wxUSE_BASE + +wxString wxMacFindFolderNoSeparator( short vol, + OSType folderType, + Boolean createFolder) { - wxFontEncoding encoding; + FSRef fsRef; + wxString strDir; - if ( m_font.Ok() ) - encoding = m_font.GetEncoding(); - else - encoding = wxFont::GetDefaultEncoding(); + if ( FSFindFolder( vol, folderType, createFolder, &fsRef) == noErr) + { + strDir = wxMacFSRefToPath( &fsRef ); + } - SetControlTitleWithCFString( m_controlRef , wxCFStringRef( title , encoding ) ); + return strDir; } -void wxMacControl::GetFeatures( UInt32 * features ) +wxString wxMacFindFolder( short vol, + OSType folderType, + Boolean createFolder) { - GetControlFeatures( m_controlRef , features ); + return wxMacFindFolderNoSeparator(vol, folderType, createFolder) + wxFILE_SEP_PATH; } -OSStatus wxMacControl::GetRegion( ControlPartCode partCode , RgnHandle region ) +#endif // wxUSE_BASE + +#if wxUSE_GUI + +void wxGetMousePosition( int* x, int* y ) { - OSStatus err = GetControlRegion( m_controlRef , partCode , region ); - return err; -} + Point pt; + GetGlobalMouse(&pt); + if ( x ) + *x = pt.h; + if ( y ) + *y = pt.v; +}; -OSStatus wxMacControl::SetZOrder( bool above , wxMacControl* other ) +void wxClientDisplayRect(int *x, int *y, int *width, int *height) { - return HIViewSetZOrder( m_controlRef,above ? kHIViewZOrderAbove : kHIViewZOrderBelow, - (other != NULL) ? other->m_controlRef : NULL); +#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 + HIRect bounds ; + HIWindowGetAvailablePositioningBounds(kCGNullDirectDisplay,kHICoordSpace72DPIGlobal, + &bounds); + if ( x ) + *x = bounds.origin.x; + if ( y ) + *y = bounds.origin.y; + if ( width ) + *width = bounds.size.width; + if ( height ) + *height = bounds.size.height; +#else + Rect r; + GetAvailableWindowPositioningBounds( GetMainDevice() , &r ); + if ( x ) + *x = r.left; + if ( y ) + *y = r.top; + if ( width ) + *width = r.right - r.left; + if ( height ) + *height = r.bottom - r.top; +#endif } -// SetNeedsDisplay would not invalidate the children -static void InvalidateControlAndChildren( HIViewRef control ) -{ - HIViewSetNeedsDisplay( control , true ); - UInt16 childrenCount = 0; - OSStatus err = CountSubControls( control , &childrenCount ); - if ( err == errControlIsNotEmbedder ) - return; +#endif // wxUSE_GUI + +#if wxUSE_BASE +// ---------------------------------------------------------------------------- +// Common Event Support +// ---------------------------------------------------------------------------- - wxASSERT_MSG( err == noErr , wxT("Unexpected error when accessing subcontrols") ); +void wxMacWakeUp() +{ + OSStatus err = noErr; - for ( UInt16 i = childrenCount; i >=1; --i ) +#if wxOSX_USE_CARBON +#if 0 + // lead sometimes to race conditions, although all calls used should be thread safe ... + static wxMacCarbonEvent s_wakeupEvent; + if ( !s_wakeupEvent.IsValid() ) + { + err = s_wakeupEvent.Create( 'WXMC', 'WXMC', GetCurrentEventTime(), + kEventAttributeNone ); + } + if ( err == noErr ) { - HIViewRef child; - err = GetIndexedSubControl( control , i , & child ); - if ( err == errControlIsNotEmbedder ) + if ( IsEventInQueue( GetMainEventQueue() , s_wakeupEvent ) ) return; - - InvalidateControlAndChildren( child ); + s_wakeupEvent.SetCurrentTime(); + err = PostEventToQueue(GetMainEventQueue(), s_wakeupEvent, + kEventPriorityHigh ); } +#else + wxMacCarbonEvent wakeupEvent; + wakeupEvent.Create( 'WXMC', 'WXMC', GetCurrentEventTime(), + kEventAttributeNone ); + err = PostEventToQueue(GetMainEventQueue(), wakeupEvent, + kEventPriorityHigh ); +#endif +#endif +} + +#endif // wxUSE_BASE + +#if wxUSE_GUI + +// ---------------------------------------------------------------------------- +// Native Struct Conversions +// ---------------------------------------------------------------------------- + +void wxMacRectToNative( const wxRect *wx , Rect *n ) +{ + n->left = wx->x; + n->top = wx->y; + n->right = wx->x + wx->width; + n->bottom = wx->y + wx->height; } -void wxMacControl::InvalidateWithChildren() +void wxMacNativeToRect( const Rect *n , wxRect* wx ) { - InvalidateControlAndChildren( m_controlRef ); + wx->x = n->left; + wx->y = n->top; + wx->width = n->right - n->left; + wx->height = n->bottom - n->top; } -void wxMacControl::ScrollRect( wxRect *r , int dx , int dy ) +void wxMacPointToNative( const wxPoint* wx , Point *n ) { - wxASSERT( r != NULL ); + n->h = wx->x; + n->v = wx->y; +} - HIRect scrollarea = CGRectMake( r->x , r->y , r->width , r->height); - HIViewScrollRect ( m_controlRef , &scrollarea , dx ,dy ); +void wxMacNativeToPoint( const Point *n , wxPoint* wx ) +{ + wx->x = n->h; + wx->y = n->v; } -OSType wxMacCreator = 'WXMC'; -OSType wxMacControlProperty = 'MCCT'; +// ---------------------------------------------------------------------------- +// Carbon Event Support +// ---------------------------------------------------------------------------- -void wxMacControl::SetReferenceInNativeControl() +OSStatus wxMacCarbonEvent::GetParameter(EventParamName inName, EventParamType inDesiredType, UInt32 inBufferSize, void * outData) { - void * data = this; - verify_noerr( SetControlProperty ( m_controlRef , - wxMacCreator,wxMacControlProperty, sizeof(data), &data ) ); + return ::GetEventParameter( m_eventRef , inName , inDesiredType , NULL , inBufferSize , NULL , outData ); } -wxMacControl* wxMacControl::GetReferenceFromNativeControl(ControlRef control) +OSStatus wxMacCarbonEvent::SetParameter(EventParamName inName, EventParamType inType, UInt32 inBufferSize, const void * inData) { - wxMacControl* ctl = NULL; - ByteCount actualSize; - if ( GetControlProperty( control ,wxMacCreator,wxMacControlProperty, sizeof(ctl) , - &actualSize , &ctl ) == noErr ) - { - return ctl; - } - return NULL; + return ::SetEventParameter( m_eventRef , inName , inType , inBufferSize , inData ); } +// ---------------------------------------------------------------------------- +// Control Access Support +// ---------------------------------------------------------------------------- + + // ============================================================================ // DataBrowser Wrapper // ============================================================================ @@ -1919,7 +1454,7 @@ void wxMacDataItemBrowserControl::MacScrollTo( unsigned int n ) UInt32 linetop = n * ((UInt32) height ); UInt32 linebottom = linetop + height; Rect rect ; - GetRect( &rect ); + GetControlBounds( m_controlRef, &rect ); if ( linetop < top || linebottom > (top + rect.bottom - rect.top ) ) SetScrollPosition( wxMax( n-2, 0 ) * ((UInt32)height) , left ) ; @@ -1927,84 +1462,6 @@ void wxMacDataItemBrowserControl::MacScrollTo( unsigned int n ) RevealItem( item , kDataBrowserRevealWithoutSelecting ); } - - -// -// Tab Control -// - -OSStatus wxMacControl::SetTabEnabled( SInt16 tabNo , bool enable ) -{ - return ::SetTabEnabled( m_controlRef , tabNo , enable ); -} - -#endif - -// -// Quartz Support -// - -/* - 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) - { - genericRGBColorSpace.reset( CGColorSpaceCreateWithName( kCGColorSpaceGenericRGB ) ); - } - - return genericRGBColorSpace; -} - -CGColorRef wxMacCreateCGColorFromHITheme( ThemeBrush brush ) -{ - CGColorRef color ; - HIThemeBrushCreateCGColor( brush, &color ); - return color; -} - -#if wxMAC_USE_QUICKDRAW - -static inline void PointFromHIPoint(const HIPoint& p, Point *pt) -{ - pt->h = wx_static_cast(short, p.x); - pt->v = wx_static_cast(short, p.y); -} - -void wxMacGlobalToLocal( WindowRef window , Point*pt ) -{ - HIPoint p = CGPointMake( pt->h, pt->v ); - HIViewRef contentView ; - // TODO check toolbar offset - HIViewFindByID( HIViewGetRoot( window ), kHIViewWindowContentID , &contentView) ; - HIPointConvert( &p, kHICoordSpace72DPIGlobal, NULL, kHICoordSpaceView, contentView ); - PointFromHIPoint(p, pt); -} - -void wxMacLocalToGlobal( WindowRef window , Point*pt ) -{ - HIPoint p = CGPointMake( pt->h, pt->v ); - HIViewRef contentView ; - // TODO check toolbar offset - HIViewFindByID( HIViewGetRoot( window ), kHIViewWindowContentID , &contentView) ; - HIPointConvert( &p, kHICoordSpaceView, contentView, kHICoordSpace72DPIGlobal, NULL ); - PointFromHIPoint(p, pt); -} - -#endif // wxMAC_USE_QUICKDRAW - #endif // wxUSE_GUI -#if wxUSE_BASE - -#endif +#endif // wxOSX_USE_CARBON