dwl

My patch set and modifications to dwl
git clone git://git.ethandl.dev/dwl
Log | Files | Refs | README | LICENSE

commit 294fb324d8f67c33552b15d3f1f79fe524d5f8fd
parent 2768af5a9bfd7cb5f874a8d61f4bc9a1188b82fd
Author: Leonardo Hernández Hernández <leohdz172@protonmail.com>
Date:   Wed, 16 Mar 2022 23:08:17 -0600

constraint popups to its parent client

Closes: #146
Closes: #155

Diffstat:
Mclient.h | 21+++++++++++++++++++++
Mdwl.c | 9++++++++-
2 files changed, 29 insertions(+), 1 deletion(-)

diff --git a/client.h b/client.h @@ -179,3 +179,24 @@ client_surface_at(Client *c, double cx, double cy, double *sx, double *sy) #endif return wlr_xdg_surface_surface_at(c->surface.xdg, cx, cy, sx, sy); } + +static inline Client * +client_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 (!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; + } + } +} diff --git a/dwl.c b/dwl.c @@ -880,7 +880,14 @@ createnotify(struct wl_listener *listener, void *data) struct wlr_xdg_surface *xdg_surface = data; Client *c; - if (xdg_surface->role != WLR_XDG_SURFACE_ROLE_TOPLEVEL) + if (xdg_surface->role == WLR_XDG_SURFACE_ROLE_POPUP) { + struct wlr_box box; + if (!(c = client_from_popup(xdg_surface->popup))) + return; + client_get_geometry(c, &box); + wlr_xdg_popup_unconstrain_from_box(xdg_surface->popup, &box); + return; + } else if (xdg_surface->role == WLR_XDG_SURFACE_ROLE_NONE) return; /* Allocate a Client for this surface */