diff --git a/src/core/button.rs b/src/core/button.rs index 85117aa..8382916 100644 --- a/src/core/button.rs +++ b/src/core/button.rs @@ -111,6 +111,7 @@ pub trait Keyboard { fn press(&mut self, sym: Keysym); fn release(&mut self, sym: Keysym); + fn text(&mut self, text: &str); fn change_layout(&mut self, layout: &Layout); } diff --git a/src/wayland/dispatcher.rs b/src/wayland/dispatcher.rs index 83b603c..33e9927 100644 --- a/src/wayland/dispatcher.rs +++ b/src/wayland/dispatcher.rs @@ -61,8 +61,7 @@ impl Dispatcher { let vk_man = globals.bind(&queue, 1..=1, ()) .expect("Compositor must implement zwp_virtual_keyboard_manager_v1"); - let im_man: zwp_input_method_manager_v2::ZwpInputMethodManagerV2 - = globals.bind(&queue, 1..=1, ()) + let im_man = globals.bind(&queue, 1..=1, ()) .expect("Compositor must implement zwp_input_method_manager_v2"); let frac_scale_man = match globals.bind(&queue, 1..=1, ()) { @@ -75,8 +74,6 @@ impl Dispatcher { Err(_) => None, }; - im_man.get_input_method(&seat, &queue, ()); - let disp = Surface::new(queue.clone(), &shm, compositor, layer_shell, frac_scale_man, vper, 185)?; @@ -84,7 +81,7 @@ impl Dispatcher { let gfx = Mutex::new(gfx); let gfx = Arc::new(gfx); - let vk = VirtualKeyboard::new(&queue, &vk_man, &seat); + let vk = VirtualKeyboard::new(&queue, &vk_man, &im_man, &seat); let seat = Seat::new(layout, vk, gfx.clone(), queue.clone(), seat); diff --git a/src/wayland/keyboard.rs b/src/wayland/keyboard.rs index 497a12c..1b30f95 100644 --- a/src/wayland/keyboard.rs +++ b/src/wayland/keyboard.rs @@ -6,6 +6,8 @@ use crate::core::Keyboard; use crate::core::Layout; use crate::core::Part; +use crate::wayland::input_method_unstable_v2::zwp_input_method_manager_v2::ZwpInputMethodManagerV2; +use crate::wayland::input_method_unstable_v2::zwp_input_method_v2::ZwpInputMethodV2; use crate::wayland::virtual_keyboard_unstable_v1::zwp_virtual_keyboard_manager_v1::ZwpVirtualKeyboardManagerV1; use crate::wayland::virtual_keyboard_unstable_v1::zwp_virtual_keyboard_v1::ZwpVirtualKeyboardV1; use std::collections::HashMap; @@ -26,6 +28,7 @@ pub struct VirtualKeyboard { keymap: File, keymap_id: u8, + im: ZwpInputMethodV2, im_serial: u32, keycodes: HashMap, @@ -35,12 +38,15 @@ pub struct VirtualKeyboard { impl VirtualKeyboard { pub fn new + + Dispatch + 'static>(queue: &QueueHandle, vk_man: &ZwpVirtualKeyboardManagerV1, + im_man: &ZwpInputMethodManagerV2, seat: &WlSeat) -> VirtualKeyboard { let vk = vk_man.create_virtual_keyboard(seat, queue, ()); + let im = im_man.get_input_method(&seat, &queue, ()); let path = format!("/tmp/ufkbd-keymap-pid{}-1", process::id()); let keymap = File::create(path).unwrap(); @@ -50,6 +56,7 @@ impl VirtualKeyboard { keymap, keymap_id: 1, + im, im_serial: 0, keycodes: HashMap::with_capacity(248), @@ -151,6 +158,12 @@ impl Keyboard for VirtualKeyboard { self.vk.key(0, keycode as u32, 0); } + fn text(&mut self, text: &str) + { + self.im.commit_string(text.to_string()); + self.im.commit(self.im_serial); + } + fn change_layout(&mut self, layout: &Layout) { let mut keycode = 8;