Diff
diff --git a/src/config/mod.rs b/src/config/mod.rs
index 56d51f1..d7aa2a4 100644
--- a/src/config/mod.rs
+++ b/src/config/mod.rs
@@ -157,6 +157,91 @@ impl KeyData {
KeyData::Slash => keycodes::SLASH,
}
}
+
+ // Adding this reverse lookup for now so converting to KeySyms is no longer
+ // an 'unsafe' call to a C FFI (Sorry Bugsy...)
+ // This will set us up in the future to move away from hardcoded keycodes,
+ // and directly convert keysyms to keydata at runtime for international
+ // keyboard support.
+ pub fn from_keycode(keycode: Keycode) -> Option<&'static str> {
+ match keycode {
+ keycodes::RETURN => Some("Return"),
+ keycodes::Q => Some("q"),
+ keycodes::ESCAPE => Some("Esc"),
+ keycodes::SPACE => Some("Space"),
+ keycodes::TAB => Some("Tab"),
+ keycodes::BACKSPACE => Some("Backspace"),
+ keycodes::DELETE => Some("Del"),
+ keycodes::F1 => Some("F1"),
+ keycodes::F2 => Some("F2"),
+ keycodes::F3 => Some("F3"),
+ keycodes::F4 => Some("F4"),
+ keycodes::F5 => Some("F5"),
+ keycodes::F6 => Some("F6"),
+ keycodes::F7 => Some("F7"),
+ keycodes::F8 => Some("F8"),
+ keycodes::F9 => Some("F9"),
+ keycodes::F10 => Some("F10"),
+ keycodes::F11 => Some("F11"),
+ keycodes::F12 => Some("F12"),
+ keycodes::A => Some("a"),
+ keycodes::B => Some("b"),
+ keycodes::C => Some("c"),
+ keycodes::D => Some("d"),
+ keycodes::E => Some("e"),
+ keycodes::F => Some("f"),
+ keycodes::G => Some("g"),
+ keycodes::H => Some("h"),
+ keycodes::I => Some("i"),
+ keycodes::J => Some("j"),
+ keycodes::K => Some("k"),
+ keycodes::L => Some("l"),
+ keycodes::M => Some("m"),
+ keycodes::N => Some("n"),
+ keycodes::O => Some("o"),
+ keycodes::P => Some("p"),
+ keycodes::R => Some("r"),
+ keycodes::S => Some("s"),
+ keycodes::T => Some("t"),
+ keycodes::U => Some("u"),
+ keycodes::V => Some("v"),
+ keycodes::W => Some("w"),
+ keycodes::X => Some("x"),
+ keycodes::Y => Some("y"),
+ keycodes::Z => Some("z"),
+ keycodes::KEY_0 => Some("0"),
+ keycodes::KEY_1 => Some("1"),
+ keycodes::KEY_2 => Some("2"),
+ keycodes::KEY_3 => Some("3"),
+ keycodes::KEY_4 => Some("4"),
+ keycodes::KEY_5 => Some("5"),
+ keycodes::KEY_6 => Some("6"),
+ keycodes::KEY_7 => Some("7"),
+ keycodes::KEY_8 => Some("8"),
+ keycodes::KEY_9 => Some("9"),
+ keycodes::LEFT => Some("Left"),
+ keycodes::RIGHT => Some("Right"),
+ keycodes::UP => Some("Up"),
+ keycodes::DOWN => Some("Down"),
+ keycodes::HOME => Some("Home"),
+ keycodes::END => Some("End"),
+ keycodes::PAGE_UP => Some("PgUp"),
+ keycodes::PAGE_DOWN => Some("PgDn"),
+ keycodes::INSERT => Some("Ins"),
+ keycodes::MINUS => Some("-"),
+ keycodes::EQUAL => Some("="),
+ keycodes::LEFT_BRACKET => Some("["),
+ keycodes::RIGHT_BRACKET => Some("]"),
+ keycodes::SEMICOLON => Some(";"),
+ keycodes::APOSTROPHE => Some("'"),
+ keycodes::GRAVE => Some("`"),
+ keycodes::BACKSLASH => Some("\\"),
+ keycodes::COMMA => Some(","),
+ keycodes::PERIOD => Some("."),
+ keycodes::SLASH => Some("/"),
+ _ => None,
+ }
+ }
}
fn preprocess_variables(input: &str) -> Result<String, ConfigError> {
diff --git a/src/window_manager.rs b/src/window_manager.rs
index 657690c..0980289 100644
--- a/src/window_manager.rs
+++ b/src/window_manager.rs
@@ -842,29 +842,9 @@ impl WindowManager {
}
fn format_keycode(&self, keycode: Keycode) -> String {
- unsafe {
- let keysym = x11::xlib::XKeycodeToKeysym(self.display, keycode, 0);
- if keysym == 0 {
- return "?".to_string();
- }
-
- let name_ptr = x11::xlib::XKeysymToString(keysym);
- if name_ptr.is_null() {
- return "?".to_string();
- }
-
- let c_str = std::ffi::CStr::from_ptr(name_ptr);
- match c_str.to_str() {
- Ok(s) => {
- if s.len() == 1 {
- s.to_lowercase()
- } else {
- s.to_string()
- }
- }
- Err(_) => "?".to_string(),
- }
- }
+ crate::config::KeyData::from_keycode(keycode)
+ .unwrap_or("?")
+ .to_string()
}
fn update_bar(&mut self) -> WmResult<()> {