diff --git a/eek/eek-keyboard.c b/eek/eek-keyboard.c index bf50c751..794f3e99 100644 --- a/eek/eek-keyboard.c +++ b/eek/eek-keyboard.c @@ -31,6 +31,7 @@ #include #include "eek-enumtypes.h" +#include "eekboard/eekboard-context-service.h" #include "eekboard/key-emitter.h" #include "keymap.h" #include "src/keyboard.h" @@ -93,17 +94,8 @@ set_level_from_press (LevelKeyboard *keyboard, struct squeek_key *key) } void eek_keyboard_press_key(LevelKeyboard *keyboard, struct squeek_key *key, guint32 timestamp) { - squeek_key_set_pressed(key, TRUE); keyboard->pressed_keys = g_list_prepend (keyboard->pressed_keys, key); - - // Only take action about setting level *after* the key has taken effect, i.e. on release - //set_level_from_press (keyboard, key); - - // "Borrowed" from eek-context-service; doesn't influence the state but forwards the event - - guint keycode = squeek_key_get_keycode (key); - - emit_key_activated(keyboard->manager, keyboard, keycode, TRUE, timestamp); + squeek_key_press(key, keyboard->manager->virtual_keyboard, KEY_PRESS, timestamp); } void eek_keyboard_release_key(LevelKeyboard *keyboard, @@ -118,12 +110,7 @@ void eek_keyboard_release_key(LevelKeyboard *keyboard, } set_level_from_press (keyboard, key); - - // "Borrowed" from eek-context-service; doesn't influence the state but forwards the event - - guint keycode = squeek_key_get_keycode (key); - - emit_key_activated(keyboard->manager, keyboard, keycode, FALSE, timestamp); + squeek_key_press(key, keyboard->manager->virtual_keyboard, KEY_RELEASE, timestamp); } void level_keyboard_deinit(LevelKeyboard *self) { diff --git a/eekboard/key-emitter.c b/eekboard/key-emitter.c index dcd5131d..b652441e 100644 --- a/eekboard/key-emitter.c +++ b/eekboard/key-emitter.c @@ -131,7 +131,6 @@ emit_key_activated (EekboardContextService *manager, */ SeatEmitter emitter = {0}; emitter.virtual_keyboard = manager->virtual_keyboard; - emitter.keymap = keyboard->keymap; update_modifier_info (&emitter); send_fake_key (&emitter, keyboard, keycode, pressed, timestamp); } diff --git a/src/keyboard.h b/src/keyboard.h index f806e262..6baeeb8c 100644 --- a/src/keyboard.h +++ b/src/keyboard.h @@ -1,15 +1,21 @@ #ifndef __KEYBOARD_H #define __KEYBOARD_H -#include "stdbool.h" #include "inttypes.h" +#include "stdbool.h" +#include "virtual-keyboard-unstable-v1-client-protocol.h" struct squeek_key; uint32_t squeek_key_is_pressed(struct squeek_key *key); -void squeek_key_set_pressed(struct squeek_key *key, uint32_t pressed); uint32_t squeek_key_is_locked(struct squeek_key *key); void squeek_key_set_locked(struct squeek_key *key, uint32_t pressed); -uint32_t squeek_key_get_keycode(struct squeek_key *key); uint32_t squeek_key_equal(struct squeek_key* key, struct squeek_key* key1); + +enum key_press { + KEY_RELEASE = 0, + KEY_PRESS = 1, +}; + +void squeek_key_press(struct squeek_key *key, struct zwp_virtual_keyboard_v1*, enum key_press press, uint32_t timestamp); #endif diff --git a/src/keyboard.rs b/src/keyboard.rs index 9b7c7e9b..025f9563 100644 --- a/src/keyboard.rs +++ b/src/keyboard.rs @@ -17,8 +17,25 @@ pub mod c { use super::*; use ::util::c; + use std::os::raw::c_void; + pub type CKeyState = c::Wrapped; + #[repr(transparent)] + pub struct ZwpVirtualKeyboardV1(*const c_void); + + #[no_mangle] + extern "C" { + /// Checks if point falls within bounds, + /// which are relative to origin and rotated by angle (I think) + pub fn eek_virtual_keyboard_v1_key( + virtual_keyboard: *mut ZwpVirtualKeyboardV1, + timestamp: u32, + keycode: u32, + press: u32, + ); + } + // The following defined in Rust. TODO: wrap naked pointers to Rust data inside RefCells to prevent multiple writers /// Compares pointers to the data @@ -34,15 +51,7 @@ pub mod c { //let key = unsafe { Rc::from_raw(key.0) }; return key.to_owned().pressed as u32; } - - #[no_mangle] - pub extern "C" - fn squeek_key_set_pressed(key: CKeyState, pressed: u32) { - let key = key.clone_ref(); - let mut key = key.borrow_mut(); - key.pressed = pressed != 0; - } - + #[no_mangle] pub extern "C" fn squeek_key_is_locked(key: CKeyState) -> u32 { @@ -56,11 +65,27 @@ pub mod c { let mut key = key.borrow_mut(); key.locked = locked != 0; } - + #[no_mangle] pub extern "C" - fn squeek_key_get_keycode(key: CKeyState) -> u32 { - return key.to_owned().keycode.unwrap_or(0u32); + fn squeek_key_press( + key: CKeyState, + virtual_keyboard: *mut ZwpVirtualKeyboardV1, + press: u32, + timestamp: u32, + ) { + let key = key.clone_ref(); + let mut key = key.borrow_mut(); + key.pressed = press != 0; + + if let Some(keycode) = key.keycode { + let keycode = keycode - 8; + unsafe { + eek_virtual_keyboard_v1_key( + virtual_keyboard, timestamp, keycode, press + ); + } + } } } diff --git a/src/wayland.c b/src/wayland.c index e441e2e7..cd10609e 100644 --- a/src/wayland.c +++ b/src/wayland.c @@ -1,3 +1,12 @@ #include "wayland.h" struct squeek_wayland *squeek_wayland = NULL; + +// The following functions only exist +// to create linkable symbols out of inline functions, +// because those are not directly callable from Rust + +void +eek_virtual_keyboard_v1_key(struct zwp_virtual_keyboard_v1 *zwp_virtual_keyboard_v1, uint32_t time, uint32_t key, uint32_t state) { + zwp_virtual_keyboard_v1_key(zwp_virtual_keyboard_v1, time, key, state); +}