diff --git a/crates/gpui/src/platform/linux/keyboard.rs b/crates/gpui/src/platform/linux/keyboard.rs index c4239e2a390a5a07ef5b2605827f7258bbddd015..c736fb905d7e8de7ee043e5823f14347ed6f1433 100644 --- a/crates/gpui/src/platform/linux/keyboard.rs +++ b/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) -> 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; diff --git a/crates/gpui/src/platform/linux/wayland/client.rs b/crates/gpui/src/platform/linux/wayland/client.rs index 78ac8ae79b84c1b488967534e953523f207b9f02..0e2995e4559e252f75aaedb0fc86c40bf192e1d5 100644 --- a/crates/gpui/src/platform/linux/wayland/client.rs +++ b/crates/gpui/src/platform/linux/wayland/client.rs @@ -1220,7 +1220,7 @@ impl Dispatch 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(); diff --git a/crates/gpui/src/platform/linux/x11/client.rs b/crates/gpui/src/platform/linux/x11/client.rs index 85daa36c00f5c14bad8b906de39bda2856acb978..84f545ebf3ded11242b7c67597e1197bcc3c73ba 100644 --- a/crates/gpui/src/platform/linux/x11/client.rs +++ b/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);