@@ -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) {