From b84d878effd520ac443e600bec95a4164f486618 Mon Sep 17 00:00:00 2001 From: koekeishiya Date: Sun, 13 May 2018 04:37:20 +0200 Subject: #33 initial support media-keys --- src/skhd.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 63 insertions(+), 1 deletion(-) diff --git a/src/skhd.c b/src/skhd.c index 9f86110..3ca08f8 100644 --- a/src/skhd.c +++ b/src/skhd.c @@ -106,6 +106,68 @@ internal EVENT_TAP_CALLBACK(key_handler) if (result) return NULL; } break; + case NX_SYSDEFINED: { + CFDataRef event_data = CGEventCreateData(kCFAllocatorDefault, event); + uint8_t *data = CFDataGetBytePtr(event_data); + +#if 0 + // NOTE(koekeishiya): dump raw event-data for reverse engineering + CFIndex length = CFDataGetLength(event_data); + for (int i = 0; i < length; ++i) { + if (i % 16 == 0) printf("\n"); + printf("%02X ", data[i]); + } +#endif + + uint8_t event_subtype = data[123]; + if (event_subtype == 0x08) { + uint8_t key_code = data[129]; + uint8_t key_state = data[130]; + if (key_state == NX_KEYDOWN) { + switch (key_code) { + case NX_KEYTYPE_SOUND_UP: { + printf("pressed media_sound_up\n"); + } break; + case NX_KEYTYPE_SOUND_DOWN: { + printf("pressed media_sound_down\n"); + } break; + case NX_KEYTYPE_MUTE: { + printf("pressed media_mute\n"); + } break; + case NX_KEYTYPE_PLAY: { + printf("pressed media_play\n"); + } break; + case NX_KEYTYPE_PREVIOUS: { + printf("pressed media_prev\n"); + } break; + case NX_KEYTYPE_NEXT: { + printf("pressed media_next\n"); + } break; + case NX_KEYTYPE_REWIND: { + printf("pressed media_rewind\n"); + } break; + case NX_KEYTYPE_FAST: { + printf("pressed media_fast\n"); + } break; + case NX_KEYTYPE_BRIGHTNESS_UP: { + printf("pressed media_brightness_up\n"); + } break; + case NX_KEYTYPE_BRIGHTNESS_DOWN: { + printf("pressed media_brightness_down\n"); + } break; + case NX_KEYTYPE_ILLUMINATION_UP: { + printf("pressed media_brightness_up\n"); + } break; + case NX_KEYTYPE_ILLUMINATION_DOWN: { + printf("pressed media_brightness_down\n"); + } break; + default: { + printf("pressed system-key %d\n", key_code); + } break; + } + } + } + } break; } return event; } @@ -201,7 +263,7 @@ int main(int argc, char **argv) signal(SIGCHLD, SIG_IGN); struct event_tap event_tap; - event_tap.mask = (1 << kCGEventKeyDown); + event_tap.mask = (1 << kCGEventKeyDown) | CGEventMaskBit(NX_SYSDEFINED); event_tap_begin(&event_tap, key_handler); struct hotloader hotloader = {}; -- cgit v1.2.3