commit 7e7c44fe8f574379a62a2c406462b9aaaeda87ba
Author: Louis Burda <quent.burda@gmail.com>
Date: Sun, 25 Jul 2021 17:56:40 +0200
Add initial version
Diffstat:
A | .gitignore | | | 1 | + |
A | Makefile | | | 3 | +++ |
A | main.c | | | 105 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
3 files changed, 109 insertions(+), 0 deletions(-)
diff --git a/.gitignore b/.gitignore
@@ -0,0 +1 @@
+main
diff --git a/Makefile b/Makefile
@@ -0,0 +1,3 @@
+LDLIBS = -lX11 -lutil
+
+main: main.c
diff --git a/main.c b/main.c
@@ -0,0 +1,105 @@
+#include <X11/X.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdarg.h>
+#include <signal.h>
+#include <unistd.h>
+#include <termios.h>
+#include <pty.h>
+
+#include <sys/wait.h>
+
+#include <X11/Xlib.h>
+#include <X11/keysym.h>
+#include <X11/XF86keysym.h>
+
+#define ARRSIZE(a) (sizeof(a)/sizeof(*(a)))
+
+void
+die(const char *fmtstr, ...)
+{
+ va_list ap;
+
+ va_start(ap, fmtstr);
+ vfprintf(stderr, fmtstr, ap);
+ va_end(ap);
+
+ exit(EXIT_FAILURE);
+}
+
+void
+sigchild(int sig)
+{
+ exit(0);
+}
+
+int
+main(int argc, char **argv)
+{
+ pid_t childpid;
+ Display *d;
+ Window win;
+ XEvent e;
+ unsigned int modifiers;
+ int i, key, childio;
+ struct termios childterm;
+ struct winsize ws;
+
+ if (argc < 2)
+ die("USAGE: skipkill CMD [ARGS..]\n");
+
+ //if (tcgetattr(STDIN_FILENO, &childterm))
+ // die("Failed to get term attrs\n");
+ //if (ioctl(STDIN_FILENO, TIOCGWINSZ, &ws) != 0)
+ // die("Failed to get term size\n");
+
+ cfmakeraw(&childterm);
+
+ ws.ws_col = 80;
+ ws.ws_row = 40;
+
+ if ((childpid = forkpty(&childio, NULL, &childterm, &ws)) < 0)
+ die("Failed to run fork\n");
+
+ fclose(stdin);
+
+ if (!childpid) {
+ execvp(argv[1], argv + 1);
+ } else {
+ if (!(d = XOpenDisplay(NULL)))
+ die("Failed to open display\n");
+
+ win = DefaultRootWindow(d);
+ modifiers = ShiftMask;
+ XGrabKey(d, XKeysymToKeycode(d, XF86XK_AudioNext), modifiers,
+ win, False, GrabModeAsync, GrabModeAsync);
+ XGrabKey(d, XKeysymToKeycode(d, XF86XK_AudioPlay), modifiers,
+ win, False, GrabModeAsync, GrabModeAsync);
+
+ signal(SIGCHLD, sigchild);
+
+ while (1) {
+ XNextEvent(d, &e);
+ if (e.type == KeyPress) {
+ key = XKeycodeToKeysym(d, e.xkey.keycode, 0);
+ switch (key) {
+ case XF86XK_AudioNext:
+ goto exit;
+ case XF86XK_AudioPlay:
+ if (write(childio, "p", 1) != 1)
+ goto exit;
+ break;
+ }
+ }
+ }
+exit:
+
+ XCloseDisplay(d);
+
+ kill(childpid, SIGTERM);
+ waitpid(childpid, NULL, 0);
+ }
+
+ return 0;
+}