X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/89a66f111b538f58612d12d4646c197e50fb3a1d..917ae499da53826e9b154a786eae1b563317f47f:/src/mac/carbon/utils.cpp diff --git a/src/mac/carbon/utils.cpp b/src/mac/carbon/utils.cpp index 6ccff5444c..4c829e6ca5 100644 --- a/src/mac/carbon/utils.cpp +++ b/src/mac/carbon/utils.cpp @@ -23,6 +23,7 @@ #if wxUSE_GUI #include "wx/mac/uma.h" #include "wx/font.h" + #include "wx/toplevel.h" #else #include "wx/intl.h" #endif @@ -764,6 +765,38 @@ void wxMacWakeUp() #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 @@ -784,6 +817,43 @@ OSStatus wxMacCarbonEvent::SetParameter(EventParamName inName, EventParamType in // Control Access Support // ---------------------------------------------------------------------------- +wxMacControl::wxMacControl(wxWindow* peer , bool isRootControl ) +{ + Init() ; + m_peer = peer ; + m_isRootControl = isRootControl ; + m_isCompositing = peer->MacGetTopLevelWindow()->MacUsesCompositing() ; +} + +wxMacControl::wxMacControl( wxWindow* peer , ControlRef control ) +{ + Init() ; + m_peer = peer ; + m_isCompositing = peer->MacGetTopLevelWindow()->MacUsesCompositing() ; + m_controlRef = control ; +} + +wxMacControl::wxMacControl( wxWindow* peer , WXWidget control ) +{ + Init() ; + m_peer = peer ; + m_isCompositing = peer->MacGetTopLevelWindow()->MacUsesCompositing() ; + m_controlRef = (ControlRef) control ; +} + +wxMacControl::~wxMacControl() +{ +} + +void wxMacControl::Init() +{ + m_peer = NULL ; + m_controlRef = NULL ; + m_needsFocusRect = false ; + m_isCompositing = false ; + m_isRootControl = false ; +} + void wxMacControl::Dispose() { ::DisposeControl( m_controlRef ) ; @@ -894,9 +964,14 @@ bool wxMacControl::HasFocus() const return control == m_controlRef ; } +void wxMacControl::SetNeedsFocusRect( bool needs ) +{ + m_needsFocusRect = needs ; +} + bool wxMacControl::NeedsFocusRect() const { - return false ; + return m_needsFocusRect ; } void wxMacControl::VisibilityChanged(bool shown) @@ -1037,61 +1112,159 @@ bool wxMacControl::GetNeedsDisplay() const return false ; #endif } +#endif -void wxMacControl::SetNeedsDisplay( bool needsDisplay , RgnHandle where ) +void wxMacControl::SetNeedsDisplay( RgnHandle where ) { + if ( !IsVisible() ) + return ; + #if TARGET_API_MAC_OSX - if ( where != NULL ) - HIViewSetNeedsDisplayInRegion( m_controlRef , where , needsDisplay ) ; + if ( m_isCompositing ) + { + HIViewSetNeedsDisplayInRegion( m_controlRef , where , true ) ; + } else - HIViewSetNeedsDisplay( m_controlRef , needsDisplay ) ; #endif + { + Rect controlBounds ; + GetControlBounds( m_controlRef, &controlBounds ) ; + RgnHandle update = NewRgn() ; + CopyRgn( where , update ) ; + OffsetRgn( update , controlBounds.left , controlBounds.top ) ; + InvalWindowRgn( GetControlOwner( m_controlRef) , update ) ; + } } + +void wxMacControl::SetNeedsDisplay( Rect* where ) +{ + if ( !IsVisible() ) + return ; + +#if TARGET_API_MAC_OSX + if ( m_isCompositing ) + { + if ( where != NULL ) + { + RgnHandle update = NewRgn() ; + RectRgn( update , where ) ; + HIViewSetNeedsDisplayInRegion( m_controlRef , update , true ) ; + DisposeRgn( update ) ; + } + else + HIViewSetNeedsDisplay( m_controlRef , true ) ; + } + else #endif + { + Rect controlBounds ; + GetControlBounds( m_controlRef, &controlBounds ) ; + if ( where ) + { + Rect whereLocal = *where ; + OffsetRect( &whereLocal , controlBounds.left , controlBounds.top ) ; + SectRect( &controlBounds , &whereLocal, &controlBounds ) ; + } + InvalWindowRect( GetControlOwner( m_controlRef) , &controlBounds ) ; + } +} void wxMacControl::Convert( wxPoint *pt , wxMacControl *from , wxMacControl *to ) { #if TARGET_API_MAC_OSX - HIPoint hiPoint ; - 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 ; -#else - Rect fromRect ; - Rect toRect ; - from->GetRect( &fromRect ) ; - to->GetRect( &toRect ) ; - - // correct the case of the root control - if ( fromRect.left == -32768 && fromRect.top == -32768 && fromRect.bottom == 32767 && fromRect.right == 32767) - fromRect.left = fromRect.top = 0 ; - - if ( toRect.left == -32768 && toRect.top == -32768 && toRect.bottom == 32767 && toRect.right == 32767 ) - toRect.left = toRect.top = 0 ; - - pt->x = pt->x + fromRect.left - toRect.left ; - pt->y = pt->y + fromRect.top - toRect.top ; + if ( from->m_peer->MacGetTopLevelWindow()->MacUsesCompositing() ) + { + HIPoint hiPoint ; + 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 ; + } + else #endif + { + Rect fromRect ; + Rect toRect ; + GetControlBounds( from->m_controlRef , &fromRect ) ; + GetControlBounds( to->m_controlRef , &toRect ) ; + if ( from->m_isRootControl ) + fromRect.left = fromRect.top = 0 ; + if ( to->m_isRootControl ) + toRect.left = toRect.top = 0 ; + + pt->x = pt->x + fromRect.left - toRect.left ; + pt->y = pt->y + fromRect.top - toRect.top ; + } } void wxMacControl::SetRect( Rect *r ) { #if TARGET_API_MAC_OSX - //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 ) ; -#else - SetControlBounds( m_controlRef , r ) ; + if ( m_isCompositing ) + { + //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 + } + else #endif - + { + bool vis = IsVisible() ; + if ( vis ) + { + Rect former ; + GetControlBounds( m_controlRef , &former ) ; + InvalWindowRect( GetControlOwner( m_controlRef ) , &former ) ; + } + + Rect controlBounds = *r ; + + wxMacControl* parent = m_peer->GetParent()->GetPeer() ; + if( parent->m_isRootControl == false ) + { + Rect superRect ; + GetControlBounds( parent->m_controlRef , &superRect ) ; + OffsetRect( &controlBounds , superRect.left , superRect.top ) ; + } + + SetControlBounds( m_controlRef , &controlBounds ) ; + if ( vis ) + { + InvalWindowRect( GetControlOwner( m_controlRef ) , &controlBounds ) ; + } + } } void wxMacControl::GetRect( Rect *r ) { GetControlBounds( m_controlRef , r ) ; + if ( m_isCompositing == false ) + { + // correct the case of the root control + if ( m_isRootControl ) + { + WindowRef wr = GetControlOwner( m_controlRef ) ; + GetWindowBounds( wr , kWindowContentRgn , r ) ; + r->right -= r->left ; + r->bottom -= r->top ; + r->left = 0 ; + r->top = 0 ; + } + else + { + wxMacControl* parent = m_peer->GetParent()->GetPeer() ; + if( parent->m_isRootControl == false ) + { + Rect superRect ; + GetControlBounds( parent->m_controlRef , &superRect ) ; + OffsetRect( r , -superRect.left , -superRect.top ) ; + } + } + } } void wxMacControl::GetRectInWindowCoords( Rect *r ) @@ -1124,7 +1297,18 @@ void wxMacControl::GetFeatures( UInt32 * features ) OSStatus wxMacControl::GetRegion( ControlPartCode partCode , RgnHandle region ) { - return GetControlRegion( m_controlRef , partCode , region ) ; + OSStatus err = GetControlRegion( m_controlRef , partCode , region ) ; + if ( m_isCompositing == false ) + { + if ( !m_isRootControl ) + { + Rect r ; + GetControlBounds(m_controlRef, &r ) ; + if ( !EmptyRgn( region ) ) + OffsetRgn( region , -r.left , -r.top ) ; + } + } + return err ; } OSStatus wxMacControl::SetZOrder( bool above , wxMacControl* other ) @@ -1273,5 +1457,73 @@ OSStatus wxMacControl::SetTabEnabled( SInt16 tabNo , bool enable ) return ::SetTabEnabled( m_controlRef , tabNo , enable ) ; } +// +// Quartz Support +// + +#ifdef __WXMAC_OSX__ +// snippets from Sketch Sample from Apple : + +#define kGenericRGBProfilePathStr "/System/Library/ColorSync/Profiles/Generic RGB Profile.icc" +/* + This function locates, opens, and returns the profile reference for the calibrated + Generic RGB color space. It is up to the caller to call CMCloseProfile when done + with the profile reference this function returns. +*/ +CMProfileRef wxMacOpenGenericProfile(void) +{ + static CMProfileRef cachedRGBProfileRef = NULL; + + // we only create the profile reference once + if (cachedRGBProfileRef == NULL) + { + CMProfileLocation loc; + + loc.locType = cmPathBasedProfile; + strcpy(loc.u.pathLoc.path, kGenericRGBProfilePathStr); + + verify_noerr( CMOpenProfile(&cachedRGBProfileRef, &loc) ); + } + + if (cachedRGBProfileRef) + { + // clone the profile reference so that the caller has their own reference, not our cached one + CMCloneProfileRef(cachedRGBProfileRef); + } + + return cachedRGBProfileRef; +} + +/* + 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 CGColorSpaceRef genericRGBColorSpace = NULL; + + if (genericRGBColorSpace == NULL) + { + CMProfileRef genericRGBProfile = wxMacOpenGenericProfile(); + + if (genericRGBProfile) + { + genericRGBColorSpace = CGColorSpaceCreateWithPlatformColorSpace(genericRGBProfile); + wxASSERT_MSG( genericRGBColorSpace != NULL, wxT("couldn't create the generic RGB color space") ) ; + + // we opened the profile so it is up to us to close it + CMCloseProfile(genericRGBProfile); + } + } + return genericRGBColorSpace; +} +#endif + #endif // wxUSE_GUI