aboutsummaryrefslogtreecommitdiff
path: root/niri-config/src
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2025-09-30 09:01:44 +0300
committerIvan Molodetskikh <yalterz@gmail.com>2025-10-02 09:38:17 +0300
commit2eabc22b3831265bec4e4a0d5ed5e9c0a00f50ab (patch)
treec28ffaa413de153e8b586ad66beb67660edb4ffd /niri-config/src
parent2de34e8798d18321cc36bde97960ef1a9958bca0 (diff)
downloadniri-2eabc22b3831265bec4e4a0d5ed5e9c0a00f50ab.tar.gz
niri-2eabc22b3831265bec4e4a0d5ed5e9c0a00f50ab.tar.bz2
niri-2eabc22b3831265bec4e4a0d5ed5e9c0a00f50ab.zip
config: Add merging for Gestures
Diffstat (limited to 'niri-config/src')
-rw-r--r--niri-config/src/gestures.rs85
-rw-r--r--niri-config/src/lib.rs18
2 files changed, 71 insertions, 32 deletions
diff --git a/niri-config/src/gestures.rs b/niri-config/src/gestures.rs
index 8c4b1363..dcf296ac 100644
--- a/niri-config/src/gestures.rs
+++ b/niri-config/src/gestures.rs
@@ -1,55 +1,102 @@
+use crate::utils::MergeWith;
use crate::FloatOrInt;
-#[derive(knuffel::Decode, Debug, Default, Clone, Copy, PartialEq)]
+#[derive(Debug, Default, Clone, Copy, PartialEq)]
pub struct Gestures {
- #[knuffel(child, default)]
pub dnd_edge_view_scroll: DndEdgeViewScroll,
- #[knuffel(child, default)]
pub dnd_edge_workspace_switch: DndEdgeWorkspaceSwitch,
- #[knuffel(child, default)]
pub hot_corners: HotCorners,
}
-#[derive(knuffel::Decode, Debug, Clone, Copy, PartialEq)]
+#[derive(knuffel::Decode, Debug, Default, Clone, Copy, PartialEq)]
+pub struct GesturesPart {
+ #[knuffel(child)]
+ pub dnd_edge_view_scroll: Option<DndEdgeViewScrollPart>,
+ #[knuffel(child)]
+ pub dnd_edge_workspace_switch: Option<DndEdgeWorkspaceSwitchPart>,
+ #[knuffel(child)]
+ pub hot_corners: Option<HotCorners>,
+}
+
+impl MergeWith<GesturesPart> for Gestures {
+ fn merge_with(&mut self, part: &GesturesPart) {
+ merge!(
+ (self, part),
+ dnd_edge_view_scroll,
+ dnd_edge_workspace_switch,
+ );
+ merge_clone!((self, part), hot_corners);
+ }
+}
+
+#[derive(Debug, Clone, Copy, PartialEq)]
pub struct DndEdgeViewScroll {
- #[knuffel(child, unwrap(argument), default = Self::default().trigger_width)]
- pub trigger_width: FloatOrInt<0, 65535>,
- #[knuffel(child, unwrap(argument), default = Self::default().delay_ms)]
+ pub trigger_width: f64,
pub delay_ms: u16,
- #[knuffel(child, unwrap(argument), default = Self::default().max_speed)]
- pub max_speed: FloatOrInt<0, 1_000_000>,
+ pub max_speed: f64,
}
impl Default for DndEdgeViewScroll {
fn default() -> Self {
Self {
- trigger_width: FloatOrInt(30.), // Taken from GTK 4.
+ trigger_width: 30., // Taken from GTK 4.
delay_ms: 100,
- max_speed: FloatOrInt(1500.),
+ max_speed: 1500.,
}
}
}
#[derive(knuffel::Decode, Debug, Clone, Copy, PartialEq)]
+pub struct DndEdgeViewScrollPart {
+ #[knuffel(child, unwrap(argument))]
+ pub trigger_width: Option<FloatOrInt<0, 65535>>,
+ #[knuffel(child, unwrap(argument))]
+ pub delay_ms: Option<u16>,
+ #[knuffel(child, unwrap(argument))]
+ pub max_speed: Option<FloatOrInt<0, 1_000_000>>,
+}
+
+impl MergeWith<DndEdgeViewScrollPart> for DndEdgeViewScroll {
+ fn merge_with(&mut self, part: &DndEdgeViewScrollPart) {
+ merge!((self, part), trigger_width, max_speed);
+ merge_clone!((self, part), delay_ms);
+ }
+}
+
+#[derive(Debug, Clone, Copy, PartialEq)]
pub struct DndEdgeWorkspaceSwitch {
- #[knuffel(child, unwrap(argument), default = Self::default().trigger_height)]
- pub trigger_height: FloatOrInt<0, 65535>,
- #[knuffel(child, unwrap(argument), default = Self::default().delay_ms)]
+ pub trigger_height: f64,
pub delay_ms: u16,
- #[knuffel(child, unwrap(argument), default = Self::default().max_speed)]
- pub max_speed: FloatOrInt<0, 1_000_000>,
+ pub max_speed: f64,
}
impl Default for DndEdgeWorkspaceSwitch {
fn default() -> Self {
Self {
- trigger_height: FloatOrInt(50.),
+ trigger_height: 50.,
delay_ms: 100,
- max_speed: FloatOrInt(1500.),
+ max_speed: 1500.,
}
}
}
+#[derive(knuffel::Decode, Debug, Clone, Copy, PartialEq)]
+pub struct DndEdgeWorkspaceSwitchPart {
+ #[knuffel(child, unwrap(argument))]
+ pub trigger_height: Option<FloatOrInt<0, 65535>>,
+ #[knuffel(child, unwrap(argument))]
+ pub delay_ms: Option<u16>,
+ #[knuffel(child, unwrap(argument))]
+ pub max_speed: Option<FloatOrInt<0, 1_000_000>>,
+}
+
+impl MergeWith<DndEdgeWorkspaceSwitchPart> for DndEdgeWorkspaceSwitch {
+ fn merge_with(&mut self, part: &DndEdgeWorkspaceSwitchPart) {
+ merge!((self, part), trigger_height, max_speed);
+ merge_clone!((self, part), delay_ms);
+ }
+}
+
#[derive(knuffel::Decode, Debug, Default, Clone, Copy, PartialEq)]
pub struct HotCorners {
#[knuffel(child)]
diff --git a/niri-config/src/lib.rs b/niri-config/src/lib.rs
index 7a07b71b..ab63361d 100644
--- a/niri-config/src/lib.rs
+++ b/niri-config/src/lib.rs
@@ -192,7 +192,7 @@ where
"hotkey-overlay" => m_merge!(hotkey_overlay),
"config-notification" => m_merge!(config_notification),
"animations" => m_replace!(animations),
- "gestures" => m_replace!(gestures),
+ "gestures" => m_merge!(gestures),
"overview" => m_merge!(overview),
"xwayland-satellite" => m_merge!(xwayland_satellite),
"switch-events" => m_merge!(switch_events),
@@ -1433,22 +1433,14 @@ mod tests {
},
gestures: Gestures {
dnd_edge_view_scroll: DndEdgeViewScroll {
- trigger_width: FloatOrInt(
- 10.0,
- ),
+ trigger_width: 10.0,
delay_ms: 100,
- max_speed: FloatOrInt(
- 50.0,
- ),
+ max_speed: 50.0,
},
dnd_edge_workspace_switch: DndEdgeWorkspaceSwitch {
- trigger_height: FloatOrInt(
- 50.0,
- ),
+ trigger_height: 50.0,
delay_ms: 100,
- max_speed: FloatOrInt(
- 1500.0,
- ),
+ max_speed: 1500.0,
},
hot_corners: HotCorners {
off: false,