wayland: Maybe postpone xdg-foreign state setup until mapping
In order to map a window with the correct initial parent-child relationship when a modal dialog is set up to be a child of an imported foreign window, the relationship must be set up before the window is mapped. In order to do this, if a window is not yet mapped, postpone the relationship setup until when the window is eventually mapped. https://bugzilla.gnome.org/show_bug.cgi?id=791062
This commit is contained in:
committed by
Matthias Clasen
parent
279b81d202
commit
dee5142c91
@ -1086,6 +1086,24 @@ gdk_wayland_window_sync_parent (GdkWindow *window,
|
|||||||
parent_toplevel);
|
parent_toplevel);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gdk_wayland_window_sync_parent_of_imported (GdkWindow *window)
|
||||||
|
{
|
||||||
|
GdkWindowImplWayland *impl = GDK_WINDOW_IMPL_WAYLAND (window->impl);
|
||||||
|
|
||||||
|
if (!impl->display_server.wl_surface)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!impl->imported_transient_for)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!impl->display_server.xdg_toplevel)
|
||||||
|
return;
|
||||||
|
|
||||||
|
zxdg_imported_v1_set_parent_of (impl->imported_transient_for,
|
||||||
|
impl->display_server.wl_surface);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gdk_wayland_window_update_dialogs (GdkWindow *window)
|
gdk_wayland_window_update_dialogs (GdkWindow *window)
|
||||||
{
|
{
|
||||||
@ -1542,6 +1560,7 @@ G_GNUC_END_IGNORE_DEPRECATIONS
|
|||||||
window);
|
window);
|
||||||
|
|
||||||
gdk_wayland_window_sync_parent (window, NULL);
|
gdk_wayland_window_sync_parent (window, NULL);
|
||||||
|
gdk_wayland_window_sync_parent_of_imported (window);
|
||||||
gdk_wayland_window_sync_title (window);
|
gdk_wayland_window_sync_title (window);
|
||||||
|
|
||||||
if (window->state & GDK_WINDOW_STATE_MAXIMIZED)
|
if (window->state & GDK_WINDOW_STATE_MAXIMIZED)
|
||||||
@ -4361,12 +4380,12 @@ gdk_wayland_window_set_transient_for_exported (GdkWindow *window,
|
|||||||
|
|
||||||
g_return_val_if_fail (GDK_IS_WAYLAND_WINDOW (window), FALSE);
|
g_return_val_if_fail (GDK_IS_WAYLAND_WINDOW (window), FALSE);
|
||||||
g_return_val_if_fail (GDK_IS_WAYLAND_DISPLAY (display), FALSE);
|
g_return_val_if_fail (GDK_IS_WAYLAND_DISPLAY (display), FALSE);
|
||||||
|
g_return_val_if_fail (!should_map_as_subsurface (window) &&
|
||||||
|
!should_map_as_popup (window), FALSE);
|
||||||
|
|
||||||
impl = GDK_WINDOW_IMPL_WAYLAND (window->impl);
|
impl = GDK_WINDOW_IMPL_WAYLAND (window->impl);
|
||||||
display_wayland = GDK_WAYLAND_DISPLAY (display);
|
display_wayland = GDK_WAYLAND_DISPLAY (display);
|
||||||
|
|
||||||
g_return_val_if_fail (impl->display_server.xdg_surface, FALSE);
|
|
||||||
|
|
||||||
if (!display_wayland->xdg_importer)
|
if (!display_wayland->xdg_importer)
|
||||||
{
|
{
|
||||||
g_warning ("Server is missing xdg_foreign support");
|
g_warning ("Server is missing xdg_foreign support");
|
||||||
@ -4381,8 +4400,7 @@ gdk_wayland_window_set_transient_for_exported (GdkWindow *window,
|
|||||||
&xdg_imported_listener,
|
&xdg_imported_listener,
|
||||||
window);
|
window);
|
||||||
|
|
||||||
zxdg_imported_v1_set_parent_of (impl->imported_transient_for,
|
gdk_wayland_window_sync_parent_of_imported (window);
|
||||||
impl->display_server.wl_surface);
|
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user