X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/360a4636ddfe9ff74fb80c2fdd6cb352d8ee11f6..49a91764b57168d9f441578001b3206a7330ee70:/src/mac/window.cpp diff --git a/src/mac/window.cpp b/src/mac/window.cpp index 40ade4f268..62f65318ea 100644 --- a/src/mac/window.cpp +++ b/src/mac/window.cpp @@ -15,6 +15,7 @@ #include "wx/setup.h" #include "wx/menu.h" +#include "wx/window.h" #include "wx/dc.h" #include "wx/dcclient.h" #include "wx/utils.h" @@ -33,9 +34,6 @@ #include "wx/tabctrl.h" #include "wx/tooltip.h" #include "wx/statusbr.h" -// TODO remove the line below, just for lookup-up convenience CS -#include "wx/window.h" - #include "wx/menuitem.h" #include "wx/log.h" @@ -110,11 +108,15 @@ void wxRemoveMacWindowAssociation(wxWindow *win) // constructors and such // ---------------------------------------------------------------------------- +WindowRef wxWindow::s_macWindowInUpdate = NULL; + void wxWindow::Init() { // generic InitBase(); + m_macEraseOnRedraw = true ; + // MSW specific m_doubleClickAllowed = 0; m_winCaptured = FALSE; @@ -132,6 +134,7 @@ void wxWindow::Init() m_isShown = TRUE; m_macWindowData = NULL ; + m_macEraseOnRedraw = true ; m_x = 0; m_y = 0 ; @@ -149,6 +152,20 @@ void wxWindow::Init() // Destructor wxWindow::~wxWindow() { + // deleting a window while it is shown invalidates the region + if ( IsShown() ) { + wxWindow* iter = this ; + while( iter ) { + if ( iter->m_macWindowData ) + { + Refresh() ; + break ; + } + iter = iter->GetParent() ; + + } + } + m_isBeingDeleted = TRUE; if ( s_lastMouseWindow == this ) @@ -279,6 +296,11 @@ void wxWindow::CaptureMouse() wxTheApp->s_captureWindow = this ; } +wxWindow* wxWindowBase::GetCapture() +{ + return wxTheApp->s_captureWindow ; +} + void wxWindow::ReleaseMouse() { wxTheApp->s_captureWindow = NULL ; @@ -410,11 +432,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")); @@ -429,7 +459,7 @@ bool wxWindow::SetCursor(const wxCursor& cursor) { if ( mouseWin == this && !wxIsBusy() ) { - cursor.MacInstall() ; + m_cursor.MacInstall() ; } } @@ -618,7 +648,7 @@ void wxWindow::DoSetSize(int x, int y, int width, int height, int sizeFlags) if ( focus.Ok() ) { Rect clientrect = { 0 , 0 , m_height , m_width } ; - ClipRect( &clientrect ) ; + // ClipRect( &clientrect ) ; InvalWindowRect( GetMacRootWindow() , &clientrect ) ; } } @@ -653,7 +683,7 @@ void wxWindow::DoSetSize(int x, int y, int width, int height, int sizeFlags) if ( focus.Ok() ) { Rect clientrect = { 0 , 0 , m_height , m_width } ; - ClipRect( &clientrect ) ; + // ClipRect( &clientrect ) ; InvalWindowRect( GetMacRootWindow() , &clientrect ) ; } } @@ -664,16 +694,18 @@ void wxWindow::DoSetSize(int x, int y, int width, int height, int sizeFlags) MacRepositionScrollBars() ; if ( doMove ) { - wxMoveEvent event(wxPoint(m_x, m_y), m_windowId); + wxPoint point(m_x, m_y); + wxMoveEvent event(point, m_windowId); event.SetEventObject(this); GetEventHandler()->ProcessEvent(event) ; } if ( doResize ) { - MacRepositionScrollBars() ; - wxSizeEvent event(wxSize(m_width, m_height), m_windowId); - event.SetEventObject(this); - GetEventHandler()->ProcessEvent(event); + MacRepositionScrollBars() ; + wxSize size(m_width, m_height); + wxSizeEvent event(size, m_windowId); + event.SetEventObject(this); + GetEventHandler()->ProcessEvent(event); } } } @@ -732,7 +764,8 @@ bool wxWindow::Show(bool show) UMASelectWindow( m_macWindowData->m_macWindow ) ; // no need to generate events here, they will get them triggered by macos // actually they should be , but apparently they are not - wxSizeEvent event(wxSize(m_width, m_height), m_windowId); + wxSize size(m_width, m_height); + wxSizeEvent event(size, m_windowId); event.SetEventObject(this); GetEventHandler()->ProcessEvent(event); } @@ -743,8 +776,6 @@ bool wxWindow::Show(bool show) } MacSuperShown( show ) ; Refresh() ; - if(m_macWindowData) - MacUpdateImmediately() ; return TRUE; } @@ -763,6 +794,11 @@ void wxWindow::MacSuperShown( bool show ) bool wxWindow::MacIsReallyShown() const { + if ( m_isShown && (m_parent != NULL) ) { + return m_parent->MacIsReallyShown(); + } + return m_isShown; +/* bool status = m_isShown ; wxWindow * win = this ; while ( status && win->m_parent != NULL ) @@ -771,6 +807,7 @@ bool wxWindow::MacIsReallyShown() const status = win->m_isShown ; } return status ; +*/ } int wxWindow::GetCharHeight() const @@ -794,7 +831,7 @@ void wxWindow::GetTextExtent(const wxString& string, int *x, int *y, wxClientDC dc( (wxWindow*) this ) ; long lx,ly,ld,le ; - dc.GetTextExtent( string , &lx , &ly , &ld, &le, fontToUse ) ; + dc.GetTextExtent( string , &lx , &ly , &ld, &le, (wxFont *)fontToUse ) ; if ( externalLeading ) *externalLeading = le ; if ( descent ) @@ -807,6 +844,7 @@ void wxWindow::GetTextExtent(const wxString& string, int *x, int *y, void wxWindow::MacEraseBackground( Rect *rect ) { +/* WindowRef window = GetMacRootWindow() ; if ( m_backgroundColour == wxSystemSettings::GetSystemColour(wxSYS_COLOUR_APPWORKSPACE) ) { @@ -874,15 +912,19 @@ void wxWindow::MacEraseBackground( Rect *rect ) } } } +*/ } void wxWindow::Refresh(bool eraseBack, const wxRect *rect) { +// if ( !IsShown() ) +// return ; + wxMacDrawingHelper focus( this ) ; if ( focus.Ok() ) { Rect clientrect = { 0 , 0 , m_height , m_width } ; - ClipRect( &clientrect ) ; + // ClipRect( &clientrect ) ; if ( rect ) { @@ -891,6 +933,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. @@ -1118,6 +1164,7 @@ void wxWindow::MacCreateRealWindow( const wxString& title, UMACreateRootControl( m_macWindowData->m_macWindow , &m_macWindowData->m_macRootControl ) ; m_macWindowData->m_macFocus = NULL ; + m_macWindowData->m_macHasReceivedFirstActivate = true ; } void wxWindow::MacPaint( wxPaintEvent &event ) @@ -1254,7 +1301,7 @@ void wxWindow::SetScrollbar(int orient, int pos, int thumbVisible, { if ( !m_hScrollBar->IsShown() ) m_hScrollBar->Show(true) ; - m_hScrollBar->SetScrollbar( pos , thumbVisible , range , refresh ) ; + m_hScrollBar->SetScrollbar( pos , thumbVisible , range , thumbVisible , refresh ) ; } } } @@ -1271,7 +1318,7 @@ void wxWindow::SetScrollbar(int orient, int pos, int thumbVisible, { if ( !m_vScrollBar->IsShown() ) m_vScrollBar->Show(true) ; - m_vScrollBar->SetScrollbar( pos , thumbVisible , range , refresh ) ; + m_vScrollBar->SetScrollbar( pos , thumbVisible , range , thumbVisible , refresh ) ; } } } @@ -1476,13 +1523,19 @@ void wxWindow::OnIdle(wxIdleEvent& event) // Raise the window to the top of the Z order void wxWindow::Raise() { - // TODO + if ( m_macWindowData ) + { + UMABringToFront( m_macWindowData->m_macWindow ) ; + } } // Lower the window to the bottom of the Z order void wxWindow::Lower() { - // TODO + if ( m_macWindowData ) + { + UMASendBehind( m_macWindowData->m_macWindow , NULL ) ; + } } void wxWindow::DoSetClientSize(int width, int height) @@ -1669,8 +1722,12 @@ void wxWindow::MacFireMouseEvent( EventRecord *ev ) else event.SetEventType(wxEVT_LEFT_DCLICK ) ; } + lastWhen = 0 ; + } + else + { + lastWhen = ev->when ; } - lastWhen = ev->when ; lastWhere = localwhere ; } @@ -1743,19 +1800,27 @@ void wxWindow::MacMouseMoved( EventRecord *ev , short part) } void wxWindow::MacActivate( EventRecord *ev , bool inIsActivating ) { - wxActivateEvent event(wxEVT_ACTIVATE, inIsActivating); + if ( !m_macWindowData->m_macHasReceivedFirstActivate ) + m_macWindowData->m_macHasReceivedFirstActivate = true ; + + wxActivateEvent event(wxEVT_ACTIVATE, inIsActivating , m_windowId); event.m_timeStamp = ev->when ; event.SetEventObject(this); GetEventHandler()->ProcessEvent(event); + Refresh(false) ; UMAHighlightAndActivateWindow( m_macWindowData->m_macWindow , inIsActivating ) ; +// MacUpdateImmediately() ; } 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 @@ -1820,23 +1885,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->GetBackgroundColour() != m_backgroundColour && !child->IsKindOf( CLASSINFO( wxControl ) ) && ((wxControl*)child)->GetMacControl() ) + { + 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 ) - { - EraseRgn( updatergn ) ; - } + SetClip( ownUpdateRgn ) ; + 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 ) ; @@ -1856,7 +1943,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 ) ) { @@ -1890,7 +1977,7 @@ void wxWindow::MacUpdateImmediately() GetPortVisibleRegion( GetWindowPort( window ), region ); // if windowshade gives incompatibility , take the follwing out - if ( !EmptyRgn( region ) ) + if ( !EmptyRgn( region ) && win->m_macWindowData->m_macHasReceivedFirstActivate ) { win->MacRedraw( region , wxTheApp->sm_lastMessageTime ) ; } @@ -1921,7 +2008,7 @@ void wxWindow::MacUpdate( EventRecord *ev ) GetPortVisibleRegion( GetWindowPort( window ), region ); // if windowshade gives incompatibility , take the follwing out - if ( !EmptyRgn( region ) ) + if ( !EmptyRgn( region ) && win->m_macWindowData->m_macHasReceivedFirstActivate ) { MacRedraw( region , ev->when ) ; } @@ -2340,7 +2427,6 @@ wxMacDrawingHelper::~wxMacDrawingHelper() Rect portRect ; GetPortBounds( m_currentPort , &portRect ) ; ClipRect( &portRect ) ; - wxDC::MacInvalidateSetup() ; } if ( m_formerPort != m_currentPort )