hyprshell_config_lib/
structs.rs

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