revert `Instroduce KeyboardState`

Junkui Zhang created

Change summary

crates/gpui/src/platform/linux/platform.rs       | 22 +-------
crates/gpui/src/platform/linux/wayland/client.rs | 43 ++++++-----------
crates/gpui/src/platform/linux/x11/client.rs     | 33 +++++--------
3 files changed, 33 insertions(+), 65 deletions(-)

Detailed changes

crates/gpui/src/platform/linux/platform.rs 🔗

@@ -709,30 +709,16 @@ pub(super) fn log_cursor_icon_warning(message: impl std::fmt::Display) {
     }
 }
 
-#[cfg(any(feature = "wayland", feature = "x11"))]
-pub(crate) struct KeyboardState {
-    pub(crate) state: xkb::State,
-    pub(crate) mapper: LinuxKeyboardMapper,
-}
-
-#[cfg(any(feature = "wayland", feature = "x11"))]
-impl KeyboardState {
-    pub(crate) fn new(state: xkb::State) -> Self {
-        let mapper = LinuxKeyboardMapper::new();
-        Self { state, mapper }
-    }
-}
-
 #[cfg(any(feature = "wayland", feature = "x11"))]
 impl crate::Keystroke {
     pub(super) fn from_xkb(
-        keyboard_state: &KeyboardState,
+        keyboard_state: &State,
         mut modifiers: crate::Modifiers,
         keycode: Keycode,
     ) -> Self {
-        let key_utf32 = keyboard_state.state.key_get_utf32(keycode);
-        let key_utf8 = keyboard_state.state.key_get_utf8(keycode);
-        let key_sym = keyboard_state.state.key_get_one_sym(keycode);
+        let key_utf32 = keyboard_state.key_get_utf32(keycode);
+        let key_utf8 = keyboard_state.key_get_utf8(keycode);
+        let key_sym = keyboard_state.key_get_one_sym(keycode);
 
         let key = match key_sym {
             Keysym::space => "space".to_owned(),

crates/gpui/src/platform/linux/wayland/client.rs 🔗

@@ -61,8 +61,9 @@ use wayland_protocols::xdg::decoration::zv1::client::{
 };
 use wayland_protocols::xdg::shell::client::{xdg_surface, xdg_toplevel, xdg_wm_base};
 use wayland_protocols_plasma::blur::client::{org_kde_kwin_blur, org_kde_kwin_blur_manager};
-use xkbcommon::xkb::ffi::XKB_KEYMAP_FORMAT_TEXT_V1;
-use xkbcommon::xkb::{self, KEYMAP_COMPILE_NO_FLAGS, Keycode};
+use xkbcommon::xkb::{
+    self, KEYMAP_COMPILE_NO_FLAGS, Keycode, State, ffi::XKB_KEYMAP_FORMAT_TEXT_V1,
+};
 
 use super::{
     display::WaylandDisplay,
@@ -212,7 +213,7 @@ pub(crate) struct WaylandClientState {
     outputs: HashMap<ObjectId, Output>,
     in_progress_outputs: HashMap<ObjectId, InProgressOutput>,
     keyboard_layout: LinuxKeyboardLayout,
-    keyboard_state: Option<KeyboardState>,
+    keymap_state: Option<State>,
     compose_state: Option<xkb::compose::State>,
     drag: DragState,
     click: ClickState,
@@ -571,7 +572,7 @@ impl WaylandClient {
             windows: HashMap::default(),
             common,
             keyboard_layout: LinuxKeyboardLayout::new(UNKNOWN_KEYBOARD_LAYOUT_NAME),
-            keyboard_state: None,
+            keymap_state: None,
             compose_state: None,
             drag: DragState {
                 data_offer: None,
@@ -1214,7 +1215,7 @@ impl Dispatch<wl_keyboard::WlKeyboard, ()> for WaylandClientStatePtr {
                     .flatten()
                     .expect("Failed to create keymap")
                 };
-                state.keyboard_state = Some(KeyboardState::new(xkb::State::new(&keymap)));
+                state.keymap_state = Some(xkb::State::new(&keymap));
                 state.compose_state = get_xkb_compose_state(&xkb_context);
                 drop(state);
 
@@ -1255,20 +1256,12 @@ 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);
+                state.capslock = Capslock::from_xkb(&keymap_state);
                 let keymap_state = state.keymap_state.as_mut().unwrap();
 
                 let input = PlatformInput::ModifiersChanged(ModifiersChangedEvent {
@@ -1299,14 +1292,14 @@ impl Dispatch<wl_keyboard::WlKeyboard, ()> for WaylandClientStatePtr {
                 };
                 let focused_window = focused_window.clone();
 
-                let keyboard_state = state.keyboard_state.as_ref().unwrap();
+                let keymap_state = state.keymap_state.as_ref().unwrap();
                 let keycode = Keycode::from(key + MIN_KEYCODE);
-                let keysym = keyboard_state.state.key_get_one_sym(keycode);
+                let keysym = keymap_state.key_get_one_sym(keycode);
 
                 match key_state {
                     wl_keyboard::KeyState::Pressed if !keysym.is_modifier_key() => {
                         let mut keystroke =
-                            Keystroke::from_xkb(&keyboard_state, state.modifiers, keycode);
+                            Keystroke::from_xkb(&keymap_state, state.modifiers, keycode);
                         println!("Wayland Before {:#?}", keystroke);
                         if let Some(mut compose) = state.compose_state.take() {
                             compose.feed(keysym);
@@ -1393,11 +1386,7 @@ 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(
-                                keyboard_state,
-                                state.modifiers,
-                                keycode,
-                            ),
+                            keystroke: Keystroke::from_xkb(keymap_state, state.modifiers, keycode),
                         });
 
                         if state.repeat.current_keycode == Some(keycode) {

crates/gpui/src/platform/linux/x11/client.rs 🔗

@@ -1,5 +1,4 @@
 use crate::{
-    linux::KeyboardState,
     platform::{xcb_flush, Capslock},
     scap_screen_capture::scap_screen_sources,
     underlying_dead_key,
@@ -43,7 +42,7 @@ use x11rb::{
 };
 use xim::{x11rb::X11rbClient, AttributeName, Client, InputStyle};
 use xkbc::x11::ffi::{XKB_X11_MIN_MAJOR_XKB_VERSION, XKB_X11_MIN_MINOR_XKB_VERSION};
-use xkbcommon::xkb::{self as xkbc, LayoutIndex, ModMask, STATE_LAYOUT_EFFECTIVE};
+use xkbcommon::xkb::{self as xkbc, LayoutIndex, ModMask, State, STATE_LAYOUT_EFFECTIVE};
 
 use super::{
     button_or_scroll_from_event_detail, check_reply,
@@ -202,7 +201,7 @@ pub struct X11ClientState {
     pub(crate) windows: HashMap<xproto::Window, WindowRef>,
     pub(crate) mouse_focused_window: Option<xproto::Window>,
     pub(crate) keyboard_focused_window: Option<xproto::Window>,
-    pub(crate) keyboard_state: KeyboardState,
+    pub(crate) xkb: State,
     previous_xkb_state: XKBStateNotiy,
     keyboard_layout: LinuxKeyboardLayout,
     pub(crate) ximc: Option<X11rbClient<Rc<XCBConnection>>>,
@@ -417,7 +416,6 @@ impl X11Client {
             );
             xkbc::x11::state_new_from_device(&xkb_keymap, &xcb_connection, xkb_device_id)
         };
-        let keyboard_state = KeyboardState::new(xkb_state);
         let compose_state = get_xkb_compose_state(&xkb_context);
         let layout_idx = xkb_state.serialize_layout(STATE_LAYOUT_EFFECTIVE);
         let layout_name = xkb_state
@@ -515,7 +513,7 @@ impl X11Client {
             windows: HashMap::default(),
             mouse_focused_window: None,
             keyboard_focused_window: None,
-            keyboard_state,
+            xkb: xkb_state,
             previous_xkb_state: XKBStateNotiy::default(),
             keyboard_layout,
             ximc,
@@ -976,18 +974,15 @@ impl X11Client {
                     latched_layout,
                     locked_layout,
                 };
-                state.keyboard_state = KeyboardState::new(xkb_state);
+                state.xkb = xkb_state;
                 drop(state);
                 self.handle_keyboard_layout_change();
             }
             Event::XkbStateNotify(event) => {
                 let mut state = self.0.borrow_mut();
-                let old_layout = state
-                    .keyboard_state
-                    .state
-                    .serialize_layout(STATE_LAYOUT_EFFECTIVE);
+                let old_layout = state.xkb.serialize_layout(STATE_LAYOUT_EFFECTIVE);
                 let new_layout = u32::from(event.group);
-                state.keyboard_state.state.update_mask(
+                state.xkb.update_mask(
                     event.base_mods.into(),
                     event.latched_mods.into(),
                     event.locked_mods.into(),
@@ -1038,7 +1033,7 @@ impl X11Client {
                 let keystroke = {
                     let code = event.detail.into();
                     let xkb_state = state.previous_xkb_state.clone();
-                    state.keyboard_state.state.update_mask(
+                    state.xkb.update_mask(
                         event.state.bits() as ModMask,
                         0,
                         0,
@@ -1046,9 +1041,8 @@ impl X11Client {
                         xkb_state.latched_layout,
                         xkb_state.locked_layout,
                     );
-                    let mut keystroke =
-                        crate::Keystroke::from_xkb(&state.keyboard_state, modifiers, code);
-                    let keysym = state.keyboard_state.state.key_get_one_sym(code);
+                    let mut keystroke = crate::Keystroke::from_xkb(&state.xkb, modifiers, code);
+                    let keysym = state.xkb.key_get_one_sym(code);
                     if keysym.is_modifier_key() {
                         return Some(());
                     }
@@ -1112,7 +1106,7 @@ impl X11Client {
                 let keystroke = {
                     let code = event.detail.into();
                     let xkb_state = state.previous_xkb_state.clone();
-                    state.keyboard_state.state.update_mask(
+                    state.xkb.update_mask(
                         event.state.bits() as ModMask,
                         0,
                         0,
@@ -1120,9 +1114,8 @@ impl X11Client {
                         xkb_state.latched_layout,
                         xkb_state.locked_layout,
                     );
-                    let keystroke =
-                        crate::Keystroke::from_xkb(&state.keyboard_state, modifiers, code);
-                    let keysym = state.keyboard_state.state.key_get_one_sym(code);
+                    let keystroke = crate::Keystroke::from_xkb(&state.xkb, modifiers, code);
+                    let keysym = state.xkb.key_get_one_sym(code);
                     if keysym.is_modifier_key() {
                         return Some(());
                     }
@@ -1343,7 +1336,7 @@ impl X11Client {
             Event::KeyPress(event) | Event::KeyRelease(event) => {
                 let mut state = self.0.borrow_mut();
                 state.pre_key_char_down = Some(Keystroke::from_xkb(
-                    &state.keyboard_state,
+                    &state.xkb,
                     state.modifiers,
                     event.detail.into(),
                 ));