diff options
author | Simon Ser <contact@emersion.fr> | 2019-12-24 13:59:38 +0100 |
---|---|---|
committer | Drew DeVault <sir@cmpwn.com> | 2019-12-30 14:24:35 -0700 |
commit | 7e521fed9799d94b90bfd7f11951736d98fe30f8 (patch) | |
tree | e2b1a5a40d419fe9854c42c7d239be80de57da7c | |
parent | 31f721286a23851a4fe5f0b6ee4fc324bdd79fef (diff) |
xdg-shell: fix inert xdg_surface handling
Closes: https://github.com/swaywm/sway/issues/4834
Closes: https://github.com/swaywm/wlroots/issues/1890
-rw-r--r-- | include/wlr/types/wlr_xdg_shell.h | 5 | ||||
-rw-r--r-- | types/xdg_shell/wlr_xdg_surface.c | 16 |
2 files changed, 20 insertions, 1 deletions
diff --git a/include/wlr/types/wlr_xdg_shell.h b/include/wlr/types/wlr_xdg_shell.h index 7c787a16..4bd286ce 100644 --- a/include/wlr/types/wlr_xdg_shell.h +++ b/include/wlr/types/wlr_xdg_shell.h @@ -244,6 +244,11 @@ struct wlr_xdg_toplevel_show_window_menu_event { struct wlr_xdg_shell *wlr_xdg_shell_create(struct wl_display *display); +/** Returns the wlr_xdg_surface from an xdg_surface resource. + * + * Aborts if the resource doesn't have the correct type. Returns NULL if the + * resource is inert. + */ struct wlr_xdg_surface *wlr_xdg_surface_from_resource( struct wl_resource *resource); struct wlr_xdg_surface *wlr_xdg_surface_from_popup_resource( diff --git a/types/xdg_shell/wlr_xdg_surface.c b/types/xdg_shell/wlr_xdg_surface.c index fcd3e0c9..c3ea9f44 100644 --- a/types/xdg_shell/wlr_xdg_surface.c +++ b/types/xdg_shell/wlr_xdg_surface.c @@ -96,6 +96,9 @@ void unmap_xdg_surface(struct wlr_xdg_surface *surface) { static void xdg_surface_handle_ack_configure(struct wl_client *client, struct wl_resource *resource, uint32_t serial) { struct wlr_xdg_surface *surface = wlr_xdg_surface_from_resource(resource); + if (surface == NULL) { + return; + } if (surface->role == WLR_XDG_SURFACE_ROLE_NONE) { wl_resource_post_error(surface->resource, @@ -236,6 +239,9 @@ static void xdg_surface_handle_get_popup(struct wl_client *client, wlr_xdg_surface_from_resource(resource); struct wlr_xdg_surface *parent = wlr_xdg_surface_from_resource(parent_resource); + if (xdg_surface == NULL) { + return; // TODO: create an inert xdg_popup + } struct wlr_xdg_positioner_resource *positioner = get_xdg_positioner_from_resource(positioner_resource); create_xdg_popup(xdg_surface, parent, positioner, id); @@ -245,6 +251,9 @@ static void xdg_surface_handle_get_toplevel(struct wl_client *client, struct wl_resource *resource, uint32_t id) { struct wlr_xdg_surface *xdg_surface = wlr_xdg_surface_from_resource(resource); + if (xdg_surface == NULL) { + return; // TODO: create an inert xdg_toplevel + } create_xdg_toplevel(xdg_surface, id); } @@ -252,6 +261,9 @@ static void xdg_surface_handle_set_window_geometry(struct wl_client *client, struct wl_resource *resource, int32_t x, int32_t y, int32_t width, int32_t height) { struct wlr_xdg_surface *surface = wlr_xdg_surface_from_resource(resource); + if (surface == NULL) { + return; + } if (surface->role == WLR_XDG_SURFACE_ROLE_NONE) { wl_resource_post_error(surface->resource, @@ -277,6 +289,9 @@ static void xdg_surface_handle_set_window_geometry(struct wl_client *client, static void xdg_surface_handle_destroy(struct wl_client *client, struct wl_resource *resource) { struct wlr_xdg_surface *surface = wlr_xdg_surface_from_resource(resource); + if (surface == NULL) { + return; + } if (surface->role != WLR_XDG_SURFACE_ROLE_NONE) { wlr_log(WLR_ERROR, "Tried to destroy an xdg_surface before its role " @@ -502,7 +517,6 @@ void destroy_xdg_surface(struct wlr_xdg_surface *surface) { struct wlr_xdg_surface *wlr_xdg_surface_from_resource( struct wl_resource *resource) { - // TODO: Double check that all of the callers can deal with NULL if (!resource) { return NULL; } |