diff --git a/crates/gpui/src/platform/linux/wayland/client.rs b/crates/gpui/src/platform/linux/wayland/client.rs index 858587beb3944a0cad3f3a6315da90da70759f80..c67dd41d13d096cbe5da1c09772add1702cc6fec 100644 --- a/crates/gpui/src/platform/linux/wayland/client.rs +++ b/crates/gpui/src/platform/linux/wayland/client.rs @@ -217,7 +217,8 @@ pub(crate) struct WaylandClientState { keymap_state: Option, compose_state: Option, keyboard_layout: Box, - keyboard_mapper: Option, + keyboard_mapper: Option>, + keyboard_mapper_cache: HashMap>, drag: DragState, click: ClickState, repeat: KeyRepeat, @@ -579,6 +580,7 @@ impl WaylandClient { keymap_state: None, compose_state: None, keyboard_mapper: None, + keyboard_mapper_cache: HashMap::default(), keyboard_layout, drag: DragState { data_offer: None, @@ -1225,7 +1227,15 @@ impl Dispatch for WaylandClientStatePtr { let keyboard_layout = LinuxKeyboardLayout::new(&keymap_state); state.keymap_state = Some(xkb::State::new(&keymap)); state.compose_state = get_xkb_compose_state(&xkb_context); - state.keyboard_mapper = Some(LinuxKeyboardMapper::new(0, 0, 0)); + if let Some(mapper) = state.keyboard_mapper_cache.get(keyboard_layout.id()) { + state.keyboard_mapper = Some(mapper.clone()); + } else { + let mapper = Rc::new(LinuxKeyboardMapper::new(0, 0, 0)); + state.keyboard_mapper = Some(mapper.clone()); + state + .keyboard_mapper_cache + .insert(keyboard_layout.id().to_string(), mapper); + } state.keyboard_layout = Box::new(keyboard_layout); drop(state);