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