diff options
Diffstat (limited to 'xmonad')
-rw-r--r-- | xmonad/.gitignore | 1 | ||||
-rw-r--r-- | xmonad/Makefile | 9 | ||||
-rw-r--r-- | xmonad/xmonad-autofocus-output.c | 93 |
3 files changed, 101 insertions, 2 deletions
diff --git a/xmonad/.gitignore b/xmonad/.gitignore index 48adae9..4e800a7 100644 --- a/xmonad/.gitignore +++ b/xmonad/.gitignore @@ -1 +1,2 @@ /xmonad.hs +/xmonad-autofocus-output diff --git a/xmonad/Makefile b/xmonad/Makefile index 4003b95..2265823 100644 --- a/xmonad/Makefile +++ b/xmonad/Makefile @@ -3,7 +3,7 @@ include ../common.mk XINITRC_ORDER = 80 -install: +install: xmonad-autofocus-output $(CHECK_INSTALLED) xwallpaper $(CHECK_INSTALLED) xcman $(CHECK_INSTALLED) pdeath @@ -18,6 +18,11 @@ install: test ! -d ~/.xmonad/xmonad.hs ln -sf -- ~/.dotfiles/xmonad/xmonad.hs ~/.xmonad/xmonad.hs make xmonad.hs + mkdir -p ~/.local/bin + ln -sf -- ~/.dotfiles/xmonad/xmonad-autofocus-output ~/.local/bin + +xmonad-autofocus-output: xmonad-autofocus-output.c + $(CC) -o $@ $@.c -Wall -s -lX11 -lXtst include xmonad.mk @@ -30,6 +35,6 @@ uninstall: -make clean clean: - -rm -f xmonad.hs + -rm -f xmonad.hs xmonad-autofocus-output .PHONY: install uninstall clean diff --git a/xmonad/xmonad-autofocus-output.c b/xmonad/xmonad-autofocus-output.c new file mode 100644 index 0000000..853e18b --- /dev/null +++ b/xmonad/xmonad-autofocus-output.c @@ -0,0 +1,93 @@ +/* -lX11 -lXtst */ +#include <sys/select.h> +#include <errno.h> +#include <stdio.h> + +#define XK_MISCELLANY +#define XK_LATIN1 +#include <X11/Xlib.h> +#include <X11/keysymdef.h> +#include <X11/extensions/XTest.h> + +static Display *disp; +static KeyCode mod, key[2]; + +static inline int +get_output(int x, int y) +{ + return x < 1920; +} + +static inline void +set_output(int output) +{ + XTestFakeKeyEvent(disp, mod, 1, 0); + XTestFakeKeyEvent(disp, key[output], 1, 0); + XTestFakeKeyEvent(disp, key[output], 0, 0); + XTestFakeKeyEvent(disp, mod, 0, 0); + XFlush(disp); +} + +int +main(int argc, char *argv[]) +{ + int fd, scrn; + Window root; + fd_set fds; + XEvent ev; + int output, prev_output = -1; + + XSetLocaleModifiers(""); + if (!(disp = XOpenDisplay(NULL))) { + fprintf(stderr, "%s: cannot open display\n", *argv); + return 1; + } + + fd = XConnectionNumber(disp); + scrn = XDefaultScreen(disp); + root = XRootWindow(disp, scrn); + XSelectInput(disp, root, PointerMotionMask | EnterWindowMask); + XSync(disp, False); + + mod = XKeysymToKeycode(disp, XK_Super_L); + key[0] = XKeysymToKeycode(disp, XK_W); + key[1] = XKeysymToKeycode(disp, XK_E); + + for (;;) { + FD_ZERO(&fds); + FD_SET(fd, &fds); + + if (select(fd + 1, &fds, NULL, NULL, NULL) < 0) { + if (errno == EINTR) + continue; + perror(*argv); + return 1; + } + + if (!FD_ISSET(fd, &fds)) + continue; + + while (XPending(disp)) { + XNextEvent(disp, &ev); + if (XFilterEvent(&ev, None)) + continue; + switch (ev.type) { + case MotionNotify: + output = get_output(ev.xmotion.x_root, ev.xmotion.y_root); + if (output == prev_output) + continue; + prev_output = output; + set_output(output); + break; + case EnterNotify: + prev_output = -1; + break; + default: + break; + } + } + } + + return 0; + (void) argc; +} |