Skip to content

Commit e998405

Browse files
committed
feat: Enhance keyboard event handling to support modifier key changes in KeyboardEventHandler
1 parent cc31829 commit e998405

File tree

3 files changed

+60
-7
lines changed

3 files changed

+60
-7
lines changed

src/keyboard_monitor.cpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@ namespace nativeapi {
44

55
KeyboardEventHandler::KeyboardEventHandler(
66
std::function<void(int)> onKeyPressedCallback,
7-
std::function<void(int)> onKeyReleasedCallback)
7+
std::function<void(int)> onKeyReleasedCallback,
8+
std::function<void(uint32_t)> onModifierKeysChangedCallback)
89
: onKeyPressedCallback_(onKeyPressedCallback),
9-
onKeyReleasedCallback_(onKeyReleasedCallback) {}
10+
onKeyReleasedCallback_(onKeyReleasedCallback),
11+
onModifierKeysChangedCallback_(onModifierKeysChangedCallback) {}
1012

1113
void KeyboardEventHandler::OnKeyPressed(int keycode) {
1214
if (onKeyPressedCallback_) {
@@ -20,6 +22,12 @@ void KeyboardEventHandler::OnKeyReleased(int keycode) {
2022
}
2123
}
2224

25+
void KeyboardEventHandler::OnModifierKeysChanged(uint32_t modifier_keys) {
26+
if (onModifierKeysChangedCallback_) {
27+
onModifierKeysChangedCallback_(modifier_keys);
28+
}
29+
}
30+
2331
void KeyboardMonitor::SetEventHandler(KeyboardEventHandler* event_handler) {
2432
event_handler_ = event_handler;
2533
}

src/keyboard_monitor.h

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,40 @@
66

77
namespace nativeapi {
88

9+
enum class ModifierKey : uint32_t {
10+
None = 0,
11+
Shift = 1 << 0,
12+
Ctrl = 1 << 1,
13+
Alt = 1 << 2,
14+
Meta = 1 << 3, // Windows key or Cmd key
15+
Fn = 1 << 4,
16+
CapsLock = 1 << 5,
17+
NumLock = 1 << 6,
18+
ScrollLock = 1 << 7
19+
};
20+
921
// KeyboardEventHandler uses callbacks to handle keyboard events.
1022
class KeyboardEventHandler {
1123
public:
1224
// Constructor that takes callbacks for keyboard events
13-
KeyboardEventHandler(std::function<void(int)> onKeyPressedCallback,
14-
std::function<void(int)> onKeyReleasedCallback);
25+
KeyboardEventHandler(
26+
std::function<void(int)> onKeyPressedCallback,
27+
std::function<void(int)> onKeyReleasedCallback,
28+
std::function<void(uint32_t)> onModifierKeysChangedCallback);
1529

1630
// Handle key pressed event
1731
void OnKeyPressed(int keycode);
1832

1933
// Handle key released event
2034
void OnKeyReleased(int keycode);
2135

36+
// Handle modifier keys changed event
37+
void OnModifierKeysChanged(uint32_t modifier_keys);
38+
2239
private:
2340
std::function<void(int)> onKeyPressedCallback_;
2441
std::function<void(int)> onKeyReleasedCallback_;
42+
std::function<void(uint32_t)> onModifierKeysChangedCallback_;
2543
};
2644

2745
class KeyboardMonitor {

src/keyboard_monitor_macos.mm

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)