term_model/config/
window.rs
1use std::os::raw::c_ulong;
2
3use serde::Deserialize;
4
5use crate::config::{
6 failure_default, from_string_or_deserialize, option_explicit_none, Delta, FromString,
7};
8use crate::index::{Column, Line};
9
10pub const DEFAULT_NAME: &str = "Alacritty";
12
13#[serde(default)]
14#[derive(Deserialize, Debug, Clone, PartialEq, Eq)]
15pub struct WindowConfig {
16 #[serde(deserialize_with = "failure_default")]
18 pub dimensions: Dimensions,
19
20 #[serde(deserialize_with = "failure_default")]
22 pub position: Option<Delta<i32>>,
23
24 #[serde(deserialize_with = "failure_default")]
26 pub padding: Delta<u8>,
27
28 #[serde(deserialize_with = "failure_default")]
30 pub decorations: Decorations,
31
32 #[serde(deserialize_with = "failure_default")]
34 pub dynamic_padding: bool,
35
36 #[serde(deserialize_with = "failure_default")]
38 startup_mode: StartupMode,
39
40 #[serde(default = "default_title")]
42 pub title: String,
43
44 #[serde(deserialize_with = "from_string_or_deserialize")]
46 pub class: Class,
47
48 #[serde(skip)]
50 pub embed: Option<c_ulong>,
51
52 #[serde(deserialize_with = "option_explicit_none")]
54 pub gtk_theme_variant: Option<String>,
55
56 #[serde(deserialize_with = "failure_default")]
58 pub start_maximized: Option<bool>,
59}
60
61pub fn default_title() -> String {
62 DEFAULT_NAME.to_string()
63}
64
65impl WindowConfig {
66 pub fn startup_mode(&self) -> StartupMode {
67 match self.start_maximized {
68 Some(true) => StartupMode::Maximized,
69 _ => self.startup_mode,
70 }
71 }
72}
73
74impl Default for WindowConfig {
75 fn default() -> WindowConfig {
76 WindowConfig {
77 dimensions: Default::default(),
78 position: Default::default(),
79 padding: Default::default(),
80 decorations: Default::default(),
81 dynamic_padding: Default::default(),
82 startup_mode: Default::default(),
83 class: Default::default(),
84 embed: Default::default(),
85 gtk_theme_variant: Default::default(),
86 start_maximized: Default::default(),
87 title: default_title(),
88 }
89 }
90}
91
92#[derive(Debug, Deserialize, Copy, Clone, PartialEq, Eq)]
93pub enum StartupMode {
94 Windowed,
95 Maximized,
96 Fullscreen,
97 #[cfg(target_os = "macos")]
98 SimpleFullscreen,
99}
100
101impl Default for StartupMode {
102 fn default() -> StartupMode {
103 StartupMode::Windowed
104 }
105}
106
107#[derive(Debug, Copy, Clone, PartialEq, Eq, Deserialize)]
108pub enum Decorations {
109 #[serde(rename = "full")]
110 Full,
111 #[cfg(target_os = "macos")]
112 #[serde(rename = "transparent")]
113 Transparent,
114 #[cfg(target_os = "macos")]
115 #[serde(rename = "buttonless")]
116 Buttonless,
117 #[serde(rename = "none")]
118 None,
119}
120
121impl Default for Decorations {
122 fn default() -> Decorations {
123 Decorations::Full
124 }
125}
126
127#[serde(default)]
131#[derive(Default, Debug, Copy, Clone, Deserialize, PartialEq, Eq)]
132pub struct Dimensions {
133 #[serde(deserialize_with = "failure_default")]
135 columns: Column,
136
137 #[serde(deserialize_with = "failure_default")]
139 lines: Line,
140}
141
142impl Dimensions {
143 pub fn new(columns: Column, lines: Line) -> Self {
144 Dimensions { columns, lines }
145 }
146
147 #[inline]
149 pub fn lines_u32(&self) -> u32 {
150 self.lines.0 as u32
151 }
152
153 #[inline]
155 pub fn columns_u32(&self) -> u32 {
156 self.columns.0 as u32
157 }
158}
159
160#[serde(default)]
162#[derive(Deserialize, Debug, Clone, PartialEq, Eq)]
163pub struct Class {
164 pub instance: String,
165 pub general: String,
166}
167
168impl Default for Class {
169 fn default() -> Self {
170 Class { instance: DEFAULT_NAME.into(), general: DEFAULT_NAME.into() }
171 }
172}
173
174impl FromString for Class {
175 fn from(value: String) -> Self {
176 Class { instance: value, general: DEFAULT_NAME.into() }
177 }
178}