mirror of
https://codeberg.org/dwl/dwl-patches.git
synced 2025-09-08 12:14:50 +00:00
111 lines
2.7 KiB
Diff
111 lines
2.7 KiB
Diff
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
|
|
|