hyprshell_core_lib/config/
structs.rs1use serde::{Deserialize, Serialize};
2use smart_default::SmartDefault;
3use std::fmt::Display;
4
5#[derive(SmartDefault, Debug, Clone, Deserialize, Serialize)]
6#[serde(default, deny_unknown_fields)]
7pub struct Config {
8 #[default = true]
9 pub layerrules: bool,
10 #[default(None)]
11 pub launcher: Option<Launcher>,
12 #[default(Some(Windows::default()))]
13 pub windows: Option<Windows>,
14}
15
16#[derive(SmartDefault, Debug, Clone, Deserialize, Serialize)]
17#[serde(default, deny_unknown_fields)]
18pub struct Windows {
19 #[default = 5.5]
20 pub size_factor: f64,
21 #[default = 5]
22 pub workspaces_per_row: u8,
23 #[default = true]
24 pub strip_html_from_workspace_title: bool,
25 pub overview: Option<Overview>,
26 pub switch: Option<Switch>,
27}
28
29#[derive(SmartDefault, Debug, Clone, Deserialize, Serialize)]
30#[serde(default, deny_unknown_fields)]
31pub struct Launcher {
32 #[default = true]
33 pub show_execs: bool,
34 #[default(None)]
35 pub default_terminal: Option<String>,
36 #[default = 400]
37 pub animate_launch_time_ms: u64,
38 #[default = 650]
39 pub width: u32,
40 #[default = 6]
41 pub max_items: u8,
42 #[default = 3]
43 pub run_cache_weeks: u8,
44}
45
46#[derive(SmartDefault, Debug, Clone, Deserialize, Serialize)]
47#[serde(default, deny_unknown_fields)]
48pub struct Overview {
49 pub open: OpenOverview,
50 pub navigate: Navigate,
51 pub other: OtherOverview,
52}
53
54#[derive(SmartDefault, Debug, Clone, Deserialize, Serialize)]
55#[serde(default, deny_unknown_fields)]
56pub struct OtherOverview {
57 #[default = false]
58 pub hide_filtered: bool,
59 #[default(Vec::new())]
60 pub filter_by: Vec<FilterBy>,
61}
62
63#[derive(SmartDefault, Debug, Clone, Deserialize, Serialize)]
64#[serde(default, deny_unknown_fields)]
65pub struct OpenOverview {
66 #[default(Mod::Super)]
67 pub modifier: Mod,
68 #[default = "super"]
69 pub key: KeyMaybeMod,
70}
71
72#[derive(SmartDefault, Debug, Clone, Deserialize, Serialize)]
73#[serde(default, deny_unknown_fields)]
74pub struct Navigate {
75 #[default = "tab"]
76 pub forward: String,
77 #[default(Reverse::Mod(Mod::Shift))]
78 pub reverse: Reverse,
79}
80
81#[derive(SmartDefault, Debug, Clone, Deserialize, Serialize)]
82#[serde(default, deny_unknown_fields)]
83pub struct Switch {
84 pub open: OpenSwitch,
85 pub navigate: Navigate,
86 pub other: OtherSwitch,
87}
88
89#[derive(SmartDefault, Debug, Clone, Deserialize, Serialize)]
90#[serde(default, deny_unknown_fields)]
91pub struct OpenSwitch {
92 #[default(Mod::Super)]
93 pub modifier: Mod,
94}
95
96#[derive(SmartDefault, Debug, Clone, Deserialize, Serialize)]
97#[serde(default, deny_unknown_fields)]
98pub struct OtherSwitch {
99 #[default = true]
100 pub hide_filtered: bool,
101 #[default(Vec::new())]
102 pub filter_by: Vec<FilterBy>,
103}
104
105#[derive(Debug, Clone, Copy, Deserialize, Serialize, Eq, PartialEq)]
106#[serde(rename_all = "snake_case")]
107pub enum FilterBy {
108 SameClass,
109 CurrentWorkspace,
110 CurrentMonitor,
111}
112
113#[derive(Debug, Clone, Deserialize, Serialize)]
114pub enum Reverse {
115 Key(String),
116 Mod(Mod),
117}
118#[derive(Debug, Clone, Copy, Deserialize, Serialize)]
119#[serde(rename_all = "snake_case")]
120pub enum Mod {
121 Alt,
122 Ctrl,
123 Super,
124 Shift,
125}
126
127impl Display for Mod {
128 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
129 match self {
130 Mod::Alt => write!(f, "alt"),
131 Mod::Ctrl => write!(f, "ctrl"),
132 Mod::Super => write!(f, "super"),
133 Mod::Shift => write!(f, "shift"),
134 }
135 }
136}
137
138#[derive(Debug, Clone, Deserialize, Serialize)]
139pub struct KeyMaybeMod(String);
140impl From<&str> for KeyMaybeMod {
141 fn from(s: &str) -> Self {
142 Self(s.to_string())
143 }
144}
145
146pub trait ToKey {
147 fn to_key(&self) -> String;
148}
149
150impl ToKey for KeyMaybeMod {
153 fn to_key(&self) -> String {
154 match &*self.0.to_ascii_lowercase() {
155 "alt" => "alt_l".to_string(),
156 "ctrl" => "ctrl_l".to_string(),
157 "super" => "super_l".to_string(),
158 "shift" => "shift_l".to_string(),
159 a => a.to_string(),
160 }
161 }
162}
163
164impl ToKey for Mod {
165 fn to_key(&self) -> String {
166 match self {
167 Mod::Alt => "alt_l".to_string(),
168 Mod::Ctrl => "ctrl_l".to_string(),
169 Mod::Super => "super_l".to_string(),
170 Mod::Shift => "shift_l".to_string(),
171 }
172 }
173}