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.
This commit is contained in:
@@ -1146,6 +1146,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)
|
void wxTopLevelWindowGTK::DoSetClientSize(int width, int height)
|
||||||
{
|
{
|
||||||
base_type::DoSetClientSize(width, height);
|
base_type::DoSetClientSize(width, height);
|
||||||
@@ -1154,6 +1162,25 @@ void wxTopLevelWindowGTK::DoSetClientSize(int width, int height)
|
|||||||
// Has to be done after calling base because it calls SetSize,
|
// Has to be done after calling base because it calls SetSize,
|
||||||
// which sets this true
|
// which sets this true
|
||||||
m_deferShowAllowed = false;
|
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
|
void wxTopLevelWindowGTK::DoGetClientSize( int *width, int *height ) const
|
||||||
|
Reference in New Issue
Block a user