You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
wxGTK3/wxGTK3-3.0.2-wayland-window...

60 lines
2.2 KiB

From 0388ce8e25535415d9bdd79ce14eb20e73859279 Mon Sep 17 00:00:00 2001
From: Paul Cornett <paulcor@users.noreply.github.com>
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