From 7da2e2af507c795b56e191bccca9a9b4b38f4459 Mon Sep 17 00:00:00 2001 From: Junkui Zhang <364772080@qq.com> Date: Thu, 22 May 2025 15:47:41 +0800 Subject: [PATCH] use cache for x11 --- crates/gpui/src/platform/linux/x11/client.rs | 24 ++++++++++++++++---- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/crates/gpui/src/platform/linux/x11/client.rs b/crates/gpui/src/platform/linux/x11/client.rs index a4c524eea6f64625d59955b407105d2f5c0c0f37..273312b005000901a19f36ffcf742f507bc647b7 100644 --- a/crates/gpui/src/platform/linux/x11/client.rs +++ b/crates/gpui/src/platform/linux/x11/client.rs @@ -207,7 +207,8 @@ pub struct X11ClientState { previous_xkb_state: XKBStateNotiy, keyboard_layout: LinuxKeyboardLayout, pub(crate) keyboard_layout: Box, - pub(crate) keyboard_mapper: LinuxKeyboardMapper, + pub(crate) keyboard_mapper: Rc, + pub(crate) keyboard_mapper_cache: HashMap>, pub(crate) ximc: Option>>, pub(crate) xim_handler: Option, pub modifiers: Modifiers, @@ -428,7 +429,9 @@ impl X11Client { .to_string(); let keyboard_layout = LinuxKeyboardLayout::new(layout_name.into()); let keyboard_layout = Box::new(LinuxKeyboardLayout::new(&xkb_state)); - let keyboard_mapper = LinuxKeyboardMapper::new(0, 0, 0); + let keyboard_mapper = Rc::new(LinuxKeyboardMapper::new(0, 0, 0)); + let mut keyboard_mapper_cache = HashMap::default(); + keyboard_mapper_cache.insert(keyboard_layout.id().to_string(), keyboard_mapper.clone()); let gpu_context = BladeContext::new().context("Unable to init GPU context")?; @@ -523,6 +526,7 @@ impl X11Client { previous_xkb_state: XKBStateNotiy::default(), keyboard_layout, keyboard_mapper, + keyboard_mapper_cache, ximc, xim_handler, @@ -981,12 +985,22 @@ impl X11Client { latched_layout, locked_layout, }; + let keyboard_layout = LinuxKeyboardLayout::new(&xkb_state); + println!("X11 Keyboard layout: {:#?}", keyboard_layout.id()); state.xkb = xkb_state; drop(state); self.handle_keyboard_layout_change(); - state.keyboard_mapper = LinuxKeyboardMapper::new(0, 0, 0); - let layout = LinuxKeyboardLayout::new(&state.xkb).id().to_string(); - println!("X11 Keyboard layout: {:#?}", layout); + state.keyboard_mapper = + if let Some(mapper) = state.keyboard_mapper_cache.get(keyboard_layout.id()) { + Rc::clone(mapper) + } else { + let mapper = Rc::new(LinuxKeyboardMapper::new(0, 0, 0)); + state + .keyboard_mapper_cache + .insert(keyboard_layout.id().to_string(), Rc::clone(&mapper)); + mapper + }; + state.keyboard_layout = Box::new(keyboard_layout); } Event::XkbStateNotify(event) => { let mut state = self.0.borrow_mut();