diff options
| author | 2026-02-23 17:10:45 -0500 | |
|---|---|---|
| committer | 2026-02-23 17:10:45 -0500 | |
| commit | 29011c1a548b481fca8ddc9a5c044ae020d02917 (patch) | |
| tree | 54a332f26ac55e38101abf5b82aa7b9ac8b18795 /src | |
| parent | initial commit (diff) | |
get keymap from server instead of building a new one
Diffstat (limited to '')
| -rw-r--r-- | src/main.rs | 50 |
1 files changed, 32 insertions, 18 deletions
diff --git a/src/main.rs b/src/main.rs index bde0457..d0dbf8f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,7 +1,9 @@ +use as_raw_xcb_connection::ValidConnection; use pam::Client; use xcb::Xid; use xcb::x; use xkbcommon::xkb; +use xkbcommon::xkb::keysyms; fn get_username() -> String { std::env::var("USER") @@ -24,21 +26,31 @@ fn main() -> xcb::Result<()> { let username = get_username(); let mut password_buf = String::new(); + let (conn, screen_num) = xcb::Connection::connect(None)?; + + let xkb_cookie = conn.send_request(&xcb::xkb::UseExtension { + wanted_major: xkb::x11::MIN_MAJOR_XKB_VERSION, + wanted_minor: xkb::x11::MIN_MINOR_XKB_VERSION, + }); + let xkb_reply: xcb::xkb::UseExtensionReply = conn.wait_for_reply(xkb_cookie)?; + if !xkb_reply.supported() { + eprintln!("XKB extension not supported"); + return Ok(()); + } + // make keymap + let raw = conn.get_raw_conn(); + let raw_conn = unsafe { ValidConnection::new(raw as *mut _) }; + let context = xkb::Context::new(xkb::CONTEXT_NO_FLAGS); - let keymap = xkb::Keymap::new_from_names( + let device_id = xkb::x11::get_core_keyboard_device_id(&raw_conn); + let keymap = xkb::x11::keymap_new_from_device( &context, - "", // rules - "", // model - "", // layout - "", // variant - None, // options + &raw_conn, + device_id, xkb::KEYMAP_COMPILE_NO_FLAGS, - ) - .expect("Failed to create keymap"); - let mut state = xkb::State::new(&keymap); - - let (conn, screen_num) = xcb::Connection::connect(None)?; + ); + let mut state = xkb::x11::state_new_from_device(&keymap, &raw_conn, device_id); let setup = conn.get_setup(); let screen = setup.roots().nth(screen_num as usize).unwrap(); @@ -112,8 +124,8 @@ fn main() -> xcb::Result<()> { let keysym = state.key_get_one_sym(keycode.into()); let c = xkb::keysym_to_utf8(keysym); - match keycode { - 36 => { + match keysym.raw() { + keysyms::KEY_Return => { if authenticate(&username, &password_buf) { conn.send_request(&x::UngrabKeyboard { time: x::CURRENT_TIME, @@ -128,17 +140,19 @@ fn main() -> xcb::Result<()> { password_buf.clear(); } } - // Backspace (22) - 22 => { + + keysyms::KEY_BackSpace => { password_buf.pop(); } - // Escape (9) — clear buffer - 9 => { + + keysyms::KEY_Escape => { password_buf.clear(); } _ => { - password_buf.push_str(&c); + if !c.is_empty() { + password_buf.push_str(&c); + } } } } |
