aboutsummaryrefslogtreecommitdiff
path: root/src/event_tap.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/event_tap.c')
-rw-r--r--src/event_tap.c39
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;
+ }
+}