diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/main.c | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..bf2c762 --- /dev/null +++ b/src/main.c @@ -0,0 +1,115 @@ +#include <stdbool.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include <dirent.h> +#include <limits.h> +#include <unistd.h> + +/* get insert-before offset of first argument if any, argv end if none, or -1 + * if wd already defined */ +int get_wd_off(int argc, char *argv[]) +{ + int i; + + for (i = 0; i < argc; i++) { + if (strcmp("--working-directory", argv[i]) == 0) + return -1; + if (argv[i][0] == '-') + break; + } + + return i; +} + +/* walk through /proc looking for alacritty cmdline */ +bool walk_proc(void) +{ + struct dirent *de; + DIR *d = opendir("/proc"); + FILE *f; + char path[PATH_MAX], cmd[PATH_MAX]; + + if (d == NULL) + abort(); + + while ((de = readdir(d)) != NULL) { + path[0] = '\0'; + strcat(path, "/proc/"); + strcat(path, de->d_name); + strcat(path, "/cmdline"); + + f = fopen(path, "r"); + + if (f == NULL) + continue; + + fscanf(f, "%s", cmd); + + if (strstr(cmd, "alacritty") != NULL) { + fclose(f); + closedir(d); + return true; + } + + fclose(f); + } + + closedir(d); + + return false; +} + +int main(int argc, char *argv[]) +{ + /* two for --working-directory and cwd, two for msg and create-window, one + * for NULL */ + char *argvnew[argc + 5]; + char wd_arg_str[] = "--working-directory"; + char cwd[PATH_MAX]; + + char alacritty[] = "alacritty"; + + char *msg_create_window[] = {"msg", "create-window"}; + + int i; + int wd_off = get_wd_off(argc, argv); + + argvnew[0] = alacritty; + + /* insert --working-directory cwd if not already extant */ + if (wd_off == -1) { + for (i = 1; i < argc; i++) { + argvnew[i] = argv[i]; + } + + argvnew[i] = NULL; + } else { + getcwd(cwd, sizeof(cwd)); + + for (i = 1; i < wd_off; i++) + argvnew[i] = argv[i]; + + argvnew[i] = wd_arg_str; + argvnew[i + 1] = cwd; + i += 2; + + for (; i < argc + 2; i++) + argvnew[i] = argv[i - 2]; + + argvnew[i] = NULL; + } + + /* check if alacritty is running and, if so, insert msg create-window */ + if ( (argc < 2 || strcmp("msg", argv[1]) != 0) && walk_proc()) { + /* shunt args up two to make room */ + for (i = argc + 4; i > 2; i--) + argvnew[i] = argvnew[i - 2]; + + argvnew[1] = msg_create_window[0]; + argvnew[2] = msg_create_window[1]; + } + + execv("/bin/alacritty", argvnew); +} |