From a0c8c39b06e672c633e09f3751d46fa8fed4f3a4 Mon Sep 17 00:00:00 2001 From: Ivan Molodetskikh Date: Fri, 22 Mar 2024 10:36:19 +0400 Subject: Make binds accept wheel names --- niri-config/src/lib.rs | 54 ++++++++++++++++++++++++++++++++++++------------ src/input.rs | 16 +++++++------- src/ui/hotkey_overlay.rs | 12 +++++++++-- 3 files changed, 59 insertions(+), 23 deletions(-) diff --git a/niri-config/src/lib.rs b/niri-config/src/lib.rs index 937df0ad..1bf0ac2d 100644 --- a/niri-config/src/lib.rs +++ b/niri-config/src/lib.rs @@ -724,10 +724,19 @@ pub struct Bind { #[derive(Debug, PartialEq, Eq, Clone, Copy, Hash)] pub struct Key { - pub keysym: Keysym, + pub trigger: Trigger, pub modifiers: Modifiers, } +#[derive(Debug, PartialEq, Eq, Clone, Copy, Hash)] +pub enum Trigger { + Keysym(Keysym), + WheelDown, + WheelUp, + WheelLeft, + WheelRight, +} + bitflags! { #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub struct Modifiers : u8 { @@ -1499,12 +1508,23 @@ impl FromStr for Key { } } - let keysym = keysym_from_name(key, KEYSYM_CASE_INSENSITIVE); - if keysym.raw() == KEY_NoSymbol { - return Err(miette!("invalid key: {key}")); - } + let trigger = if key.eq_ignore_ascii_case("WheelDown") { + Trigger::WheelDown + } else if key.eq_ignore_ascii_case("WheelUp") { + Trigger::WheelUp + } else if key.eq_ignore_ascii_case("WheelLeft") { + Trigger::WheelLeft + } else if key.eq_ignore_ascii_case("WheelRight") { + Trigger::WheelRight + } else { + let keysym = keysym_from_name(key, KEYSYM_CASE_INSENSITIVE); + if keysym.raw() == KEY_NoSymbol { + return Err(miette!("invalid key: {key}")); + } + Trigger::Keysym(keysym) + }; - Ok(Key { keysym, modifiers }) + Ok(Key { trigger, modifiers }) } } @@ -1712,6 +1732,7 @@ mod tests { Mod+Comma { consume-window-into-column; } Mod+1 { focus-workspace 1; } Mod+Shift+E { quit skip-confirmation=true; } + Mod+WheelDown { focus-workspace-down; } } debug { @@ -1895,53 +1916,60 @@ mod tests { binds: Binds(vec![ Bind { key: Key { - keysym: Keysym::t, + trigger: Trigger::Keysym(Keysym::t), modifiers: Modifiers::COMPOSITOR, }, action: Action::Spawn(vec!["alacritty".to_owned()]), }, Bind { key: Key { - keysym: Keysym::q, + trigger: Trigger::Keysym(Keysym::q), modifiers: Modifiers::COMPOSITOR, }, action: Action::CloseWindow, }, Bind { key: Key { - keysym: Keysym::h, + trigger: Trigger::Keysym(Keysym::h), modifiers: Modifiers::COMPOSITOR | Modifiers::SHIFT, }, action: Action::FocusMonitorLeft, }, Bind { key: Key { - keysym: Keysym::l, + trigger: Trigger::Keysym(Keysym::l), modifiers: Modifiers::COMPOSITOR | Modifiers::SHIFT | Modifiers::CTRL, }, action: Action::MoveWindowToMonitorRight, }, Bind { key: Key { - keysym: Keysym::comma, + trigger: Trigger::Keysym(Keysym::comma), modifiers: Modifiers::COMPOSITOR, }, action: Action::ConsumeWindowIntoColumn, }, Bind { key: Key { - keysym: Keysym::_1, + trigger: Trigger::Keysym(Keysym::_1), modifiers: Modifiers::COMPOSITOR, }, action: Action::FocusWorkspace(1), }, Bind { key: Key { - keysym: Keysym::e, + trigger: Trigger::Keysym(Keysym::e), modifiers: Modifiers::COMPOSITOR | Modifiers::SHIFT, }, action: Action::Quit(true), }, + Bind { + key: Key { + trigger: Trigger::WheelDown, + modifiers: Modifiers::COMPOSITOR, + }, + action: Action::FocusWorkspaceDown, + }, ]), debug: DebugConfig { render_drm_device: Some(PathBuf::from("/dev/dri/renderD129")), diff --git a/src/input.rs b/src/input.rs index 80000efe..e6598719 100644 --- a/src/input.rs +++ b/src/input.rs @@ -3,7 +3,7 @@ use std::collections::HashSet; use std::time::Duration; use input::event::gesture::GestureEventCoordinates as _; -use niri_config::{Action, Binds, Modifiers}; +use niri_config::{Action, Binds, Modifiers, Trigger}; use niri_ipc::LayoutSwitchTarget; use smithay::backend::input::{ AbsolutePositionEvent, Axis, AxisSource, ButtonState, Device, DeviceCapability, Event, @@ -1731,7 +1731,7 @@ fn bound_action( let raw = raw?; for bind in &bindings.0 { - if bind.key.keysym != raw { + if bind.key.trigger != Trigger::Keysym(raw) { continue; } @@ -1911,7 +1911,7 @@ mod tests { let close_keysym = Keysym::q; let bindings = Binds(vec![Bind { key: Key { - keysym: close_keysym, + trigger: Trigger::Keysym(close_keysym), modifiers: Modifiers::COMPOSITOR | Modifiers::CTRL, }, action: Action::CloseWindow, @@ -2033,35 +2033,35 @@ mod tests { let bindings = Binds(vec![ Bind { key: Key { - keysym: Keysym::q, + trigger: Trigger::Keysym(Keysym::q), modifiers: Modifiers::COMPOSITOR, }, action: Action::CloseWindow, }, Bind { key: Key { - keysym: Keysym::h, + trigger: Trigger::Keysym(Keysym::h), modifiers: Modifiers::SUPER, }, action: Action::FocusColumnLeft, }, Bind { key: Key { - keysym: Keysym::j, + trigger: Trigger::Keysym(Keysym::j), modifiers: Modifiers::empty(), }, action: Action::FocusWindowDown, }, Bind { key: Key { - keysym: Keysym::k, + trigger: Trigger::Keysym(Keysym::k), modifiers: Modifiers::COMPOSITOR | Modifiers::SUPER, }, action: Action::FocusWindowUp, }, Bind { key: Key { - keysym: Keysym::l, + trigger: Trigger::Keysym(Keysym::l), modifiers: Modifiers::SUPER | Modifiers::ALT, }, action: Action::FocusColumnRight, diff --git a/src/ui/hotkey_overlay.rs b/src/ui/hotkey_overlay.rs index 5fc3cedb..f054b3cf 100644 --- a/src/ui/hotkey_overlay.rs +++ b/src/ui/hotkey_overlay.rs @@ -4,7 +4,7 @@ use std::collections::HashMap; use std::iter::zip; use std::rc::Rc; -use niri_config::{Action, Config, Key, Modifiers}; +use niri_config::{Action, Config, Key, Modifiers, Trigger}; use pangocairo::cairo::{self, ImageSurface}; use pangocairo::pango::{AttrColor, AttrInt, AttrList, AttrString, FontDescription, Weight}; use smithay::backend::renderer::element::memory::{ @@ -414,7 +414,15 @@ fn key_name(comp_mod: CompositorMod, key: &Key) -> String { if key.modifiers.contains(Modifiers::CTRL) { name.push_str("Ctrl + "); } - name.push_str(&prettify_keysym_name(&keysym_get_name(key.keysym))); + + let pretty = match key.trigger { + Trigger::Keysym(keysym) => prettify_keysym_name(&keysym_get_name(keysym)), + Trigger::WheelDown => String::from("Wheel Down"), + Trigger::WheelUp => String::from("Wheel Up"), + Trigger::WheelLeft => String::from("Wheel Left"), + Trigger::WheelRight => String::from("Wheel Right"), + }; + name.push_str(&pretty); name } -- cgit