From 9991f8bbf2e379dfca8eb356c03d3d20085255a8 Mon Sep 17 00:00:00 2001
From: sewn <sewn@disroot.org>
Date: Sun, 23 Jul 2023 08:13:52 +0300
Subject: [PATCH] pass window regions to given program as stdin

---
 config.def.h |  1 +
 dwl.c        | 28 ++++++++++++++++++++++++++++
 2 files changed, 29 insertions(+)

diff --git a/config.def.h b/config.def.h
index 9009517..79d0236 100644
--- a/config.def.h
+++ b/config.def.h
@@ -122,6 +122,7 @@ static const Key keys[] = {
 	/* modifier                  key                 function        argument */
 	{ MODKEY,                    XKB_KEY_p,          spawn,          {.v = menucmd} },
 	{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Return,     spawn,          {.v = termcmd} },
+	{ MODKEY,                    XKB_KEY_r,          regions,        SHCMD("grim -g \"$(slurp)\"") },
 	{ MODKEY,                    XKB_KEY_j,          focusstack,     {.i = +1} },
 	{ MODKEY,                    XKB_KEY_k,          focusstack,     {.i = -1} },
 	{ MODKEY,                    XKB_KEY_i,          incnmaster,     {.i = +1} },
diff --git a/dwl.c b/dwl.c
index fa76db2..9588e36 100644
--- a/dwl.c
+++ b/dwl.c
@@ -334,6 +334,7 @@ static Monitor *xytomon(double x, double y);
 static void xytonode(double x, double y, struct wlr_surface **psurface,
 		Client **pc, LayerSurface **pl, double *nx, double *ny);
 static void zoom(const Arg *arg);
+static void regions(const Arg *arg);
 
 /* variables */
 static const char broken[] = "broken";
@@ -2823,6 +2824,33 @@ zoom(const Arg *arg)
 	arrange(selmon);
 }
 
+void
+regions(const Arg *arg)
+{
+	int pipefd[2];
+	Client *c;
+	Monitor *m;
+
+	if (pipe(pipefd) == -1)
+		return;
+	if (fork() == 0) {
+		close(pipefd[1]);
+		dup2(pipefd[0], STDIN_FILENO);
+		close(pipefd[0]);
+		setsid();
+		execvp(((char **)arg->v)[0], (char **)arg->v);
+		die("dwl: execvp %s failed:", ((char **)arg->v)[0]);
+	}
+
+	close(pipefd[0]);
+	wl_list_for_each(m, &mons, link)
+		wl_list_for_each(c, &clients, link)
+			if (VISIBLEON(c, m))
+				dprintf(pipefd[1], "%d,%d %dx%d\n",
+				        c->geom.x, c->geom.y, c->geom.width, c->geom.height);
+	close(pipefd[1]);
+}
+
 #ifdef XWAYLAND
 void
 activatex11(struct wl_listener *listener, void *data)
-- 
2.43.1

