fix wayland

Junkui Zhang created

Change summary

crates/gpui/src/platform/linux/wayland/client.rs | 40 +++++++++++------
1 file changed, 26 insertions(+), 14 deletions(-)

Detailed changes

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<ObjectId, Output>,
     in_progress_outputs: HashMap<ObjectId, InProgressOutput>,
     keyboard_layout: LinuxKeyboardLayout,
-    keymap_state: Option<xkb::State>,
+    keyboard_state: Option<KeyboardState>,
     compose_state: Option<xkb::compose::State>,
     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<wl_keyboard::WlKeyboard, ()> 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<wl_keyboard::WlKeyboard, ()> 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<wl_keyboard::WlKeyboard, ()> 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<wl_keyboard::WlKeyboard, ()> 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) {