diff options
| author | Ivan Molodetskikh <yalterz@gmail.com> | 2025-09-30 09:10:34 +0300 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2025-10-02 09:38:17 +0300 |
| commit | 31f9577df92d79ded3e60cea54cd56f61a9bd470 (patch) | |
| tree | 9a752cfbdda2c99729b19fb85d139e0c3033cab9 /niri-config/src | |
| parent | 2eabc22b3831265bec4e4a0d5ed5e9c0a00f50ab (diff) | |
| download | niri-31f9577df92d79ded3e60cea54cd56f61a9bd470.tar.gz niri-31f9577df92d79ded3e60cea54cd56f61a9bd470.tar.bz2 niri-31f9577df92d79ded3e60cea54cd56f61a9bd470.zip | |
config: Add merging for Animations
Diffstat (limited to 'niri-config/src')
| -rw-r--r-- | niri-config/src/animations.rs | 77 | ||||
| -rw-r--r-- | niri-config/src/lib.rs | 6 |
2 files changed, 63 insertions, 20 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<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, 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, |
