core: button: add keyboard method to insert text

This commit is contained in:
Richard Acayan 2024-08-04 22:09:24 -04:00
parent 8f7e9dfe7a
commit db2a8cdeab
3 changed files with 16 additions and 5 deletions

View file

@ -111,6 +111,7 @@ pub trait Keyboard {
fn press(&mut self, sym: Keysym); fn press(&mut self, sym: Keysym);
fn release(&mut self, sym: Keysym); fn release(&mut self, sym: Keysym);
fn text(&mut self, text: &str);
fn change_layout(&mut self, layout: &Layout); fn change_layout(&mut self, layout: &Layout);
} }

View file

@ -61,8 +61,7 @@ impl Dispatcher {
let vk_man = globals.bind(&queue, 1..=1, ()) let vk_man = globals.bind(&queue, 1..=1, ())
.expect("Compositor must implement zwp_virtual_keyboard_manager_v1"); .expect("Compositor must implement zwp_virtual_keyboard_manager_v1");
let im_man: zwp_input_method_manager_v2::ZwpInputMethodManagerV2 let im_man = globals.bind(&queue, 1..=1, ())
= globals.bind(&queue, 1..=1, ())
.expect("Compositor must implement zwp_input_method_manager_v2"); .expect("Compositor must implement zwp_input_method_manager_v2");
let frac_scale_man = match globals.bind(&queue, 1..=1, ()) { let frac_scale_man = match globals.bind(&queue, 1..=1, ()) {
@ -75,8 +74,6 @@ impl Dispatcher {
Err(_) => None, Err(_) => None,
}; };
im_man.get_input_method(&seat, &queue, ());
let disp = Surface::new(queue.clone(), let disp = Surface::new(queue.clone(),
&shm, compositor, layer_shell, &shm, compositor, layer_shell,
frac_scale_man, vper, 185)?; frac_scale_man, vper, 185)?;
@ -84,7 +81,7 @@ impl Dispatcher {
let gfx = Mutex::new(gfx); let gfx = Mutex::new(gfx);
let gfx = Arc::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); let seat = Seat::new(layout, vk, gfx.clone(), queue.clone(), seat);

View file

@ -6,6 +6,8 @@
use crate::core::Keyboard; use crate::core::Keyboard;
use crate::core::Layout; use crate::core::Layout;
use crate::core::Part; 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_manager_v1::ZwpVirtualKeyboardManagerV1;
use crate::wayland::virtual_keyboard_unstable_v1::zwp_virtual_keyboard_v1::ZwpVirtualKeyboardV1; use crate::wayland::virtual_keyboard_unstable_v1::zwp_virtual_keyboard_v1::ZwpVirtualKeyboardV1;
use std::collections::HashMap; use std::collections::HashMap;
@ -26,6 +28,7 @@ pub struct VirtualKeyboard {
keymap: File, keymap: File,
keymap_id: u8, keymap_id: u8,
im: ZwpInputMethodV2,
im_serial: u32, im_serial: u32,
keycodes: HashMap<Keysym, u8>, keycodes: HashMap<Keysym, u8>,
@ -35,12 +38,15 @@ pub struct VirtualKeyboard {
impl VirtualKeyboard { impl VirtualKeyboard {
pub fn new<T: Dispatch<ZwpVirtualKeyboardV1, ()> pub fn new<T: Dispatch<ZwpVirtualKeyboardV1, ()>
+ Dispatch<ZwpInputMethodV2, ()>
+ 'static>(queue: &QueueHandle<T>, + 'static>(queue: &QueueHandle<T>,
vk_man: &ZwpVirtualKeyboardManagerV1, vk_man: &ZwpVirtualKeyboardManagerV1,
im_man: &ZwpInputMethodManagerV2,
seat: &WlSeat) seat: &WlSeat)
-> VirtualKeyboard -> VirtualKeyboard
{ {
let vk = vk_man.create_virtual_keyboard(seat, queue, ()); 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 path = format!("/tmp/ufkbd-keymap-pid{}-1", process::id());
let keymap = File::create(path).unwrap(); let keymap = File::create(path).unwrap();
@ -50,6 +56,7 @@ impl VirtualKeyboard {
keymap, keymap,
keymap_id: 1, keymap_id: 1,
im,
im_serial: 0, im_serial: 0,
keycodes: HashMap::with_capacity(248), keycodes: HashMap::with_capacity(248),
@ -151,6 +158,12 @@ impl Keyboard for VirtualKeyboard {
self.vk.key(0, keycode as u32, 0); 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) fn change_layout(&mut self, layout: &Layout)
{ {
let mut keycode = 8; let mut keycode = 8;