From d2b99a9169495f7f79b18b637979e4b5f94e4a7f Mon Sep 17 00:00:00 2001 From: Paul van der Walt Date: Sat, 5 Nov 2016 12:57:21 +1100 Subject: [PATCH] Don't filter events with SYNTHETIC_KB_ID. --- GNUmakefile | 2 +- debounce.m | 17 +++++++++++++---- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/GNUmakefile b/GNUmakefile index 3dbbcc9..49e7d90 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -1,6 +1,6 @@ all: debounce debounce: debounce.m - clang -fobjc-arc -framework Cocoa ./debounce.m -o debounce + clang -fobjc-arc -framework Cocoa ./debounce.m -o $@ .PHONY: all diff --git a/debounce.m b/debounce.m index 8abc50f..e5c23a0 100644 --- a/debounce.m +++ b/debounce.m @@ -12,6 +12,9 @@ #import #import +#define DEBOUNCE_DELAY 100 +#define SYNTHETIC_KB_ID 666 + typedef CFMachPortRef EventTap; @interface KeyChanger : NSObject @@ -80,13 +83,18 @@ CGEventRef _tapCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef even long long currentKeytime = (long long)([[NSDate date] timeIntervalSince1970] * 1000.0); UInt16 currentKeycode = [event keyCode]; BOOL debounce = NO; + long long keyboard_id = CGEventGetIntegerValueField(cgEvent, kCGKeyboardEventKeyboardType); - if (currentKeycode == lastKeycode && + if (keyboard_id != SYNTHETIC_KB_ID && + currentKeycode == lastKeycode && ![event isARepeat] && - (currentKeytime - lastKeytime) < 100) { + (currentKeytime - lastKeytime) < DEBOUNCE_DELAY) { - NSLog(@"BOUNCE detected!!! Character: %@", event.characters); - NSLog(@"Time between keys: %lldms", (currentKeytime - lastKeytime)); + NSLog(@"BOUNCE detected!!! Character: %@", + event.characters); + NSLog(@"Time between keys: %lldms (limit <%dms)", + (currentKeytime - lastKeytime), + DEBOUNCE_DELAY); // Cancel keypress event debounce = YES; @@ -120,6 +128,7 @@ CGEventRef _tapCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef even } @end + CGEventRef _tapCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef event, KeyChanger* listener) { // Do not make the NSEvent here. // NSEvent will throw an exception if we try to make an event from the tap timeout type