try fix x11

Junkui Zhang created

Change summary

crates/gpui/src/platform/linux/keyboard.rs       |  9 +++----
crates/gpui/src/platform/linux/wayland/client.rs |  2 
crates/gpui/src/platform/linux/x11/client.rs     | 19 ++++++++++-------
3 files changed, 16 insertions(+), 14 deletions(-)

Detailed changes

crates/gpui/src/platform/linux/keyboard.rs 🔗

@@ -49,8 +49,7 @@ pub(crate) struct LinuxKeyboardMapper {
 
 #[cfg(any(feature = "wayland", feature = "x11"))]
 impl LinuxKeyboardMapper {
-    pub(crate) fn new(group: Option<u32>) -> Self {
-        let group = group.unwrap_or(0);
+    pub(crate) fn new(base_group: u32, latched_group: u32, locked_group: u32) -> Self {
         let _ = XCB_CONNECTION
             .xkb_use_extension(XKB_X11_MIN_MAJOR_XKB_VERSION, XKB_X11_MIN_MINOR_XKB_VERSION)
             .unwrap()
@@ -67,7 +66,7 @@ impl LinuxKeyboardMapper {
             );
             xkbcommon::xkb::x11::state_new_from_device(&xkb_keymap, &*XCB_CONNECTION, xkb_device_id)
         };
-        xkb_state.update_mask(0, 0, 0, 0, 0, group);
+        xkb_state.update_mask(0, 0, 0, base_group, latched_group, locked_group);
 
         let mut letters = HashMap::default();
         let mut code_to_key = HashMap::default();
@@ -78,7 +77,7 @@ impl LinuxKeyboardMapper {
         let mut shifted_state = xkbcommon::xkb::State::new(&keymap);
         let shift_mod = keymap.mod_get_index(xkbcommon::xkb::MOD_NAME_SHIFT);
         let shift_mask = 1 << shift_mod;
-        shifted_state.update_mask(shift_mask, 0, 0, 0, 0, group);
+        shifted_state.update_mask(shift_mask, 0, 0, base_group, latched_group, locked_group);
 
         for scan_code in LinuxScanCodes::iter() {
             let keycode = Keycode::new(scan_code as u32);
@@ -447,7 +446,7 @@ mod tests {
 
     #[test]
     fn test_us_layout_mapper() {
-        let mapper = LinuxKeyboardMapper::new(None);
+        let mapper = LinuxKeyboardMapper::new(0, 0, 0);
         for scan_code in super::LinuxScanCodes::iter() {
             if scan_code == LinuxScanCodes::IntlBackslash || scan_code == LinuxScanCodes::IntlRo {
                 continue;

crates/gpui/src/platform/linux/wayland/client.rs 🔗

@@ -1220,7 +1220,7 @@ impl Dispatch<wl_keyboard::WlKeyboard, ()> for WaylandClientStatePtr {
                 };
                 state.keymap_state = Some(xkb::State::new(&keymap));
                 state.compose_state = get_xkb_compose_state(&xkb_context);
-                state.keyboard_mapper = Some(LinuxKeyboardMapper::new(None));
+                state.keyboard_mapper = Some(LinuxKeyboardMapper::new(0, 0, 0));
                 drop(state);
 
                 this.handle_keyboard_layout_change();

crates/gpui/src/platform/linux/x11/client.rs 🔗

@@ -426,7 +426,7 @@ impl X11Client {
             .layout_get_name(layout_idx)
             .to_string();
         let keyboard_layout = LinuxKeyboardLayout::new(layout_name.into());
-        let keyboard_mapper = LinuxKeyboardMapper::new(None);
+        let keyboard_mapper = LinuxKeyboardMapper::new(0, 0, 0);
 
         let gpu_context = BladeContext::new().context("Unable to init GPU context")?;
 
@@ -982,7 +982,7 @@ impl X11Client {
                 state.xkb = xkb_state;
                 drop(state);
                 self.handle_keyboard_layout_change();
-                state.keyboard_mapper = LinuxKeyboardMapper::new(None);
+                state.keyboard_mapper = LinuxKeyboardMapper::new(0, 0, 0);
                 let layout_idx = state.xkb.serialize_layout(STATE_LAYOUT_EFFECTIVE);
                 let layout = LinuxKeyboardLayout::new(
                     state
@@ -999,18 +999,21 @@ impl X11Client {
                 let mut state = self.0.borrow_mut();
                 let old_layout = state.xkb.serialize_layout(STATE_LAYOUT_EFFECTIVE);
                 let new_layout = u32::from(event.group);
+                let base_group = event.base_group as u32;
+                let latched_group = event.latched_group as u32;
+                let locked_group = event.locked_group.into();
                 state.xkb.update_mask(
                     event.base_mods.into(),
                     event.latched_mods.into(),
                     event.locked_mods.into(),
-                    event.base_group as u32,
-                    event.latched_group as u32,
-                    event.locked_group.into(),
+                    base_group,
+                    latched_group,
+                    locked_group,
                 );
                 state.previous_xkb_state = XKBStateNotiy {
-                    depressed_layout: event.base_group as u32,
-                    latched_layout: event.latched_group as u32,
-                    locked_layout: event.locked_group.into(),
+                    depressed_layout: base_group,
+                    latched_layout: latched_group,
+                    locked_layout: locked_group,
                 };
 
                 let modifiers = Modifiers::from_xkb(&state.keyboard_state.state);