Preload DWM plugins (dialer, calllog, xdrawer) with resident X11/Pango state and FIFO IPC
This commit is contained in:
+40
-3
@@ -1572,19 +1572,56 @@ host_spawn_command(const char *const *argv)
|
||||
spawn(&a);
|
||||
}
|
||||
|
||||
static int
|
||||
is_plugin_daemon_alive(const char *plugin_name)
|
||||
{
|
||||
char pidpath[128], buf[32];
|
||||
snprintf(pidpath, sizeof(pidpath), "/tmp/dwm_plugin_%s.pid", plugin_name);
|
||||
read_sysfs_str(pidpath, buf, sizeof(buf));
|
||||
int pid = atoi(buf);
|
||||
return (pid > 0 && kill(pid, 0) == 0);
|
||||
}
|
||||
|
||||
static void
|
||||
host_spawn_plugin(const char *plugin_name, const char *arg)
|
||||
{
|
||||
if (!plugin_name || !plugin_name[0])
|
||||
return;
|
||||
if (arg && strcmp(arg, "--preload") == 0) {
|
||||
if (is_plugin_daemon_alive(plugin_name))
|
||||
return;
|
||||
const char *cmd[4] = { "dwm-plugin", plugin_name, "--preload", NULL };
|
||||
Arg a = { .v = cmd };
|
||||
spawn(&a);
|
||||
return;
|
||||
}
|
||||
XUngrabKeyboard(dpy, CurrentTime);
|
||||
XFlush(dpy);
|
||||
if (is_plugin_daemon_alive(plugin_name)) {
|
||||
char fifopath[128], msg[128];
|
||||
snprintf(fifopath, sizeof(fifopath), "/tmp/dwm_plugin_%s.fifo", plugin_name);
|
||||
int fd = open(fifopath, O_WRONLY | O_NONBLOCK | O_CLOEXEC);
|
||||
if (fd >= 0) {
|
||||
int len;
|
||||
if (strcmp(plugin_name, "xdrawer") == 0)
|
||||
len = snprintf(msg, sizeof(msg), "TOGGLE\n");
|
||||
else if (arg && arg[0])
|
||||
len = snprintf(msg, sizeof(msg), "OPEN %s\n", arg);
|
||||
else
|
||||
len = snprintf(msg, sizeof(msg), "OPEN\n");
|
||||
if (write(fd, msg, len) == len) {
|
||||
close(fd);
|
||||
return;
|
||||
}
|
||||
close(fd);
|
||||
}
|
||||
}
|
||||
const char *cmd[4];
|
||||
cmd[0] = "dwm-plugin";
|
||||
cmd[1] = plugin_name;
|
||||
cmd[2] = (arg && arg[0]) ? arg : NULL;
|
||||
cmd[3] = NULL;
|
||||
Arg a = { .v = cmd };
|
||||
XUngrabKeyboard(dpy, CurrentTime);
|
||||
XFlush(dpy);
|
||||
spawn(&a);
|
||||
}
|
||||
|
||||
@@ -2849,7 +2886,7 @@ unmapnotify(XEvent *e)
|
||||
setclientstate(c, WithdrawnState);
|
||||
else
|
||||
unmanage(c, 0);
|
||||
} else if (selmon && !selmon->sel) {
|
||||
} else {
|
||||
focus(NULL);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user