hyprshell_core_lib/config/
structs.rs

1use 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// no default for this, if some elements are missing, they should be None.
71// if no config for plugins is provided, use the default value from the launcher.
72#[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}