hyprshell_core_lib/config/
structs.rs

1use 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
150// https://wiki.hyprland.org/Configuring/Variables/#variable-types
151// SHIFT CAPS CTRL/CONTROL ALT MOD2 MOD3 SUPER/WIN/LOGO/MOD4 MOD5
152impl 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}