aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main.c115
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);
+}