diff --git a/src/wayland/keyboard.rs b/src/wayland/keyboard.rs index f08879e..24eb0e1 100644 --- a/src/wayland/keyboard.rs +++ b/src/wayland/keyboard.rs @@ -13,8 +13,7 @@ use crate::wayland::virtual_keyboard_unstable_v1::zwp_virtual_keyboard_manager_v use crate::wayland::virtual_keyboard_unstable_v1::zwp_virtual_keyboard_v1::ZwpVirtualKeyboardV1; use reis::ei; use std::collections::HashMap; -use std::fs::File; -use std::fs::OpenOptions; +use std::fs; use std::io::Seek; use std::io::Write; use std::os::fd::AsFd; @@ -106,7 +105,6 @@ const STATIC_KEYCODES: [(Keysym, u8); 76] = [ pub struct VirtualKeyboard { vk: Option, - keymap: File, keymap_id: u8, im: Option, @@ -132,12 +130,8 @@ impl VirtualKeyboard { let vk = vk_man.as_ref().map(|m| m.create_virtual_keyboard(seat, queue, ())); let im = im_man.as_ref().map(|m| m.get_input_method(seat, queue, ())); - let path = format!("/tmp/ufkbd-keymap-pid{}-1", process::id()); - let keymap = File::create(path).unwrap(); - VirtualKeyboard { vk, - keymap, keymap_id: 1, im, @@ -152,25 +146,25 @@ impl VirtualKeyboard { } } - fn write_key(&mut self, part: &Part, keycode: u8) + fn write_key(keymap: &mut fs::File, part: &Part, keycode: u8) { let sym = part.sym(); let lower = &sym.name().unwrap()[3..]; let upper = &Part::modify_shift(sym).name().unwrap()[3..]; - writeln!(self.keymap, " key {{ [ {}, {} ] }};", + writeln!(keymap, " key {{ [ {}, {} ] }};", keycode, lower, upper).unwrap(); if sym == Keysym::Shift_L { - writeln!(self.keymap, + writeln!(keymap, " modifier_map Shift {{ }};", keycode).unwrap(); } else if sym == Keysym::Control_L { - writeln!(self.keymap, + writeln!(keymap, " modifier_map Control {{ }};", keycode).unwrap(); } else if sym == Keysym::Alt_L { - writeln!(self.keymap, + writeln!(keymap, " modifier_map Mod1 {{ }};", keycode).unwrap(); } @@ -314,13 +308,11 @@ impl Keyboard for VirtualKeyboard { let path = format!("/tmp/ufkbd-keymap-pid{}-{}", process::id(), self.keymap_id); - self.keymap = OpenOptions::new() - .read(true).write(true) - .create(true).truncate(true) - .open(path).unwrap(); + let mut keymap = fs::File::create_new(path.clone()).unwrap(); + let _ = fs::remove_file(path); - self.keymap.write_all(b"xkb_keymap {\n").unwrap(); - self.keymap.write_all(b" xkb_symbols \"ufkbd\" {\n").unwrap(); + keymap.write_all(b"xkb_keymap {\n").unwrap(); + keymap.write_all(b" xkb_symbols \"ufkbd\" {\n").unwrap(); self.keycodes.clear(); for row in layout.rows() { @@ -333,7 +325,7 @@ impl Keyboard for VirtualKeyboard { if let Ok(idx) = STATIC_KEYCODES.binary_search_by_key(&part.sym(), |(s, _)| *s) { let (sym, code) = STATIC_KEYCODES[idx]; self.keycodes.insert(sym, code - 8); - self.write_key(part, code); + Self::write_key(&mut keymap, part, code); used_codes[code as usize - 8] = true; } } @@ -356,43 +348,43 @@ impl Keyboard for VirtualKeyboard { } self.keycodes.insert(part.sym(), keycode - 8); - self.write_key(part, keycode); + Self::write_key(&mut keymap, part, keycode); keycode += 1; } } } - self.keymap.write_all(b" };\n").unwrap(); - self.keymap.write_all(b"\n").unwrap(); - self.keymap.write_all(b" xkb_keycodes \"ufkbd\" {\n").unwrap(); - self.keymap.write_all(b" minimum = 8;\n").unwrap(); - self.keymap.write_all(b" maximum = 255;\n").unwrap(); + keymap.write_all(b" };\n").unwrap(); + keymap.write_all(b"\n").unwrap(); + keymap.write_all(b" xkb_keycodes \"ufkbd\" {\n").unwrap(); + keymap.write_all(b" minimum = 8;\n").unwrap(); + keymap.write_all(b" maximum = 255;\n").unwrap(); for i in 8..keycode { - writeln!(self.keymap, " = {};", i, i).unwrap(); + writeln!(keymap, " = {};", i, i).unwrap(); } for i in keycode..255 { if used_codes[i as usize - 8] { - writeln!(self.keymap, " = {};", i, i).unwrap(); + writeln!(keymap, " = {};", i, i).unwrap(); } } - self.keymap.write_all(b" indicator 1 = \"Caps Lock\";\n").unwrap(); - self.keymap.write_all(b" };\n").unwrap(); - self.keymap.write_all(b"\n").unwrap(); - self.keymap.write_all(b" xkb_types \"ufkbd\" {\n").unwrap(); - self.keymap.write_all(b" type \"TWO_LEVEL\" {\n").unwrap(); - self.keymap.write_all(b" modifiers = Shift;\n").unwrap(); - self.keymap.write_all(b" map[Shift] = Level2;\n").unwrap(); - self.keymap.write_all(b" level_name[Level1] = \"Base\";\n").unwrap(); - self.keymap.write_all(b" level_name[Level2] = \"Shift\";\n").unwrap(); - self.keymap.write_all(b" };\n").unwrap(); - self.keymap.write_all(b" };\n").unwrap(); - self.keymap.write_all(b"\n").unwrap(); - self.keymap.write_all(b" xkb_compatibility \"ufkbd\" {\n").unwrap(); - self.keymap.write_all(b" };\n").unwrap(); - self.keymap.write_all(b"};\n").unwrap(); + keymap.write_all(b" indicator 1 = \"Caps Lock\";\n").unwrap(); + keymap.write_all(b" };\n").unwrap(); + keymap.write_all(b"\n").unwrap(); + keymap.write_all(b" xkb_types \"ufkbd\" {\n").unwrap(); + keymap.write_all(b" type \"TWO_LEVEL\" {\n").unwrap(); + keymap.write_all(b" modifiers = Shift;\n").unwrap(); + keymap.write_all(b" map[Shift] = Level2;\n").unwrap(); + keymap.write_all(b" level_name[Level1] = \"Base\";\n").unwrap(); + keymap.write_all(b" level_name[Level2] = \"Shift\";\n").unwrap(); + keymap.write_all(b" };\n").unwrap(); + keymap.write_all(b" };\n").unwrap(); + keymap.write_all(b"\n").unwrap(); + keymap.write_all(b" xkb_compatibility \"ufkbd\" {\n").unwrap(); + keymap.write_all(b" };\n").unwrap(); + keymap.write_all(b"};\n").unwrap(); if let Some(vk) = self.vk.as_ref() { if self.mod_state != 0 { @@ -405,8 +397,8 @@ impl Keyboard for VirtualKeyboard { } } - let len = self.keymap.stream_position().unwrap() as u32; - vk.keymap(KeymapFormat::XkbV1 as u32, self.keymap.as_fd(), len); + let len = keymap.stream_position().unwrap() as u32; + vk.keymap(KeymapFormat::XkbV1 as u32, keymap.as_fd(), len); if self.mod_state != 0 { vk.modifiers(self.mod_state, 0, 0, 0);