From 0dd9b9e2be1809f484b6447ad9525fa5b404ad95 Mon Sep 17 00:00:00 2001 From: Robin Dunn Date: Thu, 13 Dec 2007 20:56:15 +0000 Subject: [PATCH] Applied patch [ 1845819 ] wxMSW Top level window freeze fix for trunk git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@50681 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/msw/toplevel.h | 6 +++++ include/wx/msw/window.h | 7 +++-- src/msw/toplevel.cpp | 54 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 65 insertions(+), 2 deletions(-) diff --git a/include/wx/msw/toplevel.h b/include/wx/msw/toplevel.h index 82379ad36d..3938b96e62 100644 --- a/include/wx/msw/toplevel.h +++ b/include/wx/msw/toplevel.h @@ -75,6 +75,12 @@ public: virtual bool SetTransparent(wxByte alpha); virtual bool CanSetTransparent(); + //Top level windows have different freeze semantics on Windows + virtual void Freeze(); + virtual void Thaw(); + + virtual void AddChild( wxWindowBase *child ); + // implementation from now on // -------------------------- diff --git a/include/wx/msw/window.h b/include/wx/msw/window.h index 86bd78cda3..dd35d7fd88 100644 --- a/include/wx/msw/window.h +++ b/include/wx/msw/window.h @@ -555,8 +555,7 @@ private: bool HandleNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result); - // number of calls to Freeze() minus number of calls to Thaw() - unsigned int m_frozenness; + // current defer window position operation handle (may be NULL) WXHANDLE m_hDWP; @@ -568,6 +567,10 @@ protected: wxPoint m_pendingPosition; wxSize m_pendingSize; + // number of calls to Freeze() minus number of calls to Thaw() + // protected so that wxTopLevelWindowMSW can access it + unsigned int m_frozenness; + private: #ifdef __POCKETPC__ bool m_contextMenuEnabled; diff --git a/src/msw/toplevel.cpp b/src/msw/toplevel.cpp index 7c9fd6c588..57e85c3913 100644 --- a/src/msw/toplevel.cpp +++ b/src/msw/toplevel.cpp @@ -1170,6 +1170,60 @@ bool wxTopLevelWindowMSW::CanSetTransparent() return (os_type == wxOS_WINDOWS_NT && ver_major >= 5); } + +void wxTopLevelWindowMSW::Freeze() +{ + if ( !m_frozenness++) { + if (IsShown()) { + for ( wxWindowList::compatibility_iterator node = GetChildren().GetFirst(); + node; + node = node->GetNext() ) + { + wxWindow *child = node->GetData(); + if ( child->IsTopLevel() ) + continue; + else + child->Freeze(); + } + } + } +} + +void wxTopLevelWindowMSW::Thaw() +{ + wxASSERT_MSG( m_frozenness > 0, _T("Thaw() without matching Freeze()") ); + if ( --m_frozenness == 0 ) + { + if ( IsShown() ) { + for ( wxWindowList::compatibility_iterator node = GetChildren().GetFirst(); + node; + node = node->GetNext() ) + { + wxWindow *child = node->GetData(); + if ( child->IsTopLevel() ) + continue; + else + child->Thaw(); + } + } + } +} + + +void wxTopLevelWindowMSW::AddChild(wxWindowBase *child ) +{ + //adding a child while frozen will assert when thawn, + // so freeze it + if (child && !child->IsTopLevel() && IsFrozen()) { + //need to match our current freeze level + for (unsigned int ii=0;ii< m_frozenness;ii++) { + child->Freeze(); + } + } + wxTopLevelWindowBase::AddChild(child); +} + + // ---------------------------------------------------------------------------- // wxTopLevelWindow event handling // ---------------------------------------------------------------------------- -- 2.45.2