diff --git a/crates/gpui/src/platform/linux/platform.rs b/crates/gpui/src/platform/linux/platform.rs index 00dea59b148ab6940ce6f3ca3c20b4c029266834..0786fdd5c96b6d8070455b27ab077e9e9508a26a 100644 --- a/crates/gpui/src/platform/linux/platform.rs +++ b/crates/gpui/src/platform/linux/platform.rs @@ -709,30 +709,16 @@ pub(super) fn log_cursor_icon_warning(message: impl std::fmt::Display) { } } -#[cfg(any(feature = "wayland", feature = "x11"))] -pub(crate) struct KeyboardState { - pub(crate) state: xkb::State, - pub(crate) mapper: LinuxKeyboardMapper, -} - -#[cfg(any(feature = "wayland", feature = "x11"))] -impl KeyboardState { - pub(crate) fn new(state: xkb::State) -> Self { - let mapper = LinuxKeyboardMapper::new(); - Self { state, mapper } - } -} - #[cfg(any(feature = "wayland", feature = "x11"))] impl crate::Keystroke { pub(super) fn from_xkb( - keyboard_state: &KeyboardState, + keyboard_state: &State, mut modifiers: crate::Modifiers, keycode: Keycode, ) -> Self { - let key_utf32 = keyboard_state.state.key_get_utf32(keycode); - let key_utf8 = keyboard_state.state.key_get_utf8(keycode); - let key_sym = keyboard_state.state.key_get_one_sym(keycode); + let key_utf32 = keyboard_state.key_get_utf32(keycode); + let key_utf8 = keyboard_state.key_get_utf8(keycode); + let key_sym = keyboard_state.key_get_one_sym(keycode); let key = match key_sym { Keysym::space => "space".to_owned(), diff --git a/crates/gpui/src/platform/linux/wayland/client.rs b/crates/gpui/src/platform/linux/wayland/client.rs index 69fb28b0efd0efb01717a2badcd268e35f06d43a..d485202c6949be3fc9ce15e840fab5a77d7a5931 100644 --- a/crates/gpui/src/platform/linux/wayland/client.rs +++ b/crates/gpui/src/platform/linux/wayland/client.rs @@ -61,8 +61,9 @@ use wayland_protocols::xdg::decoration::zv1::client::{ }; use wayland_protocols::xdg::shell::client::{xdg_surface, xdg_toplevel, xdg_wm_base}; use wayland_protocols_plasma::blur::client::{org_kde_kwin_blur, org_kde_kwin_blur_manager}; -use xkbcommon::xkb::ffi::XKB_KEYMAP_FORMAT_TEXT_V1; -use xkbcommon::xkb::{self, KEYMAP_COMPILE_NO_FLAGS, Keycode}; +use xkbcommon::xkb::{ + self, KEYMAP_COMPILE_NO_FLAGS, Keycode, State, ffi::XKB_KEYMAP_FORMAT_TEXT_V1, +}; use super::{ display::WaylandDisplay, @@ -212,7 +213,7 @@ pub(crate) struct WaylandClientState { outputs: HashMap, in_progress_outputs: HashMap, keyboard_layout: LinuxKeyboardLayout, - keyboard_state: Option, + keymap_state: Option, compose_state: Option, drag: DragState, click: ClickState, @@ -571,7 +572,7 @@ impl WaylandClient { windows: HashMap::default(), common, keyboard_layout: LinuxKeyboardLayout::new(UNKNOWN_KEYBOARD_LAYOUT_NAME), - keyboard_state: None, + keymap_state: None, compose_state: None, drag: DragState { data_offer: None, @@ -1214,7 +1215,7 @@ impl Dispatch for WaylandClientStatePtr { .flatten() .expect("Failed to create keymap") }; - state.keyboard_state = Some(KeyboardState::new(xkb::State::new(&keymap))); + state.keymap_state = Some(xkb::State::new(&keymap)); state.compose_state = get_xkb_compose_state(&xkb_context); drop(state); @@ -1255,20 +1256,12 @@ impl Dispatch for WaylandClientStatePtr { } => { let focused_window = state.keyboard_focused_window.clone(); - let keyboard_state = state.keyboard_state.as_mut().unwrap(); - let old_layout = keyboard_state - .state - .serialize_layout(xkbcommon::xkb::STATE_LAYOUT_EFFECTIVE); - keyboard_state.state.update_mask( - mods_depressed, - mods_latched, - mods_locked, - 0, - 0, - group, - ); - state.modifiers = Modifiers::from_xkb(&keyboard_state.state); - state.capslock = Capslock::from_xkb(&keyboard_state.state); + let keymap_state = state.keymap_state.as_mut().unwrap(); + let old_layout = + keymap_state.serialize_layout(xkbcommon::xkb::STATE_LAYOUT_EFFECTIVE); + keymap_state.update_mask(mods_depressed, mods_latched, mods_locked, 0, 0, group); + state.modifiers = Modifiers::from_xkb(&keymap_state); + state.capslock = Capslock::from_xkb(&keymap_state); let keymap_state = state.keymap_state.as_mut().unwrap(); let input = PlatformInput::ModifiersChanged(ModifiersChangedEvent { @@ -1299,14 +1292,14 @@ impl Dispatch for WaylandClientStatePtr { }; let focused_window = focused_window.clone(); - let keyboard_state = state.keyboard_state.as_ref().unwrap(); + let keymap_state = state.keymap_state.as_ref().unwrap(); let keycode = Keycode::from(key + MIN_KEYCODE); - let keysym = keyboard_state.state.key_get_one_sym(keycode); + let keysym = keymap_state.key_get_one_sym(keycode); match key_state { wl_keyboard::KeyState::Pressed if !keysym.is_modifier_key() => { let mut keystroke = - Keystroke::from_xkb(&keyboard_state, state.modifiers, keycode); + Keystroke::from_xkb(&keymap_state, state.modifiers, keycode); println!("Wayland Before {:#?}", keystroke); if let Some(mut compose) = state.compose_state.take() { compose.feed(keysym); @@ -1393,11 +1386,7 @@ impl Dispatch for WaylandClientStatePtr { } wl_keyboard::KeyState::Released if !keysym.is_modifier_key() => { let input = PlatformInput::KeyUp(KeyUpEvent { - keystroke: Keystroke::from_xkb( - keyboard_state, - state.modifiers, - keycode, - ), + keystroke: Keystroke::from_xkb(keymap_state, state.modifiers, keycode), }); if state.repeat.current_keycode == Some(keycode) { diff --git a/crates/gpui/src/platform/linux/x11/client.rs b/crates/gpui/src/platform/linux/x11/client.rs index 28888a9ac0c0411ff203edbb3f147340ff94d163..0f572596608f670a7ebbad251ce9d9f5f547b6b8 100644 --- a/crates/gpui/src/platform/linux/x11/client.rs +++ b/crates/gpui/src/platform/linux/x11/client.rs @@ -1,5 +1,4 @@ use crate::{ - linux::KeyboardState, platform::{xcb_flush, Capslock}, scap_screen_capture::scap_screen_sources, underlying_dead_key, @@ -43,7 +42,7 @@ use x11rb::{ }; use xim::{x11rb::X11rbClient, AttributeName, Client, InputStyle}; use xkbc::x11::ffi::{XKB_X11_MIN_MAJOR_XKB_VERSION, XKB_X11_MIN_MINOR_XKB_VERSION}; -use xkbcommon::xkb::{self as xkbc, LayoutIndex, ModMask, STATE_LAYOUT_EFFECTIVE}; +use xkbcommon::xkb::{self as xkbc, LayoutIndex, ModMask, State, STATE_LAYOUT_EFFECTIVE}; use super::{ button_or_scroll_from_event_detail, check_reply, @@ -202,7 +201,7 @@ pub struct X11ClientState { pub(crate) windows: HashMap, pub(crate) mouse_focused_window: Option, pub(crate) keyboard_focused_window: Option, - pub(crate) keyboard_state: KeyboardState, + pub(crate) xkb: State, previous_xkb_state: XKBStateNotiy, keyboard_layout: LinuxKeyboardLayout, pub(crate) ximc: Option>>, @@ -417,7 +416,6 @@ impl X11Client { ); xkbc::x11::state_new_from_device(&xkb_keymap, &xcb_connection, xkb_device_id) }; - let keyboard_state = KeyboardState::new(xkb_state); let compose_state = get_xkb_compose_state(&xkb_context); let layout_idx = xkb_state.serialize_layout(STATE_LAYOUT_EFFECTIVE); let layout_name = xkb_state @@ -515,7 +513,7 @@ impl X11Client { windows: HashMap::default(), mouse_focused_window: None, keyboard_focused_window: None, - keyboard_state, + xkb: xkb_state, previous_xkb_state: XKBStateNotiy::default(), keyboard_layout, ximc, @@ -976,18 +974,15 @@ impl X11Client { latched_layout, locked_layout, }; - state.keyboard_state = KeyboardState::new(xkb_state); + state.xkb = xkb_state; drop(state); self.handle_keyboard_layout_change(); } Event::XkbStateNotify(event) => { let mut state = self.0.borrow_mut(); - let old_layout = state - .keyboard_state - .state - .serialize_layout(STATE_LAYOUT_EFFECTIVE); + let old_layout = state.xkb.serialize_layout(STATE_LAYOUT_EFFECTIVE); let new_layout = u32::from(event.group); - state.keyboard_state.state.update_mask( + state.xkb.update_mask( event.base_mods.into(), event.latched_mods.into(), event.locked_mods.into(), @@ -1038,7 +1033,7 @@ impl X11Client { let keystroke = { let code = event.detail.into(); let xkb_state = state.previous_xkb_state.clone(); - state.keyboard_state.state.update_mask( + state.xkb.update_mask( event.state.bits() as ModMask, 0, 0, @@ -1046,9 +1041,8 @@ impl X11Client { xkb_state.latched_layout, xkb_state.locked_layout, ); - let mut keystroke = - crate::Keystroke::from_xkb(&state.keyboard_state, modifiers, code); - let keysym = state.keyboard_state.state.key_get_one_sym(code); + let mut keystroke = crate::Keystroke::from_xkb(&state.xkb, modifiers, code); + let keysym = state.xkb.key_get_one_sym(code); if keysym.is_modifier_key() { return Some(()); } @@ -1112,7 +1106,7 @@ impl X11Client { let keystroke = { let code = event.detail.into(); let xkb_state = state.previous_xkb_state.clone(); - state.keyboard_state.state.update_mask( + state.xkb.update_mask( event.state.bits() as ModMask, 0, 0, @@ -1120,9 +1114,8 @@ impl X11Client { xkb_state.latched_layout, xkb_state.locked_layout, ); - let keystroke = - crate::Keystroke::from_xkb(&state.keyboard_state, modifiers, code); - let keysym = state.keyboard_state.state.key_get_one_sym(code); + let keystroke = crate::Keystroke::from_xkb(&state.xkb, modifiers, code); + let keysym = state.xkb.key_get_one_sym(code); if keysym.is_modifier_key() { return Some(()); } @@ -1343,7 +1336,7 @@ impl X11Client { Event::KeyPress(event) | Event::KeyRelease(event) => { let mut state = self.0.borrow_mut(); state.pre_key_char_down = Some(Keystroke::from_xkb( - &state.keyboard_state, + &state.xkb, state.modifiers, event.detail.into(), ));