From 0388ce8e25535415d9bdd79ce14eb20e73859279 Mon Sep 17 00:00:00 2001 From: Paul Cornett Date: Sat, 6 Feb 2016 16:07:28 -0800 Subject: [PATCH] Allow SetClientSize() to set correct size even when size of window decorations is not known This should allow correct sizing of first TLW (when using SetClientSize()) with backends using client-side decorations such as Wayland. (cherry picked from commit bc4df78421a5b1e6fd9b218e89d03e59bd846d0a) --- src/gtk/toplevel.cpp | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/gtk/toplevel.cpp b/src/gtk/toplevel.cpp index c3d42e8..a52dad0 100644 --- a/src/gtk/toplevel.cpp +++ b/src/gtk/toplevel.cpp @@ -1194,6 +1194,14 @@ void wxTopLevelWindowGTK::DoSetSize( int x, int y, int width, int height, int si } } +extern "C" { +static gboolean reset_size_request(void* data) +{ + gtk_widget_set_size_request(GTK_WIDGET(data), -1, -1); + return false; +} +} + void wxTopLevelWindowGTK::DoSetClientSize(int width, int height) { base_type::DoSetClientSize(width, height); @@ -1202,6 +1210,25 @@ void wxTopLevelWindowGTK::DoSetClientSize(int width, int height) // Has to be done after calling base because it calls SetSize, // which sets this true m_deferShowAllowed = false; + + if (m_wxwindow) + { + // If window is not resizable or not yet shown, set size request on + // client widget, to make it more likely window will get correct size + // even if our decorations size cache is incorrect (as it will be before + // showing first TLW). + if (!gtk_window_get_resizable(GTK_WINDOW(m_widget))) + { + gtk_widget_set_size_request(m_widget, -1, -1); + gtk_widget_set_size_request(m_wxwindow, m_clientWidth, m_clientHeight); + } + else if (!IsShown()) + { + gtk_widget_set_size_request(m_wxwindow, m_clientWidth, m_clientHeight); + // Cancel size request at next idle to allow resizing + g_idle_add_full(G_PRIORITY_LOW, reset_size_request, m_wxwindow, NULL); + } + } } void wxTopLevelWindowGTK::DoGetClientSize( int *width, int *height ) const