1#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
2pub struct KeyModifiers {
3 pub super_key: bool,
4 pub left_super: bool,
5 pub right_super: bool,
6 pub alt: bool,
7 pub left_alt: bool,
8 pub right_alt: bool,
9 pub ctrl: bool,
10 pub left_ctrl: bool,
11 pub right_ctrl: bool,
12 pub shift: bool,
13 pub left_shift: bool,
14 pub right_shift: bool,
15}
16
17#[derive(Clone, Debug)]
18pub struct Keybinds {
19 pub modifier: KeyModifiers,
20}
21
22#[derive(Clone, Debug)]
23pub struct LaunchBinding {
24 pub modifiers: KeyModifiers,
25 pub key: u32,
26 pub command: String,
27}
28
29pub const WHEEL_UP_CODE: u32 = 0x2000;
30pub const WHEEL_DOWN_CODE: u32 = 0x2001;
31
32#[derive(Clone, Copy, Debug, PartialEq, Eq)]
33pub enum DirectionalAction {
34 Left,
35 Right,
36 Up,
37 Down,
38}
39
40#[derive(Clone, Debug, PartialEq, Eq)]
41pub enum NodeBindingAction {
42 Move(DirectionalAction),
43}
44
45#[derive(Clone, Debug, PartialEq, Eq)]
46pub enum TrailBindingAction {
47 Prev,
48 Next,
49}
50
51#[derive(Clone, Debug, PartialEq, Eq)]
52pub enum MonitorBindingTarget {
53 Direction(DirectionalAction),
54 Output(String),
55}
56
57#[derive(Clone, Debug, PartialEq, Eq)]
58pub enum MonitorBindingAction {
59 Focus(MonitorBindingTarget),
60}
61
62#[derive(Clone, Copy, Debug, PartialEq, Eq)]
63pub enum StackCycleDirection {
64 Forward,
65 Backward,
66}
67
68#[derive(Clone, Debug, PartialEq, Eq)]
69pub enum StackBindingAction {
70 Cycle(StackCycleDirection),
71}
72
73#[derive(Clone, Debug, PartialEq, Eq)]
74pub enum TileBindingAction {
75 Focus(DirectionalAction),
76 Swap(DirectionalAction),
77}
78
79#[derive(Clone, Debug, PartialEq, Eq)]
80pub enum ClusterBindingAction {
81 LayoutCycle,
82}
83
84#[derive(Clone, Copy, Debug, PartialEq, Eq)]
85pub enum CompositorBindingScope {
86 Global,
87 Field,
88 Cluster,
89 Tile,
90 Stack,
91}
92
93#[derive(Clone, Debug, PartialEq, Eq)]
94pub enum BearingsBindingAction {
95 Show,
96 Toggle,
97}
98
99#[derive(Clone, Debug, PartialEq, Eq)]
100pub enum CompositorBindingAction {
101 Reload,
102 OpenTerminal,
103 ToggleState,
104 CloseFocusedWindow,
105 ClusterMode,
106 Quit { requires_shift: bool },
107 ZoomIn,
108 ZoomOut,
109 ZoomReset,
110 Node(NodeBindingAction),
111 Trail(TrailBindingAction),
112 Monitor(MonitorBindingAction),
113 Bearings(BearingsBindingAction),
114 Stack(StackBindingAction),
115 Tile(TileBindingAction),
116 Cluster(ClusterBindingAction),
117}
118
119#[derive(Clone, Debug)]
120pub struct CompositorBinding {
121 pub scope: CompositorBindingScope,
122 pub modifiers: KeyModifiers,
123 pub key: u32,
124 pub action: CompositorBindingAction,
125}
126
127#[derive(Clone, Copy, Debug, PartialEq, Eq)]
128pub enum PointerBindingAction {
129 MoveWindow,
130 FieldJump,
131 ResizeWindow,
132}
133
134#[derive(Clone, Debug)]
135pub struct PointerBinding {
136 pub modifiers: KeyModifiers,
137 pub button: u32,
138 pub action: PointerBindingAction,
139}
140
141impl Default for Keybinds {
142 fn default() -> Self {
143 Self {
144 modifier: KeyModifiers {
145 left_alt: true,
146 ..KeyModifiers::default()
147 },
148 }
149 }
150}
151
152impl Keybinds {
153 pub fn modifier_name(&self) -> String {
154 let mut parts = Vec::new();
155
156 if self.modifier.left_super {
157 parts.push("lsuper");
158 }
159 if self.modifier.right_super {
160 parts.push("rsuper");
161 }
162 if self.modifier.super_key {
163 parts.push("super");
164 }
165
166 if self.modifier.left_ctrl {
167 parts.push("lctrl");
168 }
169 if self.modifier.right_ctrl {
170 parts.push("rctrl");
171 }
172 if self.modifier.ctrl {
173 parts.push("ctrl");
174 }
175
176 if self.modifier.left_alt {
177 parts.push("lalt");
178 }
179 if self.modifier.right_alt {
180 parts.push("ralt");
181 }
182 if self.modifier.alt {
183 parts.push("alt");
184 }
185
186 if self.modifier.left_shift {
187 parts.push("lshift");
188 }
189 if self.modifier.right_shift {
190 parts.push("rshift");
191 }
192 if self.modifier.shift {
193 parts.push("shift");
194 }
195
196 if parts.is_empty() {
197 "none".to_string()
198 } else {
199 parts.join("+")
200 }
201 }
202}