hyprshell_core_lib/config/
structs.rs1use serde::{Deserialize, Serialize};
2use smart_default::SmartDefault;
3use std::fmt::Display;
4
5pub(crate) const CURRENT_CONFIG_VERSION: u16 = 1;
6
7#[derive(SmartDefault, Debug, Clone, Deserialize, Serialize)]
8#[serde(default, deny_unknown_fields)]
9pub struct Config {
10 #[default = true]
11 pub layerrules: bool,
12 #[default = "ctrl+shift+alt, h"]
13 pub kill_bind: String,
14 #[default(Some(Windows::default()))]
15 pub windows: Option<Windows>,
16 #[default(CURRENT_CONFIG_VERSION)]
17 pub version: u16,
18}
19
20#[derive(SmartDefault, Debug, Clone, Deserialize, Serialize)]
21#[serde(default, deny_unknown_fields)]
22pub struct Windows {
23 #[default = 8.5]
24 pub scale: f64,
25 #[default = 5]
26 pub items_per_row: u8,
27 pub overview: Option<Overview>,
28 pub switch: Option<Switch>,
29}
30
31#[derive(SmartDefault, Debug, Clone, Deserialize, Serialize)]
32#[serde(default, deny_unknown_fields)]
33pub struct Overview {
34 #[default = true]
35 pub strip_html_from_workspace_title: bool,
36 pub launcher: Launcher,
37 #[default = "super_l"]
38 pub key: String,
39 #[default(Mod::Super)]
40 pub modifier: Mod,
41 #[default(Vec::new())]
42 pub filter_by: Vec<FilterBy>,
43 #[default = false]
44 pub hide_filtered: bool,
45}
46
47#[derive(SmartDefault, Debug, Clone, Deserialize, Serialize)]
48#[serde(default, deny_unknown_fields)]
49pub struct Launcher {
50 #[default(None)]
51 pub default_terminal: Option<Box<str>>,
52 #[default = 650]
53 pub width: u32,
54 #[default = 5]
55 pub max_items: u8,
56 #[default = true]
57 pub show_when_empty: bool,
58 #[default = 250]
59 pub animate_launch_ms: u64,
60 #[default(Plugins{
61 applications: Some(ApplicationsPluginConfig::default()),
62 terminal: Some(EmptyConfig::default()),
63 shell: None,
64 websearch: Some(WebSearchConfig::default()),
65 calc: Some(EmptyConfig::default()),
66 })]
67 pub plugins: Plugins,
68}
69
70#[derive(Debug, Clone, Deserialize, Serialize)]
73#[serde(deny_unknown_fields)]
74pub struct Plugins {
75 pub applications: Option<ApplicationsPluginConfig>,
76 pub terminal: Option<EmptyConfig>,
77 pub shell: Option<EmptyConfig>,
78 pub websearch: Option<WebSearchConfig>,
79 pub calc: Option<EmptyConfig>,
80}
81
82#[derive(SmartDefault, Debug, Clone, Deserialize, Serialize)]
83#[serde(default, deny_unknown_fields)]
84pub struct EmptyConfig {}
85
86#[derive(SmartDefault, Debug, Clone, Deserialize, Serialize)]
87#[serde(default, deny_unknown_fields)]
88pub struct ApplicationsPluginConfig {
89 #[default = 4]
90 pub run_cache_weeks: u8,
91 #[default = true]
92 pub show_execs: bool,
93 #[default = false]
94 pub show_actions_submenu: bool,
95}
96
97#[derive(SmartDefault, Debug, Clone, Deserialize, Serialize)]
98#[serde(default, deny_unknown_fields)]
99pub struct WebSearchConfig {
100 #[default(vec![SearchEngine {
101 url: "https://www.google.com/search?q={}".into(),
102 name: "Google".into(),
103 key: 'g',
104 }])]
105 pub engines: Vec<SearchEngine>,
106}
107
108#[derive(Debug, Clone, Deserialize, Serialize)]
109#[serde(deny_unknown_fields)]
110pub struct SearchEngine {
111 pub url: String,
112 pub name: String,
113 pub key: char,
114}
115
116#[derive(SmartDefault, Debug, Clone, Deserialize, Serialize)]
117#[serde(default, deny_unknown_fields)]
118pub struct Switch {
119 #[default(Mod::Super)]
120 pub modifier: Mod,
121 #[default(Vec::new())]
122 pub filter_by: Vec<FilterBy>,
123}
124
125#[derive(Debug, Clone, Copy, Deserialize, Serialize, Eq, PartialEq)]
126#[serde(rename_all = "snake_case")]
127pub enum FilterBy {
128 SameClass,
129 CurrentWorkspace,
130 CurrentMonitor,
131}
132
133#[derive(Debug, Clone, Copy, Eq, PartialEq, Deserialize, Serialize)]
134#[serde(rename_all = "snake_case")]
135pub enum Mod {
136 Alt,
137 Ctrl,
138 Super,
139 Shift,
140}
141
142impl Display for Mod {
143 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
144 match self {
145 Mod::Alt => write!(f, "alt"),
146 Mod::Ctrl => write!(f, "ctrl"),
147 Mod::Super => write!(f, "super"),
148 Mod::Shift => write!(f, "shift"),
149 }
150 }
151}