summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--client.h108
-rw-r--r--dwl.c10
2 files changed, 52 insertions, 66 deletions
diff --git a/client.h b/client.h
index b443a8d..c12a107 100644
--- a/client.h
+++ b/client.h
@@ -16,27 +16,6 @@ client_is_x11(Client *c)
#endif
}
-static inline Client *
-client_from_wlr_surface(struct wlr_surface *s)
-{
- struct wlr_xdg_surface *surface;
-
-#ifdef XWAYLAND
- struct wlr_xwayland_surface *xsurface;
- if (s && wlr_surface_is_xwayland_surface(s)
- && (xsurface = wlr_xwayland_surface_from_wlr_surface(s)))
- return xsurface->data;
-#endif
- if (s && wlr_surface_is_xdg_surface(s)
- && (surface = wlr_xdg_surface_from_wlr_surface(s))
- && surface->role == WLR_XDG_SURFACE_ROLE_TOPLEVEL)
- return surface->data;
-
- if (s && wlr_surface_is_subsurface(s))
- return client_from_wlr_surface(wlr_surface_get_root_surface(s));
- return NULL;
-}
-
static inline void
client_get_size_hints(Client *c, struct wlr_box *max, struct wlr_box *min)
{
@@ -72,6 +51,53 @@ client_surface(Client *c)
return c->surface.xdg->surface;
}
+static inline void *
+toplevel_from_wlr_surface(struct wlr_surface *s)
+{
+ struct wlr_xdg_surface *xdg_surface;
+ struct wlr_surface *root_surface;
+ struct wlr_layer_surface_v1 *layer_surface;
+#ifdef XWAYLAND
+ struct wlr_xwayland_surface *xsurface;
+#endif
+
+ if (!s)
+ return NULL;
+ root_surface = wlr_surface_get_root_surface(s);
+
+#ifdef XWAYLAND
+ if (wlr_surface_is_xwayland_surface(root_surface)
+ && (xsurface = wlr_xwayland_surface_from_wlr_surface(root_surface)))
+ return xsurface->data;
+#endif
+
+ if (wlr_surface_is_layer_surface(root_surface)
+ && (layer_surface = wlr_layer_surface_v1_from_wlr_surface(root_surface)))
+ return layer_surface->data;
+
+ if (wlr_surface_is_xdg_surface(root_surface)
+ && (xdg_surface = wlr_xdg_surface_from_wlr_surface(root_surface))) {
+ while (1) {
+ switch (xdg_surface->role) {
+ case WLR_XDG_SURFACE_ROLE_POPUP:
+ if (!xdg_surface->popup->parent)
+ return NULL;
+ else if (!wlr_surface_is_xdg_surface(xdg_surface->popup->parent))
+ return toplevel_from_wlr_surface(xdg_surface->popup->parent);
+
+ xdg_surface = wlr_xdg_surface_from_wlr_surface(xdg_surface->popup->parent);
+ break;
+ case WLR_XDG_SURFACE_ROLE_TOPLEVEL:
+ return xdg_surface->data;
+ case WLR_XDG_SURFACE_ROLE_NONE:
+ return NULL;
+ }
+ }
+ }
+
+ return NULL;
+}
+
/* The others */
static inline void
client_activate_surface(struct wlr_surface *s, int activated)
@@ -320,43 +346,3 @@ client_wants_fullscreen(Client *c)
#endif
return c->surface.xdg->toplevel->requested.fullscreen;
}
-
-static inline void *
-toplevel_from_popup(struct wlr_xdg_popup *popup)
-{
- struct wlr_xdg_surface *surface = popup->base;
-
- while (1) {
- switch (surface->role) {
- case WLR_XDG_SURFACE_ROLE_POPUP:
- if (!surface->popup->parent)
- return NULL;
- else if (wlr_surface_is_layer_surface(surface->popup->parent))
- return wlr_layer_surface_v1_from_wlr_surface(surface->popup->parent)->data;
- else if (!wlr_surface_is_xdg_surface(surface->popup->parent))
- return NULL;
-
- surface = wlr_xdg_surface_from_wlr_surface(surface->popup->parent);
- break;
- case WLR_XDG_SURFACE_ROLE_TOPLEVEL:
- return surface->data;
- case WLR_XDG_SURFACE_ROLE_NONE:
- return NULL;
- }
- }
-}
-
-static inline void *
-toplevel_from_wlr_layer_surface(struct wlr_surface *s)
-{
- Client *c;
- struct wlr_layer_surface_v1 *wlr_layer_surface;
-
- if ((c = client_from_wlr_surface(s)))
- return c;
- else if (s && wlr_surface_is_layer_surface(s)
- && (wlr_layer_surface = wlr_layer_surface_v1_from_wlr_surface(s)))
- return wlr_layer_surface->data;
-
- return NULL;
-}
diff --git a/dwl.c b/dwl.c
index c304256..9c2fc3d 100644
--- a/dwl.c
+++ b/dwl.c
@@ -908,7 +908,7 @@ createnotify(struct wl_listener *listener, void *data)
if (xdg_surface->role == WLR_XDG_SURFACE_ROLE_POPUP) {
struct wlr_box box;
- LayerSurface *l = toplevel_from_popup(xdg_surface->popup);
+ LayerSurface *l = toplevel_from_wlr_surface(xdg_surface->surface);
if (!xdg_surface->popup->parent)
return;
xdg_surface->surface->data = wlr_scene_xdg_surface_create(
@@ -1096,7 +1096,7 @@ focusclient(Client *c, int lift)
/* If an overlay is focused, don't focus or activate the client,
* but only update its position in fstack to render its border with focuscolor
* and focus it after the overlay is closed. */
- Client *w = client_from_wlr_surface(old);
+ Client *w = toplevel_from_wlr_surface(old);
if (wlr_surface_is_layer_surface(old)) {
struct wlr_layer_surface_v1 *wlr_layer_surface =
wlr_layer_surface_v1_from_wlr_surface(old);
@@ -1472,7 +1472,7 @@ motionnotify(uint32_t time)
xytonode(cursor->x, cursor->y, &surface, &c, NULL, &sx, &sy);
if (cursor_mode == CurPressed && !seat->drag) {
- if ((l = toplevel_from_wlr_layer_surface(
+ if ((l = toplevel_from_wlr_surface(
seat->pointer_state.focused_surface))) {
surface = seat->pointer_state.focused_surface;
sx = cursor->x - l->geom.x;
@@ -2357,8 +2357,8 @@ void
urgent(struct wl_listener *listener, void *data)
{
struct wlr_xdg_activation_v1_request_activate_event *event = data;
- Client *c = client_from_wlr_surface(event->surface);
- if (c && c != selclient()) {
+ Client *c = toplevel_from_wlr_surface(event->surface);
+ if (c && c->type != LayerShell && c != selclient()) {
c->isurgent = 1;
printstatus();
}