1use std::collections::HashMap;
2
3use halley_core::field::Vec2;
4
5use crate::keybinds::{
6 BearingsBindingAction, ClusterBindingAction, CompositorBinding, CompositorBindingAction,
7 CompositorBindingScope, DirectionalAction, FocusCycleBindingAction, KeyModifiers, Keybinds,
8 NodeBindingAction, PointerBinding, PointerBindingAction, TileBindingAction, TrailBindingAction,
9 WHEEL_DOWN_CODE, WHEEL_UP_CODE, key_name_to_evdev,
10};
11
12use super::{
13 AnimationsConfig, BearingsConfig, ClickCollapsedOutsideFocusMode, ClickCollapsedPanMode,
14 CloseRestorePanMode, ClusterBloomDirection, ClusterDefaultLayout, CursorConfig,
15 DecorationsConfig, FontConfig, InputConfig, NodeBackgroundColorMode, NodeBorderColorMode,
16 NodeDisplayPolicy, OverlayStyleConfig, PanToNewMode, RuntimeTuning, ScreenshotConfig,
17 ShapeStyle,
18};
19
20impl Default for RuntimeTuning {
21 fn default() -> Self {
22 Self {
23 viewport_center: Vec2 { x: 0.0, y: 0.0 },
24 viewport_size: Vec2 {
25 x: 1920.0,
26 y: 1080.0,
27 },
28
29 focus_ring_rx: 820.0,
30 focus_ring_ry: 420.0,
31 focus_ring_offset_x: 0.0,
32 focus_ring_offset_y: 0.0,
33
34 primary_hot_inner_frac: 0.88,
35 primary_to_node_ms: 1_260_000,
36 node_show_labels: NodeDisplayPolicy::Hover,
37 node_show_app_icons: NodeDisplayPolicy::Always,
38 node_shape: ShapeStyle::Squircle,
39 node_label_shape: ShapeStyle::Squircle,
40 node_icon_size: 0.72,
41 node_background_color: NodeBackgroundColorMode::Auto,
42 node_border_color_hover: NodeBorderColorMode::UseWindowActive,
43 node_border_color_inactive: NodeBorderColorMode::UseWindowInactive,
44 decorations: DecorationsConfig::default(),
45 click_collapsed_outside_focus: ClickCollapsedOutsideFocusMode::Activate,
46 click_collapsed_pan: ClickCollapsedPanMode::IfOffscreen,
47 bearings: BearingsConfig {
48 show_distance: true,
49 show_icons: true,
50 fade_distance: 1200.0,
51 },
52
53 cluster_distance_px: 280.0,
54 cluster_dwell_ms: 900,
55 cluster_show_icons: true,
56 cluster_bloom_direction: ClusterBloomDirection::Clockwise,
57 cluster_default_layout: ClusterDefaultLayout::Stacking,
58 tile_gaps_inner_px: 20.0,
59 tile_gaps_outer_px: 20.0,
60 tile_new_on_top: false,
61 tile_queue_show_icons: true,
62 tile_max_stack: 3,
63 stacking_max_visible: 5,
64 trail_history_length: 32,
65 trail_wrap: true,
66
67 active_outside_ring_delay_ms: 120_000,
68 inactive_outside_ring_delay_ms: 30_000,
69 docked_offscreen_delay_ms: 300_000,
70
71 non_overlap_gap_px: 20.0,
72 field_active_windows_allowed: 5,
73 pan_to_new: PanToNewMode::IfNeeded,
74 close_restore_focus: true,
75 close_restore_pan: CloseRestorePanMode::IfOffscreen,
76 zoom_enabled: true,
77 zoom_step: 1.10,
78 zoom_min: 0.25,
79 zoom_max: 1.35,
80 zoom_smooth: true,
81 zoom_smooth_rate: 12.5,
82 non_overlap_active_gap_scale: 0.22,
83 non_overlap_bump_newer: false,
84 non_overlap_bump_damping: 0.65,
85 drag_smoothing_boost: 6.0,
86 center_window_to_mouse: false,
87 restore_last_active_on_pan_return: true,
88 physics_enabled: true,
89 window_rules: Vec::new(),
90
91 keybinds: Keybinds::default(),
92 compositor_bindings: default_compositor_bindings(Keybinds::default().modifier),
93 launch_bindings: Vec::new(),
94 pointer_bindings: default_pointer_bindings(Keybinds::default().modifier),
95
96 tty_viewports: Vec::new(),
97 autostart_once: Vec::new(),
98 autostart_on_reload: Vec::new(),
99 input: InputConfig::default(),
100 cursor: CursorConfig::default(),
101 font: FontConfig::default(),
102 animations: AnimationsConfig::default(),
103 overlay_style: OverlayStyleConfig::default(),
104 screenshot: ScreenshotConfig::default(),
105 env: HashMap::new(),
106 }
107 }
108}
109
110pub fn default_pointer_bindings(modifier: KeyModifiers) -> Vec<PointerBinding> {
111 let mut transfer_modifier = modifier;
112 transfer_modifier.shift = true;
113 vec![
114 PointerBinding {
115 modifiers: modifier,
116 button: 272,
117 action: PointerBindingAction::MoveWindow,
118 },
119 PointerBinding {
120 modifiers: transfer_modifier,
121 button: 272,
122 action: PointerBindingAction::FieldJump,
123 },
124 PointerBinding {
125 modifiers: modifier,
126 button: 273,
127 action: PointerBindingAction::ResizeWindow,
128 },
129 ]
130}
131
132pub fn default_compositor_bindings(modifier: KeyModifiers) -> Vec<CompositorBinding> {
133 let key = |name: &str| key_name_to_evdev(name).expect("default compositor key should exist");
134
135 vec![
136 CompositorBinding {
137 scope: CompositorBindingScope::Global,
138 modifiers: modifier,
139 key: key("r"),
140 action: CompositorBindingAction::Reload,
141 },
142 CompositorBinding {
143 scope: CompositorBindingScope::Global,
144 modifiers: modifier,
145 key: key("return"),
146 action: CompositorBindingAction::OpenTerminal,
147 },
148 CompositorBinding {
149 scope: CompositorBindingScope::Global,
150 modifiers: modifier,
151 key: key("n"),
152 action: CompositorBindingAction::ToggleState,
153 },
154 CompositorBinding {
155 scope: CompositorBindingScope::Field,
156 modifiers: modifier,
157 key: key("m"),
158 action: CompositorBindingAction::MaximizeFocusedWindow,
159 },
160 CompositorBinding {
161 scope: CompositorBindingScope::Global,
162 modifiers: KeyModifiers {
163 shift: true,
164 ..modifier
165 },
166 key: key("c"),
167 action: CompositorBindingAction::ClusterMode,
168 },
169 CompositorBinding {
170 scope: CompositorBindingScope::Global,
171 modifiers: modifier,
172 key: key("z"),
173 action: CompositorBindingAction::Bearings(BearingsBindingAction::Show),
174 },
175 CompositorBinding {
176 scope: CompositorBindingScope::Global,
177 modifiers: KeyModifiers {
178 shift: true,
179 ..modifier
180 },
181 key: key("z"),
182 action: CompositorBindingAction::Bearings(BearingsBindingAction::Toggle),
183 },
184 CompositorBinding {
185 scope: CompositorBindingScope::Global,
186 modifiers: modifier,
187 key: key("tab"),
188 action: CompositorBindingAction::FocusCycle(FocusCycleBindingAction::Forward),
189 },
190 CompositorBinding {
191 scope: CompositorBindingScope::Global,
192 modifiers: KeyModifiers {
193 shift: true,
194 ..modifier
195 },
196 key: key("tab"),
197 action: CompositorBindingAction::FocusCycle(FocusCycleBindingAction::Backward),
198 },
199 CompositorBinding {
200 scope: CompositorBindingScope::Global,
201 modifiers: modifier,
202 key: WHEEL_UP_CODE,
203 action: CompositorBindingAction::ZoomIn,
204 },
205 CompositorBinding {
206 scope: CompositorBindingScope::Global,
207 modifiers: modifier,
208 key: WHEEL_DOWN_CODE,
209 action: CompositorBindingAction::ZoomOut,
210 },
211 CompositorBinding {
212 scope: CompositorBindingScope::Global,
213 modifiers: modifier,
214 key: key("mousemiddle"),
215 action: CompositorBindingAction::ZoomReset,
216 },
217 CompositorBinding {
218 scope: CompositorBindingScope::Global,
219 modifiers: KeyModifiers {
220 shift: true,
221 ..modifier
222 },
223 key: key("q"),
224 action: CompositorBindingAction::Quit {
225 requires_shift: true,
226 },
227 },
228 CompositorBinding {
229 scope: CompositorBindingScope::Field,
230 modifiers: modifier,
231 key: key("h"),
232 action: CompositorBindingAction::Node(NodeBindingAction::Move(DirectionalAction::Left)),
233 },
234 CompositorBinding {
235 scope: CompositorBindingScope::Field,
236 modifiers: modifier,
237 key: key("k"),
238 action: CompositorBindingAction::Node(NodeBindingAction::Move(DirectionalAction::Up)),
239 },
240 CompositorBinding {
241 scope: CompositorBindingScope::Field,
242 modifiers: modifier,
243 key: key("l"),
244 action: CompositorBindingAction::Node(NodeBindingAction::Move(
245 DirectionalAction::Right,
246 )),
247 },
248 CompositorBinding {
249 scope: CompositorBindingScope::Field,
250 modifiers: modifier,
251 key: key("j"),
252 action: CompositorBindingAction::Node(NodeBindingAction::Move(DirectionalAction::Down)),
253 },
254 CompositorBinding {
255 scope: CompositorBindingScope::Global,
256 modifiers: KeyModifiers {
257 shift: true,
258 ..modifier
259 },
260 key: key("comma"),
261 action: CompositorBindingAction::Trail(TrailBindingAction::Prev),
262 },
263 CompositorBinding {
264 scope: CompositorBindingScope::Global,
265 modifiers: KeyModifiers {
266 shift: true,
267 ..modifier
268 },
269 key: key("dot"),
270 action: CompositorBindingAction::Trail(TrailBindingAction::Next),
271 },
272 CompositorBinding {
273 scope: CompositorBindingScope::Cluster,
274 modifiers: modifier,
275 key: key("l"),
276 action: CompositorBindingAction::Cluster(ClusterBindingAction::LayoutCycle),
277 },
278 CompositorBinding {
279 scope: CompositorBindingScope::Global,
280 modifiers: modifier,
281 key: key("1"),
282 action: CompositorBindingAction::Cluster(ClusterBindingAction::Slot(1)),
283 },
284 CompositorBinding {
285 scope: CompositorBindingScope::Global,
286 modifiers: modifier,
287 key: key("2"),
288 action: CompositorBindingAction::Cluster(ClusterBindingAction::Slot(2)),
289 },
290 CompositorBinding {
291 scope: CompositorBindingScope::Global,
292 modifiers: modifier,
293 key: key("3"),
294 action: CompositorBindingAction::Cluster(ClusterBindingAction::Slot(3)),
295 },
296 CompositorBinding {
297 scope: CompositorBindingScope::Global,
298 modifiers: modifier,
299 key: key("4"),
300 action: CompositorBindingAction::Cluster(ClusterBindingAction::Slot(4)),
301 },
302 CompositorBinding {
303 scope: CompositorBindingScope::Global,
304 modifiers: modifier,
305 key: key("5"),
306 action: CompositorBindingAction::Cluster(ClusterBindingAction::Slot(5)),
307 },
308 CompositorBinding {
309 scope: CompositorBindingScope::Global,
310 modifiers: modifier,
311 key: key("6"),
312 action: CompositorBindingAction::Cluster(ClusterBindingAction::Slot(6)),
313 },
314 CompositorBinding {
315 scope: CompositorBindingScope::Global,
316 modifiers: modifier,
317 key: key("7"),
318 action: CompositorBindingAction::Cluster(ClusterBindingAction::Slot(7)),
319 },
320 CompositorBinding {
321 scope: CompositorBindingScope::Global,
322 modifiers: modifier,
323 key: key("8"),
324 action: CompositorBindingAction::Cluster(ClusterBindingAction::Slot(8)),
325 },
326 CompositorBinding {
327 scope: CompositorBindingScope::Global,
328 modifiers: modifier,
329 key: key("9"),
330 action: CompositorBindingAction::Cluster(ClusterBindingAction::Slot(9)),
331 },
332 CompositorBinding {
333 scope: CompositorBindingScope::Global,
334 modifiers: modifier,
335 key: key("0"),
336 action: CompositorBindingAction::Cluster(ClusterBindingAction::Slot(10)),
337 },
338 CompositorBinding {
339 scope: CompositorBindingScope::Tile,
340 modifiers: modifier,
341 key: key("left"),
342 action: CompositorBindingAction::Tile(TileBindingAction::Focus(
343 DirectionalAction::Left,
344 )),
345 },
346 CompositorBinding {
347 scope: CompositorBindingScope::Tile,
348 modifiers: modifier,
349 key: key("right"),
350 action: CompositorBindingAction::Tile(TileBindingAction::Focus(
351 DirectionalAction::Right,
352 )),
353 },
354 CompositorBinding {
355 scope: CompositorBindingScope::Tile,
356 modifiers: modifier,
357 key: key("up"),
358 action: CompositorBindingAction::Tile(TileBindingAction::Focus(DirectionalAction::Up)),
359 },
360 CompositorBinding {
361 scope: CompositorBindingScope::Tile,
362 modifiers: modifier,
363 key: key("down"),
364 action: CompositorBindingAction::Tile(TileBindingAction::Focus(
365 DirectionalAction::Down,
366 )),
367 },
368 CompositorBinding {
369 scope: CompositorBindingScope::Tile,
370 modifiers: KeyModifiers {
371 ctrl: true,
372 ..modifier
373 },
374 key: key("left"),
375 action: CompositorBindingAction::Tile(TileBindingAction::Swap(DirectionalAction::Left)),
376 },
377 CompositorBinding {
378 scope: CompositorBindingScope::Tile,
379 modifiers: KeyModifiers {
380 ctrl: true,
381 ..modifier
382 },
383 key: key("right"),
384 action: CompositorBindingAction::Tile(TileBindingAction::Swap(
385 DirectionalAction::Right,
386 )),
387 },
388 CompositorBinding {
389 scope: CompositorBindingScope::Tile,
390 modifiers: KeyModifiers {
391 ctrl: true,
392 ..modifier
393 },
394 key: key("up"),
395 action: CompositorBindingAction::Tile(TileBindingAction::Swap(DirectionalAction::Up)),
396 },
397 CompositorBinding {
398 scope: CompositorBindingScope::Tile,
399 modifiers: KeyModifiers {
400 ctrl: true,
401 ..modifier
402 },
403 key: key("down"),
404 action: CompositorBindingAction::Tile(TileBindingAction::Swap(DirectionalAction::Down)),
405 },
406 ]
407}