1- #include < iostream>
21#include < signal.h>
3- #include < thread>
42#include < chrono>
3+ #include < iostream>
4+ #include < thread>
55
66extern " C" {
77#include " ../../src/capi/keyboard_monitor_c.h"
@@ -13,98 +13,109 @@ static bool g_running = true;
1313
1414// Signal handler for graceful shutdown
1515void signal_handler (int sig) {
16- std::cout << " \n Received signal " << sig << " , shutting down...\n " ;
17- g_running = false ;
18- if (g_monitor) {
19- native_keyboard_monitor_stop (g_monitor);
20- native_keyboard_monitor_destroy (g_monitor);
21- g_monitor = nullptr ;
22- }
23- exit (0 );
16+ std::cout << " \n Received signal " << sig << " , shutting down...\n " ;
17+ g_running = false ;
18+ if (g_monitor) {
19+ native_keyboard_monitor_stop (g_monitor);
20+ native_keyboard_monitor_destroy (g_monitor);
21+ g_monitor = nullptr ;
22+ }
23+ exit (0 );
2424}
2525
2626// Callback for key pressed events
2727void on_key_pressed (int keycode, void * user_data) {
28- std::cout << " Key pressed: " << keycode << std::endl;
28+ std::cout << " Key pressed: " << keycode << std::endl;
2929}
3030
31- // Callback for key released events
31+ // Callback for key released events
3232void on_key_released (int keycode, void * user_data) {
33- std::cout << " Key released: " << keycode << std::endl;
33+ std::cout << " Key released: " << keycode << std::endl;
3434}
3535
3636// Callback for modifier keys changed events
3737void on_modifier_keys_changed (uint32_t modifier_keys, void * user_data) {
38- std::cout << " Modifier keys changed: 0x" << std::hex << modifier_keys << std::dec;
39-
40- if (modifier_keys & NATIVE_MODIFIER_KEY_SHIFT) std::cout << " SHIFT" ;
41- if (modifier_keys & NATIVE_MODIFIER_KEY_CTRL) std::cout << " CTRL" ;
42- if (modifier_keys & NATIVE_MODIFIER_KEY_ALT) std::cout << " ALT" ;
43- if (modifier_keys & NATIVE_MODIFIER_KEY_META) std::cout << " META" ;
44- if (modifier_keys & NATIVE_MODIFIER_KEY_FN) std::cout << " FN" ;
45- if (modifier_keys & NATIVE_MODIFIER_KEY_CAPS_LOCK) std::cout << " CAPS" ;
46- if (modifier_keys & NATIVE_MODIFIER_KEY_NUM_LOCK) std::cout << " NUM" ;
47- if (modifier_keys & NATIVE_MODIFIER_KEY_SCROLL_LOCK) std::cout << " SCROLL" ;
48-
49- std::cout << std::endl;
38+ std::cout << " Modifier keys changed: 0x" << std::hex << modifier_keys
39+ << std::dec;
40+
41+ if (modifier_keys & NATIVE_MODIFIER_KEY_SHIFT)
42+ std::cout << " SHIFT" ;
43+ if (modifier_keys & NATIVE_MODIFIER_KEY_CTRL)
44+ std::cout << " CTRL" ;
45+ if (modifier_keys & NATIVE_MODIFIER_KEY_ALT)
46+ std::cout << " ALT" ;
47+ if (modifier_keys & NATIVE_MODIFIER_KEY_META)
48+ std::cout << " META" ;
49+ if (modifier_keys & NATIVE_MODIFIER_KEY_FN)
50+ std::cout << " FN" ;
51+ if (modifier_keys & NATIVE_MODIFIER_KEY_CAPS_LOCK)
52+ std::cout << " CAPS" ;
53+ if (modifier_keys & NATIVE_MODIFIER_KEY_NUM_LOCK)
54+ std::cout << " NUM" ;
55+ if (modifier_keys & NATIVE_MODIFIER_KEY_SCROLL_LOCK)
56+ std::cout << " SCROLL" ;
57+
58+ std::cout << std::endl;
5059}
5160
5261int main () {
53- std::cout << " KeyboardMonitor C API Example\n " ;
54- std::cout << " ==============================\n " ;
55-
56- // Set up signal handlers
57- signal (SIGINT, signal_handler);
58- signal (SIGTERM, signal_handler);
59-
60- // Create keyboard monitor
61- g_monitor = native_keyboard_monitor_create ();
62- if (!g_monitor) {
63- std::cout << " ❌ Failed to create keyboard monitor\n " ;
64- return 1 ;
65- }
66- std::cout << " ✅ Keyboard monitor created successfully\n " ;
67-
68- // Set up callbacks
69- if (!native_keyboard_monitor_set_callbacks (
70- g_monitor,
71- on_key_pressed,
72- on_key_released,
73- on_modifier_keys_changed,
74- nullptr )) {
75- std::cout << " ❌ Failed to set callbacks\n " ;
76- native_keyboard_monitor_destroy (g_monitor);
77- return 1 ;
78- }
79- std::cout << " ✅ Callbacks set successfully\n " ;
80-
81- // Start monitoring
82- if (!native_keyboard_monitor_start (g_monitor)) {
83- std::cout << " ❌ Failed to start keyboard monitoring\n " ;
84- native_keyboard_monitor_destroy (g_monitor);
85- return 1 ;
86- }
87-
88- if (native_keyboard_monitor_is_monitoring (g_monitor)) {
89- std::cout << " Keyboard monitoring is now active\n " ;
90- std::cout << " \n This example demonstrates the KeyboardMonitor C API:\n " ;
91- std::cout << " • native_keyboard_monitor_create() - Creates a monitor instance\n " ;
92- std::cout << " • native_keyboard_monitor_set_callbacks() - Sets event callbacks\n " ;
93- std::cout << " • native_keyboard_monitor_start() - Starts monitoring\n " ;
94- std::cout << " • native_keyboard_monitor_is_monitoring() - Checks status\n " ;
95- std::cout << " • native_keyboard_monitor_stop() - Stops monitoring\n " ;
96- std::cout << " • native_keyboard_monitor_destroy() - Cleans up resources\n " ;
97- std::cout << " \n Press keys to see events. Press Ctrl+C to exit.\n\n " ;
98- } else {
99- std::cout << " Warning: Monitor created but not monitoring (may be due to permissions or display server)\n " ;
100- std::cout << " This is expected in headless environments or without proper permissions.\n " ;
101- std::cout << " On a desktop system with X11/Wayland, you would see keyboard events.\n\n " ;
102- }
103-
104- // Keep the main thread alive to receive events
105- while (g_running) {
106- std::this_thread::sleep_for (std::chrono::milliseconds (100 ));
107- }
108-
109- return 0 ;
62+ std::cout << " KeyboardMonitor C API Example\n " ;
63+ std::cout << " ==============================\n " ;
64+
65+ // Set up signal handlers
66+ signal (SIGINT, signal_handler);
67+ signal (SIGTERM, signal_handler);
68+
69+ // Create keyboard monitor
70+ g_monitor = native_keyboard_monitor_create ();
71+ if (!g_monitor) {
72+ std::cout << " ❌ Failed to create keyboard monitor\n " ;
73+ return 1 ;
74+ }
75+ std::cout << " ✅ Keyboard monitor created successfully\n " ;
76+
77+ // Set up callbacks
78+ if (!native_keyboard_monitor_set_callbacks (
79+ g_monitor, on_key_pressed, on_key_released, on_modifier_keys_changed,
80+ nullptr )) {
81+ std::cout << " ❌ Failed to set callbacks\n " ;
82+ native_keyboard_monitor_destroy (g_monitor);
83+ return 1 ;
84+ }
85+ std::cout << " ✅ Callbacks set successfully\n " ;
86+
87+ // Start monitoring
88+ if (!native_keyboard_monitor_start (g_monitor)) {
89+ std::cout << " ❌ Failed to start keyboard monitoring\n " ;
90+ native_keyboard_monitor_destroy (g_monitor);
91+ return 1 ;
92+ }
93+
94+ if (native_keyboard_monitor_is_monitoring (g_monitor)) {
95+ std::cout << " Keyboard monitoring is now active\n " ;
96+ std::cout << " \n This example demonstrates the KeyboardMonitor C API:\n " ;
97+ std::cout
98+ << " • native_keyboard_monitor_create() - Creates a monitor instance\n " ;
99+ std::cout
100+ << " • native_keyboard_monitor_set_callbacks() - Sets event callbacks\n " ;
101+ std::cout << " • native_keyboard_monitor_start() - Starts monitoring\n " ;
102+ std::cout << " • native_keyboard_monitor_is_monitoring() - Checks status\n " ;
103+ std::cout << " • native_keyboard_monitor_stop() - Stops monitoring\n " ;
104+ std::cout << " • native_keyboard_monitor_destroy() - Cleans up resources\n " ;
105+ std::cout << " \n Press keys to see events. Press Ctrl+C to exit.\n\n " ;
106+ } else {
107+ std::cout << " Warning: Monitor created but not monitoring (may be due to "
108+ " permissions or display server)\n " ;
109+ std::cout << " This is expected in headless environments or without proper "
110+ " permissions.\n " ;
111+ std::cout << " On a desktop system with X11/Wayland, you would see keyboard "
112+ " events.\n\n " ;
113+ }
114+
115+ // Keep the main thread alive to receive events
116+ while (g_running) {
117+ std::this_thread::sleep_for (std::chrono::milliseconds (100 ));
118+ }
119+
120+ return 0 ;
110121}
0 commit comments