aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkatherine <ageha@airen-no-jikken.icu>2025-05-22 22:50:01 +1000
committerkatherine <ageha@airen-no-jikken.icu>2025-05-22 22:50:01 +1000
commitf44696d037481e196f8049f392477771f1bf09c2 (patch)
tree0b2f7b85188d6000e0aa1ca64abe04a759504afb
downloadaty-f44696d037481e196f8049f392477771f1bf09c2.tar.gz
init
-rw-r--r--Makefile38
-rw-r--r--pkg/PKGBUILD22
-rw-r--r--src/main.c115
3 files changed, 175 insertions, 0 deletions
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..22aed93
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,38 @@
+.POSIX:
+.SUFFIXES:
+
+CC = cc
+CFLAGS = -Wall -D_XOPEN_SOURCE=700 -O2
+CFLAGSDEBUG = -std=c99 -Wall -D_XOPEN_SOURCE=700 -pedantic -ggdb3 -O0 -DDEBUG
+PREFIX = /usr/local
+
+all: aty
+
+debug: dbg_aty
+
+install: all
+ mkdir -p $(DESTDIR)$(PREFIX)/bin
+ cp -f aty $(DESTDIR)$(PREFIX)/bin
+
+aty: build/release build/release/main.o
+ $(CC) $(LDFLAGS) -o aty build/release/main.o
+
+dbg_aty: build/debug build/debug/main.o
+ $(CC) $(LDFLAGS) -o dbg_aty build/debug/main.o
+
+build/release:
+ mkdir -p build/release
+
+build/debug:
+ mkdir -p build/debug
+
+build/release/main.o: src/main.c
+ $(CC) -c $(CFLAGS) -o build/release/main.o src/main.c
+
+build/debug/main.o: src/main.c
+ $(CC) -c $(CFLAGS) -o build/debug/main.o src/main.c
+
+clean:
+ rm -f aty
+ rm -f dbg_aty
+ rm -rf build
diff --git a/pkg/PKGBUILD b/pkg/PKGBUILD
new file mode 100644
index 0000000..8e41922
--- /dev/null
+++ b/pkg/PKGBUILD
@@ -0,0 +1,22 @@
+pkgname=aty
+pkgver=1.0
+pkgrel=1
+pkgdesk="client fix for stupid alacritty"
+arch=('any')
+depends=('alacritty')
+makedepends=('git')
+url="https://git.airen-no-jikken.icu/aty.git"
+license=('MIT')
+source=("${pkgname}::git+https://git.airen-no-jikken.icu/aty.git")
+cksums=('SKIP')
+
+build() {
+ cd $srcdir/$pkgname
+ make
+}
+
+package() {
+ cd $srcdir/$pkgname
+ install -D -t $pkgdir/usr/bin aty
+ strip -x --strip-unneeded $pkgdir/usr/bin/aty
+}
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);
+}