|
1 | 1 | #include "keyboard_monitor_c.h" |
2 | 2 | #include "../keyboard_monitor.h" |
| 3 | +#include "../keyboard_events.h" |
3 | 4 | #include <memory> |
4 | 5 |
|
5 | 6 | // Internal structure to hold C API state |
6 | 7 | struct native_keyboard_monitor_t { |
7 | 8 | std::unique_ptr<nativeapi::KeyboardMonitor> cpp_monitor; |
8 | | - std::unique_ptr<nativeapi::KeyboardEventHandler> event_handler; |
9 | 9 |
|
10 | 10 | // Store C callback functions and user data |
11 | 11 | native_key_pressed_callback_t on_key_pressed; |
12 | 12 | native_key_released_callback_t on_key_released; |
13 | 13 | native_modifier_keys_changed_callback_t on_modifier_keys_changed; |
14 | 14 | void* user_data; |
15 | 15 |
|
| 16 | + // Store listener IDs for cleanup |
| 17 | + size_t key_pressed_listener_id; |
| 18 | + size_t key_released_listener_id; |
| 19 | + size_t modifier_keys_listener_id; |
| 20 | + |
16 | 21 | native_keyboard_monitor_t() |
17 | 22 | : cpp_monitor(nullptr), |
18 | | - event_handler(nullptr), |
19 | 23 | on_key_pressed(nullptr), |
20 | 24 | on_key_released(nullptr), |
21 | 25 | on_modifier_keys_changed(nullptr), |
22 | | - user_data(nullptr) {} |
| 26 | + user_data(nullptr), |
| 27 | + key_pressed_listener_id(0), |
| 28 | + key_released_listener_id(0), |
| 29 | + modifier_keys_listener_id(0) {} |
23 | 30 | }; |
24 | 31 |
|
25 | 32 | // Helper function to convert C++ ModifierKey enum to C enum |
@@ -88,41 +95,49 @@ bool native_keyboard_monitor_set_callbacks( |
88 | 95 | return false; |
89 | 96 | } |
90 | 97 |
|
| 98 | + // Remove existing listeners if any |
| 99 | + if (monitor->key_pressed_listener_id > 0) { |
| 100 | + monitor->cpp_monitor->RemoveListener(monitor->key_pressed_listener_id); |
| 101 | + } |
| 102 | + if (monitor->key_released_listener_id > 0) { |
| 103 | + monitor->cpp_monitor->RemoveListener(monitor->key_released_listener_id); |
| 104 | + } |
| 105 | + if (monitor->modifier_keys_listener_id > 0) { |
| 106 | + monitor->cpp_monitor->RemoveListener(monitor->modifier_keys_listener_id); |
| 107 | + } |
| 108 | + |
91 | 109 | // Store the C callbacks and user data |
92 | 110 | monitor->on_key_pressed = on_key_pressed; |
93 | 111 | monitor->on_key_released = on_key_released; |
94 | 112 | monitor->on_modifier_keys_changed = on_modifier_keys_changed; |
95 | 113 | monitor->user_data = user_data; |
96 | 114 |
|
97 | 115 | try { |
98 | | - // Create C++ lambda callbacks that call the C callbacks |
99 | | - auto key_pressed_callback = [monitor](int keycode) { |
100 | | - if (monitor->on_key_pressed) { |
101 | | - monitor->on_key_pressed(keycode, monitor->user_data); |
102 | | - } |
103 | | - }; |
104 | | - |
105 | | - auto key_released_callback = [monitor](int keycode) { |
106 | | - if (monitor->on_key_released) { |
107 | | - monitor->on_key_released(keycode, monitor->user_data); |
108 | | - } |
109 | | - }; |
110 | | - |
111 | | - auto modifier_keys_changed_callback = [monitor](uint32_t modifier_keys) { |
112 | | - if (monitor->on_modifier_keys_changed) { |
113 | | - uint32_t c_modifier_keys = convert_modifier_keys_to_c(modifier_keys); |
114 | | - monitor->on_modifier_keys_changed(c_modifier_keys, monitor->user_data); |
115 | | - } |
116 | | - }; |
| 116 | + // Add event listeners with callback lambdas |
| 117 | + if (on_key_pressed) { |
| 118 | + monitor->key_pressed_listener_id = monitor->cpp_monitor->AddListener<nativeapi::KeyPressedEvent>( |
| 119 | + [monitor](const nativeapi::KeyPressedEvent& event) { |
| 120 | + monitor->on_key_pressed(event.GetKeycode(), monitor->user_data); |
| 121 | + } |
| 122 | + ); |
| 123 | + } |
117 | 124 |
|
118 | | - // Create the event handler with the lambda callbacks |
119 | | - monitor->event_handler = std::make_unique<nativeapi::KeyboardEventHandler>( |
120 | | - key_pressed_callback, |
121 | | - key_released_callback, |
122 | | - modifier_keys_changed_callback); |
| 125 | + if (on_key_released) { |
| 126 | + monitor->key_released_listener_id = monitor->cpp_monitor->AddListener<nativeapi::KeyReleasedEvent>( |
| 127 | + [monitor](const nativeapi::KeyReleasedEvent& event) { |
| 128 | + monitor->on_key_released(event.GetKeycode(), monitor->user_data); |
| 129 | + } |
| 130 | + ); |
| 131 | + } |
123 | 132 |
|
124 | | - // Set the event handler on the keyboard monitor |
125 | | - monitor->cpp_monitor->SetEventHandler(monitor->event_handler.get()); |
| 133 | + if (on_modifier_keys_changed) { |
| 134 | + monitor->modifier_keys_listener_id = monitor->cpp_monitor->AddListener<nativeapi::ModifierKeysChangedEvent>( |
| 135 | + [monitor](const nativeapi::ModifierKeysChangedEvent& event) { |
| 136 | + uint32_t c_modifier_keys = convert_modifier_keys_to_c(event.GetModifierKeys()); |
| 137 | + monitor->on_modifier_keys_changed(c_modifier_keys, monitor->user_data); |
| 138 | + } |
| 139 | + ); |
| 140 | + } |
126 | 141 |
|
127 | 142 | return true; |
128 | 143 | } catch (...) { |
|
0 commit comments