diff options
author | katherine <ageha@airen-no-jikken.icu> | 2025-05-22 22:50:01 +1000 |
---|---|---|
committer | katherine <ageha@airen-no-jikken.icu> | 2025-05-22 22:50:01 +1000 |
commit | f44696d037481e196f8049f392477771f1bf09c2 (patch) | |
tree | 0b2f7b85188d6000e0aa1ca64abe04a759504afb | |
download | aty-f44696d037481e196f8049f392477771f1bf09c2.tar.gz |
init
-rw-r--r-- | Makefile | 38 | ||||
-rw-r--r-- | pkg/PKGBUILD | 22 | ||||
-rw-r--r-- | src/main.c | 115 |
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); +} |