X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0eaa1d68c29cd273971be9d60008045e470c2d46..804c69d3d193d0d821aea227524f8f5d96ecc309:/src/mac/window.cpp?ds=sidebyside diff --git a/src/mac/window.cpp b/src/mac/window.cpp index b3b459a0d3..48ac3429cf 100644 --- a/src/mac/window.cpp +++ b/src/mac/window.cpp @@ -413,11 +413,19 @@ void wxWindow::MacRootWindowToClient( int *x , int *y ) const bool wxWindow::SetCursor(const wxCursor& cursor) { - if ( !wxWindowBase::SetCursor(cursor) ) - { - // no change + if (m_cursor == cursor) return FALSE; - } + + if (wxNullCursor == cursor) + { + if ( ! wxWindowBase::SetCursor( *wxSTANDARD_CURSOR ) ) + return FALSE ; + } + else + { + if ( ! wxWindowBase::SetCursor( cursor ) ) + return FALSE ; + } wxASSERT_MSG( m_cursor.Ok(), wxT("cursor must be valid after call to the base version")); @@ -432,7 +440,7 @@ bool wxWindow::SetCursor(const wxCursor& cursor) { if ( mouseWin == this && !wxIsBusy() ) { - cursor.MacInstall() ; + m_cursor.MacInstall() ; } } @@ -902,6 +910,10 @@ void wxWindow::Refresh(bool eraseBack, const wxRect *rect) } InvalWindowRect( GetMacRootWindow() , &clientrect ) ; } + if ( !eraseBack ) + m_macEraseOnRedraw = false ; + else + m_macEraseOnRedraw = true ; } // Responds to colour changes: passes event on to children. @@ -1767,6 +1779,9 @@ void wxWindow::MacRedraw( RgnHandle updatergn , long time) { // updatergn is always already clipped to our boundaries WindowRef window = GetMacRootWindow() ; + // ownUpdateRgn is the area that this window has to invalidate i.e. its own area without its children + RgnHandle ownUpdateRgn = NewRgn() ; + CopyRgn( updatergn , ownUpdateRgn ) ; wxWindow* win = wxFindWinFromMacWindow( window ) ; { wxMacDrawingHelper focus( this ) ; // was client @@ -1831,25 +1846,45 @@ void wxWindow::MacRedraw( RgnHandle updatergn , long time) { RGBBackColor( &m_backgroundColour.GetPixel()) ; } + // subtract all non transparent children from updatergn + + RgnHandle childarea = NewRgn() ; + for (wxNode *node = GetChildren().First(); node; node = node->Next()) + { + wxWindow *child = (wxWindow*)node->Data(); + // eventually test for transparent windows + if ( child->GetMacRootWindow() == window && child->IsShown() ) + { + if ( !child->IsKindOf( CLASSINFO( wxNotebook ) ) && !child->IsKindOf( CLASSINFO( wxTabCtrl ) ) ) + { + SetRectRgn( childarea , child->m_x , child->m_y , child->m_x + child->m_width , child->m_y + child->m_height ) ; + DiffRgn( ownUpdateRgn , childarea , ownUpdateRgn ) ; + } + } + } + DisposeRgn( childarea ) ; + if ( GetParent() && m_backgroundColour != GetParent()->GetBackgroundColour() ) eraseBackground = true ; SetClip( updatergn ) ; - if ( eraseBackground && m_macEraseOnRedraw ) - { - // todo : find a clever algorithm, which only will do this - // if really necessary - EraseRgn( updatergn ) ; - } + if ( m_macEraseOnRedraw ) { + if ( eraseBackground ) + { + EraseRgn( ownUpdateRgn ) ; + } + } + else { + m_macEraseOnRedraw = true ; + } } - m_macUpdateRgn = updatergn ; { RgnHandle newupdate = NewRgn() ; wxSize point = GetClientSize() ; wxPoint origin = GetClientAreaOrigin() ; SetRectRgn( newupdate , origin.x , origin.y , origin.x + point.x , origin.y+point.y ) ; - SectRgn( newupdate , m_macUpdateRgn , newupdate ) ; + SectRgn( newupdate , ownUpdateRgn , newupdate ) ; OffsetRgn( newupdate , -origin.x , -origin.y ) ; m_updateRegion = newupdate ; DisposeRgn( newupdate ) ; @@ -1869,7 +1904,7 @@ void wxWindow::MacRedraw( RgnHandle updatergn , long time) { wxWindow *child = (wxWindow*)node->Data(); SetRectRgn( childupdate , child->m_x , child->m_y , child->m_x + child->m_width , child->m_y + child->m_height ) ; - SectRgn( childupdate , m_macUpdateRgn , childupdate ) ; + SectRgn( childupdate , updatergn , childupdate ) ; OffsetRgn( childupdate , -child->m_x , -child->m_y ) ; if ( child->GetMacRootWindow() == window && child->IsShown() && !EmptyRgn( childupdate ) ) {