halley_config/layout/
guards.rs1use super::{CursorConfig, FontConfig, RuntimeTuning};
2
3impl RuntimeTuning {
4 pub fn enforce_guards(&mut self) {
5 self.clamp_values();
6 }
7
8 pub(crate) fn clamp_values(&mut self) {
9 self.viewport_center.x = self.viewport_center.x.clamp(-100_000.0, 100_000.0);
10 self.viewport_center.y = self.viewport_center.y.clamp(-100_000.0, 100_000.0);
11 self.viewport_size.x = self.viewport_size.x.clamp(320.0, 16_000.0);
12 self.viewport_size.y = self.viewport_size.y.clamp(240.0, 16_000.0);
13
14 self.focus_ring_rx = self.focus_ring_rx.clamp(8.0, 16_000.0);
15 self.focus_ring_ry = self.focus_ring_ry.clamp(8.0, 16_000.0);
16 self.focus_ring_offset_x = self.focus_ring_offset_x.clamp(-16_000.0, 16_000.0);
17 self.focus_ring_offset_y = self.focus_ring_offset_y.clamp(-16_000.0, 16_000.0);
18
19 self.primary_hot_inner_frac = self.primary_hot_inner_frac.clamp(0.1, 1.0);
20 self.primary_to_node_ms = self.primary_to_node_ms.clamp(250, 7_200_000);
21 self.node_icon_size = self.node_icon_size.clamp(0.35, 0.95);
22 self.decorations.border.size_px = self.decorations.border.size_px.clamp(0, 64);
23 self.decorations.border.radius_px = self.decorations.border.radius_px.clamp(0, 256);
24 self.decorations.secondary_border.size_px =
25 self.decorations.secondary_border.size_px.clamp(0, 64);
26 self.decorations.secondary_border.gap_px =
27 self.decorations.secondary_border.gap_px.clamp(0, 8);
28 self.bearings.fade_distance = self.bearings.fade_distance.clamp(120.0, 100_000.0);
29
30 self.cluster_distance_px = self.cluster_distance_px.clamp(24.0, 4_000.0);
31 self.cluster_dwell_ms = self.cluster_dwell_ms.clamp(0, 30_000);
32 self.tile_gaps_inner_px = self.tile_gaps_inner_px.clamp(0.0, 256.0);
33 self.tile_gaps_outer_px = self.tile_gaps_outer_px.clamp(0.0, 512.0);
34 self.tile_max_stack = self.tile_max_stack.clamp(0, 64);
35 self.stacking_max_visible = self.stacking_max_visible.clamp(0, 64);
36 self.trail_history_length = self.trail_history_length.clamp(1, 512);
37 self.input.repeat_rate = self.input.repeat_rate.clamp(0, 1000);
38 self.input.repeat_delay = self.input.repeat_delay.clamp(0, 10_000);
39 self.cursor.size = self.cursor.size.clamp(8, 128);
40 if self.cursor.theme.trim().is_empty() {
41 self.cursor.theme = CursorConfig::default().theme;
42 }
43 self.font.size = self.font.size.clamp(8, 32);
44 if self.font.family.trim().is_empty() {
45 self.font.family = FontConfig::default().family;
46 }
47
48 self.active_outside_ring_delay_ms = self.active_outside_ring_delay_ms.clamp(0, 7_200_000);
49 self.inactive_outside_ring_delay_ms =
50 self.inactive_outside_ring_delay_ms.clamp(0, 7_200_000);
51 self.docked_offscreen_delay_ms = self.docked_offscreen_delay_ms.clamp(0, 7_200_000);
52
53 self.non_overlap_gap_px = self.non_overlap_gap_px.clamp(0.0, 256.0);
54 self.field_active_windows_allowed = self.field_active_windows_allowed.clamp(0, 64);
55 self.zoom_step = self.zoom_step.clamp(1.001, 4.0);
56 self.zoom_min = self.zoom_min.clamp(0.05, 1.0);
57 self.zoom_max = self.zoom_max.clamp(1.0, 16.0);
58 if self.zoom_max < self.zoom_min {
59 self.zoom_max = self.zoom_min;
60 }
61 self.zoom_smooth_rate = self.zoom_smooth_rate.clamp(0.1, 120.0);
62 self.non_overlap_active_gap_scale = self.non_overlap_active_gap_scale.clamp(0.0, 1.2);
63 self.non_overlap_bump_damping = self.non_overlap_bump_damping.clamp(0.05, 1.0);
64 self.drag_smoothing_boost = self.drag_smoothing_boost.clamp(0.1, 20.0);
65 self.animations.smooth_resize.duration_ms =
66 self.animations.smooth_resize.duration_ms.clamp(1, 10_000);
67 self.animations.window_close.duration_ms =
68 self.animations.window_close.duration_ms.clamp(1, 10_000);
69 self.animations.window_open.duration_ms =
70 self.animations.window_open.duration_ms.clamp(1, 10_000);
71 self.animations.tile.duration_ms = self.animations.tile.duration_ms.clamp(1, 10_000);
72 self.animations.stack.duration_ms = self.animations.stack.duration_ms.clamp(1, 10_000);
73 }
74}
75
76#[cfg(test)]
77mod tests {
78 use super::*;
79
80 #[test]
81 fn secondary_border_gap_is_clamped_to_small_range() {
82 let mut tuning = RuntimeTuning::default();
83 tuning.decorations.secondary_border.gap_px = 99;
84
85 tuning.enforce_guards();
86
87 assert_eq!(tuning.decorations.secondary_border.gap_px, 8);
88 }
89}