xf86ctrl

mplay control using xf86 media keys
git clone https://git.sinitax.com/sinitax/xf86ctrl
Log | Files | Refs | LICENSE | sfeed.txt

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+
AMakefile | 3+++
Amain.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; +}