diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..eb317bb --- /dev/null +++ b/Makefile @@ -0,0 +1,3 @@ +main : main.c + gcc -o main main.c + sudo chmod a+r /dev/input/by-id/usb-MAX_Falcon_20_RGB-if02-event-kbd diff --git a/main b/main new file mode 100755 index 0000000..09b6974 Binary files /dev/null and b/main differ diff --git a/main.c b/main.c new file mode 100644 index 0000000..d08c778 --- /dev/null +++ b/main.c @@ -0,0 +1,137 @@ +// https://stackoverflow.com/questions/20943322/accessing-keys-from-linux-input-device + +#include +#include +#include +#include +#include +#include +#include + +static const char *const evval[3] = { + "RELEASED", + "PRESSED ", + "REPEATED" +}; + +/** + * +--+--+--+--+ + * |30|48|46|32| + * +--+--+--+--+ + * |18|33|34|35| + * +--+--+--+--+ + * |23|36|37|38| + * +--+--+--+--+ + * |50|49|24|25| + * +--+--+--+--+ + * |16|19|31|20| + * +--+--+--+--+ +* */ + +enum p_key { + p11 = 30, + p12 = 48, + p13 = 46, + p14 = 32, + p21 = 18, + p22 = 33, + p23 = 34, + p24 = 35, + p31 = 23, + p32 = 36, + p33 = 37, + p34 = 38, + p41 = 50, + p42 = 49, + p43 = 24, + p44 = 25, + p51 = 16, + p52 = 19, + p53 = 31, + p54 = 20 +}; + +int main(void) +{ + const char* dev = "/dev/input/by-id/usb-MAX_Falcon_20_RGB-if02-event-kbd"; //at.event26 + struct input_event ev; + ssize_t n; + int fd; + + fd = open(dev, O_RDONLY); + if (fd == -1) { + fprintf(stderr, "Cannot open %s: %s.\n", dev, strerror(errno)); + return EXIT_FAILURE; + } + + // This grabs the device, so the we do not just listen to events but we actually consume them! This way the keypresses are not handled by any other handler! + // https://stackoverflow.com/questions/29942421/read-barcodes-from-input-event-linux-c/29956584#29956584 + if (ioctl(fd, EVIOCGRAB, 1)) { + const int saved_errno = errno; + close(fd); + return errno = (saved_errno) ? errno : EACCES; + } + + // Main-Loop + while (1) { + n = read(fd, &ev, sizeof ev); + //n = ioctl(fd, EVIOCGRAB, 1); + if (n == (ssize_t)-1) { + if (errno == EINTR) + continue; + else + break; + } else + if (n != sizeof ev) { + errno = EIO; + break; + } + if (ev.type == EV_KEY && ev.value >= 0 && ev.value <= 2) { + //printf("%s 0x%04x (%d)\n", evval[ev.value], (int)ev.code, (int)ev.code); + if (evval[ev.value] == "RELEASED") { + switch((int)ev.code) { + case p11: + system("notify-send 'Screenlayout: default'; /home/tbehrendt/.screenlayout/default.sh"); + break; + case p12: + system("notify-send 'Screenlayout: main low res'; /home/tbehrendt/.screenlayout/main_low_res.sh"); + break; + case p13: + system("notify-send 'Screenlayout: tv mirror'; /home/tbehrendt/.screenlayout/tv_mirror.sh"); + break; + case p14: + system("notify-send 'Screenlayout: tv standalone'; /home/tbehrendt/.screenlayout/tv_standalone.sh"); + break; + case p21: printf("p21\n"); break; + case p22: printf("p22\n"); break; + case p23: printf("p23\n"); break; + case p24: printf("p24\n"); break; + case p31: printf("p31\n"); break; + case p32: printf("p32\n"); break; + case p33: printf("p33\n"); break; + case p34: printf("p34\n"); break; + case p41: printf("p41\n"); break; + case p42: printf("p42\n"); break; + case p43: printf("p43\n"); break; + case p44: printf("p44\n"); break; + case p51: + system("notify-send mute toggled;pactl set-sink-mute @DEFAULT_SINK@ toggle"); + break; + case p52: + system("notify-send 'VOL +5%'; pactl set-sink-volume @DEFAULT_SINK@ +5%"); + break; + case p53: + system("notify-send 'VOL -5%'; pactl set-sink-volume @DEFAULT_SINK@ -5%"); + break; + case p54: + system("/home/tbehrendt/.scripts/makroboard/p51.sh &"); + break; + } + } + } + + } + fflush(stdout); + fprintf(stderr, "%s.\n", strerror(errno)); + return EXIT_FAILURE; +}