~ruther/dwl

8cdb9971264adfdc35777b5a9935c2e4c47eea9f — Leonardo Hernández Hernández 2 years ago 90a12c9
conform the xdg-protocol with fullscreen translucent clients

see `setfullscreen()` for more info
2 files changed, 16 insertions(+), 0 deletions(-)

M config.def.h
M dwl.c
M config.def.h => config.def.h +2 -0
@@ 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" };

M dwl.c => dwl.c +14 -0
@@ 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();

Do not follow this link