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