aboutsummaryrefslogtreecommitdiff
path: root/niri-config/src
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2025-09-30 09:10:34 +0300
committerIvan Molodetskikh <yalterz@gmail.com>2025-10-02 09:38:17 +0300
commit31f9577df92d79ded3e60cea54cd56f61a9bd470 (patch)
tree9a752cfbdda2c99729b19fb85d139e0c3033cab9 /niri-config/src
parent2eabc22b3831265bec4e4a0d5ed5e9c0a00f50ab (diff)
downloadniri-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.rs77
-rw-r--r--niri-config/src/lib.rs6
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,