From c19c9da5f0a7bafde11651c1617d49c816d83f3c Mon Sep 17 00:00:00 2001 From: galister <22305755+galister@users.noreply.github.com> Date: Tue, 16 Dec 2025 10:28:06 +0900 Subject: [PATCH] fall back to system layout more aggressively --- wlx-overlay-s/src/overlays/keyboard/mod.rs | 32 ++++++++++++++-------- wlx-overlay-s/src/overlays/screen/mod.rs | 2 +- wlx-overlay-s/src/subsystem/hid/mod.rs | 2 +- wlx-overlay-s/src/windowing/manager.rs | 4 +-- 4 files changed, 24 insertions(+), 16 deletions(-) diff --git a/wlx-overlay-s/src/overlays/keyboard/mod.rs b/wlx-overlay-s/src/overlays/keyboard/mod.rs index ad51fe8..c364b3b 100644 --- a/wlx-overlay-s/src/overlays/keyboard/mod.rs +++ b/wlx-overlay-s/src/overlays/keyboard/mod.rs @@ -6,23 +6,23 @@ use std::{ }; use crate::{ + KEYMAP_CHANGE, backend::input::{HoverResult, PointerHit}, gui::panel::GuiPanel, overlays::keyboard::{builder::create_keyboard_panel, layout::AltModifier}, state::AppState, subsystem::hid::{ - get_keymap_wl, get_keymap_x11, KeyModifier, VirtualKey, WheelDelta, XkbKeymap, ALT, CTRL, - META, SHIFT, SUPER, + ALT, CTRL, KeyModifier, META, SHIFT, SUPER, VirtualKey, WheelDelta, XkbKeymap, + get_keymap_wl, get_keymap_x11, }, windowing::{ backend::{FrameMeta, OverlayBackend, OverlayEventData, RenderResources, ShouldRender}, window::OverlayWindowConfig, }, - KEYMAP_CHANGE, }; use anyhow::Context; -use glam::{vec3, Affine3A, Quat, Vec3}; -use slotmap::{new_key_type, SlotMap}; +use glam::{Affine3A, Quat, Vec3, vec3}; +use slotmap::{SlotMap, new_key_type}; use wgui::{ drawing, event::{InternalStateChangeEvent, MouseButton, MouseButtonIndex}, @@ -180,16 +180,21 @@ impl KeyboardBackend { unreachable!(); } - fn switch_to_fcitx_keymap(&mut self, app: &mut AppState) -> anyhow::Result { - let fcitx_layout = app + fn auto_switch_keymap(&mut self, app: &mut AppState) -> anyhow::Result { + let Ok(fcitx_layout) = app .dbus .fcitx_keymap() - .context("Could not fetch Fcitx5 keymap") - .inspect_err(|e| log::warn!("{e:?}"))?; + .context("Could not keymap via fcitx5, falling back to wayland") + .inspect_err(|e| log::warn!("{e:?}")) + else { + let keymap = self.get_system_keymap()?; + app.hid_provider.keymap_changed(&keymap); + return self.switch_keymap(&keymap, app); + }; if fcitx_layout.starts_with("keyboard-") { let keymap = XkbKeymap::from_layout_str(&fcitx_layout[9..]) - .context("Could not load Fcitx5 keymap") + .context("layout is invalid") .inspect_err(|e| log::warn!("fcitx layout {fcitx_layout}: {e:?}"))?; app.hid_provider.keymap_changed(&keymap); self.switch_keymap(&keymap, app) @@ -199,7 +204,10 @@ impl KeyboardBackend { app.hid_provider.keymap_changed(&keymap); self.switch_keymap(&keymap, app) } else { - anyhow::bail!("Unknown layout or IME: {fcitx_layout}"); + log::warn!("Unknown layout or IME '{fcitx_layout}', using system layout"); + let keymap = self.get_system_keymap()?; + app.hid_provider.keymap_changed(&keymap); + return self.switch_keymap(&keymap, app); } } @@ -215,7 +223,7 @@ impl OverlayBackend for KeyboardBackend { fn should_render(&mut self, app: &mut AppState) -> anyhow::Result { while KEYMAP_CHANGE.swap(false, Ordering::Relaxed) { if self - .switch_to_fcitx_keymap(app) + .auto_switch_keymap(app) .inspect_err(|e| log::warn!("{e:?}")) .unwrap_or(false) { diff --git a/wlx-overlay-s/src/overlays/screen/mod.rs b/wlx-overlay-s/src/overlays/screen/mod.rs index a4a507c..4038aa7 100644 --- a/wlx-overlay-s/src/overlays/screen/mod.rs +++ b/wlx-overlay-s/src/overlays/screen/mod.rs @@ -1,6 +1,6 @@ use std::{f32::consts::PI, sync::Arc}; -use glam::{vec3, Affine3A, Quat, Vec3}; +use glam::{Affine3A, Quat, Vec3, vec3}; use wlx_capture::frame::Transform; use wlx_common::windowing::{OverlayWindowState, Positioning}; diff --git a/wlx-overlay-s/src/subsystem/hid/mod.rs b/wlx-overlay-s/src/subsystem/hid/mod.rs index 3c85210..ae5e2bb 100644 --- a/wlx-overlay-s/src/subsystem/hid/mod.rs +++ b/wlx-overlay-s/src/subsystem/hid/mod.rs @@ -1,5 +1,5 @@ use glam::Vec2; -use idmap::{idmap, IdMap}; +use idmap::{IdMap, idmap}; use idmap_derive::IntegerId; use input_linux::{ AbsoluteAxis, AbsoluteInfo, AbsoluteInfoSetup, EventKind, InputId, Key, RelativeAxis, diff --git a/wlx-overlay-s/src/windowing/manager.rs b/wlx-overlay-s/src/windowing/manager.rs index 2ae99fc..a1abe6e 100644 --- a/wlx-overlay-s/src/windowing/manager.rs +++ b/wlx-overlay-s/src/windowing/manager.rs @@ -12,6 +12,7 @@ use wlx_common::{ }; use crate::{ + FRAME_COUNTER, backend::task::OverlayTask, overlays::{ anchor::create_anchor, edit::EditWrapperManager, keyboard::create_keyboard, @@ -19,13 +20,12 @@ use crate::{ }, state::AppState, windowing::{ + OverlayID, OverlaySelector, backend::{OverlayEventData, OverlayMeta}, set::OverlayWindowSet, snap_upright, window::{OverlayCategory, OverlayWindowData}, - OverlayID, OverlaySelector, }, - FRAME_COUNTER, }; pub const MAX_OVERLAY_SETS: usize = 7;