Integrate dmenu as a preloaded zero-lag DWM plugin (dmenu.so)

This commit is contained in:
Luxferre
2026-10-21 17:37:51 +03:00
parent 7da7352a6d
commit d240f25131
34 changed files with 2835 additions and 1232 deletions
+18 -2
View File
@@ -1649,7 +1649,7 @@ host_spawn_plugin(const char *plugin_name, const char *arg)
if (arg && strcmp(arg, "--preload") == 0) {
if (is_plugin_daemon_alive(plugin_name))
return;
int stagger_ms = 600 + (preload_stagger_idx++ * 220);
int stagger_ms = (strcmp(plugin_name, "dmenu") == 0) ? 150 : (600 + (preload_stagger_idx++ * 220));
if (fork() == 0) {
if (dpy)
close(ConnectionNumber(dpy));
@@ -1670,6 +1670,8 @@ host_spawn_plugin(const char *plugin_name, const char *arg)
int len;
if (strcmp(plugin_name, "xdrawer") == 0)
len = snprintf(msg, sizeof(msg), "TOGGLE\n");
else if (strcmp(plugin_name, "dmenu") == 0 && arg && strcmp(arg, "close") == 0)
len = snprintf(msg, sizeof(msg), "CLOSE\n");
else if (arg && arg[0])
len = snprintf(msg, sizeof(msg), "OPEN %s\n", arg);
else
@@ -1843,6 +1845,8 @@ trigger_softkey_chord(long long now)
kill(-last_menu_pgid, SIGKILL);
last_menu_pgid = 0;
}
if (is_plugin_loaded("dmenu"))
host_spawn_plugin("dmenu", "close");
softkey_pending = 0;
softkey_first_ms = 0;
softkey_deadline_ms = 0;
@@ -1868,6 +1872,10 @@ flush_pending_softkey(void)
XUngrabKeyboard(dpy, CurrentTime);
XFlush(dpy);
if (pending == SOFTKEY_LEFT) {
if (is_plugin_loaded("dmenu")) {
host_spawn_plugin("dmenu", "sys");
return;
}
const Arg syscmd = { .v = (const char*[]){ "sxmo_appmenu.sh", "sys", NULL } };
last_menu_pgid = spawn_pgid(&syscmd);
} else if (pending == SOFTKEY_RIGHT) {
@@ -1875,6 +1883,10 @@ flush_pending_softkey(void)
dispatch_plugin_idle_key(XF86XK_Back, 166, 0)) {
return;
}
if (is_plugin_loaded("dmenu")) {
host_spawn_plugin("dmenu", "ctx");
return;
}
const Arg ctxcmd = { .v = (const char*[]){ "sxmo_appmenu.sh", NULL } };
last_menu_pgid = spawn_pgid(&ctxcmd);
}
@@ -1953,9 +1965,13 @@ keypress(XEvent *e)
if (!selmon->sel && CLEANMASK(ev->state) == 0) {
if (keysym == XK_Return) {
const Arg entercmd = { .v = (const char*[]){ "sxmo_appmenu.sh", NULL } };
XUngrabKeyboard(dpy, CurrentTime);
XFlush(dpy);
if (is_plugin_loaded("dmenu")) {
host_spawn_plugin("dmenu", "sys");
return;
}
const Arg entercmd = { .v = (const char*[]){ "sxmo_appmenu.sh", NULL } };
spawn(&entercmd);
return;
} else if (keysym == XK_Left) {