X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/89a66f111b538f58612d12d4646c197e50fb3a1d..cad61c3e8f976515852eb65b10587e08e0282445:/src/mac/carbon/utils.cpp diff --git a/src/mac/carbon/utils.cpp b/src/mac/carbon/utils.cpp index 6ccff5444c..cef9733b64 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 )