aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKirill Primak <vyivel@eclair.cafe>2023-07-26 10:50:09 +0300
committerSimon Ser <contact@emersion.fr>2023-08-21 16:30:29 +0000
commit10ba8ebc7050d4290fa5bd9bbd3ed771c266afe3 (patch)
treec6e280ba8d800ff24aa0ad1beca270cfc1639d5f
parentf0cc712af14d9eae7cd8c56e74ae3b2547ff8ea2 (diff)
Don't assume xdg_surface.{toplevel,popup} is non-NULL
This assumption will become incorrect with future commits.
-rw-r--r--tinywl/tinywl.c4
-rw-r--r--types/scene/xdg_shell.c6
-rw-r--r--types/xdg_shell/wlr_xdg_popup.c2
-rw-r--r--types/xdg_shell/wlr_xdg_surface.c52
4 files changed, 44 insertions, 20 deletions
diff --git a/tinywl/tinywl.c b/tinywl/tinywl.c
index 61c08928..e91ad283 100644
--- a/tinywl/tinywl.c
+++ b/tinywl/tinywl.c
@@ -122,7 +122,9 @@ static void focus_view(struct tinywl_view *view, struct wlr_surface *surface) {
struct wlr_xdg_surface *previous =
wlr_xdg_surface_try_from_wlr_surface(seat->keyboard_state.focused_surface);
assert(previous != NULL && previous->role == WLR_XDG_SURFACE_ROLE_TOPLEVEL);
- wlr_xdg_toplevel_set_activated(previous->toplevel, false);
+ if (previous->toplevel != NULL) {
+ wlr_xdg_toplevel_set_activated(previous->toplevel, false);
+ }
}
struct wlr_keyboard *keyboard = wlr_seat_get_keyboard(seat);
/* Move the view to the front */
diff --git a/types/scene/xdg_shell.c b/types/scene/xdg_shell.c
index eba33c86..9e3ffb05 100644
--- a/types/scene/xdg_shell.c
+++ b/types/scene/xdg_shell.c
@@ -59,8 +59,10 @@ static void scene_xdg_surface_update_position(
if (xdg_surface->role == WLR_XDG_SURFACE_ROLE_POPUP) {
struct wlr_xdg_popup *popup = xdg_surface->popup;
- wlr_scene_node_set_position(&scene_xdg_surface->tree->node,
- popup->current.geometry.x, popup->current.geometry.y);
+ if (popup != NULL) {
+ wlr_scene_node_set_position(&scene_xdg_surface->tree->node,
+ popup->current.geometry.x, popup->current.geometry.y);
+ }
}
}
diff --git a/types/xdg_shell/wlr_xdg_popup.c b/types/xdg_shell/wlr_xdg_popup.c
index d3600307..452e9a1d 100644
--- a/types/xdg_shell/wlr_xdg_popup.c
+++ b/types/xdg_shell/wlr_xdg_popup.c
@@ -485,7 +485,7 @@ void wlr_xdg_popup_get_toplevel_coords(struct wlr_xdg_popup *popup,
struct wlr_surface *parent = popup->parent;
struct wlr_xdg_surface *xdg_surface;
while ((xdg_surface = wlr_xdg_surface_try_from_wlr_surface(parent))) {
- if (xdg_surface->role == WLR_XDG_SURFACE_ROLE_POPUP) {
+ if (xdg_surface->role == WLR_XDG_SURFACE_ROLE_POPUP && xdg_surface->popup != NULL) {
popup_sx += xdg_surface->popup->current.geometry.x;
popup_sy += xdg_surface->popup->current.geometry.y;
parent = xdg_surface->popup->parent;
diff --git a/types/xdg_shell/wlr_xdg_surface.c b/types/xdg_shell/wlr_xdg_surface.c
index eec3a495..38280ad5 100644
--- a/types/xdg_shell/wlr_xdg_surface.c
+++ b/types/xdg_shell/wlr_xdg_surface.c
@@ -37,10 +37,14 @@ static void reset_xdg_surface(struct wlr_xdg_surface *surface) {
switch (surface->role) {
case WLR_XDG_SURFACE_ROLE_TOPLEVEL:
- reset_xdg_toplevel(surface->toplevel);
+ if (surface->toplevel != NULL) {
+ reset_xdg_toplevel(surface->toplevel);
+ }
break;
case WLR_XDG_SURFACE_ROLE_POPUP:
- reset_xdg_popup(surface->popup);
+ if (surface->popup != NULL) {
+ reset_xdg_popup(surface->popup);
+ }
break;
case WLR_XDG_SURFACE_ROLE_NONE:
break;
@@ -100,12 +104,16 @@ static void xdg_surface_handle_ack_configure(struct wl_client *client,
assert(0 && "not reached");
break;
case WLR_XDG_SURFACE_ROLE_TOPLEVEL:
- handle_xdg_toplevel_ack_configure(surface->toplevel,
- configure->toplevel_configure);
+ if (surface->toplevel != NULL) {
+ handle_xdg_toplevel_ack_configure(surface->toplevel,
+ configure->toplevel_configure);
+ }
break;
case WLR_XDG_SURFACE_ROLE_POPUP:
- handle_xdg_popup_ack_configure(surface->popup,
- configure->popup_configure);
+ if (surface->popup != NULL) {
+ handle_xdg_popup_ack_configure(surface->popup,
+ configure->popup_configure);
+ }
break;
}
@@ -137,12 +145,16 @@ static void surface_send_configure(void *user_data) {
assert(0 && "not reached");
break;
case WLR_XDG_SURFACE_ROLE_TOPLEVEL:
- configure->toplevel_configure =
- send_xdg_toplevel_configure(surface->toplevel);
+ if (surface->toplevel != NULL) {
+ configure->toplevel_configure =
+ send_xdg_toplevel_configure(surface->toplevel);
+ }
break;
case WLR_XDG_SURFACE_ROLE_POPUP:
- configure->popup_configure =
- send_xdg_popup_configure(surface->popup);
+ if (surface->popup != NULL) {
+ configure->popup_configure =
+ send_xdg_popup_configure(surface->popup);
+ }
break;
}
@@ -288,10 +300,14 @@ void xdg_surface_role_commit(struct wlr_surface *wlr_surface) {
// inert toplevel or popup
return;
case WLR_XDG_SURFACE_ROLE_TOPLEVEL:
- handle_xdg_toplevel_committed(surface->toplevel);
+ if (surface->toplevel != NULL) {
+ handle_xdg_toplevel_committed(surface->toplevel);
+ }
break;
case WLR_XDG_SURFACE_ROLE_POPUP:
- handle_xdg_popup_committed(surface->popup);
+ if (surface->popup != NULL) {
+ handle_xdg_popup_committed(surface->popup);
+ }
break;
}
@@ -391,12 +407,16 @@ void destroy_xdg_surface_role_object(struct wlr_xdg_surface *surface) {
switch (surface->role) {
case WLR_XDG_SURFACE_ROLE_TOPLEVEL:
- destroy_xdg_toplevel(surface->toplevel);
- surface->toplevel = NULL;
+ if (surface->toplevel != NULL) {
+ destroy_xdg_toplevel(surface->toplevel);
+ surface->toplevel = NULL;
+ }
break;
case WLR_XDG_SURFACE_ROLE_POPUP:
- destroy_xdg_popup(surface->popup);
- surface->popup = NULL;
+ if (surface->popup != NULL) {
+ destroy_xdg_popup(surface->popup);
+ surface->popup = NULL;
+ }
break;
case WLR_XDG_SURFACE_ROLE_NONE:
// This space is intentionally left blank