X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a3bf7524f394af039efe196a186f7969cbabcc19..b77b87881bae2e6306366d79e7fe160334b3d4a2:/src/mac/window.cpp?ds=sidebyside diff --git a/src/mac/window.cpp b/src/mac/window.cpp index 51406e6bb7..6a23f1cab3 100644 --- a/src/mac/window.cpp +++ b/src/mac/window.cpp @@ -100,10 +100,6 @@ END_EVENT_TABLE() void wxWindowMac::Init() { - // generic - InitBase(); - - m_isBeingDeleted = FALSE; m_backgroundTransparent = FALSE; // as all windows are created with WS_VISIBLE style... @@ -116,8 +112,6 @@ void wxWindowMac::Init() m_hScrollBar = NULL ; m_vScrollBar = NULL ; - - m_label = wxEmptyString; } // Destructor @@ -174,15 +168,8 @@ wxWindowMac::~wxWindowMac() gFocusWindow = NULL ; } - // CS: copied from MSW : - // VS: destroy children first and _then_ detach *this from its parent. - // If we'd do it the other way around, children wouldn't be able - // find their parent frame (see above). DestroyChildren(); - if ( m_parent ) - m_parent->RemoveChild(this); - // delete our drop target if we've got one #if wxUSE_DRAG_AND_DROP if ( m_dropTarget != NULL ) @@ -634,7 +621,7 @@ void wxWindowMac::DoMoveWindow(int x, int y, int width, int height) bool partialRepaint = false ; - if ( HasFlag(wxNO_FULL_REPAINT_ON_RESIZE) ) + if ( !HasFlag(wxFULL_REPAINT_ON_RESIZE) ) { wxPoint oldPos( m_x , m_y ) ; wxPoint newPos( actualX , actualY ) ; @@ -1189,10 +1176,14 @@ void wxWindowMac::SetScrollbar(int orient, int pos, int thumbVisible, // Does a physical scroll void wxWindowMac::ScrollWindow(int dx, int dy, const wxRect *rect) { - wxClientDC dc(this) ; - wxMacPortSetter helper(&dc) ; + if( dx == 0 && dy ==0 ) + return ; + { + wxClientDC dc(this) ; + wxMacPortSetter helper(&dc) ; + int width , height ; GetClientSize( &width , &height ) ; @@ -1206,8 +1197,27 @@ void wxWindowMac::ScrollWindow(int dx, int dy, const wxRect *rect) SectRect( &scrollrect , &r , &scrollrect ) ; } ScrollRect( &scrollrect , dx , dy , updateRgn ) ; - InvalWindowRgn( (WindowRef) MacGetRootWindow() , updateRgn ) ; + // we also have to scroll the update rgn in this rectangle + // in order not to loose updates + WindowRef rootWindow = (WindowRef) MacGetRootWindow() ; + RgnHandle formerUpdateRgn = NewRgn() ; + RgnHandle scrollRgn = NewRgn() ; + RectRgn( scrollRgn , &scrollrect ) ; + GetWindowUpdateRgn( rootWindow , formerUpdateRgn ) ; + Point pt = {0,0} ; + LocalToGlobal( &pt ) ; + OffsetRgn( formerUpdateRgn , -pt.h , -pt.v ) ; + SectRgn( formerUpdateRgn , scrollRgn , formerUpdateRgn ) ; + if ( !EmptyRgn( formerUpdateRgn ) ) + { + MacOffsetRgn( formerUpdateRgn , dx , dy ) ; + SectRgn( formerUpdateRgn , scrollRgn , formerUpdateRgn ) ; + InvalWindowRgn(rootWindow , formerUpdateRgn ) ; + } + InvalWindowRgn(rootWindow , updateRgn ) ; DisposeRgn( updateRgn ) ; + DisposeRgn( formerUpdateRgn ) ; + DisposeRgn( scrollRgn ) ; } for (wxWindowListNode *node = GetChildren().GetFirst(); node; node = node->GetNext()) @@ -1223,6 +1233,8 @@ void wxWindowMac::ScrollWindow(int dx, int dy, const wxRect *rect) child->GetSize( &w, &h ); child->SetSize( x+dx, y+dy, w, h ); } + + Update() ; } @@ -1523,17 +1535,34 @@ wxString wxWindowMac::MacGetToolTipString( wxPoint &pt ) void wxWindowMac::Update() { - wxTopLevelWindowMac* win = MacGetTopLevelWindow( ) ; - if ( win ) - { - win->MacUpdate( 0 ) ; + wxRegion visRgn = MacGetVisibleRegion( false ) ; + int top = 0 , left = 0 ; + MacWindowToRootWindow( &left , &top ) ; + WindowRef rootWindow = (WindowRef) MacGetRootWindow() ; + RgnHandle updateRgn = NewRgn() ; + // getting the update region in macos local coordinates + GetWindowUpdateRgn( rootWindow , updateRgn ) ; + GrafPtr port ; + ::GetPort( &port ) ; + ::SetPort( UMAGetWindowPort( rootWindow ) ) ; + Point pt = {0,0} ; + LocalToGlobal( &pt ) ; + ::SetPort( port ) ; + OffsetRgn( updateRgn , -pt.h , -pt.v ) ; + // translate to window local coordinates + OffsetRgn( updateRgn , -left , -top ) ; + SectRgn( updateRgn , (RgnHandle) visRgn.GetWXHRGN() , updateRgn ) ; + MacRedraw( updateRgn , 0 , true ) ; + // for flushing and validating we need macos-local coordinates again + OffsetRgn( updateRgn , left , top ) ; #if TARGET_API_MAC_CARBON - if ( QDIsPortBuffered( GetWindowPort( (WindowRef) win->MacGetWindowRef() ) ) ) - { - QDFlushPortBuffer( GetWindowPort( (WindowRef) win->MacGetWindowRef() ) , NULL ) ; - } + if ( QDIsPortBuffered( GetWindowPort( rootWindow ) ) ) + { + QDFlushPortBuffer( GetWindowPort( rootWindow ) , updateRgn ) ; + } #endif - } + ValidWindowRgn( rootWindow , updateRgn ) ; + DisposeRgn( updateRgn ) ; } wxTopLevelWindowMac* wxWindowMac::MacGetTopLevelWindow() const @@ -1691,10 +1720,32 @@ void wxWindowMac::MacRedraw( WXHRGN updatergnr , long time, bool erase) DisposeRgn( ownUpdateRgn ) ; if ( !m_updateRegion.Empty() ) { + wxWindowList hiddenWindows ; + for (wxWindowListNode *node = GetChildren().GetFirst(); node; node = node->GetNext()) + { + wxControl *child = wxDynamicCast( ( wxWindow*)node->GetData() , wxControl ) ; + + if ( child && child->MacGetRootWindow() == window && child->IsShown() && child->GetMacControl() ) + { + SetControlVisibility( (ControlHandle) child->GetMacControl() , false , false ) ; + hiddenWindows.Append( child ) ; + } + } + wxPaintEvent event; event.m_timeStamp = time ; event.SetEventObject(this); GetEventHandler()->ProcessEvent(event); + + for (wxWindowListNode *node = hiddenWindows.GetFirst(); node; node = node->GetNext()) + { + wxControl *child = wxDynamicCast( ( wxWindow*)node->GetData() , wxControl ) ; + + if ( child && child->GetMacControl() ) + { + SetControlVisibility( (ControlHandle) child->GetMacControl() , true , false ) ; + } + } } }