From 8cdb9971264adfdc35777b5a9935c2e4c47eea9f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Leonardo=20Hern=C3=A1ndez=20Hern=C3=A1ndez?=
 <leohdz172@protonmail.com>
Date: Sat, 23 Jul 2022 02:08:10 -0500
Subject: conform the xdg-protocol with fullscreen translucent clients

see `setfullscreen()` for more info
---
 config.def.h |  2 ++
 dwl.c        | 14 ++++++++++++++
 2 files changed, 16 insertions(+)

diff --git a/config.def.h b/config.def.h
index 43f35cd..29c6dbf 100644
--- a/config.def.h
+++ b/config.def.h
@@ -5,6 +5,8 @@ static const int lockfullscreen     = 1;  /* 1 will force focus on the fullscree
 static const float rootcolor[]      = {0.3, 0.3, 0.3, 1.0};
 static const float bordercolor[]    = {0.5, 0.5, 0.5, 1.0};
 static const float focuscolor[]     = {1.0, 0.0, 0.0, 1.0};
+/* To conform the xdg-protocol, set the alpha to zero to restore the old behavior */
+static const float fullscreen_bg[]  = {0.1, 0.1, 0.1, 1.0};
 
 /* tagging */
 static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
diff --git a/dwl.c b/dwl.c
index 727e6e1..35c72f0 100644
--- a/dwl.c
+++ b/dwl.c
@@ -98,6 +98,7 @@ typedef struct {
 	struct wlr_scene_node *scene;
 	struct wlr_scene_rect *border[4]; /* top, bottom, left, right */
 	struct wlr_scene_node *scene_surface;
+	struct wlr_scene_rect *fullscreen_bg; /* See setfullscreen() for info */
 	struct wl_list link;
 	struct wl_list flink;
 	union {
@@ -1869,10 +1870,23 @@ setfullscreen(Client *c, int fullscreen)
 	if (fullscreen) {
 		c->prev = c->geom;
 		resize(c, c->mon->m, 0);
+		/* The xdg-protocol specifies:
+		 *
+		 * If the fullscreened surface is not opaque, the compositor must make
+		 * sure that other screen content not part of the same surface tree (made
+		 * up of subsurfaces, popups or similarly coupled surfaces) are not
+		 * visible below the fullscreened surface.
+		 *
+		 * For brevity we set a black background for all clients
+		 */
+		c->fullscreen_bg = wlr_scene_rect_create(c->scene,
+			c->geom.width, c->geom.height, fullscreen_bg);
+		wlr_scene_node_lower_to_bottom(&c->fullscreen_bg->node);
 	} else {
 		/* restore previous size instead of arrange for floating windows since
 		 * client positions are set by the user and cannot be recalculated */
 		resize(c, c->prev, 0);
+		wlr_scene_node_destroy(&c->fullscreen_bg->node);
 	}
 	arrange(c->mon);
 	printstatus();
-- 
cgit v1.2.3