diff --git a/native/liblinuxbridge/bridge.cpp b/native/liblinuxbridge/bridge.cpp index 9c6c311..bbe7fda 100644 --- a/native/liblinuxbridge/bridge.cpp +++ b/native/liblinuxbridge/bridge.cpp @@ -180,14 +180,13 @@ void event_callback(XPointer p, XRecordInterceptData *hook) switch (event_type) { case KeyRelease: - //printf ("%d %d KeyPress: \t%s\t%s\n", key_code, res, XKeysymToString(XkbKeycodeToKeysym(ctrl_disp, key_code, 0, 0)), buffer.data()); - if (res > 0) { // Send only printable chars, todo: change - keypress_callback(interceptor_instance, buffer.data(), buffer.size()); + //printf ("%d %d %s\n", key_code, res, buffer.data()); + if (res > 0 && key_code != 22) { // Printable character, but not backspace + keypress_callback(interceptor_instance, buffer.data(), buffer.size(), 0, key_code); + }else{ // Modifier key + keypress_callback(interceptor_instance, NULL, 0, 1, key_code); } break; -// case KeyPress: -// printf ("%d %d KeyPress: \t%s\t%s\t%d\n", keycode, res, XKeysymToString(XkbKeycodeToKeysym(ctrl_disp, keycode, 0, 0)), buff, buff[0]); -// break; default: break; } diff --git a/native/liblinuxbridge/bridge.h b/native/liblinuxbridge/bridge.h index ec9a21f..62919cc 100644 --- a/native/liblinuxbridge/bridge.h +++ b/native/liblinuxbridge/bridge.h @@ -22,7 +22,7 @@ extern "C" void cleanup(); * Called when a new keypress is made, the first argument is an char array, * while the second is the size of the array. */ -typedef void (*KeypressCallback)(void * self, char *buffer, int32_t len); +typedef void (*KeypressCallback)(void * self, const char *buffer, int32_t len, int32_t is_modifier, int32_t key_code); extern KeypressCallback keypress_callback; extern void * interceptor_instance; diff --git a/src/keyboard/linux.rs b/src/keyboard/linux.rs index b131c97..997968c 100644 --- a/src/keyboard/linux.rs +++ b/src/keyboard/linux.rs @@ -54,10 +54,10 @@ impl super::KeyboardSender for LinuxKeyboardSender { // Native bridge code -extern fn keypress_callback(_self: *mut LinuxKeyboardInterceptor, raw_buffer: *const u8, len: i32) { +extern fn keypress_callback(_self: *mut LinuxKeyboardInterceptor, raw_buffer: *const u8, len: i32, + is_modifier: i32, key_code: i32) { unsafe { - //if is_modifier == 0 { // Char event - if true { // Char event + if is_modifier == 0 { // Char event // Convert the received buffer to a character let buffer = std::slice::from_raw_parts(raw_buffer, len as usize); let r = String::from_utf8_lossy(buffer).chars().nth(0); @@ -67,13 +67,12 @@ extern fn keypress_callback(_self: *mut LinuxKeyboardInterceptor, raw_buffer: *c (*_self).sender.send(KeyEvent::Char(c)).unwrap(); } }else{ // Modifier event - let key_code = 3; let modifier: Option = match key_code { - 0x37 => Some(META), - 0x38 => Some(SHIFT), - 0x3A => Some(ALT), - 0x3B => Some(CTRL), - 0x33 => Some(BACKSPACE), + 133 => Some(META), + 50 => Some(SHIFT), + 64 => Some(ALT), + 37 => Some(CTRL), + 22 => Some(BACKSPACE), _ => None, }; @@ -87,7 +86,9 @@ extern fn keypress_callback(_self: *mut LinuxKeyboardInterceptor, raw_buffer: *c #[allow(improper_ctypes)] #[link(name="linuxbridge", kind="static")] extern { - fn register_keypress_callback(s: *const LinuxKeyboardInterceptor, cb: extern fn(_self: *mut LinuxKeyboardInterceptor, *const u8, i32)); + fn register_keypress_callback(s: *const LinuxKeyboardInterceptor, + cb: extern fn(_self: *mut LinuxKeyboardInterceptor, *const u8, + i32, i32, i32)); fn initialize(); fn eventloop(); fn cleanup();