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) {