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:
@@ -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);
|
||||||
|
@@ -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
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user