1use std::collections::HashMap;
2
3use halley_core::field::Vec2;
4
5use crate::keybinds::{
6 BearingsBindingAction, ClusterBindingAction, CompositorBinding, CompositorBindingAction,
7 CompositorBindingScope, DirectionalAction, KeyModifiers, Keybinds, NodeBindingAction,
8 PointerBinding, PointerBindingAction, TileBindingAction, TrailBindingAction, WHEEL_DOWN_CODE,
9 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::Global,
156 modifiers: KeyModifiers {
157 shift: true,
158 ..modifier
159 },
160 key: key("c"),
161 action: CompositorBindingAction::ClusterMode,
162 },
163 CompositorBinding {
164 scope: CompositorBindingScope::Global,
165 modifiers: modifier,
166 key: key("z"),
167 action: CompositorBindingAction::Bearings(BearingsBindingAction::Show),
168 },
169 CompositorBinding {
170 scope: CompositorBindingScope::Global,
171 modifiers: KeyModifiers {
172 shift: true,
173 ..modifier
174 },
175 key: key("z"),
176 action: CompositorBindingAction::Bearings(BearingsBindingAction::Toggle),
177 },
178 CompositorBinding {
179 scope: CompositorBindingScope::Global,
180 modifiers: modifier,
181 key: WHEEL_UP_CODE,
182 action: CompositorBindingAction::ZoomIn,
183 },
184 CompositorBinding {
185 scope: CompositorBindingScope::Global,
186 modifiers: modifier,
187 key: WHEEL_DOWN_CODE,
188 action: CompositorBindingAction::ZoomOut,
189 },
190 CompositorBinding {
191 scope: CompositorBindingScope::Global,
192 modifiers: modifier,
193 key: key("mousemiddle"),
194 action: CompositorBindingAction::ZoomReset,
195 },
196 CompositorBinding {
197 scope: CompositorBindingScope::Global,
198 modifiers: KeyModifiers {
199 shift: true,
200 ..modifier
201 },
202 key: key("q"),
203 action: CompositorBindingAction::Quit {
204 requires_shift: true,
205 },
206 },
207 CompositorBinding {
208 scope: CompositorBindingScope::Field,
209 modifiers: modifier,
210 key: key("h"),
211 action: CompositorBindingAction::Node(NodeBindingAction::Move(DirectionalAction::Left)),
212 },
213 CompositorBinding {
214 scope: CompositorBindingScope::Field,
215 modifiers: modifier,
216 key: key("k"),
217 action: CompositorBindingAction::Node(NodeBindingAction::Move(DirectionalAction::Up)),
218 },
219 CompositorBinding {
220 scope: CompositorBindingScope::Field,
221 modifiers: modifier,
222 key: key("l"),
223 action: CompositorBindingAction::Node(NodeBindingAction::Move(
224 DirectionalAction::Right,
225 )),
226 },
227 CompositorBinding {
228 scope: CompositorBindingScope::Field,
229 modifiers: modifier,
230 key: key("j"),
231 action: CompositorBindingAction::Node(NodeBindingAction::Move(DirectionalAction::Down)),
232 },
233 CompositorBinding {
234 scope: CompositorBindingScope::Global,
235 modifiers: KeyModifiers {
236 shift: true,
237 ..modifier
238 },
239 key: key("comma"),
240 action: CompositorBindingAction::Trail(TrailBindingAction::Prev),
241 },
242 CompositorBinding {
243 scope: CompositorBindingScope::Global,
244 modifiers: KeyModifiers {
245 shift: true,
246 ..modifier
247 },
248 key: key("dot"),
249 action: CompositorBindingAction::Trail(TrailBindingAction::Next),
250 },
251 CompositorBinding {
252 scope: CompositorBindingScope::Cluster,
253 modifiers: modifier,
254 key: key("l"),
255 action: CompositorBindingAction::Cluster(ClusterBindingAction::LayoutCycle),
256 },
257 CompositorBinding {
258 scope: CompositorBindingScope::Tile,
259 modifiers: modifier,
260 key: key("left"),
261 action: CompositorBindingAction::Tile(TileBindingAction::Focus(
262 DirectionalAction::Left,
263 )),
264 },
265 CompositorBinding {
266 scope: CompositorBindingScope::Tile,
267 modifiers: modifier,
268 key: key("right"),
269 action: CompositorBindingAction::Tile(TileBindingAction::Focus(
270 DirectionalAction::Right,
271 )),
272 },
273 CompositorBinding {
274 scope: CompositorBindingScope::Tile,
275 modifiers: modifier,
276 key: key("up"),
277 action: CompositorBindingAction::Tile(TileBindingAction::Focus(DirectionalAction::Up)),
278 },
279 CompositorBinding {
280 scope: CompositorBindingScope::Tile,
281 modifiers: modifier,
282 key: key("down"),
283 action: CompositorBindingAction::Tile(TileBindingAction::Focus(
284 DirectionalAction::Down,
285 )),
286 },
287 CompositorBinding {
288 scope: CompositorBindingScope::Tile,
289 modifiers: KeyModifiers {
290 ctrl: true,
291 ..modifier
292 },
293 key: key("left"),
294 action: CompositorBindingAction::Tile(TileBindingAction::Swap(DirectionalAction::Left)),
295 },
296 CompositorBinding {
297 scope: CompositorBindingScope::Tile,
298 modifiers: KeyModifiers {
299 ctrl: true,
300 ..modifier
301 },
302 key: key("right"),
303 action: CompositorBindingAction::Tile(TileBindingAction::Swap(
304 DirectionalAction::Right,
305 )),
306 },
307 CompositorBinding {
308 scope: CompositorBindingScope::Tile,
309 modifiers: KeyModifiers {
310 ctrl: true,
311 ..modifier
312 },
313 key: key("up"),
314 action: CompositorBindingAction::Tile(TileBindingAction::Swap(DirectionalAction::Up)),
315 },
316 CompositorBinding {
317 scope: CompositorBindingScope::Tile,
318 modifiers: KeyModifiers {
319 ctrl: true,
320 ..modifier
321 },
322 key: key("down"),
323 action: CompositorBindingAction::Tile(TileBindingAction::Swap(DirectionalAction::Down)),
324 },
325 ]
326}