diff options
Diffstat (limited to 'dwl-patches/patches/spawninfo/spawninfo.patch')
-rw-r--r-- | dwl-patches/patches/spawninfo/spawninfo.patch | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/dwl-patches/patches/spawninfo/spawninfo.patch b/dwl-patches/patches/spawninfo/spawninfo.patch new file mode 100644 index 0000000..e452a4e --- /dev/null +++ b/dwl-patches/patches/spawninfo/spawninfo.patch @@ -0,0 +1,110 @@ +From 83b8dc03f5ea40f472e90d452671f8e55faf2c4c Mon Sep 17 00:00:00 2001 +From: Nikita Ivanov <nikita.vyach.ivanov@gmail.com> +Date: Sun, 9 Feb 2025 23:27:48 +0100 +Subject: [PATCH] spawninfo: spawn but pass client info via stdin + +--- + client.h | 12 ++++++++++++ + dwl.c | 42 ++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 54 insertions(+) + +diff --git a/client.h b/client.h +index 42f225f..bc9cad2 100644 +--- a/client.h ++++ b/client.h +@@ -131,6 +131,18 @@ client_get_appid(Client *c) + return c->surface.xdg->toplevel->app_id; + } + ++static inline int ++client_get_pid(Client *c) ++{ ++ pid_t pid; ++#ifdef XWAYLAND ++ if (client_is_x11(c)) ++ return c->surface.xwayland->pid; ++#endif ++ wl_client_get_credentials(c->surface.xdg->client->client, &pid, NULL, NULL); ++ return pid; ++} ++ + static inline void + client_get_clip(Client *c, struct wlr_box *clip) + { +diff --git a/dwl.c b/dwl.c +index def2562..859514c 100644 +--- a/dwl.c ++++ b/dwl.c +@@ -141,6 +141,7 @@ typedef struct { + uint32_t tags; + int isfloating, isurgent, isfullscreen; + uint32_t resize; /* configure serial of a pending resize */ ++ pid_t pid; + } Client; + + typedef struct { +@@ -334,6 +335,7 @@ static void setpsel(struct wl_listener *listener, void *data); + static void setsel(struct wl_listener *listener, void *data); + static void setup(void); + static void spawn(const Arg *arg); ++static void spawninfo(const Arg *arg); + static void startdrag(struct wl_listener *listener, void *data); + static void tag(const Arg *arg); + static void tagmon(const Arg *arg); +@@ -466,6 +468,8 @@ applyrules(Client *c) + if (!(title = client_get_title(c))) + title = broken; + ++ c->pid = client_get_pid(c); ++ + for (r = rules; r < END(rules); r++) { + if ((!r->title || strstr(title, r->title)) + && (!r->id || strstr(appid, r->id))) { +@@ -2658,6 +2662,44 @@ spawn(const Arg *arg) + } + } + ++void ++spawninfo(const Arg *arg) ++{ ++ int fd[2]; ++ pid_t pid; ++ const char *title, *appid; ++ Client *c = focustop(selmon); ++ ++ if (pipe(fd) == -1) ++ return; ++ if ((pid = fork()) == -1) ++ return; ++ if (pid == 0) { ++ dup2(fd[0], STDIN_FILENO); ++ close(fd[0]); ++ close(fd[1]); ++ dup2(STDERR_FILENO, STDOUT_FILENO); ++ setsid(); ++ execvp(((char **)arg->v)[0], (char **)arg->v); ++ die("dwl: execvp %s failed:", ((char **)arg->v)[0]); ++ } ++ ++ close(fd[0]); ++ ++ if (c) { ++ if (!(title = client_get_title(c))) ++ title = ""; ++ if (!(appid = client_get_appid(c))) ++ appid = ""; ++ dprintf(fd[1], "%d\n%s\n%s\n%"PRIu32"\n%d,%d %dx%d\n", c->pid, ++ title, appid, c->tags, ++ c->geom.x + c->bw, c->geom.y + c->bw, ++ c->geom.width - 2 * c->bw, c->geom.height - 2 * c->bw); ++ } ++ ++ close(fd[1]); ++} ++ + void + startdrag(struct wl_listener *listener, void *data) + { +-- +2.48.1 + |