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"));
{
if ( mouseWin == this && !wxIsBusy() )
{
- cursor.MacInstall() ;
+ m_cursor.MacInstall() ;
}
}
}
InvalWindowRect( GetMacRootWindow() , &clientrect ) ;
}
+ if ( !eraseBack )
+ m_macEraseOnRedraw = false ;
+ else
+ m_macEraseOnRedraw = true ;
}
// Responds to colour changes: passes event on to children.
{
// 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
{
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 ) ;
{
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 ) )
{
Rect portRect ;
GetPortBounds( m_currentPort , &portRect ) ;
ClipRect( &portRect ) ;
- wxDC::MacInvalidateSetup() ;
}
if ( m_formerPort != m_currentPort )