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