diff --git a/crates/gpui/src/platform/linux/wayland/client.rs b/crates/gpui/src/platform/linux/wayland/client.rs index 9953ee29b9c9ad770f4a795ff171c303837740bd..0b88ee829a93a949c1b2f021e33943384c4d1613 100644 --- a/crates/gpui/src/platform/linux/wayland/client.rs +++ b/crates/gpui/src/platform/linux/wayland/client.rs @@ -79,7 +79,7 @@ use crate::{ ScrollWheelEvent, Size, TouchPhase, WindowParams, point, px, size, }; use crate::{ - SharedString, + KeyboardState, SharedString, platform::linux::{ LinuxClient, get_xkb_compose_state, is_within_click_distance, open_uri_internal, read_fd, reveal_path_internal, @@ -209,7 +209,7 @@ pub(crate) struct WaylandClientState { outputs: HashMap, in_progress_outputs: HashMap, keyboard_layout: LinuxKeyboardLayout, - keymap_state: Option, + keyboard_state: Option, compose_state: Option, drag: DragState, click: ClickState, @@ -568,7 +568,7 @@ impl WaylandClient { windows: HashMap::default(), common, keyboard_layout: LinuxKeyboardLayout::new(UNKNOWN_KEYBOARD_LAYOUT_NAME), - keymap_state: None, + keyboard_state: None, compose_state: None, drag: DragState { data_offer: None, @@ -1210,7 +1210,7 @@ impl Dispatch for WaylandClientStatePtr { .flatten() .expect("Failed to create keymap") }; - state.keymap_state = Some(xkb::State::new(&keymap)); + state.keyboard_state = Some(KeyboardState::new(xkb::State::new(&keymap))); state.compose_state = get_xkb_compose_state(&xkb_context); drop(state); @@ -1251,13 +1251,21 @@ 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); - let keymap_state = state.keymap_state.as_mut().unwrap(); - state.capslock = Capslock::from_xkb(keymap_state); let input = PlatformInput::ModifiersChanged(ModifiersChangedEvent { modifiers: state.modifiers, @@ -1287,14 +1295,14 @@ impl Dispatch for WaylandClientStatePtr { }; let focused_window = focused_window.clone(); - let keymap_state = state.keymap_state.as_ref().unwrap(); + let keyboard_state = state.keyboard_state.as_ref().unwrap(); let keycode = Keycode::from(key + MIN_KEYCODE); - let keysym = keymap_state.key_get_one_sym(keycode); + let keysym = keyboard_state.state.key_get_one_sym(keycode); match key_state { wl_keyboard::KeyState::Pressed if !keysym.is_modifier_key() => { let mut keystroke = - Keystroke::from_xkb(&keymap_state, state.modifiers, keycode); + Keystroke::from_xkb(&keyboard_state, state.modifiers, keycode); println!("Wayland Before {:#?}", keystroke); if let Some(mut compose) = state.compose_state.take() { compose.feed(keysym); @@ -1381,7 +1389,11 @@ impl Dispatch for WaylandClientStatePtr { } wl_keyboard::KeyState::Released if !keysym.is_modifier_key() => { let input = PlatformInput::KeyUp(KeyUpEvent { - keystroke: Keystroke::from_xkb(keymap_state, state.modifiers, keycode), + keystroke: Keystroke::from_xkb( + keyboard_state, + state.modifiers, + keycode, + ), }); if state.repeat.current_keycode == Some(keycode) {