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