summaryrefslogtreecommitdiff
path: root/dwm/my-selwin.diff
blob: 66ab6be1f67962d1d52bd027d8ace13cc24bc08a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
diff -urN ../dwm-clean/config.def.h ./config.def.h
--- ../dwm-clean/config.def.h	2025-08-09 06:00:55.740267680 -0700
+++ ./config.def.h	2025-12-04 11:02:06.893182108 -0800
@@ -73,6 +73,7 @@
 	{ MODKEY,                       XK_l,      setmfact,       {.f = +0.05} },
 	{ MODKEY,                       XK_Return, zoom,           {0} },
 	{ MODKEY,                       XK_Tab,    view,           {0} },
+	{ MODKEY,                       XK_w,      selectclient,   {0} },
 	{ MODKEY|ShiftMask,             XK_c,      killclient,     {0} },
 	{ MODKEY,                       XK_t,      setlayout,      {.v = &layouts[0]} },
 	{ MODKEY,                       XK_f,      setlayout,      {.v = &layouts[1]} },
diff -urN ../dwm-clean/dwm.c ./dwm.c
--- ../dwm-clean/dwm.c	2025-08-09 06:00:55.740267680 -0700
+++ ./dwm.c	2025-12-04 11:01:00.243873971 -0800
@@ -194,6 +194,7 @@
 static void restack(Monitor *m);
 static void run(void);
 static void scan(void);
+static void selectclient(const Arg *arg);
 static int sendevent(Client *c, Atom proto);
 static void sendmon(Client *c, Monitor *m);
 static void setclientstate(Client *c, long state);
@@ -1416,6 +1417,69 @@
 	}
 }
 
+void
+selectclient(const Arg *_arg)
+{
+	static const char* dmenuwincmd[] = { "dmenu", "-i", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_purple, "-sf", col_gray4, NULL };
+	Client *c;
+	int fds[4];		/* cin,sout,sin,cout */
+	const char ln = '\n';
+	char selected[257];
+	int ret;
+	struct sigaction sa;
+	Arg arg;
+
+	dmenumon[0] = '0' + selmon->num;
+	
+	if (pipe(fds))
+		return;
+	if (pipe(fds+2)) {
+		close(fds[0]);
+		close(fds[1]);
+		return;
+	}
+	if (fork() == 0) {
+		close(fds[1]);
+		close(fds[2]);
+		dup2(fds[0], 0);
+		dup2(fds[3], 1);
+
+		if (dpy)
+			close(ConnectionNumber(dpy));
+		setsid();
+
+		sigemptyset(&sa.sa_mask);
+		sa.sa_flags = 0;
+		sa.sa_handler = SIG_DFL;
+		sigaction(SIGCHLD, &sa, NULL);
+
+		execvp(((char **)dmenuwincmd)[0], (char **)dmenuwincmd);
+		die("dwm: execvp 'dmenu' for window select failed:");
+	}
+	close(fds[0]);
+	close(fds[3]);
+
+	for (c = selmon->clients; c; c = c->next) {
+		write(fds[1], c->name, strlen(c->name));
+		write(fds[1], &ln, 1);
+	}
+	close(fds[1]);
+	ret = read(fds[2], selected, 256);
+	for (int i = 0; i < 256 && (selected[i] != '\n' || (selected[i] = 0)); ++i);
+	close(fds[2]);
+	if (ret <= 0)
+		return;
+	for (c = selmon->clients; c; c = c->next) {
+		if (!strcmp(c->name, selected)) {
+			arg.ui = c->tags;
+			view(&arg);
+			focus(c);
+			return;
+		}
+
+	}
+}
+
 void
 sendmon(Client *c, Monitor *m)
 {