From 31f9577df92d79ded3e60cea54cd56f61a9bd470 Mon Sep 17 00:00:00 2001 From: Ivan Molodetskikh Date: Tue, 30 Sep 2025 09:10:34 +0300 Subject: config: Add merging for Animations --- niri-config/src/animations.rs | 77 ++++++++++++++++++++++++++++++++++--------- niri-config/src/lib.rs | 6 ++-- src/niri.rs | 4 +-- 3 files changed, 65 insertions(+), 22 deletions(-) diff --git a/niri-config/src/animations.rs b/niri-config/src/animations.rs index d265026e..a3be59c9 100644 --- a/niri-config/src/animations.rs +++ b/niri-config/src/animations.rs @@ -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>, + #[knuffel(child)] + pub workspace_switch: Option, + #[knuffel(child)] + pub window_open: Option, + #[knuffel(child)] + pub window_close: Option, + #[knuffel(child)] + pub horizontal_view_movement: Option, + #[knuffel(child)] + pub window_movement: Option, + #[knuffel(child)] + pub window_resize: Option, + #[knuffel(child)] + pub config_notification_open_close: Option, + #[knuffel(child)] + pub exit_confirmation_open_close: Option, + #[knuffel(child)] + pub screenshot_ui_open: Option, + #[knuffel(child)] + pub overview_open_close: Option, +} + +impl MergeWith 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, diff --git a/niri-config/src/lib.rs b/niri-config/src/lib.rs index ab63361d..18f52a95 100644 --- a/niri-config/src/lib.rs +++ b/niri-config/src/lib.rs @@ -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, diff --git a/src/niri.rs b/src/niri.rs index 939316f6..3702c69d 100644 --- a/src/niri.rs +++ b/src/niri.rs @@ -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); -- cgit