summaryrefslogtreecommitdiff
path: root/client.h
diff options
context:
space:
mode:
Diffstat (limited to 'client.h')
-rw-r--r--client.h166
1 files changed, 92 insertions, 74 deletions
diff --git a/client.h b/client.h
index c18d01a..77cde58 100644
--- a/client.h
+++ b/client.h
@@ -16,40 +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 Client *
-client_get_parent(Client *c)
-{
-#ifdef XWAYLAND
- if (client_is_x11(c) && c->surface.xwayland->parent)
- return client_from_wlr_surface(c->surface.xwayland->parent->surface);
-#endif
- if (c->surface.xdg->toplevel->parent)
- return client_from_wlr_surface(c->surface.xdg->toplevel->parent->base->surface);
-
- return NULL;
-}
-
static inline void
client_get_size_hints(Client *c, struct wlr_box *max, struct wlr_box *min)
{
@@ -85,6 +51,69 @@ client_surface(Client *c)
return c->surface.xdg->surface;
}
+static inline int
+toplevel_from_wlr_surface(struct wlr_surface *s, Client **pc, LayerSurface **pl)
+{
+ struct wlr_xdg_surface *xdg_surface;
+ struct wlr_surface *root_surface;
+ struct wlr_layer_surface_v1 *layer_surface;
+ Client *c = NULL;
+ LayerSurface *l = NULL;
+ int type = -1;
+#ifdef XWAYLAND
+ struct wlr_xwayland_surface *xsurface;
+#endif
+
+ if (!s)
+ return type;
+ 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))) {
+ c = xsurface->data;
+ type = c->type;
+ goto end;
+ }
+#endif
+
+ if (wlr_surface_is_layer_surface(root_surface)
+ && (layer_surface = wlr_layer_surface_v1_from_wlr_surface(root_surface))) {
+ l = layer_surface->data;
+ type = LayerShell;
+ goto end;
+ }
+
+ 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 -1;
+ else if (!wlr_surface_is_xdg_surface(xdg_surface->popup->parent))
+ return toplevel_from_wlr_surface(xdg_surface->popup->parent, pc, pl);
+
+ xdg_surface = wlr_xdg_surface_from_wlr_surface(xdg_surface->popup->parent);
+ break;
+ case WLR_XDG_SURFACE_ROLE_TOPLEVEL:
+ c = xdg_surface->data;
+ type = c->type;
+ goto end;
+ case WLR_XDG_SURFACE_ROLE_NONE:
+ return -1;
+ }
+ }
+ }
+
+end:
+ if (pl)
+ *pl = l;
+ if (pc)
+ *pc = c;
+ return type;
+}
+
/* The others */
static inline void
client_activate_surface(struct wlr_surface *s, int activated)
@@ -153,6 +182,20 @@ client_get_geometry(Client *c, struct wlr_box *geom)
wlr_xdg_surface_get_geometry(c->surface.xdg, geom);
}
+static inline Client *
+client_get_parent(Client *c)
+{
+ Client *p = NULL;
+#ifdef XWAYLAND
+ if (client_is_x11(c) && c->surface.xwayland->parent)
+ toplevel_from_wlr_surface(c->surface.xwayland->parent->surface, &p, NULL);
+#endif
+ if (c->surface.xdg->toplevel->parent)
+ toplevel_from_wlr_surface(c->surface.xdg->toplevel->parent->base->surface, &p, NULL);
+
+ return p;
+}
+
static inline const char *
client_get_title(Client *c)
{
@@ -198,6 +241,21 @@ client_is_mapped(Client *c)
}
static inline int
+client_is_rendered_on_mon(Client *c, Monitor *m)
+{
+ /* This is needed for when you don't want to check formal assignment,
+ * but rather actual displaying of the pixels.
+ * Usually VISIBLEON suffices and is also faster. */
+ struct wlr_surface_output *s;
+ if (!c->scene->node.enabled)
+ return 0;
+ wl_list_for_each(s, &client_surface(c)->current_outputs, link)
+ if (s->output == m->wlr_output)
+ return 1;
+ return 0;
+}
+
+static inline int
client_is_unmanaged(Client *c)
{
#ifdef XWAYLAND
@@ -305,43 +363,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;
-}