avoid GDK assertion "impl_window->update_freeze_count > 0" on Ubuntu when enabling frozen window
closes #16795 git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_3_0_BRANCH@78474 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -3267,13 +3267,52 @@ bool wxWindowGTK::Show( bool show )
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool GetFrozen(wxWindowGTK* win, wxVector<wxWindowGTK*>& vector)
|
||||
{
|
||||
bool scroll =
|
||||
GTK_IS_SCROLLED_WINDOW(win->m_widget) || GTK_IS_SCROLLBAR(win->m_widget);
|
||||
|
||||
if (win->IsFrozen())
|
||||
vector.push_back(win);
|
||||
|
||||
wxWindowList& children = win->GetChildren();
|
||||
for (wxWindowList::iterator i = children.begin(); i != children.end(); ++i)
|
||||
{
|
||||
if (GetFrozen(*i, vector))
|
||||
scroll = true;
|
||||
}
|
||||
|
||||
return scroll;
|
||||
}
|
||||
|
||||
void wxWindowGTK::DoEnable( bool enable )
|
||||
{
|
||||
wxCHECK_RET( (m_widget != NULL), wxT("invalid window") );
|
||||
|
||||
wxVector<wxWindowGTK*> frozen;
|
||||
if (enable)
|
||||
{
|
||||
// Ubuntu overlay scrollbar can cause GdkWindow.impl_window to change
|
||||
// (by indirectly invoking gdk_window_ensure_native()), which messes up
|
||||
// the freeze count. Avoid this by temporarily un-freezing window hierarchy.
|
||||
if (GetFrozen(this, frozen))
|
||||
{
|
||||
for (unsigned i = frozen.size(); i--;)
|
||||
frozen[i]->DoThaw();
|
||||
}
|
||||
else
|
||||
frozen.clear();
|
||||
}
|
||||
|
||||
gtk_widget_set_sensitive( m_widget, enable );
|
||||
if (m_wxwindow && (m_wxwindow != m_widget))
|
||||
gtk_widget_set_sensitive( m_wxwindow, enable );
|
||||
|
||||
if (enable)
|
||||
{
|
||||
for (unsigned i = frozen.size(); i--;)
|
||||
frozen[i]->DoFreeze();
|
||||
}
|
||||
}
|
||||
|
||||
int wxWindowGTK::GetCharHeight() const
|
||||
|
Reference in New Issue
Block a user