mirror of
https://github.com/niri-wm/niri.git
synced 2026-06-23 02:05:33 +07:00
Add scroll-factor window rule
This commit is contained in:
committed by
Ivan Molodetskikh
parent
788c9c6c54
commit
128b01e049
@@ -1079,6 +1079,8 @@ pub struct WindowRule {
|
|||||||
pub variable_refresh_rate: Option<bool>,
|
pub variable_refresh_rate: Option<bool>,
|
||||||
#[knuffel(child)]
|
#[knuffel(child)]
|
||||||
pub default_floating_position: Option<FloatingPosition>,
|
pub default_floating_position: Option<FloatingPosition>,
|
||||||
|
#[knuffel(child, unwrap(argument))]
|
||||||
|
pub scroll_factor: Option<FloatOrInt<0, 100>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(knuffel::Decode, Debug, Default, Clone, PartialEq)]
|
#[derive(knuffel::Decode, Debug, Default, Clone, PartialEq)]
|
||||||
|
|||||||
+11
-4
@@ -2086,6 +2086,8 @@ impl State {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn on_pointer_axis<I: InputBackend>(&mut self, event: I::PointerAxisEvent) {
|
fn on_pointer_axis<I: InputBackend>(&mut self, event: I::PointerAxisEvent) {
|
||||||
|
let pointer = &self.niri.seat.get_pointer().unwrap();
|
||||||
|
|
||||||
let source = event.source();
|
let source = event.source();
|
||||||
|
|
||||||
// We received an event for the regular pointer, so show it now. This is also needed for
|
// We received an event for the regular pointer, so show it now. This is also needed for
|
||||||
@@ -2232,12 +2234,20 @@ impl State {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
self.update_pointer_contents();
|
||||||
|
|
||||||
let scroll_factor = match source {
|
let scroll_factor = match source {
|
||||||
AxisSource::Wheel => self.niri.config.borrow().input.mouse.scroll_factor,
|
AxisSource::Wheel => self.niri.config.borrow().input.mouse.scroll_factor,
|
||||||
AxisSource::Finger => self.niri.config.borrow().input.touchpad.scroll_factor,
|
AxisSource::Finger => self.niri.config.borrow().input.touchpad.scroll_factor,
|
||||||
_ => None,
|
_ => None,
|
||||||
};
|
};
|
||||||
let scroll_factor = scroll_factor.map(|x| x.0).unwrap_or(1.);
|
let window_scroll_factor = pointer
|
||||||
|
.current_focus()
|
||||||
|
.map(|focused| self.niri.find_root_shell_surface(&focused))
|
||||||
|
.and_then(|root| self.niri.layout.find_window_and_output(&root).unzip().0)
|
||||||
|
.and_then(|window| window.rules().scroll_factor);
|
||||||
|
let scroll_factor =
|
||||||
|
scroll_factor.map(|x| x.0).unwrap_or(1.) * window_scroll_factor.unwrap_or(1.);
|
||||||
|
|
||||||
let horizontal_amount = horizontal_amount.unwrap_or_else(|| {
|
let horizontal_amount = horizontal_amount.unwrap_or_else(|| {
|
||||||
// Winit backend, discrete scrolling.
|
// Winit backend, discrete scrolling.
|
||||||
@@ -2278,9 +2288,6 @@ impl State {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
self.update_pointer_contents();
|
|
||||||
|
|
||||||
let pointer = &self.niri.seat.get_pointer().unwrap();
|
|
||||||
pointer.axis(self, frame);
|
pointer.axis(self, frame);
|
||||||
pointer.frame(self);
|
pointer.frame(self);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -100,6 +100,9 @@ pub struct ResolvedWindowRules {
|
|||||||
|
|
||||||
/// Whether to enable VRR on this window's primary output if it is on-demand.
|
/// Whether to enable VRR on this window's primary output if it is on-demand.
|
||||||
pub variable_refresh_rate: Option<bool>,
|
pub variable_refresh_rate: Option<bool>,
|
||||||
|
|
||||||
|
/// Multiplier for all scroll events sent to this window.
|
||||||
|
pub scroll_factor: Option<f64>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> WindowRef<'a> {
|
impl<'a> WindowRef<'a> {
|
||||||
@@ -190,6 +193,7 @@ impl ResolvedWindowRules {
|
|||||||
clip_to_geometry: None,
|
clip_to_geometry: None,
|
||||||
block_out_from: None,
|
block_out_from: None,
|
||||||
variable_refresh_rate: None,
|
variable_refresh_rate: None,
|
||||||
|
scroll_factor: None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -301,6 +305,9 @@ impl ResolvedWindowRules {
|
|||||||
if let Some(x) = rule.variable_refresh_rate {
|
if let Some(x) = rule.variable_refresh_rate {
|
||||||
resolved.variable_refresh_rate = Some(x);
|
resolved.variable_refresh_rate = Some(x);
|
||||||
}
|
}
|
||||||
|
if let Some(x) = rule.scroll_factor {
|
||||||
|
resolved.scroll_factor = Some(x.0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
resolved.open_on_output = open_on_output.map(|x| x.to_owned());
|
resolved.open_on_output = open_on_output.map(|x| x.to_owned());
|
||||||
|
|||||||
@@ -53,6 +53,7 @@ window-rule {
|
|||||||
// block-out-from "screen-capture"
|
// block-out-from "screen-capture"
|
||||||
variable-refresh-rate true
|
variable-refresh-rate true
|
||||||
default-floating-position x=100 y=200 relative-to="bottom-left"
|
default-floating-position x=100 y=200 relative-to="bottom-left"
|
||||||
|
scroll-factor 0.75
|
||||||
|
|
||||||
focus-ring {
|
focus-ring {
|
||||||
// off
|
// off
|
||||||
@@ -557,6 +558,23 @@ window-rule {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
#### `scroll-factor`
|
||||||
|
|
||||||
|
<sup>Since: next release</sup>
|
||||||
|
|
||||||
|
Set a scroll factor for all scroll events sent to a window.
|
||||||
|
|
||||||
|
This will be multiplied with the scroll factor set for your input device in the [input](/wiki/Configuration:-Input.md) section.
|
||||||
|
|
||||||
|
```kdl
|
||||||
|
// Make scrolling in Firefox a bit slower.
|
||||||
|
window-rule {
|
||||||
|
match app-id="firefox$"
|
||||||
|
|
||||||
|
scroll-factor 0.75
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
#### `draw-border-with-background`
|
#### `draw-border-with-background`
|
||||||
|
|
||||||
Override whether the border and the focus ring draw with a background.
|
Override whether the border and the focus ring draw with a background.
|
||||||
|
|||||||
Reference in New Issue
Block a user