use xkb style for variants

This commit is contained in:
galister 2026-08-02 23:53:59 +09:00
parent 5a9133c497
commit 2e07818072
1 changed files with 7 additions and 3 deletions

View File

@ -89,6 +89,7 @@ pub fn create_keyboard(app: &mut AppState) -> anyhow::Result<OverlayWindowConfig
wlx_layout: layout,
wayland: app.feats.desktop_backend.is_wayland(),
re_fcitx: Regex::new(r"^keyboard-([^-]+)(?:-([^-]+))?$").unwrap(),
re_keymap: Regex::new(r"^([a-zA-Z][a-zA-Z0-9]*)(?:\(([^)]+)\))?$").unwrap(),
};
backend.active_layout = backend.add_new_keymap(maybe_keymap.as_ref(), app)?;
@ -136,6 +137,7 @@ struct KeyboardBackend {
wlx_layout: layout::Layout,
wayland: bool,
re_fcitx: Regex,
re_keymap: Regex,
}
impl KeyboardBackend {
@ -234,9 +236,11 @@ impl KeyboardBackend {
keymap_name: &str,
app: &mut AppState,
) -> anyhow::Result<bool> {
let mut parts = keymap_name.splitn(2, '/');
let layout = parts.next().unwrap_or("");
let variant = parts.next().unwrap_or("");
let Some(captures) = self.re_keymap.captures(keymap_name) else {
anyhow::bail!("invalid layout name for keymap switch: {keymap_name}");
};
let layout = captures.get(1).map_or("", |g| g.as_str());
let variant = captures.get(2).map_or("", |g| g.as_str());
let keymap = XkbKeymap::from_layout_variant(layout, variant)
.context("invalid layout/variant for keymap switch")?;
app.hid_provider