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#[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}