aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2024-03-22 10:36:19 +0400
committerIvan Molodetskikh <yalterz@gmail.com>2024-03-22 10:36:19 +0400
commita0c8c39b06e672c633e09f3751d46fa8fed4f3a4 (patch)
tree3aab3194216623e64dd0feac99f967aecd6723da
parent977f1487c22b5d30051939b9572b99a31a9775ff (diff)
downloadniri-a0c8c39b06e672c633e09f3751d46fa8fed4f3a4.tar.gz
niri-a0c8c39b06e672c633e09f3751d46fa8fed4f3a4.tar.bz2
niri-a0c8c39b06e672c633e09f3751d46fa8fed4f3a4.zip
Make binds accept wheel names
-rw-r--r--niri-config/src/lib.rs54
-rw-r--r--src/input.rs16
-rw-r--r--src/ui/hotkey_overlay.rs12
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
}