Description
Hi @Kentzo!
So, we've been trying to identify a keyboard issue with AltTab's community for a while now. Today, I analyzed new logs from a user, and I see this message in these logs:
#Error Unexpected key code 0 for the FlagsChanged event
This message is coming from ShortcutRecorder. After digging a bit, I found the log line:
ShortcutRecorder/Library/SRShortcutAction.m
Line 395 in efde820
I'm quite puzzled as to how this is happening. From the caller (AltTab), we call get a CGEvent
from CGEvent.tapCreate
. Then we construct a NSEvent
based on that CGEvent
:
let event_ = NSEvent(cgEvent: cgEvent)
Then we create a new NSEvent
based off that NSEvent
(to workaround the issue we had with calling .characters
outside the main thread; I think you remember this workaround):
let event = NSEvent.keyEvent(with: event_.type, location: event_.locationInWindow, modifierFlags: event_.modifierFlags, timestamp: event_.timestamp, windowNumber: event_.windowNumber, context: nil, characters: "", charactersIgnoringModifiers: "", isARepeat: type == .flagsChanged ? false : event_.isARepeat, keyCode: event_.keyCode)
At this point we call event.sr_keyEventType
to learn if a modifier key was went up or down. Within this method, the log line is logged.
I can't imagine why the keyCode
would be 0
. From the NSEvent header, it doesn't even seem like 0 should be a possible value:
/* Device-independent bits found in event modifier flags */
typedef NS_OPTIONS(NSUInteger, NSEventModifierFlags) {
NSEventModifierFlagCapsLock = 1 << 16, // Set if Caps Lock key is pressed.
NSEventModifierFlagShift = 1 << 17, // Set if Shift key is pressed.
NSEventModifierFlagControl = 1 << 18, // Set if Control key is pressed.
NSEventModifierFlagOption = 1 << 19, // Set if Option or Alternate key is pressed.
NSEventModifierFlagCommand = 1 << 20, // Set if Command key is pressed.
NSEventModifierFlagNumericPad = 1 << 21, // Set if any key in the numeric keypad is pressed.
NSEventModifierFlagHelp = 1 << 22, // Set if the Help key is pressed.
NSEventModifierFlagFunction = 1 << 23, // Set if any function key is pressed.
// Used to retrieve only the device-independent modifier flags, allowing applications to mask off the device-dependent modifier flags, including event coalescing information.
NSEventModifierFlagDeviceIndependentFlagsMask = 0xffff0000UL
};
Do you have any idea how this scenario would be happening?
Originally posted by @lwouis in #114 (comment)