config: Add merging for Animations

This commit is contained in:
Ivan Molodetskikh
2025-09-30 09:10:34 +03:00
parent 2eabc22b38
commit 31f9577df9
3 changed files with 65 additions and 22 deletions
+61 -16
View File
@@ -1,34 +1,22 @@
use knuffel::errors::DecodeError;
use knuffel::Decode as _;
use crate::utils::{expect_only_children, parse_arg_node};
use crate::utils::{expect_only_children, parse_arg_node, MergeWith};
use crate::FloatOrInt;
#[derive(knuffel::Decode, Debug, Clone, PartialEq)]
#[derive(Debug, Clone, PartialEq)]
pub struct Animations {
#[knuffel(child)]
pub off: bool,
#[knuffel(child, unwrap(argument), default = FloatOrInt(1.))]
pub slowdown: FloatOrInt<0, { i32::MAX }>,
#[knuffel(child, default)]
pub slowdown: f64,
pub workspace_switch: WorkspaceSwitchAnim,
#[knuffel(child, default)]
pub window_open: WindowOpenAnim,
#[knuffel(child, default)]
pub window_close: WindowCloseAnim,
#[knuffel(child, default)]
pub horizontal_view_movement: HorizontalViewMovementAnim,
#[knuffel(child, default)]
pub window_movement: WindowMovementAnim,
#[knuffel(child, default)]
pub window_resize: WindowResizeAnim,
#[knuffel(child, default)]
pub config_notification_open_close: ConfigNotificationOpenCloseAnim,
#[knuffel(child, default)]
pub exit_confirmation_open_close: ExitConfirmationOpenCloseAnim,
#[knuffel(child, default)]
pub screenshot_ui_open: ScreenshotUiOpenAnim,
#[knuffel(child, default)]
pub overview_open_close: OverviewOpenCloseAnim,
}
@@ -36,7 +24,7 @@ impl Default for Animations {
fn default() -> Self {
Self {
off: false,
slowdown: FloatOrInt(1.),
slowdown: 1.,
workspace_switch: Default::default(),
horizontal_view_movement: Default::default(),
window_movement: Default::default(),
@@ -51,6 +39,63 @@ impl Default for Animations {
}
}
#[derive(knuffel::Decode, Debug, Clone, PartialEq)]
pub struct AnimationsPart {
#[knuffel(child)]
pub off: bool,
#[knuffel(child)]
pub on: bool,
#[knuffel(child, unwrap(argument))]
pub slowdown: Option<FloatOrInt<0, { i32::MAX }>>,
#[knuffel(child)]
pub workspace_switch: Option<WorkspaceSwitchAnim>,
#[knuffel(child)]
pub window_open: Option<WindowOpenAnim>,
#[knuffel(child)]
pub window_close: Option<WindowCloseAnim>,
#[knuffel(child)]
pub horizontal_view_movement: Option<HorizontalViewMovementAnim>,
#[knuffel(child)]
pub window_movement: Option<WindowMovementAnim>,
#[knuffel(child)]
pub window_resize: Option<WindowResizeAnim>,
#[knuffel(child)]
pub config_notification_open_close: Option<ConfigNotificationOpenCloseAnim>,
#[knuffel(child)]
pub exit_confirmation_open_close: Option<ExitConfirmationOpenCloseAnim>,
#[knuffel(child)]
pub screenshot_ui_open: Option<ScreenshotUiOpenAnim>,
#[knuffel(child)]
pub overview_open_close: Option<OverviewOpenCloseAnim>,
}
impl MergeWith<AnimationsPart> for Animations {
fn merge_with(&mut self, part: &AnimationsPart) {
self.off |= part.off;
if part.on {
self.off = false;
}
merge!((self, part), slowdown);
// Animation properties are fairly tied together, except maybe `off`. So let's just save
// ourselves the work and not merge within individual animations.
merge_clone!(
(self, part),
workspace_switch,
window_open,
window_close,
horizontal_view_movement,
window_movement,
window_resize,
config_notification_open_close,
exit_confirmation_open_close,
screenshot_ui_open,
overview_open_close,
);
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct Animation {
pub off: bool,
+2 -4
View File
@@ -191,7 +191,7 @@ where
"clipboard" => m_merge!(clipboard),
"hotkey-overlay" => m_merge!(hotkey_overlay),
"config-notification" => m_merge!(config_notification),
"animations" => m_replace!(animations),
"animations" => m_merge!(animations),
"gestures" => m_merge!(gestures),
"overview" => m_merge!(overview),
"xwayland-satellite" => m_merge!(xwayland_satellite),
@@ -1303,9 +1303,7 @@ mod tests {
},
animations: Animations {
off: false,
slowdown: FloatOrInt(
2.0,
),
slowdown: 2.0,
workspace_switch: WorkspaceSwitchAnim(
Animation {
off: false,
+2 -2
View File
@@ -1381,7 +1381,7 @@ impl State {
self.niri.layout.ensure_named_workspace(ws_config);
}
let rate = 1.0 / config.animations.slowdown.0.max(0.001);
let rate = 1.0 / config.animations.slowdown.max(0.001);
self.niri.clock.set_rate(rate);
self.niri
.clock
@@ -2320,7 +2320,7 @@ impl Niri {
let mut animation_clock = Clock::default();
let rate = 1.0 / config_.animations.slowdown.0.max(0.001);
let rate = 1.0 / config_.animations.slowdown.max(0.001);
animation_clock.set_rate(rate);
animation_clock.set_complete_instantly(config_.animations.off);