aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--niri-config/src/lib.rs23
-rw-r--r--resources/default-config.kdl6
-rw-r--r--src/input.rs29
3 files changed, 58 insertions, 0 deletions
diff --git a/niri-config/src/lib.rs b/niri-config/src/lib.rs
index 2fe2b56d..35bda95e 100644
--- a/niri-config/src/lib.rs
+++ b/niri-config/src/lib.rs
@@ -48,6 +48,8 @@ pub struct Input {
#[knuffel(child, default)]
pub touchpad: Touchpad,
#[knuffel(child, default)]
+ pub mouse: Mouse,
+ #[knuffel(child, default)]
pub tablet: Tablet,
#[knuffel(child)]
pub disable_power_key_handling: bool,
@@ -118,6 +120,16 @@ pub struct Touchpad {
pub tap_button_map: Option<TapButtonMap>,
}
+#[derive(knuffel::Decode, Debug, Default, PartialEq)]
+pub struct Mouse {
+ #[knuffel(child)]
+ pub natural_scroll: bool,
+ #[knuffel(child, unwrap(argument), default)]
+ pub accel_speed: f64,
+ #[knuffel(child, unwrap(argument, str))]
+ pub accel_profile: Option<AccelProfile>,
+}
+
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum AccelProfile {
Adaptive,
@@ -679,6 +691,12 @@ mod tests {
tap-button-map "left-middle-right"
}
+ mouse {
+ natural-scroll
+ accel-speed 0.4
+ accel-profile "flat"
+ }
+
tablet {
map-to-output "eDP-1"
}
@@ -768,6 +786,11 @@ mod tests {
accel_profile: Some(AccelProfile::Flat),
tap_button_map: Some(TapButtonMap::LeftMiddleRight),
},
+ mouse: Mouse {
+ natural_scroll: true,
+ accel_speed: 0.4,
+ accel_profile: Some(AccelProfile::Flat),
+ },
tablet: Tablet {
map_to_output: Some("eDP-1".to_owned()),
},
diff --git a/resources/default-config.kdl b/resources/default-config.kdl
index c97229bc..87b026c5 100644
--- a/resources/default-config.kdl
+++ b/resources/default-config.kdl
@@ -34,6 +34,12 @@ input {
// tap-button-map "left-middle-right"
}
+ mouse {
+ // natural-scroll
+ // accel-speed 0.2
+ // accel-profile "flat"
+ }
+
tablet {
// Set the name of the output (see below) which the tablet will map to.
// If this is unset or the output doesn't exist, the tablet maps to one of the
diff --git a/src/input.rs b/src/input.rs
index 2692726f..b4211a82 100644
--- a/src/input.rs
+++ b/src/input.rs
@@ -119,6 +119,35 @@ impl State {
}
}
}
+
+ // This is how Mutter tells apart mice.
+ let mut is_trackball = false;
+ let mut is_trackpoint = false;
+ if let Some(udev_device) = unsafe { device.udev_device() } {
+ if udev_device.property_value("ID_INPUT_TRACKBALL").is_some() {
+ is_trackball = true;
+ }
+ if udev_device
+ .property_value("ID_INPUT_POINTINGSTICK")
+ .is_some()
+ {
+ is_trackpoint = true;
+ }
+ }
+
+ let is_mouse = device.has_capability(input::DeviceCapability::Pointer)
+ && !is_touchpad
+ && !is_trackball
+ && !is_trackpoint;
+ if is_mouse {
+ let c = &self.niri.config.borrow().input.mouse;
+ let _ = device.config_scroll_set_natural_scroll_enabled(c.natural_scroll);
+ let _ = device.config_accel_set_speed(c.accel_speed);
+
+ if let Some(accel_profile) = c.accel_profile {
+ let _ = device.config_accel_set_profile(accel_profile.into());
+ }
+ }
}
InputEvent::DeviceRemoved { device } => {
self.niri.tablets.remove(device);