feat(settings): add grouped configuration hub, languages and tray controls

This commit is contained in:
aria committed 2026-10-28 03:37:22 +09:00
1 parent 6f34fd080f
commit cc3b6f903f
90 files changed
+3625 -408

No files matched your search

+54 -7
View File
@@ -83,6 +83,22 @@ fn parse_numbers(text: &str) -> Result<Vec<u32>, Box<dyn Error>> {
delegate_noop!(State: ignore pointer_manager::ZwlrVirtualPointerManagerV1);
delegate_noop!(State: ignore virtual_pointer::ZwlrVirtualPointerV1);
fn named_keysym(name: &str) -> Result<u32, String> {
let canonical = match name {
"Ctrl" | "Control" => "Control_L",
"Shift" => "Shift_L",
"Alt" => "Alt_L",
"Super" | "Meta" => "Super_L",
_ => name,
};
let symbol = xkb::keysym_from_name(canonical, xkb::KEYSYM_NO_FLAGS).raw();
if symbol == 0 {
Err(format!("unknown test keysym {name:?}"))
} else {
Ok(symbol)
}
}
fn main() -> Result<(), Box<dyn Error>> {
if std::env::var("FERESE_TEST_INPUT").as_deref() != Ok("1") {
return Err(
@@ -122,16 +138,13 @@ fn main() -> Result<(), Box<dyn Error>> {
sequences.push(vec![character as u32]);
}
}
"--key" => sequences.push(vec![
xkb::keysym_from_name(&args.next().ok_or("missing key")?, xkb::KEYSYM_NO_FLAGS)
.raw(),
]),
"--key" => sequences.push(vec![named_keysym(&args.next().ok_or("missing key")?)?]),
"--chord" => sequences.push(
args.next()
.ok_or("missing chord")?
.split('+')
.map(|name| xkb::keysym_from_name(name, xkb::KEYSYM_NO_FLAGS).raw())
.collect(),
.map(named_keysym)
.collect::<Result<Vec<_>, _>>()?,
),
_ => return Err(format!("unknown test input argument {arg}").into()),
}
@@ -191,7 +204,7 @@ fn main() -> Result<(), Box<dyn Error>> {
xkb::KEYMAP_COMPILE_NO_FLAGS,
)
.ok_or("US test keymap missing")?;
let xkb = xkb::State::new(&keymap);
let mut xkb = xkb::State::new(&keymap);
let text = keymap.get_as_string(xkb::KEYMAP_FORMAT_TEXT_V1) + "\0";
let mut file = tempfile::tempfile()?;
file.write_all(text.as_bytes())?;
@@ -211,11 +224,25 @@ fn main() -> Result<(), Box<dyn Error>> {
.collect::<Result<Vec<_>, _>>()?;
for key in &codes {
keyboard.key(started.elapsed().as_millis() as u32, *key, 1);
xkb.update_key(xkb::Keycode::new(*key + 8), xkb::KeyDirection::Down);
keyboard.modifiers(
xkb.serialize_mods(xkb::STATE_MODS_DEPRESSED),
xkb.serialize_mods(xkb::STATE_MODS_LATCHED),
xkb.serialize_mods(xkb::STATE_MODS_LOCKED),
xkb.serialize_layout(xkb::STATE_LAYOUT_EFFECTIVE),
);
queue.roundtrip(&mut state)?;
std::thread::sleep(Duration::from_millis(35));
}
for key in codes.iter().rev() {
keyboard.key(started.elapsed().as_millis() as u32, *key, 0);
xkb.update_key(xkb::Keycode::new(*key + 8), xkb::KeyDirection::Up);
keyboard.modifiers(
xkb.serialize_mods(xkb::STATE_MODS_DEPRESSED),
xkb.serialize_mods(xkb::STATE_MODS_LATCHED),
xkb.serialize_mods(xkb::STATE_MODS_LOCKED),
xkb.serialize_layout(xkb::STATE_LAYOUT_EFFECTIVE),
);
queue.roundtrip(&mut state)?;
std::thread::sleep(Duration::from_millis(35));
}
@@ -302,3 +329,23 @@ fn main() -> Result<(), Box<dyn Error>> {
println!("nested test input complete");
Ok(())
}
#[cfg(test)]
mod tests {
#[test]
fn modifier_aliases_are_valid_and_unknown_key_names_are_rejected() {
for (alias, name) in [
("Ctrl", "Control_L"),
("Shift", "Shift_L"),
("Alt", "Alt_L"),
("Super", "Super_L"),
] {
assert_eq!(
super::named_keysym(alias).unwrap(),
super::named_keysym(name).unwrap()
);
assert_ne!(super::named_keysym(alias).unwrap(), 0);
}
assert!(super::named_keysym("not-a-real-key").is_err());
}
}