@@ -45,8 +45,32 @@ static CGEventRef keyboardEventCallback(CGEventTapProxy proxy,
4545 eventHandler->OnKeyPressed (keyCode);
4646 } else if (type == kCGEventKeyUp ) {
4747 eventHandler->OnKeyReleased (keyCode);
48+ } else if (type == kCGEventFlagsChanged ) {
49+ CGEventFlags flags = CGEventGetFlags (event);
50+ uint32_t modifier_keys = static_cast <uint32_t >(ModifierKey::None);
51+ if (flags & kCGEventFlagMaskShift ) {
52+ modifier_keys |= static_cast <uint32_t >(ModifierKey::Shift);
53+ }
54+ if (flags & kCGEventFlagMaskControl ) {
55+ modifier_keys |= static_cast <uint32_t >(ModifierKey::Ctrl);
56+ }
57+ if (flags & kCGEventFlagMaskAlternate ) {
58+ modifier_keys |= static_cast <uint32_t >(ModifierKey::Alt);
59+ }
60+ if (flags & kCGEventFlagMaskCommand ) {
61+ modifier_keys |= static_cast <uint32_t >(ModifierKey::Meta);
62+ }
63+ if (flags & kCGEventFlagMaskSecondaryFn ) {
64+ modifier_keys |= static_cast <uint32_t >(ModifierKey::Fn);
65+ }
66+ if (flags & kCGEventFlagMaskAlphaShift ) {
67+ modifier_keys |= static_cast <uint32_t >(ModifierKey::CapsLock);
68+ }
69+ if (flags & kCGEventFlagMaskNumericPad ) {
70+ modifier_keys |= static_cast <uint32_t >(ModifierKey::NumLock);
71+ }
72+ eventHandler->OnModifierKeysChanged (modifier_keys);
4873 }
49-
5074 return event;
5175}
5276
@@ -55,13 +79,16 @@ static CGEventRef keyboardEventCallback(CGEventTapProxy proxy,
5579 return ; // Already started
5680 }
5781
82+ // Create event mask
83+ CGEventMask eventMask =
84+ (1 << kCGEventKeyDown ) | (1 << kCGEventKeyUp ) | (1 << kCGEventFlagsChanged );
85+
5886 // Create event tap for keyboard events
5987 impl_->eventTap =
6088 CGEventTapCreate (kCGSessionEventTap , // Monitor session-wide events
6189 kCGHeadInsertEventTap , // Insert at the head of the event queue
6290 kCGEventTapOptionDefault , // Default options
63- CGEventMaskBit (kCGEventKeyDown ) |
64- CGEventMaskBit (kCGEventKeyUp ), // Monitor key down and up events
91+ eventMask, // Monitor key down, up, and flags changed events
6592 keyboardEventCallback,
6693 this ); // Pass this pointer as user data
6794
0 commit comments