From 0d8cea7540c91b70c237228a8d38bce9195da3cc Mon Sep 17 00:00:00 2001 From: 9tin9tin9 <9tin9tin9@gmail.com> Date: Sat, 4 Mar 2023 21:24:31 +0800 Subject: [PATCH 1/5] -o flag observe mouse down --- src/skhd.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/skhd.c b/src/skhd.c index 3525269..e02437f 100644 --- a/src/skhd.c +++ b/src/skhd.c @@ -132,9 +132,13 @@ internal EVENT_TAP_CALLBACK(key_observer_handler) CGEventTapEnable(event_tap->handle, 1); } break; case kCGEventKeyDown: - case kCGEventFlagsChanged: { + case kCGEventFlagsChanged: + case kCGEventLeftMouseDown: + case kCGEventRightMouseDown: + case kCGEventOtherMouseDown: { uint32_t flags = CGEventGetFlags(event); uint32_t keycode = CGEventGetIntegerValueField(event, kCGKeyboardEventKeycode); + uint32_t button = CGEventGetIntegerValueField(event, kCGMouseEventButtonNumber); if (keycode == kVK_ANSI_C && flags & 0x40000) { exit(0); @@ -144,6 +148,7 @@ internal EVENT_TAP_CALLBACK(key_observer_handler) for (int i = 31; i >= 0; --i) { printf("%c", (flags & (1 << i)) ? '1' : '0'); } + printf("\tbutton: %d", button); fflush(stdout); return NULL; @@ -314,7 +319,10 @@ parse_arguments(int argc, char **argv) } break; case 'o': { event_tap.mask = (1 << kCGEventKeyDown) | - (1 << kCGEventFlagsChanged); + (1 << kCGEventFlagsChanged) | + (1 << kCGEventLeftMouseDown) | + (1 << kCGEventRightMouseDown) | + (1 << kCGEventOtherMouseDown); event_tap_begin(&event_tap, key_observer_handler); CFRunLoopRun(); } break; From 0014ce56eee567c441ff7de47b38eaacfc9a6e12 Mon Sep 17 00:00:00 2001 From: 9tin9tin9 <9tin9tin9@gmail.com> Date: Sat, 4 Mar 2023 21:43:11 +0800 Subject: [PATCH 2/5] Listening and handling mouse button presses in main tap --- src/hotkey.c | 8 +++++--- src/hotkey.h | 1 + src/skhd.c | 11 +++++++++-- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/hotkey.c b/src/hotkey.c index 780aa3a..546927d 100644 --- a/src/hotkey.c +++ b/src/hotkey.c @@ -66,12 +66,13 @@ bool same_hotkey(struct hotkey *a, struct hotkey *b) compare_lr_mod(a, b, LRMOD_SHIFT) && compare_fn(a, b) && compare_nx(a, b) && - a->key == b->key; + a->key == b->key && + a->button == b->button; } unsigned long hash_hotkey(struct hotkey *a) { - return a->key; + return (a->key << 6) | a->button; } bool compare_string(char *a, char *b) @@ -276,7 +277,8 @@ struct hotkey create_eventkey(CGEventRef event) { struct hotkey eventkey = { .key = CGEventGetIntegerValueField(event, kCGKeyboardEventKeycode), - .flags = cgevent_flags_to_hotkey_flags(CGEventGetFlags(event)) + .flags = cgevent_flags_to_hotkey_flags(CGEventGetFlags(event)), + .button = CGEventGetIntegerValueField(event, kCGMouseEventButtonNumber), }; return eventkey; } diff --git a/src/hotkey.h b/src/hotkey.h index 6b6e92a..e543915 100644 --- a/src/hotkey.h +++ b/src/hotkey.h @@ -72,6 +72,7 @@ struct hotkey { uint32_t flags; uint32_t key; + uint8_t button; char **process_name; char **command; char *wildcard_command; diff --git a/src/skhd.c b/src/skhd.c index e02437f..e39ead9 100644 --- a/src/skhd.c +++ b/src/skhd.c @@ -166,7 +166,10 @@ internal EVENT_TAP_CALLBACK(key_handler) struct event_tap *event_tap = (struct event_tap *) reference; CGEventTapEnable(event_tap->handle, 1); } break; - case kCGEventKeyDown: { + case kCGEventKeyDown: + case kCGEventLeftMouseDown: + case kCGEventRightMouseDown: + case kCGEventOtherMouseDown: { if (table_find(&blacklst, carbon.process_name)) return event; if (!current_mode) return event; @@ -495,7 +498,11 @@ int main(int argc, char **argv) END_SCOPED_TIMED_BLOCK(); BEGIN_SCOPED_TIMED_BLOCK("begin_eventtap"); - event_tap.mask = (1 << kCGEventKeyDown) | (1 << NX_SYSDEFINED); + event_tap.mask = (1 << kCGEventKeyDown) | + (1 << NX_SYSDEFINED) | + (1 << kCGEventLeftMouseDown) | + (1 << kCGEventRightMouseDown) | + (1 << kCGEventOtherMouseDown); event_tap_begin(&event_tap, key_handler); END_SCOPED_TIMED_BLOCK(); END_SCOPED_TIMED_BLOCK(); From 8cea5f8b75737f29f6141b5f5dd3d26053f87d24 Mon Sep 17 00:00:00 2001 From: 9tin9tin9 <9tin9tin9@gmail.com> Date: Sun, 5 Mar 2023 16:34:54 +0800 Subject: [PATCH 3/5] Parsing mouse button config --- examples/skhdrc | 5 ++++- src/hotkey.c | 1 - src/parse.c | 33 +++++++++++++++++++++++++++++++-- src/tokenize.c | 6 ++++++ src/tokenize.h | 16 ++++++++++++++++ 5 files changed, 57 insertions(+), 4 deletions(-) diff --git a/examples/skhdrc b/examples/skhdrc index b631aab..4f572e7 100644 --- a/examples/skhdrc +++ b/examples/skhdrc @@ -15,12 +15,15 @@ # # mod = 'modifier keyword' | '+' # -# key = | +# key = | |