From 4637e56c938b55d469f381e1e9b580ad45b13551 Mon Sep 17 00:00:00 2001 From: Julien M Date: Wed, 10 May 2017 18:42:59 +0200 Subject: [PATCH 1/3] Add some media keys as option Play/Pause, Previous, Next --- PowerKey/PKPowerKeyEventListener.m | 16 ++++++++++++++++ PowerKey/PKPreferencesWindowController.m | 5 +++++ PowerKey/PowerKey-Info.plist | 2 +- 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/PowerKey/PKPowerKeyEventListener.m b/PowerKey/PKPowerKeyEventListener.m index b030b43..7ae9e96 100644 --- a/PowerKey/PKPowerKeyEventListener.m +++ b/PowerKey/PKPowerKeyEventListener.m @@ -8,6 +8,7 @@ #import "PKPowerKeyEventListener.h" #include +#include #include #import "PKAppDelegate.h" #import "PKScriptController.h" @@ -158,6 +159,7 @@ - (CGEventRef)newPowerKeyEventOrUnmodifiedSystemDefinedEvent:(CGEventRef)systemE // Input an event/action chosen by the user. CGKeyCode replacementKeyCode = [[NSUserDefaults standardUserDefaults] integerForKey:kPowerKeyReplacementKeycodeKey] ?: kVK_ForwardDelete; + if (replacementKeyCode == kPowerKeyDeadKeyTag) { // no action @@ -166,6 +168,20 @@ - (CGEventRef)newPowerKeyEventOrUnmodifiedSystemDefinedEvent:(CGEventRef)systemE [PKScriptController runScript]; + } else if ([@[@NX_KEYTYPE_PLAY, @NX_KEYTYPE_PREVIOUS, @NX_KEYTYPE_NEXT] containsObject:@(replacementKeyCode)]) { + // Helper method for special keys. + // Source: http://stackoverflow.com/questions/11045814/emulate-media-key-press-on-mac + NSEvent *inputEvent = [NSEvent otherEventWithType: NSSystemDefined + location: NSMakePoint(0,0) + modifierFlags: 0xa00 + timestamp: 0 + windowNumber: 0 + context: 0 + subtype: 8 + data1: (replacementKeyCode << 16) | ((0xa) << 8) + data2: -1]; + + CGEventPost(0, [inputEvent CGEvent]); } else { CGEventSourceRef eventSource = CGEventSourceCreate(kCGEventSourceStateHIDSystemState); CGEventRef inputEvent = CGEventCreateKeyboardEvent(eventSource, replacementKeyCode, true); diff --git a/PowerKey/PKPreferencesWindowController.m b/PowerKey/PKPreferencesWindowController.m index f12c365..b541313 100644 --- a/PowerKey/PKPreferencesWindowController.m +++ b/PowerKey/PKPreferencesWindowController.m @@ -8,6 +8,8 @@ #import "PKPreferencesWindowController.h" #include +#include +#import #import "PKAppDelegate.h" #import "PKPowerKeyEventListener.h" #import "PKScriptController.h" @@ -58,6 +60,9 @@ - (NSArray *)powerKeyReplacements { @[@"Tab", @(kVK_Tab)], @[@"Return", @(kVK_Return)], @[@"Enter", @(kVK_ANSI_KeypadEnter)], + @[@"Play/Pause (media)", @(NX_KEYTYPE_PLAY)], + @[@"Previous (media)", @(NX_KEYTYPE_PREVIOUS)], + @[@"Next (media)", @(NX_KEYTYPE_NEXT)], @[@"F13", @(kVK_F13)], @[@"Script", @(kPowerKeyScriptTag)], ]; diff --git a/PowerKey/PowerKey-Info.plist b/PowerKey/PowerKey-Info.plist index 612d6dc..9309c3b 100644 --- a/PowerKey/PowerKey-Info.plist +++ b/PowerKey/PowerKey-Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.5.2 + 1.5.3 CFBundleSignature ???? CFBundleVersion From 85e42a0243a7269d4df9d2a5d32360a2f1cee9d8 Mon Sep 17 00:00:00 2001 From: Julien M Date: Wed, 10 May 2017 19:00:04 +0200 Subject: [PATCH 2/3] Clean some mess for PR --- PowerKey/PKPowerKeyEventListener.m | 1 - PowerKey/PKPreferencesWindowController.m | 1 - PowerKey/PowerKey-Info.plist | 2 +- 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/PowerKey/PKPowerKeyEventListener.m b/PowerKey/PKPowerKeyEventListener.m index 7ae9e96..661c14c 100644 --- a/PowerKey/PKPowerKeyEventListener.m +++ b/PowerKey/PKPowerKeyEventListener.m @@ -159,7 +159,6 @@ - (CGEventRef)newPowerKeyEventOrUnmodifiedSystemDefinedEvent:(CGEventRef)systemE // Input an event/action chosen by the user. CGKeyCode replacementKeyCode = [[NSUserDefaults standardUserDefaults] integerForKey:kPowerKeyReplacementKeycodeKey] ?: kVK_ForwardDelete; - if (replacementKeyCode == kPowerKeyDeadKeyTag) { // no action diff --git a/PowerKey/PKPreferencesWindowController.m b/PowerKey/PKPreferencesWindowController.m index b541313..a2bd4f7 100644 --- a/PowerKey/PKPreferencesWindowController.m +++ b/PowerKey/PKPreferencesWindowController.m @@ -9,7 +9,6 @@ #import "PKPreferencesWindowController.h" #include #include -#import #import "PKAppDelegate.h" #import "PKPowerKeyEventListener.h" #import "PKScriptController.h" diff --git a/PowerKey/PowerKey-Info.plist b/PowerKey/PowerKey-Info.plist index 9309c3b..612d6dc 100644 --- a/PowerKey/PowerKey-Info.plist +++ b/PowerKey/PowerKey-Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.5.3 + 1.5.2 CFBundleSignature ???? CFBundleVersion From 2687c38e04900a47fba36b03fc223e9c71b01ae1 Mon Sep 17 00:00:00 2001 From: Julien Ma Date: Mon, 13 Nov 2017 14:06:15 +0100 Subject: [PATCH 3/3] Add 'up event' when firing media keys - Fix next/previous on High Sierra --- PowerKey/PKPowerKeyEventListener.m | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/PowerKey/PKPowerKeyEventListener.m b/PowerKey/PKPowerKeyEventListener.m index 130e642..17a4518 100644 --- a/PowerKey/PKPowerKeyEventListener.m +++ b/PowerKey/PKPowerKeyEventListener.m @@ -138,8 +138,11 @@ - (CGEventRef)newPowerKeyEventOrUnmodifiedSystemDefinedEvent:(CGEventRef)systemE } else if ([@[@NX_KEYTYPE_PLAY, @NX_KEYTYPE_PREVIOUS, @NX_KEYTYPE_NEXT] containsObject:@(replacementKeyCode)]) { // Helper method for special keys. // Source: http://stackoverflow.com/questions/11045814/emulate-media-key-press-on-mac - NSEvent *inputEvent = [NSEvent otherEventWithType: NSSystemDefined - location: NSMakePoint(0,0) + // Also inspired from https://github.com/jguice/mac-bt-headset-fix/commit/33401146ca0f45fec8d58765bff99398800de97a#diff-6a92cb546e342fc740fb0b588977dc48 + NSEvent* inputEvent; + // create and send down key event + inputEvent = [NSEvent otherEventWithType: NSSystemDefined + location: CGPointZero modifierFlags: 0xa00 timestamp: 0 windowNumber: 0 @@ -147,7 +150,17 @@ - (CGEventRef)newPowerKeyEventOrUnmodifiedSystemDefinedEvent:(CGEventRef)systemE subtype: 8 data1: (replacementKeyCode << 16) | ((0xa) << 8) data2: -1]; - + CGEventPost(0, [inputEvent CGEvent]); + // create and send up key event + inputEvent = [NSEvent otherEventWithType: NSSystemDefined + location: CGPointZero + modifierFlags: 0xb00 + timestamp: 0 + windowNumber: 0 + context: 0 + subtype: 8 + data1: (replacementKeyCode << 16) | ((0xb) << 8) + data2: -1]; CGEventPost(0, [inputEvent CGEvent]); } else { CGEventSourceRef eventSource = CGEventSourceCreate(kCGEventSourceStateHIDSystemState);