From: Václav Slavík Date: Fri, 8 Sep 2006 11:52:02 +0000 (+0000) Subject: don't try to paint hidden windows X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/14ac4e3a8e8b07360b59be2f49451e85c81d6f7e don't try to paint hidden windows git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@41068 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/src/dfb/toplevel.cpp b/src/dfb/toplevel.cpp index 2a115daad1..ffa3dcaaac 100644 --- a/src/dfb/toplevel.cpp +++ b/src/dfb/toplevel.cpp @@ -50,7 +50,30 @@ struct wxDfbPaintRequest bool m_eraseBackground; }; -WX_DEFINE_ARRAY_PTR(wxDfbPaintRequest*, wxDfbQueuedPaintRequests); +WX_DEFINE_ARRAY_PTR(wxDfbPaintRequest*, wxDfbQueuedPaintRequestsList); + +// Queue of paint requests +class wxDfbQueuedPaintRequests +{ +public: + ~wxDfbQueuedPaintRequests() { Clear(); } + + // Adds paint request to the queue + void Add(const wxRect& rect, bool eraseBack) + { m_queue.push_back(new wxDfbPaintRequest(rect, eraseBack)); } + + // Is the queue empty? + bool IsEmpty() const { return m_queue.empty(); } + + // Empties the queue + void Clear() { WX_CLEAR_ARRAY(m_queue); } + + // Gets requests in the queue + const wxDfbQueuedPaintRequestsList& GetRequests() const { return m_queue; } + +private: + wxDfbQueuedPaintRequestsList m_queue; +}; // ============================================================================ // wxTopLevelWindowDFB @@ -159,7 +182,6 @@ wxTopLevelWindowDFB::~wxTopLevelWindowDFB() wxTheApp->ExitMainLoop(); } - WX_CLEAR_ARRAY(*m_toPaint); wxDELETE(m_toPaint); // remove the TLW from DFBWindowID->wxTLW map: @@ -335,18 +357,28 @@ wxIDirectFBSurfacePtr wxTopLevelWindowDFB::ObtainDfbSurface() const void wxTopLevelWindowDFB::HandleQueuedPaintRequests() { - wxDfbQueuedPaintRequests& toPaint = *m_toPaint; - if ( toPaint.empty() ) + if ( m_toPaint->IsEmpty() ) return; // nothing to do + if ( IsFrozen() || !IsShown() ) + { + // nothing to do if the window is frozen or hidden; clear the queue + // and return (note that it's OK to clear the queue even if the window + // is frozen, because Thaw() calls Refresh()): + m_toPaint->Clear(); + return; + } + + const wxDfbQueuedPaintRequestsList& requests = m_toPaint->GetRequests(); + // process queued paint requests: wxRect winRect(wxPoint(0, 0), GetSize()); wxRect paintedRect; - size_t cnt = toPaint.size(); + size_t cnt = requests.size(); for ( size_t i = 0; i < cnt; ++i ) { - const wxDfbPaintRequest& request = *toPaint[i]; + const wxDfbPaintRequest& request = *requests[i]; wxRect clipped(request.m_rect); @@ -368,7 +400,7 @@ void wxTopLevelWindowDFB::HandleQueuedPaintRequests() paintedRect.Union(clipped); } - WX_CLEAR_ARRAY(toPaint); + m_toPaint->Clear(); if ( paintedRect.IsEmpty() ) return; // no painting occurred, no need to flip @@ -383,8 +415,8 @@ void wxTopLevelWindowDFB::HandleQueuedPaintRequests() void wxTopLevelWindowDFB::DoRefreshRect(const wxRect& rect, bool eraseBack) { - // defer paiting until idle time or until Update() is called: - m_toPaint->push_back(new wxDfbPaintRequest(rect, eraseBack)); + // defer painting until idle time or until Update() is called: + m_toPaint->Add(rect, eraseBack); } void wxTopLevelWindowDFB::Update() diff --git a/src/dfb/window.cpp b/src/dfb/window.cpp index bd9f6cdce5..014e7c32be 100644 --- a/src/dfb/window.cpp +++ b/src/dfb/window.cpp @@ -646,11 +646,10 @@ void wxWindowDFB::Thaw() void wxWindowDFB::PaintWindow(const wxRect& rect, bool eraseBackground) { - if ( IsFrozen() ) - return; // don't paint anything if the window is frozen + wxCHECK_RET( !IsFrozen() && IsShown(), _T("shouldn't be called") ); wxLogTrace(TRACE_PAINT, - _T("%p ('%s'): paiting region [x=%i,y=%i,w=%i,h=%i]"), + _T("%p ('%s'): painting region [x=%i,y=%i,w=%i,h=%i]"), this, GetName().c_str(), rect.x, rect.y, rect.width, rect.height); @@ -694,6 +693,9 @@ void wxWindowDFB::PaintWindow(const wxRect& rect, bool eraseBackground) { wxWindow *child = *i; + if ( child->IsFrozen() || !child->IsShown() ) + continue; // don't paint anything if the window is frozen or hidden + // compute child's area to repaint wxRect childrect(child->GetRect()); childrect.Offset(origin);