feat(settings): add grouped configuration hub, languages and tray controls
This commit is contained in:
1 parent
6f34fd080f
commit
cc3b6f903f
90 files changed
+3625
-408
No files matched your search
@@ -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());
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user