diff --git a/Cargo.lock b/Cargo.lock index 6294437..bd8ce19 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1088,6 +1088,12 @@ dependencies = [ "hashbrown 0.14.0", ] +[[package]] +name = "input-event-codes" +version = "5.16.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b6b0f8557f596a2db592f172015c40d0c149e16a956c7848e733d663f2c6636" + [[package]] name = "instant" version = "0.1.12" @@ -2085,6 +2091,7 @@ dependencies = [ "directories", "glam 0.23.0", "global_counter", + "input-event-codes", "lazy_static", "libc", "mint", diff --git a/Cargo.toml b/Cargo.toml index 6df1eca..d72814c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -61,6 +61,7 @@ atty = "0.2.14" xkbcommon = { version = "0.6.0", default-features = false, optional = true } ctrlc = "3.4.1" libc = "0.2.148" +input-event-codes = "5.16.8" [dependencies.smithay] # git = "https://github.com/technobaboo/smithay.git" # Until we get stereokit to understand OES samplers and external textures diff --git a/src/objects/input/mouse_pointer.rs b/src/objects/input/mouse_pointer.rs index 1acbddf..e8a491e 100644 --- a/src/objects/input/mouse_pointer.rs +++ b/src/objects/input/mouse_pointer.rs @@ -15,6 +15,7 @@ use serde::{Deserialize, Serialize}; use std::{convert::TryFrom, sync::Arc}; use stereokit::{ray_from_mouse, ButtonState, Key, StereoKitMultiThread}; use tracing::instrument; +use xkbcommon::xkb::{Context, Keymap, FORMAT_TEXT_V1}; #[derive(Default, Deserialize, Serialize)] struct MouseEvent { @@ -56,9 +57,12 @@ impl MousePointer { let pointer = InputMethod::add_to(&node, InputType::Pointer(Pointer::default()), None).unwrap(); - KEYMAPS - .lock() - .insert("flatscreen".to_string(), include_str!("sk.kmp").to_string()); + KEYMAPS.lock().insert( + "flatscreen".to_string(), + Keymap::new_from_names(&Context::new(0), "evdev", "", "", "", None, 0) + .unwrap() + .get_as_string(FORMAT_TEXT_V1), + ); let keyboard_sender = PulseSender::add_to(&node, Mask::from_struct::()).unwrap(); @@ -132,8 +136,8 @@ impl MousePointer { if let Some(rx) = rx { let keys = (8_u32..254) - .filter_map(|i| Some((i, Key::try_from(i).ok()?))) - .map(|(i, k)| (i - 8, sk.input_key(k))) + .filter_map(|i| Key::try_from(i).ok()) + .filter_map(|k| Some((map_key(k)?, sk.input_key(k)))) .filter_map(|(i, k)| { if k.contains(ButtonState::JUST_ACTIVE) { Some(i as i32) @@ -153,3 +157,105 @@ impl MousePointer { } } } + +fn map_key(key: Key) -> Option { + match key { + Key::Backspace => Some(input_event_codes::KEY_BACKSPACE!()), + Key::Tab => Some(input_event_codes::KEY_TAB!()), + Key::Return => Some(input_event_codes::KEY_ENTER!()), + Key::Shift => Some(input_event_codes::KEY_LEFTSHIFT!()), + Key::Ctrl => Some(input_event_codes::KEY_LEFTCTRL!()), + Key::Alt => Some(input_event_codes::KEY_LEFTALT!()), + Key::CapsLock => Some(input_event_codes::KEY_CAPSLOCK!()), + Key::Esc => Some(input_event_codes::KEY_ESC!()), + Key::Space => Some(input_event_codes::KEY_SPACE!()), + Key::End => Some(input_event_codes::KEY_END!()), + Key::Home => Some(input_event_codes::KEY_HOME!()), + Key::Left => Some(input_event_codes::KEY_LEFT!()), + Key::Right => Some(input_event_codes::KEY_RIGHT!()), + Key::Up => Some(input_event_codes::KEY_UP!()), + Key::Down => Some(input_event_codes::KEY_DOWN!()), + Key::PageUp => Some(input_event_codes::KEY_PAGEUP!()), + Key::PageDown => Some(input_event_codes::KEY_PAGEDOWN!()), + Key::PrintScreen => Some(input_event_codes::KEY_PRINT!()), + Key::KeyInsert => Some(input_event_codes::KEY_INSERT!()), + Key::Del => Some(input_event_codes::KEY_DELETE!()), + Key::Key0 => Some(input_event_codes::KEY_0!()), + Key::Key1 => Some(input_event_codes::KEY_1!()), + Key::Key2 => Some(input_event_codes::KEY_2!()), + Key::Key3 => Some(input_event_codes::KEY_3!()), + Key::Key4 => Some(input_event_codes::KEY_4!()), + Key::Key5 => Some(input_event_codes::KEY_5!()), + Key::Key6 => Some(input_event_codes::KEY_6!()), + Key::Key7 => Some(input_event_codes::KEY_7!()), + Key::Key8 => Some(input_event_codes::KEY_8!()), + Key::Key9 => Some(input_event_codes::KEY_9!()), + Key::A => Some(input_event_codes::KEY_A!()), + Key::B => Some(input_event_codes::KEY_B!()), + Key::C => Some(input_event_codes::KEY_C!()), + Key::D => Some(input_event_codes::KEY_D!()), + Key::E => Some(input_event_codes::KEY_E!()), + Key::F => Some(input_event_codes::KEY_F!()), + Key::G => Some(input_event_codes::KEY_G!()), + Key::H => Some(input_event_codes::KEY_H!()), + Key::I => Some(input_event_codes::KEY_I!()), + Key::J => Some(input_event_codes::KEY_J!()), + Key::K => Some(input_event_codes::KEY_K!()), + Key::L => Some(input_event_codes::KEY_L!()), + Key::M => Some(input_event_codes::KEY_M!()), + Key::N => Some(input_event_codes::KEY_N!()), + Key::O => Some(input_event_codes::KEY_O!()), + Key::P => Some(input_event_codes::KEY_P!()), + Key::Q => Some(input_event_codes::KEY_Q!()), + Key::R => Some(input_event_codes::KEY_R!()), + Key::S => Some(input_event_codes::KEY_S!()), + Key::T => Some(input_event_codes::KEY_T!()), + Key::U => Some(input_event_codes::KEY_U!()), + Key::V => Some(input_event_codes::KEY_V!()), + Key::W => Some(input_event_codes::KEY_W!()), + Key::X => Some(input_event_codes::KEY_X!()), + Key::Y => Some(input_event_codes::KEY_Y!()), + Key::Z => Some(input_event_codes::KEY_Z!()), + Key::Numpad0 => Some(input_event_codes::KEY_NUMERIC_0!()), + Key::Numpad1 => Some(input_event_codes::KEY_NUMERIC_1!()), + Key::Numpad2 => Some(input_event_codes::KEY_NUMERIC_2!()), + Key::Numpad3 => Some(input_event_codes::KEY_NUMERIC_3!()), + Key::Numpad4 => Some(input_event_codes::KEY_NUMERIC_4!()), + Key::Numpad5 => Some(input_event_codes::KEY_NUMERIC_5!()), + Key::Numpad6 => Some(input_event_codes::KEY_NUMERIC_6!()), + Key::Numpad7 => Some(input_event_codes::KEY_NUMERIC_7!()), + Key::Numpad8 => Some(input_event_codes::KEY_NUMERIC_8!()), + Key::Numpad9 => Some(input_event_codes::KEY_NUMERIC_9!()), + Key::F1 => Some(input_event_codes::KEY_F1!()), + Key::F2 => Some(input_event_codes::KEY_F2!()), + Key::F3 => Some(input_event_codes::KEY_F3!()), + Key::F4 => Some(input_event_codes::KEY_F4!()), + Key::F5 => Some(input_event_codes::KEY_F5!()), + Key::F6 => Some(input_event_codes::KEY_F6!()), + Key::F7 => Some(input_event_codes::KEY_F7!()), + Key::F8 => Some(input_event_codes::KEY_F8!()), + Key::F9 => Some(input_event_codes::KEY_F9!()), + Key::F10 => Some(input_event_codes::KEY_F10!()), + Key::F11 => Some(input_event_codes::KEY_F11!()), + Key::F12 => Some(input_event_codes::KEY_F12!()), + Key::Comma => Some(input_event_codes::KEY_COMMA!()), + Key::Period => Some(input_event_codes::KEY_DOT!()), + Key::SlashFwd => Some(input_event_codes::KEY_SLASH!()), + Key::SlashBack => Some(input_event_codes::KEY_BACKSLASH!()), + Key::Semicolon => Some(input_event_codes::KEY_SEMICOLON!()), + Key::Apostrophe => Some(input_event_codes::KEY_APOSTROPHE!()), + Key::BracketOpen => Some(input_event_codes::KEY_LEFTBRACE!()), + Key::BracketClose => Some(input_event_codes::KEY_RIGHTBRACE!()), + Key::Minus => Some(input_event_codes::KEY_MINUS!()), + Key::Equals => Some(input_event_codes::KEY_EQUAL!()), + Key::Backtick => None, + Key::LCmd => Some(input_event_codes::KEY_LEFTMETA!()), + Key::RCmd => Some(input_event_codes::KEY_RIGHTMETA!()), + Key::Multiply => Some(input_event_codes::KEY_NUMERIC_STAR!()), + Key::Add => Some(input_event_codes::KEY_KPPLUS!()), + Key::Subtract => Some(input_event_codes::KEY_MINUS!()), + Key::Decimal => Some(input_event_codes::KEY_DOT!()), + Key::Divide => Some(input_event_codes::KEY_SLASH!()), + _ => None, + } +} diff --git a/src/wayland/seat.rs b/src/wayland/seat.rs index 2e4ddc9..7c80652 100644 --- a/src/wayland/seat.rs +++ b/src/wayland/seat.rs @@ -86,6 +86,11 @@ impl KeyboardInfo { 0, ); } + if pressed { + println!("Key {key} is being pressed with {state_components} modifiers"); + } else { + println!("Key {key} is being released with {state_components} modifiers"); + } let wl_key_state = if pressed { KeyState::Pressed diff --git a/src/wayland/xdg_shell.rs b/src/wayland/xdg_shell.rs index 39fabce..6444825 100644 --- a/src/wayland/xdg_shell.rs +++ b/src/wayland/xdg_shell.rs @@ -1024,7 +1024,7 @@ impl Backend for XDGBackend { &surface, KeyboardEvent::Key { key: key.abs() as u32, - state: key < 0, + state: key > 0, }, ); }