diff --git a/Unshaky/Info.plist b/Unshaky/Info.plist index a6cb920..7dc2947 100644 --- a/Unshaky/Info.plist +++ b/Unshaky/Info.plist @@ -17,9 +17,9 @@ CFBundlePackageType APPL CFBundleShortVersionString - 0.2.2 + 0.2.3 CFBundleVersion - 7 + 8 LSMinimumSystemVersion $(MACOSX_DEPLOYMENT_TARGET) LSUIElement diff --git a/Unshaky/PreferenceViewController.swift b/Unshaky/PreferenceViewController.swift index 7d4e43e..87e6fdd 100644 --- a/Unshaky/PreferenceViewController.swift +++ b/Unshaky/PreferenceViewController.swift @@ -132,6 +132,7 @@ class PreferenceViewController: NSViewController, 117: "ForwardDelete", 52: "Linefeed", 53: "Escape", + 54: "RightCommand", 55: "Command", 56: "Shift", 57: "CapsLock", diff --git a/Unshaky/ShakyPressPreventer.m b/Unshaky/ShakyPressPreventer.m index 156aeff..cc1a3f1 100644 --- a/Unshaky/ShakyPressPreventer.m +++ b/Unshaky/ShakyPressPreventer.m @@ -58,6 +58,33 @@ - (CGEventRef)filterShakyPressEvent:(CGEventRef)event { // ignore unconfigured keys if (keyDelays[keyCode] == 0) return event; + { + // handle control, command, option and shift keys + CGEventFlags flags; + BOOL isModifierPressed; + switch (keyCode) { + case 54: // RightCommand + case 55: // Command + case 56: // Shift + case 58: // Option + case 59: // Control + case 60: // RightShift + case 61: // RightOption + case 62: // RightControl (this key does not exist on MacBook Pro's keyboard) + case 63: // Function + flags = CGEventGetFlags(event); + isModifierPressed = (flags & (kCGEventFlagMaskAlternate | kCGEventFlagMaskCommand | kCGEventFlagMaskControl | kCGEventFlagMaskShift | kCGEventFlagMaskSecondaryFn)) > 0; + if (isModifierPressed) + eventType = kCGEventKeyDown; + else + eventType = kCGEventKeyUp; + break; + + default: + break; + } + } + if (lastPressedTimestamps[keyCode] == 0.0) { lastPressedTimestamps[keyCode] = [[NSDate date] timeIntervalSince1970]; lastPressedEventTypes[keyCode] = eventType; @@ -92,7 +119,7 @@ - (CGEventRef)filterShakyPressEvent:(CGEventRef)event { - (BOOL)setupInputDeviceListener { - CGEventMask eventMask = ((1 << kCGEventKeyDown) | (1 << kCGEventKeyUp)); + CGEventMask eventMask = ((1 << kCGEventKeyDown) | (1 << kCGEventKeyUp) | (1 << kCGEventFlagsChanged)); CFMachPortRef eventTap = CGEventTapCreate(kCGSessionEventTap, kCGHeadInsertEventTap, 0, eventMask, myCGEventCallback, (__bridge void *)(self)); if (!eventTap) {