diff options
Diffstat (limited to 'src/event_tap.c')
-rw-r--r-- | src/event_tap.c | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/src/event_tap.c b/src/event_tap.c new file mode 100644 index 0000000..5f44ff4 --- /dev/null +++ b/src/event_tap.c @@ -0,0 +1,39 @@ +#include "event_tap.h" + +bool event_tap_enabled(struct event_tap *event_tap) +{ + bool result = (event_tap->handle && CGEventTapIsEnabled(event_tap->handle)); + return result; +} + +bool event_tap_begin(struct event_tap *event_tap, event_tap_callback *callback) +{ + event_tap->handle = CGEventTapCreate(kCGSessionEventTap, + kCGHeadInsertEventTap, + kCGEventTapOptionDefault, + event_tap->mask, + callback, + event_tap); + + bool result = event_tap_enabled(event_tap); + if(result) { + event_tap->runloop_source = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, + event_tap->handle, + 0); + CFRunLoopAddSource(CFRunLoopGetMain(), event_tap->runloop_source, kCFRunLoopCommonModes); + } + + return result; +} + +void event_tap_end(struct event_tap *event_tap) +{ + if(event_tap_enabled(event_tap)) { + CGEventTapEnable(event_tap->handle, false); + CFMachPortInvalidate(event_tap->handle); + CFRunLoopRemoveSource(CFRunLoopGetMain(), event_tap->runloop_source, kCFRunLoopCommonModes); + CFRelease(event_tap->runloop_source); + CFRelease(event_tap->handle); + event_tap->handle = NULL; + } +} |