wayland/gtk-shell: Handle requests after toplevel was unmanaged

As with xdg-toplevel, a gtk-surface can be unmanaged by the compositor
without the client knowing about it, meaning the client may still send
updates and make requests. Handle this gracefully by ignoring them. The
client needs to reset all the state anyway, if it wants to remap the
same surface.

https://gitlab.gnome.org/GNOME/mutter/issues/240
(cherry picked from commit ca5b27baf5)
This commit is contained in:
Jonas Ådahl 2018-07-25 12:20:57 +02:00 committed by Ray Strode
parent ec2471a356
commit 6e14403ac8

View File

@ -71,15 +71,13 @@ gtk_surface_set_dbus_properties (struct wl_client *client,
{ {
MetaWaylandGtkSurface *gtk_surface = wl_resource_get_user_data (resource); MetaWaylandGtkSurface *gtk_surface = wl_resource_get_user_data (resource);
MetaWaylandSurface *surface = gtk_surface->surface; MetaWaylandSurface *surface = gtk_surface->surface;
MetaWindow *window;
/* Broken client, let it die instead of us */ window = surface->window;
if (!surface->window) if (!window)
{
meta_warning ("meta-wayland-surface: set_dbus_properties called with invalid window!\n");
return; return;
}
meta_window_set_gtk_dbus_properties (surface->window, meta_window_set_gtk_dbus_properties (window,
application_id, application_id,
unique_bus_name, unique_bus_name,
app_menu_path, app_menu_path,
@ -94,12 +92,17 @@ gtk_surface_set_modal (struct wl_client *client,
{ {
MetaWaylandGtkSurface *gtk_surface = wl_resource_get_user_data (resource); MetaWaylandGtkSurface *gtk_surface = wl_resource_get_user_data (resource);
MetaWaylandSurface *surface = gtk_surface->surface; MetaWaylandSurface *surface = gtk_surface->surface;
MetaWindow *window;
window = surface->window;
if (!window)
return;
if (gtk_surface->is_modal) if (gtk_surface->is_modal)
return; return;
gtk_surface->is_modal = TRUE; gtk_surface->is_modal = TRUE;
meta_window_set_type (surface->window, META_WINDOW_MODAL_DIALOG); meta_window_set_type (window, META_WINDOW_MODAL_DIALOG);
} }
static void static void
@ -108,12 +111,17 @@ gtk_surface_unset_modal (struct wl_client *client,
{ {
MetaWaylandGtkSurface *gtk_surface = wl_resource_get_user_data (resource); MetaWaylandGtkSurface *gtk_surface = wl_resource_get_user_data (resource);
MetaWaylandSurface *surface = gtk_surface->surface; MetaWaylandSurface *surface = gtk_surface->surface;
MetaWindow *window;
window = surface->window;
if (!window)
return;
if (!gtk_surface->is_modal) if (!gtk_surface->is_modal)
return; return;
gtk_surface->is_modal = FALSE; gtk_surface->is_modal = FALSE;
meta_window_set_type (surface->window, META_WINDOW_NORMAL); meta_window_set_type (window, META_WINDOW_NORMAL);
} }
static void static void
@ -123,8 +131,9 @@ gtk_surface_present (struct wl_client *client,
{ {
MetaWaylandGtkSurface *gtk_surface = wl_resource_get_user_data (resource); MetaWaylandGtkSurface *gtk_surface = wl_resource_get_user_data (resource);
MetaWaylandSurface *surface = gtk_surface->surface; MetaWaylandSurface *surface = gtk_surface->surface;
MetaWindow *window = surface->window; MetaWindow *window;
window = surface->window;
if (!window) if (!window)
return; return;