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