summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonas Ã…dahl <jadahl@gmail.com>2018-07-25 12:20:57 +0200
committerRay Strode <rstrode@redhat.com>2019-01-14 10:06:51 -0500
commit6e14403ac837a67f2b5bf05916ddeb60a0bddf1c (patch)
tree3b749af38809023e514790d3cdd984b498699d4e
parentec2471a356226a8f515ed76f92b30586e0f7f27f (diff)
downloadmutter-6e14403ac837a67f2b5bf05916ddeb60a0bddf1c.tar.gz
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 ca5b27baf517f00354ff8811ba204fd90f1ddb38)
-rw-r--r--src/wayland/meta-wayland-gtk-shell.c29
1 files changed, 19 insertions, 10 deletions
diff --git a/src/wayland/meta-wayland-gtk-shell.c b/src/wayland/meta-wayland-gtk-shell.c
index 891109a69..58375674a 100644
--- a/src/wayland/meta-wayland-gtk-shell.c
+++ b/src/wayland/meta-wayland-gtk-shell.c
@@ -71,15 +71,13 @@ gtk_surface_set_dbus_properties (struct wl_client *client,
{
MetaWaylandGtkSurface *gtk_surface = wl_resource_get_user_data (resource);
MetaWaylandSurface *surface = gtk_surface->surface;
+ MetaWindow *window;
- /* Broken client, let it die instead of us */
- if (!surface->window)
- {
- meta_warning ("meta-wayland-surface: set_dbus_properties called with invalid window!\n");
- return;
- }
+ window = surface->window;
+ if (!window)
+ return;
- meta_window_set_gtk_dbus_properties (surface->window,
+ meta_window_set_gtk_dbus_properties (window,
application_id,
unique_bus_name,
app_menu_path,
@@ -94,12 +92,17 @@ gtk_surface_set_modal (struct wl_client *client,
{
MetaWaylandGtkSurface *gtk_surface = wl_resource_get_user_data (resource);
MetaWaylandSurface *surface = gtk_surface->surface;
+ MetaWindow *window;
+
+ window = surface->window;
+ if (!window)
+ return;
if (gtk_surface->is_modal)
return;
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
@@ -108,12 +111,17 @@ gtk_surface_unset_modal (struct wl_client *client,
{
MetaWaylandGtkSurface *gtk_surface = wl_resource_get_user_data (resource);
MetaWaylandSurface *surface = gtk_surface->surface;
+ MetaWindow *window;
+
+ window = surface->window;
+ if (!window)
+ return;
if (!gtk_surface->is_modal)
return;
gtk_surface->is_modal = FALSE;
- meta_window_set_type (surface->window, META_WINDOW_NORMAL);
+ meta_window_set_type (window, META_WINDOW_NORMAL);
}
static void
@@ -123,8 +131,9 @@ gtk_surface_present (struct wl_client *client,
{
MetaWaylandGtkSurface *gtk_surface = wl_resource_get_user_data (resource);
MetaWaylandSurface *surface = gtk_surface->surface;
- MetaWindow *window = surface->window;
+ MetaWindow *window;
+ window = surface->window;
if (!window)
return;