X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/30c841c84dce46690499567141b98ffcf5a61b6a..af717fa87a47084b4faa3d6e5dcabc6cdf3ff36f:/src/dfb/window.cpp diff --git a/src/dfb/window.cpp b/src/dfb/window.cpp index 70ee921266..f82ffb8ed6 100644 --- a/src/dfb/window.cpp +++ b/src/dfb/window.cpp @@ -28,6 +28,7 @@ #ifndef WX_PRECOMP #include "wx/dcclient.h" + #include "wx/nonownedwnd.h" #endif #include "wx/caret.h" @@ -93,25 +94,6 @@ wxWindowDFB::~wxWindowDFB() if ( gs_mouseCapture == this ) ReleaseMouse(); -#warning "FIXME: what to do with gs_activeFrame here and elsewhere?" -#if 0 - if (gs_activeFrame == this) - { - gs_activeFrame = NULL; - // activate next frame in Z-order: - if ( m_wnd->prev ) - { - wxWindowDFB *win = (wxWindowDFB*)m_wnd->prev->userData; - win->SetFocus(); - } - else if ( m_wnd->next ) - { - wxWindowDFB *win = (wxWindowDFB*)m_wnd->next->userData; - win->SetFocus(); - } - } -#endif - if ( gs_focusedWindow == this ) DFBKillFocus(); @@ -212,7 +194,8 @@ void wxWindowDFB::SetFocus() gs_focusedWindow = this; - if ( IsShownOnScreen() ) + if ( IsShownOnScreen() && + (!oldFocusedWindow || oldFocusedWindow->GetTLW() != m_tlw) ) { m_tlw->SetDfbFocus(); } @@ -220,26 +203,6 @@ void wxWindowDFB::SetFocus() // are hidden; when the TLW becomes visible, it will set the focus // to use from wxTLW::Show() - #warning "FIXME: implement in terms of DWET_{GOT,LOST}FOCUS" - #warning "FIXME: keep this or not? not, think multiapp core" -#if 0 - wxWindowDFB *active = wxGetTopLevelParent((wxWindow*)this); - if ( !(m_windowStyle & wxPOPUP_WINDOW) && active != gs_activeFrame ) - { - if ( gs_activeFrame ) - { - wxActivateEvent event(wxEVT_ACTIVATE, false, gs_activeFrame->GetId()); - event.SetEventObject(gs_activeFrame); - gs_activeFrame->GetEventHandler()->ProcessEvent(event); - } - - gs_activeFrame = active; - wxActivateEvent event(wxEVT_ACTIVATE, true, gs_activeFrame->GetId()); - event.SetEventObject(gs_activeFrame); - gs_activeFrame->GetEventHandler()->ProcessEvent(event); - } -#endif - // notify the parent keeping track of focus for the kbd navigation // purposes that we got it wxChildFocusEvent eventFocus((wxWindow*)this); @@ -300,30 +263,6 @@ bool wxWindowDFB::Show(bool show) // parent area at the place of this window (if hiding): DoRefreshWindow(); -#warning "FIXME: all of this must be implemented for DFB" -#if 0 - DFB_wmShowWindow(m_wnd, show); - - if (!show && gs_activeFrame == this) - { - // activate next frame in Z-order: - if ( m_wnd->prev ) - { - wxWindowDFB *win = (wxWindowDFB*)m_wnd->prev->userData; - win->SetFocus(); - } - else if ( m_wnd->next ) - { - wxWindowDFB *win = (wxWindowDFB*)m_wnd->next->userData; - win->SetFocus(); - } - else - { - gs_activeFrame = NULL; - } - } -#endif - return true; } @@ -492,6 +431,15 @@ void wxWindowDFB::DoMoveWindow(int x, int y, int width, int height) { // queue both former and new position of the window for repainting: wxWindow *parent = GetParent(); + + // only refresh the visible parts: + if ( !CanBeOutsideClientArea() ) + { + wxRect parentClient(parent->GetClientSize()); + oldpos.Intersect(parentClient); + newpos.Intersect(parentClient); + } + parent->RefreshRect(oldpos); parent->RefreshRect(newpos); } @@ -682,6 +630,11 @@ void wxWindowDFB::DoRefreshRect(const wxRect& rect) r.Offset(GetPosition()); r.Offset(parent->GetClientAreaOrigin()); + // normal windows cannot extend out of its parent's client area, so don't + // refresh any hidden parts: + if ( !CanBeOutsideClientArea() ) + r.Intersect(parent->GetClientRect()); + parent->DoRefreshRect(r); } @@ -763,6 +716,10 @@ void wxWindowDFB::PaintWindow(const wxRect& rect) m_updateRegion.Clear(); + // client area portion of 'rect': + wxRect rectClientOnly(rect); + rectClientOnly.Intersect(clientRect); + // paint the children: wxPoint origin = GetClientAreaOrigin(); wxWindowList& children = GetChildren(); @@ -777,7 +734,12 @@ void wxWindowDFB::PaintWindow(const wxRect& rect) // compute child's area to repaint wxRect childrect(child->GetRect()); childrect.Offset(origin); - childrect.Intersect(rect); + + if ( child->CanBeOutsideClientArea() ) + childrect.Intersect(rect); + else + childrect.Intersect(rectClientOnly); + if ( childrect.IsEmpty() ) continue; @@ -796,7 +758,9 @@ void wxWindowDFB::PaintOverlays(const wxRect& rect) for ( wxDfbOverlaysList::const_iterator i = m_overlays->begin(); i != m_overlays->end(); ++i ) { - wxOverlayImpl *overlay = *i; + // FIXME: the cast is necessary for STL build where the iterator + // (incorrectly) returns void* and not wxOverlayImpl* + wxOverlayImpl *overlay = (wxOverlayImpl*) *i; wxRect orectOrig(overlay->GetRect()); wxRect orect(orectOrig);