Partial workaround for stale styling information with GTK3

We can trigger size events when we know the style cache has been updated.
See #16088

(backport of 101c43d0aa)
This commit is contained in:
Paul Cornett
2016-11-02 10:46:57 -07:00
parent 6475376931
commit 4206e4ce1c
2 changed files with 40 additions and 10 deletions

View File

@@ -53,6 +53,7 @@
#endif // wxUSE_LIBHILDON2 #endif // wxUSE_LIBHILDON2
#ifdef __WXGTK3__ #ifdef __WXGTK3__
extern GList* wx_sizeEventList;
void wxGTKSizeRevalidate(wxWindow*); void wxGTKSizeRevalidate(wxWindow*);
#endif #endif
@@ -1049,9 +1050,7 @@ bool wxTopLevelWindowGTK::Show( bool show )
// size_allocate signals occur in reverse order (bottom to top). // size_allocate signals occur in reverse order (bottom to top).
// Things work better if the initial wxSizeEvents are sent (from the // Things work better if the initial wxSizeEvents are sent (from the
// top down), before the initial size_allocate signals occur. // top down), before the initial size_allocate signals occur.
wxSizeEvent event(GetSize(), GetId()); SendSizeEvent();
event.SetEventObject(this);
HandleWindowEvent(event);
#ifdef __WXGTK3__ #ifdef __WXGTK3__
wxGTKSizeRevalidate(this); wxGTKSizeRevalidate(this);
@@ -1060,6 +1059,14 @@ bool wxTopLevelWindowGTK::Show( bool show )
bool change = base_type::Show(show); bool change = base_type::Show(show);
#ifdef __WXGTK3__
if (GList* p = g_list_find(wx_sizeEventList, this))
{
wx_sizeEventList = g_list_delete_link(wx_sizeEventList, p);
SendSizeEvent();
}
#endif
if (change && !show) if (change && !show)
{ {
// make sure window has a non-default position, so when it is shown // make sure window has a non-default position, so when it is shown
@@ -1366,15 +1373,20 @@ void wxTopLevelWindowGTK::GTKUpdateDecorSize(const DecorSize& decorSize)
// gtk_widget_show() was deferred, do it now // gtk_widget_show() was deferred, do it now
m_deferShow = false; m_deferShow = false;
DoGetClientSize(&m_clientWidth, &m_clientHeight); DoGetClientSize(&m_clientWidth, &m_clientHeight);
wxSizeEvent sizeEvent(GetSize(), GetId()); SendSizeEvent();
sizeEvent.SetEventObject(this);
HandleWindowEvent(sizeEvent);
#ifdef __WXGTK3__ #ifdef __WXGTK3__
wxGTKSizeRevalidate(this); wxGTKSizeRevalidate(this);
#endif #endif
gtk_widget_show(m_widget); gtk_widget_show(m_widget);
#ifdef __WXGTK3__
if (GList* p = g_list_find(wx_sizeEventList, this))
{
wx_sizeEventList = g_list_delete_link(wx_sizeEventList, p);
SendSizeEvent();
}
#endif
wxShowEvent showEvent(GetId(), true); wxShowEvent showEvent(GetId(), true);
showEvent.SetEventObject(this); showEvent.SetEventObject(this);
HandleWindowEvent(showEvent); HandleWindowEvent(showEvent);

View File

@@ -222,6 +222,7 @@ int g_lastButtonNumber = 0;
#ifdef __WXGTK3__ #ifdef __WXGTK3__
static GList* gs_sizeRevalidateList; static GList* gs_sizeRevalidateList;
static GSList* gs_queueResizeList; static GSList* gs_queueResizeList;
GList* wx_sizeEventList;
static bool gs_inSizeAllocate; static bool gs_inSizeAllocate;
void wxGTKSizeRevalidate(wxWindow*); void wxGTKSizeRevalidate(wxWindow*);
#endif #endif
@@ -2583,7 +2584,8 @@ wxWindowGTK::~wxWindowGTK()
if (m_styleProvider) if (m_styleProvider)
g_object_unref(m_styleProvider); g_object_unref(m_styleProvider);
gs_sizeRevalidateList = g_list_remove(gs_sizeRevalidateList, this); gs_sizeRevalidateList = g_list_remove_all(gs_sizeRevalidateList, this);
wx_sizeEventList = g_list_remove(wx_sizeEventList, this);
#endif #endif
gs_needCursorResetMap.erase(this); gs_needCursorResetMap.erase(this);
@@ -2924,11 +2926,18 @@ void wxWindowGTK::DoSetSize( int x, int y, int width, int height, int sizeFlags
if (height == -1) if (height == -1)
height = m_height; height = m_height;
const bool sizeChange = m_width != width || m_height != height; bool sizeChange = m_width != width || m_height != height;
if (sizeChange) if (sizeChange)
m_useCachedClientSize = false; m_useCachedClientSize = false;
#ifdef __WXGTK3__
if (GList* p = g_list_find(wx_sizeEventList, this))
{
sizeChange = true;
wx_sizeEventList = g_list_delete_link(wx_sizeEventList, p);
}
#endif
if (sizeChange || m_x != x || m_y != y) if (sizeChange || m_x != x || m_y != y)
{ {
m_x = x; m_x = x;
@@ -4738,6 +4747,15 @@ void wxGTKSizeRevalidate(wxWindow* tlw)
{ {
win->InvalidateBestSize(); win->InvalidateBestSize();
gs_sizeRevalidateList = g_list_delete_link(gs_sizeRevalidateList, p); gs_sizeRevalidateList = g_list_delete_link(gs_sizeRevalidateList, p);
for (;;)
{
win = win->GetParent();
if (win == NULL || g_list_find(wx_sizeEventList, win))
break;
wx_sizeEventList = g_list_prepend(wx_sizeEventList, win);
if (win->IsTopLevel())
break;
}
} }
} }
} }
@@ -4772,14 +4790,14 @@ bool wxWindowGTK::SetFont( const wxFont &font )
// invalidate the best size right before the style cache is updated, so any // invalidate the best size right before the style cache is updated, so any
// subsequent best size requests use the correct font. // subsequent best size requests use the correct font.
if (gtk_check_version(3,8,0) == NULL) if (gtk_check_version(3,8,0) == NULL)
gs_sizeRevalidateList = g_list_append(gs_sizeRevalidateList, this); gs_sizeRevalidateList = g_list_prepend(gs_sizeRevalidateList, this);
else if (gtk_check_version(3,6,0) == NULL) else if (gtk_check_version(3,6,0) == NULL)
{ {
wxWindow* tlw = wxGetTopLevelParent(static_cast<wxWindow*>(this)); wxWindow* tlw = wxGetTopLevelParent(static_cast<wxWindow*>(this));
if (tlw->m_widget && gtk_widget_get_visible(tlw->m_widget)) if (tlw->m_widget && gtk_widget_get_visible(tlw->m_widget))
g_idle_add_full(GTK_PRIORITY_RESIZE - 1, before_resize, this, NULL); g_idle_add_full(GTK_PRIORITY_RESIZE - 1, before_resize, this, NULL);
else else
gs_sizeRevalidateList = g_list_append(gs_sizeRevalidateList, this); gs_sizeRevalidateList = g_list_prepend(gs_sizeRevalidateList, this);
} }
#endif #endif