X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1f1c8bd4d13ee2e1a6830c68770b7acdad7ca946..9802983f157c32177e92e8c0f6b1ce44aec0ebca:/src/mac/carbon/window.cpp diff --git a/src/mac/carbon/window.cpp b/src/mac/carbon/window.cpp index 3f681c8386..ae454e6a56 100644 --- a/src/mac/carbon/window.cpp +++ b/src/mac/carbon/window.cpp @@ -201,23 +201,57 @@ static pascal OSStatus wxMacWindowControlEventHandler( EventHandlerCallRef handl RgnHandle updateRgn = NULL ; RgnHandle allocatedRgn = NULL ; wxRegion visRegion = thisWindow->MacGetVisibleRegion() ; + 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 ) { - // as this update region is in native window locals we must adapt it to wx window local + 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 ; + } } } - + Rect rgnBounds ; + GetRegionBounds( updateRgn , &rgnBounds ) ; #if wxMAC_DEBUG_REDRAW if ( thisWindow->MacIsUserPane() ) { @@ -241,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 ) @@ -1275,8 +1347,6 @@ 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() ; if ( m_peer->GetRegion( kControlContentMetaPart , rgn ) == noErr ) { @@ -1328,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() ; @@ -1796,11 +1865,16 @@ 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 ) ; + if ( m_peer->GetRegion( kControlContentMetaPart , rgn ) == noErr ) + { + GetRegionBounds( rgn , &content ) ; + } + else + { + content.left = content.top = 0 ; + } DisposeRgn( rgn ) ; return wxPoint( content.left + MacGetLeftBorderSize( ) , content.top + MacGetTopBorderSize( ) ); } @@ -2602,10 +2676,12 @@ bool wxWindowMac::MacSetupCursor( const wxPoint& pt) wxString wxWindowMac::MacGetToolTipString( wxPoint &pt ) { +#if wxUSE_TOOLTIPS if ( m_tooltip ) { return m_tooltip->GetTip() ; } +#endif return wxEmptyString ; }