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