From 5b06e5102032ce799ca0ad5d1620ca56ec0883a0 Mon Sep 17 00:00:00 2001 From: koekeishiya Date: Sat, 13 Apr 2019 19:09:39 +0200 Subject: #75 flag to launch in observer mode --- README.md | 3 +++ src/skhd.c | 39 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 5f0d576..3100b3e 100644 --- a/README.md +++ b/README.md @@ -60,6 +60,9 @@ Requires xcode-8 command-line tools. -c | --config: Specify location of config file skhd -c ~/.skhdrc +-o | --observe: Output keycode and modifiers of event. Ctrl+C to quit + skhd -o + -r | --reload: Signal a running instance of skhd to reload its config file skhd -r diff --git a/src/skhd.c b/src/skhd.c index fb04e0e..cd75802 100644 --- a/src/skhd.c +++ b/src/skhd.c @@ -114,6 +114,36 @@ internal CF_NOTIFICATION_CALLBACK(keymap_handler) END_TIMED_BLOCK(); } +internal EVENT_TAP_CALLBACK(key_observer_handler) +{ + switch (type) { + case kCGEventTapDisabledByTimeout: + case kCGEventTapDisabledByUserInput: { + debug("skhd: restarting event-tap\n"); + struct event_tap *event_tap = (struct event_tap *) reference; + CGEventTapEnable(event_tap->handle, 1); + } break; + case kCGEventKeyDown: + case kCGEventFlagsChanged: { + uint32_t flags = CGEventGetFlags(event); + uint32_t keycode = CGEventGetIntegerValueField(event, kCGKeyboardEventKeycode); + + if (keycode == kVK_ANSI_C && flags & 0x40000) { + exit(0); + } + + printf("\rkeycode: 0x%.2X\tflags: ", keycode); + for (int i = 31; i >= 0; --i) { + printf("%c", (flags & (1 << i)) ? '1' : '0'); + } + fflush(stdout); + + return NULL; + } break; + } + return event; +} + internal EVENT_TAP_CALLBACK(key_handler) { switch (type) { @@ -205,7 +235,7 @@ internal bool parse_arguments(int argc, char **argv) { int option; - const char *short_option = "VPvc:k:t:rh"; + const char *short_option = "VPvc:k:t:rho"; struct option long_option[] = { { "verbose", no_argument, NULL, 'V' }, { "profile", no_argument, NULL, 'P' }, @@ -215,6 +245,7 @@ parse_arguments(int argc, char **argv) { "key", required_argument, NULL, 'k' }, { "text", required_argument, NULL, 't' }, { "reload", no_argument, NULL, 'r' }, + { "observe", no_argument, NULL, 'o' }, { NULL, 0, NULL, 0 } }; @@ -249,6 +280,12 @@ parse_arguments(int argc, char **argv) if (pid) kill(pid, SIGUSR1); return true; } break; + case 'o': { + event_tap.mask = (1 << kCGEventKeyDown) | + (1 << kCGEventFlagsChanged); + event_tap_begin(&event_tap, key_observer_handler); + CFRunLoopRun(); + } break; } } -- cgit v1.2.3