@@ -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;
@@ -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();
@@ -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);