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
This commit is contained in:
@@ -75,6 +75,12 @@ public:
|
|||||||
virtual bool SetTransparent(wxByte alpha);
|
virtual bool SetTransparent(wxByte alpha);
|
||||||
virtual bool CanSetTransparent();
|
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
|
// implementation from now on
|
||||||
// --------------------------
|
// --------------------------
|
||||||
|
@@ -555,8 +555,7 @@ private:
|
|||||||
bool HandleNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result);
|
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)
|
// current defer window position operation handle (may be NULL)
|
||||||
WXHANDLE m_hDWP;
|
WXHANDLE m_hDWP;
|
||||||
@@ -568,6 +567,10 @@ protected:
|
|||||||
wxPoint m_pendingPosition;
|
wxPoint m_pendingPosition;
|
||||||
wxSize m_pendingSize;
|
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:
|
private:
|
||||||
#ifdef __POCKETPC__
|
#ifdef __POCKETPC__
|
||||||
bool m_contextMenuEnabled;
|
bool m_contextMenuEnabled;
|
||||||
|
@@ -1170,6 +1170,60 @@ bool wxTopLevelWindowMSW::CanSetTransparent()
|
|||||||
return (os_type == wxOS_WINDOWS_NT && ver_major >= 5);
|
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
|
// wxTopLevelWindow event handling
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
Reference in New Issue
Block a user