oxwm

https://git.tonybtw.com/oxwm.git git://git.tonybtw.com/oxwm.git

Added keycode -> string map in enum for reverse lookup, to avoid unsafe call to C FFI bind. Sorry bugsy

Commit
7a4cc10097f7e496001b99152f167bff0eea92f0
Parent
aa4066d
Author
tonybtw <tonybtw@tonybtw.com>
Date
2025-10-31 04:17:13

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<()> {