@@ -368,11 +368,13 @@ - (void)observeValueForKeyPath:(NSString *)aKeyPath
368
368
369
369
@implementation NSEvent (SRShortcutAction)
370
370
371
- - (SRKeyEventType)SR_keyEventType
371
+ + (SRKeyEventType)SR_keyEventTypeForEventType : (NSEventType )anEventType
372
+ keyCode : (unsigned short )aKeyCode
373
+ modifierFlags : (NSEventModifierFlags )aModifierFlags
372
374
{
373
375
SRKeyEventType eventType = SRKeyEventTypeDown;
374
376
375
- switch (self. type )
377
+ switch (anEventType )
376
378
{
377
379
case NSEventTypeKeyDown:
378
380
eventType = SRKeyEventTypeDown;
@@ -382,8 +384,8 @@ - (SRKeyEventType)SR_keyEventType
382
384
break ;
383
385
case NSEventTypeFlagsChanged:
384
386
{
385
- __auto_type keyCode = self. keyCode ;
386
- __auto_type modifierFlags = self. modifierFlags ;
387
+ __auto_type keyCode = aKeyCode ;
388
+ __auto_type modifierFlags = aModifierFlags ;
387
389
388
390
if (keyCode == kVK_Command || keyCode == kVK_RightCommand )
389
391
eventType = modifierFlags & NSEventModifierFlagCommand ? SRKeyEventTypeDown : SRKeyEventTypeUp;
@@ -398,13 +400,18 @@ - (SRKeyEventType)SR_keyEventType
398
400
break ;
399
401
}
400
402
default :
401
- [NSException raise: NSInternalInconsistencyException format: @" Expected a key event, got %lu " , self .type ];
403
+ [NSException raise: NSInternalInconsistencyException format: @" Expected a key event, got %lu " , anEventType ];
402
404
break ;
403
405
}
404
406
405
407
return eventType;
406
408
}
407
409
410
+ - (SRKeyEventType)SR_keyEventType
411
+ {
412
+ return [self .class SR_keyEventTypeForEventType: self .type keyCode: self .keyCode modifierFlags: self .modifierFlags];
413
+ }
414
+
408
415
@end
409
416
410
417
@@ -1342,25 +1349,34 @@ - (CGEventRef)handleEvent:(CGEventRef)anEvent
1342
1349
__block __auto_type result = anEvent;
1343
1350
1344
1351
os_activity_initiate (" -[SRAXGlobalShortcutMonitor handleEvent:]" , OS_ACTIVITY_FLAG_DETACHED, ^{
1345
- __auto_type nsEvent = [NSEvent eventWithCGEvent: anEvent];
1346
- if (!nsEvent)
1347
- {
1348
- os_trace_error (" #Error Unexpected event" );
1349
- return ;
1350
- }
1351
-
1352
- __auto_type shortcut = [SRShortcut shortcutWithEvent: nsEvent ignoringCharacters: YES ];
1353
- if (!shortcut)
1352
+ __auto_type eventKeyCode = CGEventGetIntegerValueField (anEvent, kCGKeyboardEventKeycode );
1353
+ __auto_type eventType = CGEventGetType (anEvent);
1354
+ __auto_type cocoaModifierFlags = SRCoreGraphicsToCocoaFlags (CGEventGetFlags (anEvent));
1355
+ NSEventType cocoaEventType;
1356
+ switch (eventType)
1354
1357
{
1355
- os_trace_error (" #Error Not a keyboard event" );
1356
- return ;
1358
+ case kCGEventKeyDown :
1359
+ cocoaEventType = NSEventTypeKeyDown;
1360
+ break ;
1361
+ case kCGEventKeyUp :
1362
+ cocoaEventType = NSEventTypeKeyUp;
1363
+ break ;
1364
+ case kCGEventFlagsChanged :
1365
+ cocoaEventType = NSEventTypeFlagsChanged;
1366
+ break ;
1367
+ default :
1368
+ cocoaEventType = 0 ;
1369
+ break ;
1357
1370
}
1358
1371
1359
- SRKeyEventType eventType = nsEvent.SR_keyEventType ;
1360
- if (eventType == 0 )
1361
- return ;
1362
-
1363
- __auto_type actions = [self enabledActionsForShortcut: shortcut keyEvent: eventType];
1372
+ __auto_type shortcut = [SRShortcut shortcutWithCode: eventType != kCGEventFlagsChanged ? (SRKeyCode)eventKeyCode : SRKeyCodeNone
1373
+ modifierFlags: cocoaModifierFlags
1374
+ characters: nil
1375
+ charactersIgnoringModifiers: nil ];
1376
+ __auto_type keyEventType = [NSEvent SR_keyEventTypeForEventType: cocoaEventType
1377
+ keyCode: (unsigned short )eventKeyCode
1378
+ modifierFlags: cocoaModifierFlags];
1379
+ __auto_type actions = [self enabledActionsForShortcut: shortcut keyEvent: keyEventType];
1364
1380
__block BOOL isHandled = NO ;
1365
1381
[actions enumerateObjectsWithOptions: NSEnumerationReverse
1366
1382
usingBlock: ^(SRShortcutAction *obj, NSUInteger idx, BOOL *stop)
@@ -1577,11 +1593,7 @@ - (BOOL)handleEvent:(NSEvent *)anEvent withTarget:(nullable id)aTarget
1577
1593
return NO ;
1578
1594
}
1579
1595
1580
- SRKeyEventType eventType = anEvent.SR_keyEventType ;
1581
- if (eventType == 0 )
1582
- return NO ;
1583
-
1584
- __auto_type actions = [self enabledActionsForShortcut: shortcut keyEvent: eventType];
1596
+ __auto_type actions = [self enabledActionsForShortcut: shortcut keyEvent: anEvent.SR_keyEventType];
1585
1597
__block BOOL isHandled = NO ;
1586
1598
[actions enumerateObjectsWithOptions: NSEnumerationReverse
1587
1599
usingBlock: ^(SRShortcutAction *obj, NSUInteger idx, BOOL *stop)
0 commit comments