aboutsummaryrefslogtreecommitdiff
path: root/sway
diff options
context:
space:
mode:
authorAleksei Bavshin <alebastr89@gmail.com>2020-02-27 17:55:55 -0800
committerSimon Ser <contact@emersion.fr>2020-04-10 10:45:47 +0200
commit525b48ede795effb6ef61b7caf6ad333393cfd64 (patch)
treea1b4dfbbc8f0fe1b03e65cf219153334e6ea16c8 /sway
parent8c6227820754f2bb09ebda3676dcf7a43722ff64 (diff)
Adjust focus order to match rendering order of layer shell popups.
Diffstat (limited to 'sway')
-rw-r--r--sway/input/cursor.c39
1 files changed, 39 insertions, 0 deletions
diff --git a/sway/input/cursor.c b/sway/input/cursor.c
index 470bb996..11a2de85 100644
--- a/sway/input/cursor.c
+++ b/sway/input/cursor.c
@@ -52,6 +52,30 @@ static struct wlr_surface *layer_surface_at(struct sway_output *output,
return NULL;
}
+static bool surface_is_xdg_popup(struct wlr_surface *surface) {
+ if (wlr_surface_is_xdg_surface(surface)) {
+ struct wlr_xdg_surface *xdg_surface =
+ wlr_xdg_surface_from_wlr_surface(surface);
+ return xdg_surface->role == WLR_XDG_SURFACE_ROLE_POPUP;
+ }
+ return false;
+}
+
+static struct wlr_surface *layer_surface_popup_at(struct sway_output *output,
+ struct wl_list *layer, double ox, double oy, double *sx, double *sy) {
+ struct sway_layer_surface *sway_layer;
+ wl_list_for_each_reverse(sway_layer, layer, link) {
+ double _sx = ox - sway_layer->geo.x;
+ double _sy = oy - sway_layer->geo.y;
+ struct wlr_surface *sub = wlr_layer_surface_v1_surface_at(
+ sway_layer->layer_surface, _sx, _sy, sx, sy);
+ if (sub && surface_is_xdg_popup(sub)) {
+ return sub;
+ }
+ }
+ return NULL;
+}
+
/**
* Returns the node at the cursor's position. If there is a surface at that
* location, it is stored in **surface (it may not be a view).
@@ -132,6 +156,21 @@ struct sway_node *node_at_coords(
}
return NULL;
}
+ if ((*surface = layer_surface_popup_at(output,
+ &output->layers[ZWLR_LAYER_SHELL_V1_LAYER_TOP],
+ ox, oy, sx, sy))) {
+ return NULL;
+ }
+ if ((*surface = layer_surface_popup_at(output,
+ &output->layers[ZWLR_LAYER_SHELL_V1_LAYER_BOTTOM],
+ ox, oy, sx, sy))) {
+ return NULL;
+ }
+ if ((*surface = layer_surface_popup_at(output,
+ &output->layers[ZWLR_LAYER_SHELL_V1_LAYER_BACKGROUND],
+ ox, oy, sx, sy))) {
+ return NULL;
+ }
if ((*surface = layer_surface_at(output,
&output->layers[ZWLR_LAYER_SHELL_V1_LAYER_TOP],
ox, oy, sx, sy))) {