Preload DWM plugins (dialer, calllog, xdrawer) with resident X11/Pango state and FIFO IPC
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
#include <dirent.h>
|
||||
#include <dlfcn.h>
|
||||
#include <fcntl.h>
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
@@ -8,6 +10,45 @@
|
||||
|
||||
#include "../sxmo-dwm/dwm_plugin.h"
|
||||
|
||||
static int try_send_plugin_fifo(const char *plugin_name, int sub_argc, char **sub_argv) {
|
||||
if (sub_argc >= 2 && sub_argv[1] && strcmp(sub_argv[1], "--preload") == 0) {
|
||||
return 0;
|
||||
}
|
||||
char pid_path[128];
|
||||
snprintf(pid_path, sizeof(pid_path), "/tmp/dwm_plugin_%s.pid", plugin_name);
|
||||
FILE *pf = fopen(pid_path, "r");
|
||||
if (!pf) {
|
||||
return 0;
|
||||
}
|
||||
int pid = 0;
|
||||
int ok = (fscanf(pf, "%d", &pid) == 1 && pid > 1 && kill((pid_t)pid, 0) == 0);
|
||||
fclose(pf);
|
||||
if (!ok) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
char fifo_path[128];
|
||||
snprintf(fifo_path, sizeof(fifo_path), "/tmp/dwm_plugin_%s.fifo", plugin_name);
|
||||
int fd = open(fifo_path, O_WRONLY | O_NONBLOCK | O_CLOEXEC);
|
||||
if (fd < 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
char cmd[256];
|
||||
int len = 0;
|
||||
if (strcmp(plugin_name, "xdrawer") == 0) {
|
||||
len = snprintf(cmd, sizeof(cmd), "TOGGLE\n");
|
||||
} else if (sub_argc >= 2 && sub_argv[1] && sub_argv[1][0]) {
|
||||
len = snprintf(cmd, sizeof(cmd), "OPEN %s\n", sub_argv[1]);
|
||||
} else {
|
||||
len = snprintf(cmd, sizeof(cmd), "OPEN\n");
|
||||
}
|
||||
|
||||
ssize_t wr = (len > 0 && len < (int)sizeof(cmd)) ? write(fd, cmd, (size_t)len) : -1;
|
||||
close(fd);
|
||||
return wr > 0 ? 1 : 0;
|
||||
}
|
||||
|
||||
static const char *const kPluginDirs[] = {
|
||||
"/home/user/.local/lib/dwm/plugins",
|
||||
"/usr/lib/dwm/plugins",
|
||||
@@ -79,6 +120,10 @@ int main(int argc, char **argv) {
|
||||
sub_argv = argv + 1;
|
||||
}
|
||||
|
||||
if (try_send_plugin_fifo(plugin_name, sub_argc, sub_argv)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
const char *env_dir = getenv("DWM_PLUGIN_PATH");
|
||||
char path[512];
|
||||
void *handle = NULL;
|
||||
|
||||
Reference in New Issue
Block a user