Add modifier keys support on Linux. Fix #3

This commit is contained in:
Federico Terzi 2019-09-06 22:38:21 +02:00
parent 3114c7b7ff
commit 0a651cc187
3 changed files with 17 additions and 17 deletions

View File

@ -180,14 +180,13 @@ void event_callback(XPointer p, XRecordInterceptData *hook)
switch (event_type) { switch (event_type) {
case KeyRelease: case KeyRelease:
//printf ("%d %d KeyPress: \t%s\t%s\n", key_code, res, XKeysymToString(XkbKeycodeToKeysym(ctrl_disp, key_code, 0, 0)), buffer.data()); //printf ("%d %d %s\n", key_code, res, buffer.data());
if (res > 0) { // Send only printable chars, todo: change if (res > 0 && key_code != 22) { // Printable character, but not backspace
keypress_callback(interceptor_instance, buffer.data(), buffer.size()); keypress_callback(interceptor_instance, buffer.data(), buffer.size(), 0, key_code);
}else{ // Modifier key
keypress_callback(interceptor_instance, NULL, 0, 1, key_code);
} }
break; 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: default:
break; break;
} }

View File

@ -22,7 +22,7 @@ extern "C" void cleanup();
* Called when a new keypress is made, the first argument is an char array, * Called when a new keypress is made, the first argument is an char array,
* while the second is the size of the 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 KeypressCallback keypress_callback;
extern void * interceptor_instance; extern void * interceptor_instance;

View File

@ -54,10 +54,10 @@ impl super::KeyboardSender for LinuxKeyboardSender {
// Native bridge code // 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 { unsafe {
//if is_modifier == 0 { // Char event if is_modifier == 0 { // Char event
if true { // Char event
// Convert the received buffer to a character // Convert the received buffer to a character
let buffer = std::slice::from_raw_parts(raw_buffer, len as usize); let buffer = std::slice::from_raw_parts(raw_buffer, len as usize);
let r = String::from_utf8_lossy(buffer).chars().nth(0); 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(); (*_self).sender.send(KeyEvent::Char(c)).unwrap();
} }
}else{ // Modifier event }else{ // Modifier event
let key_code = 3;
let modifier: Option<KeyModifier> = match key_code { let modifier: Option<KeyModifier> = match key_code {
0x37 => Some(META), 133 => Some(META),
0x38 => Some(SHIFT), 50 => Some(SHIFT),
0x3A => Some(ALT), 64 => Some(ALT),
0x3B => Some(CTRL), 37 => Some(CTRL),
0x33 => Some(BACKSPACE), 22 => Some(BACKSPACE),
_ => None, _ => None,
}; };
@ -87,7 +86,9 @@ extern fn keypress_callback(_self: *mut LinuxKeyboardInterceptor, raw_buffer: *c
#[allow(improper_ctypes)] #[allow(improper_ctypes)]
#[link(name="linuxbridge", kind="static")] #[link(name="linuxbridge", kind="static")]
extern { 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 initialize();
fn eventloop(); fn eventloop();
fn cleanup(); fn cleanup();