X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/02a55765c470cd56bd4e5061b6c0f2258f3dda65..3ba9ea7267f57804d18e9371a7b12995dfd21417:/src/mac/carbon/window.cpp diff --git a/src/mac/carbon/window.cpp b/src/mac/carbon/window.cpp index 396de9fd34..32633ad95d 100644 --- a/src/mac/carbon/window.cpp +++ b/src/mac/carbon/window.cpp @@ -201,25 +201,58 @@ static pascal OSStatus wxMacWindowControlEventHandler( EventHandlerCallRef handl RgnHandle updateRgn = NULL ; RgnHandle allocatedRgn = NULL ; wxRegion visRegion = thisWindow->MacGetVisibleRegion() ; - if ( thisWindow->MacGetTopLevelWindow()->MacUsesCompositing() == false || cEvent.GetParameter(kEventParamRgnHandle, &updateRgn) != noErr ) + Rect controlBounds ; + if ( thisWindow->GetPeer()->IsCompositing() == false ) + { + if ( thisWindow->GetPeer()->IsRootControl() == false ) + { + GetControlBounds( thisWindow->GetPeer()->GetControlRef() , &controlBounds ) ; + } + else + { + thisWindow->GetPeer()->GetRect( &controlBounds ) ; + } + } + + if ( cEvent.GetParameter(kEventParamRgnHandle, &updateRgn) != noErr ) { updateRgn = (RgnHandle) visRegion.GetWXHRGN() ; } else { - if ( thisWindow->MacGetLeftBorderSize() != 0 || thisWindow->MacGetTopBorderSize() != 0 ) + if ( thisWindow->GetPeer()->IsCompositing() == false ) { + if ( thisWindow->GetPeer()->IsRootControl() == false ) + { + GetControlBounds( thisWindow->GetPeer()->GetControlRef() , &controlBounds ) ; + } + else + { + thisWindow->GetPeer()->GetRect( &controlBounds ) ; + } allocatedRgn = NewRgn() ; CopyRgn( updateRgn , allocatedRgn ) ; + OffsetRgn( allocatedRgn , -controlBounds.left , -controlBounds.top ) ; // hide the given region by the new region that must be shifted wxMacNativeToWindow( thisWindow , allocatedRgn ) ; - updateRgn = allocatedRgn ; + updateRgn = allocatedRgn ; + } + else + { + if ( thisWindow->MacGetLeftBorderSize() != 0 || thisWindow->MacGetTopBorderSize() != 0 ) + { + // as this update region is in native window locals we must adapt it to wx window local + allocatedRgn = NewRgn() ; + CopyRgn( updateRgn , allocatedRgn ) ; + // hide the given region by the new region that must be shifted + wxMacNativeToWindow( thisWindow , allocatedRgn ) ; + updateRgn = allocatedRgn ; + } } } - -#if 0 - // in case we would need a coregraphics compliant background erase first - // now usable to track redraws + Rect rgnBounds ; + GetRegionBounds( updateRgn , &rgnBounds ) ; +#if wxMAC_DEBUG_REDRAW if ( thisWindow->MacIsUserPane() ) { CGContextRef cgContext = cEvent.GetParameter(kEventParamCGContextRef) ; @@ -242,14 +275,52 @@ static pascal OSStatus wxMacWindowControlEventHandler( EventHandlerCallRef handl #endif { #if wxMAC_USE_CORE_GRAPHICS - CGContextRef cgContext = cEvent.GetParameter(kEventParamCGContextRef) ; + bool created = false ; + CGContextRef cgContext = 0 ; + if ( cEvent.GetParameter(kEventParamCGContextRef, &cgContext) != noErr ) + { + wxASSERT( thisWindow->GetPeer()->IsCompositing() == false ) ; + + // this parameter is not provided on non-composited windows + created = true ; + // rest of the code expects this to be already transformed and clipped for local + CGrafPtr port = GetWindowPort( (WindowRef) thisWindow->MacGetTopLevelWindowRef() ) ; + Rect bounds ; + GetPortBounds( port , &bounds ) ; + CreateCGContextForPort( port , &cgContext ) ; + + wxMacWindowToNative( thisWindow , updateRgn ) ; + OffsetRgn( updateRgn , controlBounds.left , controlBounds.top ) ; + ClipCGContextToRegion( cgContext , &bounds , updateRgn ) ; + wxMacNativeToWindow( thisWindow , updateRgn ) ; + OffsetRgn( updateRgn , -controlBounds.left , -controlBounds.top ) ; + + CGContextTranslateCTM( cgContext , 0 , bounds.bottom - bounds.top ) ; + CGContextScaleCTM( cgContext , 1 , -1 ) ; + + CGContextTranslateCTM( cgContext , controlBounds.left , controlBounds.top ) ; + + /* + CGContextSetRGBFillColor( cgContext , 1.0 , 1.0 , 1.0 , 1.0 ) ; + CGContextFillRect(cgContext , CGRectMake( 0 , 0 , + controlBounds.right - controlBounds.left , + controlBounds.bottom - controlBounds.top ) ); + */ + + } thisWindow->MacSetCGContextRef( cgContext ) ; - wxMacCGContextStateSaver sg( cgContext ) ; + { + wxMacCGContextStateSaver sg( cgContext ) ; #endif - if ( thisWindow->MacDoRedraw( updateRgn , cEvent.GetTicks() ) ) - result = noErr ; + if ( thisWindow->MacDoRedraw( updateRgn , cEvent.GetTicks() ) ) + result = noErr ; #if wxMAC_USE_CORE_GRAPHICS - thisWindow->MacSetCGContextRef( NULL ) ; + thisWindow->MacSetCGContextRef( NULL ) ; + } + if ( created ) + { + CGContextRelease( cgContext ) ; + } #endif } if ( allocatedRgn ) @@ -433,6 +504,7 @@ static pascal void wxMacControlUserPaneDrawProc(ControlRef control, SInt16 part) if ( win ) win->MacControlUserPaneDrawProc(part) ; } +wxMAC_DEFINE_PROC_GETTER( ControlUserPaneDrawUPP , wxMacControlUserPaneDrawProc ) ; static pascal ControlPartCode wxMacControlUserPaneHitTestProc(ControlRef control, Point where) { @@ -442,6 +514,7 @@ static pascal ControlPartCode wxMacControlUserPaneHitTestProc(ControlRef control else return kControlNoPart ; } +wxMAC_DEFINE_PROC_GETTER( ControlUserPaneHitTestUPP , wxMacControlUserPaneHitTestProc ) ; static pascal ControlPartCode wxMacControlUserPaneTrackingProc(ControlRef control, Point startPt, ControlActionUPP actionProc) { @@ -451,6 +524,7 @@ static pascal ControlPartCode wxMacControlUserPaneTrackingProc(ControlRef contro else return kControlNoPart ; } +wxMAC_DEFINE_PROC_GETTER( ControlUserPaneTrackingUPP , wxMacControlUserPaneTrackingProc ) ; static pascal void wxMacControlUserPaneIdleProc(ControlRef control) { @@ -458,6 +532,7 @@ static pascal void wxMacControlUserPaneIdleProc(ControlRef control) if ( win ) win->MacControlUserPaneIdleProc() ; } +wxMAC_DEFINE_PROC_GETTER( ControlUserPaneIdleUPP , wxMacControlUserPaneIdleProc ) ; static pascal ControlPartCode wxMacControlUserPaneKeyDownProc(ControlRef control, SInt16 keyCode, SInt16 charCode, SInt16 modifiers) { @@ -467,6 +542,7 @@ static pascal ControlPartCode wxMacControlUserPaneKeyDownProc(ControlRef control else return kControlNoPart ; } +wxMAC_DEFINE_PROC_GETTER( ControlUserPaneKeyDownUPP , wxMacControlUserPaneKeyDownProc ) ; static pascal void wxMacControlUserPaneActivateProc(ControlRef control, Boolean activating) { @@ -474,6 +550,7 @@ static pascal void wxMacControlUserPaneActivateProc(ControlRef control, Boolean if ( win ) win->MacControlUserPaneActivateProc(activating) ; } +wxMAC_DEFINE_PROC_GETTER( ControlUserPaneActivateUPP , wxMacControlUserPaneActivateProc ) ; static pascal ControlPartCode wxMacControlUserPaneFocusProc(ControlRef control, ControlFocusPart action) { @@ -483,6 +560,7 @@ static pascal ControlPartCode wxMacControlUserPaneFocusProc(ControlRef control, else return kControlNoPart ; } +wxMAC_DEFINE_PROC_GETTER( ControlUserPaneFocusUPP , wxMacControlUserPaneFocusProc ) ; static pascal void wxMacControlUserPaneBackgroundProc(ControlRef control, ControlBackgroundPtr info) { @@ -490,6 +568,7 @@ static pascal void wxMacControlUserPaneBackgroundProc(ControlRef control, Contro if ( win ) win->MacControlUserPaneBackgroundProc(info) ; } +wxMAC_DEFINE_PROC_GETTER( ControlUserPaneBackgroundUPP , wxMacControlUserPaneBackgroundProc ) ; void wxWindowMac::MacControlUserPaneDrawProc(wxInt16 part) { @@ -533,17 +612,26 @@ void wxWindowMac::MacControlUserPaneBackgroundProc(void* info) { } -ControlUserPaneDrawUPP gControlUserPaneDrawUPP = NULL ; -ControlUserPaneHitTestUPP gControlUserPaneHitTestUPP = NULL ; -ControlUserPaneTrackingUPP gControlUserPaneTrackingUPP = NULL ; -ControlUserPaneIdleUPP gControlUserPaneIdleUPP = NULL ; -ControlUserPaneKeyDownUPP gControlUserPaneKeyDownUPP = NULL ; -ControlUserPaneActivateUPP gControlUserPaneActivateUPP = NULL ; -ControlUserPaneFocusUPP gControlUserPaneFocusUPP = NULL ; -ControlUserPaneBackgroundUPP gControlUserPaneBackgroundUPP = NULL ; - #endif +// --------------------------------------------------------------------------- +// Scrollbar Tracking for all +// --------------------------------------------------------------------------- + +pascal void wxMacLiveScrollbarActionProc( ControlRef control , ControlPartCode partCode ) ; +pascal void wxMacLiveScrollbarActionProc( ControlRef control , ControlPartCode partCode ) +{ + if ( partCode != 0) + { + wxWindow* wx = wxFindControlFromMacControl( control ) ; + if ( wx ) + { + wx->MacHandleControlClick( (WXWidget) control , partCode , true /* stillDown */ ) ; + } + } +} +wxMAC_DEFINE_PROC_GETTER( ControlActionUPP , wxMacLiveScrollbarActionProc ) ; + // =========================================================================== // implementation // =========================================================================== @@ -610,77 +698,6 @@ void wxRemoveMacControlAssociation(wxWindow *control) } #endif // deprecated wxList -// UPP functions -ControlActionUPP wxMacLiveScrollbarActionUPP = NULL ; - -ControlColorUPP wxMacSetupControlBackgroundUPP = NULL ; - -// we have to setup the brush in the current port and return noErr -// or return an error code so that the control manager walks further up the -// hierarchy to find a correct background - -pascal OSStatus wxMacSetupControlBackground( ControlRef iControl , SInt16 iMessage , SInt16 iDepth , Boolean iIsColor ) -{ - OSStatus status = paramErr ; - switch( iMessage ) - { - case kControlMsgApplyTextColor : - break ; - case kControlMsgSetUpBackground : - { - wxWindow* wx = (wxWindow*) wxFindControlFromMacControl( iControl ) ; - if ( wx != NULL ) - { - /* - const wxBrush &brush = wx->MacGetBackgroundBrush() ; - if ( brush.Ok() ) - { - wxDC::MacSetupBackgroundForCurrentPort( brush ) ; - */ - // this clipping is only needed for non HIView - - RgnHandle clip = NewRgn() ; - int x = 0 , y = 0; - - wx->MacWindowToRootWindow( &x,&y ) ; - CopyRgn( (RgnHandle) wx->MacGetVisibleRegion().GetWXHRGN() , clip ) ; - OffsetRgn( clip , x , y ) ; - SetClip( clip ) ; - DisposeRgn( clip ) ; - - status = noErr ; - /* - } - else if ( wx->MacIsUserPane() ) - { - // if we don't have a valid brush for such a control, we have to call the - // setup of our parent ourselves - status = SetUpControlBackground( (ControlRef) wx->GetParent()->GetHandle() , iDepth , iIsColor ) ; - } - */ - } - } - break ; - default : - break ; - } - return status ; -} - - -pascal void wxMacLiveScrollbarActionProc( ControlRef control , ControlPartCode partCode ) ; -pascal void wxMacLiveScrollbarActionProc( ControlRef control , ControlPartCode partCode ) -{ - if ( partCode != 0) - { - wxWindow* wx = wxFindControlFromMacControl( control ) ; - if ( wx ) - { - wx->MacHandleControlClick( (WXWidget) control , partCode , true /* stillDown */ ) ; - } - } -} - // ---------------------------------------------------------------------------- // constructors and such // ---------------------------------------------------------------------------- @@ -720,31 +737,6 @@ void wxWindowMac::Init() #if wxMAC_USE_CORE_GRAPHICS m_cgContextRef = NULL ; #endif - // make sure all proc ptrs are available - -#if !TARGET_API_MAC_OSX - if ( gControlUserPaneDrawUPP == NULL ) - { - gControlUserPaneDrawUPP = NewControlUserPaneDrawUPP( wxMacControlUserPaneDrawProc ) ; - gControlUserPaneHitTestUPP = NewControlUserPaneHitTestUPP( wxMacControlUserPaneHitTestProc ) ; - gControlUserPaneTrackingUPP = NewControlUserPaneTrackingUPP( wxMacControlUserPaneTrackingProc ) ; - gControlUserPaneIdleUPP = NewControlUserPaneIdleUPP( wxMacControlUserPaneIdleProc ) ; - gControlUserPaneKeyDownUPP = NewControlUserPaneKeyDownUPP( wxMacControlUserPaneKeyDownProc ) ; - gControlUserPaneActivateUPP = NewControlUserPaneActivateUPP( wxMacControlUserPaneActivateProc ) ; - gControlUserPaneFocusUPP = NewControlUserPaneFocusUPP( wxMacControlUserPaneFocusProc ) ; - gControlUserPaneBackgroundUPP = NewControlUserPaneBackgroundUPP( wxMacControlUserPaneBackgroundProc ) ; - } -#endif - if ( wxMacLiveScrollbarActionUPP == NULL ) - { - wxMacLiveScrollbarActionUPP = NewControlActionUPP( wxMacLiveScrollbarActionProc ); - } - - if ( wxMacSetupControlBackgroundUPP == NULL ) - { - wxMacSetupControlBackgroundUPP = NewControlColorUPP( wxMacSetupControlBackground ) ; - } - // we need a valid font for the encodings wxWindowBase::SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT)); } @@ -833,14 +825,14 @@ void wxWindowMac::MacInstallEventHandler( WXWidget control ) #if !TARGET_API_MAC_OSX if ( (ControlRef) control == m_peer->GetControlRef() ) { - m_peer->SetData(kControlEntireControl,kControlUserPaneDrawProcTag,&gControlUserPaneDrawUPP) ; - m_peer->SetData(kControlEntireControl,kControlUserPaneHitTestProcTag,&gControlUserPaneHitTestUPP) ; - m_peer->SetData(kControlEntireControl,kControlUserPaneTrackingProcTag,&gControlUserPaneTrackingUPP) ; - m_peer->SetData(kControlEntireControl,kControlUserPaneIdleProcTag,&gControlUserPaneIdleUPP) ; - m_peer->SetData(kControlEntireControl,kControlUserPaneKeyDownProcTag,&gControlUserPaneKeyDownUPP) ; - m_peer->SetData(kControlEntireControl,kControlUserPaneActivateProcTag,&gControlUserPaneActivateUPP) ; - m_peer->SetData(kControlEntireControl,kControlUserPaneFocusProcTag,&gControlUserPaneFocusUPP) ; - m_peer->SetData(kControlEntireControl,kControlUserPaneBackgroundProcTag,&gControlUserPaneBackgroundUPP) ; + m_peer->SetData(kControlEntireControl,kControlUserPaneDrawProcTag,GetwxMacControlUserPaneDrawProc()) ; + m_peer->SetData(kControlEntireControl,kControlUserPaneHitTestProcTag,GetwxMacControlUserPaneHitTestProc()) ; + m_peer->SetData(kControlEntireControl,kControlUserPaneTrackingProcTag,GetwxMacControlUserPaneTrackingProc()) ; + m_peer->SetData(kControlEntireControl,kControlUserPaneIdleProcTag,GetwxMacControlUserPaneIdleProc()) ; + m_peer->SetData(kControlEntireControl,kControlUserPaneKeyDownProcTag,GetwxMacControlUserPaneKeyDownProc()) ; + m_peer->SetData(kControlEntireControl,kControlUserPaneActivateProcTag,GetwxMacControlUserPaneActivateProc()) ; + m_peer->SetData(kControlEntireControl,kControlUserPaneFocusProcTag,GetwxMacControlUserPaneFocusProc()) ; + m_peer->SetData(kControlEntireControl,kControlUserPaneBackgroundProcTag,GetwxMacControlUserPaneBackgroundProc()) ; } #endif @@ -866,13 +858,14 @@ bool wxWindowMac::Create(wxWindowMac *parent, wxWindowID id, UInt32 features = 0 | kControlSupportsEmbedding -// | kControlSupportsLiveFeedback + | kControlSupportsLiveFeedback + | kControlGetsFocusOnClick // | kControlHasSpecialBackground // | kControlSupportsCalcBestRect -// | kControlHandlesTracking + | kControlHandlesTracking | kControlSupportsFocus -// | kControlWantsActivate -// | kControlWantsIdle + | kControlWantsActivate + | kControlWantsIdle ; m_peer = new wxMacControl(this) ; @@ -926,11 +919,6 @@ void wxWindowMac::MacPostControlCreate(const wxPoint& pos, const wxSize& size) // adjust font, controlsize etc DoSetWindowVariant( m_windowVariant ) ; -#if !TARGET_API_MAC_OSX - // eventually we can fix some clipping issues be reactivating this hook - //if ( m_macIsUserPane ) - // SetControlColorProc( m_peer->GetControlRef() , wxMacSetupControlBackgroundUPP ) ; -#endif m_peer->SetTitle( wxStripMenuCodes(m_label) ) ; if (!m_macIsUserPane) @@ -1158,14 +1146,7 @@ void wxWindowMac::DragAcceptFiles(bool accept) void wxWindowMac::MacGetPositionAndSizeFromControl(int& x, int& y, int& w, int& h) const { - Rect bounds ; - m_peer->GetRect( &bounds ) ; - - - x = bounds.left ; - y = bounds.top ; - w = bounds.right - bounds.left ; - h = bounds.bottom - bounds.top ; + wxFAIL_MSG( wxT("Not supported anymore") ) ; } // From a wx position / size calculate the appropriate size of the native control @@ -1209,36 +1190,21 @@ bool wxWindowMac::MacGetBoundsForControl(const wxPoint& pos, // Get window size (not client size) void wxWindowMac::DoGetSize(int *x, int *y) const { - // take the size of the control and add the borders that have to be drawn outside - int x1 , y1 , w1 , h1 ; - - MacGetPositionAndSizeFromControl( x1 , y1, w1 ,h1 ) ; - - w1 += MacGetLeftBorderSize() + MacGetRightBorderSize() ; - h1 += MacGetTopBorderSize() + MacGetBottomBorderSize() ; + Rect bounds ; + m_peer->GetRect( &bounds ) ; - if(x) *x = w1 ; - if(y) *y = h1 ; + if(x) *x = bounds.right - bounds.left + MacGetLeftBorderSize() + MacGetRightBorderSize() ; + if(y) *y = bounds.bottom - bounds.top + MacGetTopBorderSize() + MacGetBottomBorderSize() ; } // get the position of the bounds of this window in client coordinates of its parent void wxWindowMac::DoGetPosition(int *x, int *y) const { - bool isCompositing = MacGetTopLevelWindow()->MacUsesCompositing() ; + Rect bounds ; + m_peer->GetRect( &bounds ) ; - int x1 , y1 , w1 ,h1 ; - MacGetPositionAndSizeFromControl( x1 , y1, w1 ,h1 ) ; - x1 -= MacGetLeftBorderSize() ; - y1 -= MacGetTopBorderSize() ; - // to non-client - - if ( !isCompositing && !GetParent()->IsTopLevel() ) - { - Rect bounds ; - GetControlBounds( (ControlRef) GetParent()->GetHandle() , &bounds ) ; - x1 -= bounds.left ; - y1 -= bounds.top ; - } + int x1 = bounds.left ; + int y1 = bounds.top ; if ( !IsTopLevel() ) { @@ -1381,57 +1347,46 @@ void wxWindowMac::MacRootWindowToWindow( short *x , short *y ) const void wxWindowMac::MacGetContentAreaInset( int &left , int &top , int &right , int &bottom ) { - bool isCompositing = MacGetTopLevelWindow()->MacUsesCompositing() ; - RgnHandle rgn = NewRgn() ; - Rect content ; if ( m_peer->GetRegion( kControlContentMetaPart , rgn ) == noErr ) { + Rect structure ; + Rect content ; GetRegionBounds( rgn , &content ) ; + m_peer->GetRect( &structure ) ; + OffsetRect( &structure, -structure.left , -structure.top ) ; + + left = content.left - structure.left ; + top = content.top - structure.top ; + right = structure.right - content.right ; + bottom = structure.bottom - content.bottom ; } else { - m_peer->GetRect( &content ) ; + left = top = right = bottom = 0 ; } DisposeRgn( rgn ) ; - Rect structure ; - m_peer->GetRect( &structure ) ; - - if ( !isCompositing ) - OffsetRect( &content , -structure.left , -structure.top ) ; - - left = content.left - structure.left ; - top = content.top - structure.top ; - right = structure.right - content.right ; - bottom = structure.bottom - content.bottom ; } wxSize wxWindowMac::DoGetSizeFromClientSize( const wxSize & size ) const { - bool isCompositing = MacGetTopLevelWindow()->MacUsesCompositing() ; wxSize sizeTotal = size; RgnHandle rgn = NewRgn() ; - Rect content ; - if ( m_peer->GetRegion( kControlContentMetaPart , rgn ) == noErr ) { + Rect content ; + Rect structure ; GetRegionBounds( rgn , &content ) ; - } - else - { - m_peer->GetRect( &content ) ; - } - DisposeRgn( rgn ) ; - Rect structure ; - m_peer->GetRect( &structure ) ; - if ( !isCompositing ) - OffsetRect( &content , -structure.left , -structure.top ) ; + m_peer->GetRect( &structure ) ; + // structure is in parent coordinates, but we only need width and height, so it's ok - sizeTotal.x += (structure.right - structure.left) - (content.right - content.left) ; - sizeTotal.y += (structure.bottom - structure.top) - (content.bottom - content.top ) ; + sizeTotal.x += (structure.right - structure.left) - (content.right - content.left) ; + sizeTotal.y += (structure.bottom - structure.top) - (content.bottom - content.top ) ; + } + DisposeRgn( rgn ) ; sizeTotal.x += MacGetLeftBorderSize( ) + MacGetRightBorderSize( ) ; sizeTotal.y += MacGetTopBorderSize( ) + MacGetBottomBorderSize( ) ; @@ -1443,7 +1398,6 @@ wxSize wxWindowMac::DoGetSizeFromClientSize( const wxSize & size ) const // Get size *available for subwindows* i.e. excluding menu bar etc. void wxWindowMac::DoGetClientSize(int *x, int *y) const { - bool isCompositing = MacGetTopLevelWindow()->MacUsesCompositing() ; int ww, hh; RgnHandle rgn = NewRgn() ; @@ -1458,62 +1412,9 @@ void wxWindowMac::DoGetClientSize(int *x, int *y) const } DisposeRgn( rgn ) ; - if ( !isCompositing ) - { - Rect structure ; - m_peer->GetRect( &structure ) ; - OffsetRect( &content , -structure.left , -structure.top ) ; - } ww = content.right - content.left ; hh = content.bottom - content.top ; - /* - ww -= MacGetLeftBorderSize( ) + MacGetRightBorderSize( ) ; - hh -= MacGetTopBorderSize( ) + MacGetBottomBorderSize( ); - */ - /* - if ( (m_vScrollBar && m_vScrollBar->IsShown()) || (m_hScrollBar && m_hScrollBar->IsShown()) ) - { - int x1 = 0 ; - int y1 = 0 ; - int w ; - int h ; - GetSize( &w , &h ) ; - - MacClientToRootWindow( &x1 , &y1 ) ; - MacClientToRootWindow( &w , &h ) ; - - wxWindowMac *iter = (wxWindowMac*)this ; - - int totW = 10000 , totH = 10000; - while( iter ) - { - if ( iter->IsTopLevel() ) - { - iter->GetSize( &totW , &totH ) ; - break ; - } - iter = iter->GetParent() ; - } - - if (m_hScrollBar && m_hScrollBar->IsShown() ) - { - hh -= m_hScrollBar->GetSize().y ; // MAC_SCROLLBAR_SIZE ; - if ( h-y1 >= totH ) - { - hh += 1 ; - } - } - if (m_vScrollBar && m_vScrollBar->IsShown() ) - { - ww -= m_vScrollBar->GetSize().x ; // MAC_SCROLLBAR_SIZE; - if ( w-x1 >= totW ) - { - ww += 1 ; - } - } - } - */ if (m_hScrollBar && m_hScrollBar->IsShown() ) { hh -= m_hScrollBar->GetSize().y ; // MAC_SCROLLBAR_SIZE ; @@ -1662,7 +1563,7 @@ void wxWindowMac::MacInvalidateBorders() RectRgn( updateOuter , &rect ) ; DiffRgn( updateOuter , updateInner ,updateOuter ) ; #ifdef __WXMAC_OSX__ - GetParent()->m_peer->SetNeedsDisplay( true , updateOuter ) ; + GetParent()->m_peer->SetNeedsDisplay( updateOuter ) ; #else WindowRef tlw = (WindowRef) MacGetTopLevelWindowRef() ; if ( tlw ) @@ -1756,7 +1657,7 @@ void wxWindowMac::MacInvalidateBorders() */ UnionRgn( updateOuter , updateTotal , updateTotal ) ; - GetParent()->m_peer->SetNeedsDisplay( true , updateTotal ) ; + GetParent()->m_peer->SetNeedsDisplay( updateTotal ) ; DisposeRgn(updateOuter) ; DisposeRgn(updateInner) ; DisposeRgn(updateTotal) ; @@ -1809,8 +1710,19 @@ void wxWindowMac::DoMoveWindow(int x, int y, int width, int height) if ( doMove || doResize ) { - // we don't adjust twice for the origin - Rect r = wxMacGetBoundsForControl(this , wxPoint( actualX,actualY), wxSize( actualWidth, actualHeight ) , false ) ; + // as the borders are drawn outside the native control, we adjust now + + wxRect bounds( wxPoint( actualX + MacGetLeftBorderSize() ,actualY + MacGetTopBorderSize() ), + wxSize( actualWidth - (MacGetLeftBorderSize() + MacGetRightBorderSize()) , + actualHeight - (MacGetTopBorderSize() + MacGetBottomBorderSize()) ) ) ; + + Rect r ; + wxMacRectToNative( &bounds , &r ) ; + + if ( !GetParent()->IsTopLevel() ) + { + wxMacWindowToNative( GetParent() , &r ) ; + } MacInvalidateBorders() ; @@ -1953,25 +1865,17 @@ void wxWindowMac::DoSetSize(int x, int y, int width, int height, int sizeFlags) wxPoint wxWindowMac::GetClientAreaOrigin() const { - bool isCompositing = MacGetTopLevelWindow()->MacUsesCompositing() ; RgnHandle rgn = NewRgn() ; Rect content ; - m_peer->GetRegion( kControlContentMetaPart , rgn ) ; - GetRegionBounds( rgn , &content ) ; - DisposeRgn( rgn ) ; - - if ( !isCompositing ) + if ( m_peer->GetRegion( kControlContentMetaPart , rgn ) == noErr ) { - // if the content rgn is empty / not supported - // don't attempt to correct the coordinates to wxWindow relative ones - if (!::EmptyRect( &content ) ) - { - Rect structure ; - m_peer->GetRect( &structure ) ; - OffsetRect( &content , -structure.left , -structure.top ) ; - } + GetRegionBounds( rgn , &content ) ; } - + else + { + content.left = content.top = 0 ; + } + DisposeRgn( rgn ) ; return wxPoint( content.left + MacGetLeftBorderSize( ) , content.top + MacGetTopBorderSize( ) ); } @@ -2195,61 +2099,18 @@ void wxWindowMac::Refresh(bool eraseBack, const wxRect *rect) if ( m_peer == NULL ) return ; + if ( !MacIsReallyShown() ) + return ; - bool isCompositing = MacGetTopLevelWindow()->MacUsesCompositing() ; -// if ( isCompositing ) + if ( rect ) { - if ( rect == NULL && isCompositing ) - m_peer->SetNeedsDisplay( true ) ; - else - { - - Rect controlBounds ; - m_peer->GetRect( &controlBounds ) ; - InvalWindowRect( (WindowRef) MacGetTopLevelWindowRef() , &controlBounds ) ; - /* - RgnHandle update = NewRgn() ; - if ( rect == NULL ) - { - CopyRgn( (RgnHandle) MacGetVisibleRegion().GetWXHRGN() , update ) ; - } - else - { - SetRectRgn( update , rect->x , rect->y , rect->x + rect->width , rect->y + rect->height ) ; - SectRgn( (RgnHandle) MacGetVisibleRegion().GetWXHRGN() , update , update ) ; - } - - wxPoint origin = GetClientAreaOrigin() ; - OffsetRgn( update, origin.x , origin.y ) ; - // right now this is wx' window coordinates, as our native peer does not have borders, this is - // inset - if ( isCompositing ) - { - OffsetRgn( update , -MacGetLeftBorderSize() , -MacGetTopBorderSize() ) ; - m_peer->SetNeedsDisplay( true , update) ; - } - else - { - int x = 0 ; - int y = 0 ; - MacWindowToRootWindow( &x , &y ) ; - OffsetRgn( update , x , y ) ; - InvalWindowRgn( (WindowRef) MacGetTopLevelWindowRef() , update ) ; - } - DisposeRgn( update ) ; - */ - } + Rect r ; + wxMacRectToNative( rect , &r ) ; + m_peer->SetNeedsDisplay( &r ) ; } - - if ( 0 ) + else { - if ( MacIsReallyShown() ) - { - /* - m_peer->SetVisibility( false , false ) ; - m_peer->SetVisibility( true , true ) ; - */ - } + m_peer->SetNeedsDisplay() ; } } @@ -2457,16 +2318,12 @@ void wxWindowMac::MacPaintBorders( int leftOrigin , int rightOrigin ) else #endif { - // as the non OSX Version is already working in window relative coordinates, it's not needed wxTopLevelWindowMac* top = MacGetTopLevelWindow(); - if (top && top->MacUsesCompositing()) + if (top ) { wxPoint pt(0,0) ; wxMacControl::Convert( &pt , GetParent()->m_peer , top->m_peer ) ; - rect.left += pt.x ; - rect.right += pt.x ; - rect.top += pt.y ; - rect.bottom += pt.y ; + OffsetRect( &rect , pt.x , pt.y ) ; } if (HasFlag(wxRAISED_BORDER) || HasFlag( wxSUNKEN_BORDER) || HasFlag(wxDOUBLE_BORDER) ) @@ -2576,7 +2433,7 @@ void wxWindowMac::ScrollWindow(int dx, int dy, const wxRect *rect) // either immediate redraw or full invalidate #if 1 // is the better overall solution, as it does not slow down scrolling - m_peer->SetNeedsDisplay( true ) ; + m_peer->SetNeedsDisplay() ; #else // this would be the preferred version for fast drawing controls if( UMAGetSystemVersion() < 0x1030 ) @@ -2721,10 +2578,9 @@ void wxWindowMac::OnSetFocus(wxFocusEvent& event) Rect rect ; m_peer->GetRect( &rect ) ; InsetRect( &rect, -MacGetLeftBorderSize() , -MacGetTopBorderSize() ) ; -#ifdef __WXMAC_OSX__ - // as the non OSX Version is already working in window relative coordinates, it's not needed + wxTopLevelWindowMac* top = MacGetTopLevelWindow(); - if (top && top->MacUsesCompositing() ) + if (top ) { wxPoint pt(0,0) ; wxMacControl::Convert( &pt , GetParent()->m_peer , top->m_peer ) ; @@ -2733,7 +2589,6 @@ void wxWindowMac::OnSetFocus(wxFocusEvent& event) rect.top += pt.y ; rect.bottom += pt.y ; } -#endif if ( event.GetEventType() == wxEVT_SET_FOCUS ) DrawThemeFocusRect( &rect , true ) ; @@ -2868,7 +2723,7 @@ void wxWindowMac::Update() status = ReceiveNextEvent( 0 , NULL , kEventDurationNoWait , false , &theEvent ) ; } else - m_peer->SetNeedsDisplay( true ) ; + m_peer->SetNeedsDisplay() ; } #else ::Draw1Control( m_peer->GetControlRef() ) ; @@ -2903,18 +2758,11 @@ wxRegion wxWindowMac::MacGetVisibleRegion( bool includeOuterStructures ) r.bottom += MacGetBottomBorderSize() ; r.right += MacGetRightBorderSize() ; - if (! MacGetTopLevelWindow()->MacUsesCompositing() ) - { - MacRootWindowToWindow( &r.left , & r.top ) ; - MacRootWindowToWindow( &r.right , & r.bottom ) ; - } - else - { - r.right -= r.left ; - r.bottom -= r.top ; - r.left = 0 ; - r.top = 0 ; - } + r.right -= r.left ; + r.bottom -= r.top ; + r.left = 0 ; + r.top = 0 ; + if ( includeOuterStructures ) InsetRect( &r , -4 , -4 ) ; RectRgn( visRgn , &r ) ;