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
10/// Default Alacritty name, used for window title and class.
11pub const DEFAULT_NAME: &str = "Alacritty";
12
13#[serde(default)]
14#[derive(Deserialize, Debug, Clone, PartialEq, Eq)]
15pub struct WindowConfig {
16    /// Initial dimensions
17    #[serde(deserialize_with = "failure_default")]
18    pub dimensions: Dimensions,
19
20    /// Initial position
21    #[serde(deserialize_with = "failure_default")]
22    pub position: Option<Delta<i32>>,
23
24    /// Pixel padding
25    #[serde(deserialize_with = "failure_default")]
26    pub padding: Delta<u8>,
27
28    /// Draw the window with title bar / borders
29    #[serde(deserialize_with = "failure_default")]
30    pub decorations: Decorations,
31
32    /// Spread out additional padding evenly
33    #[serde(deserialize_with = "failure_default")]
34    pub dynamic_padding: bool,
35
36    /// Startup mode
37    #[serde(deserialize_with = "failure_default")]
38    startup_mode: StartupMode,
39
40    /// Window title
41    #[serde(default = "default_title")]
42    pub title: String,
43
44    /// Window class
45    #[serde(deserialize_with = "from_string_or_deserialize")]
46    pub class: Class,
47
48    /// XEmbed parent
49    #[serde(skip)]
50    pub embed: Option<c_ulong>,
51
52    /// GTK theme variant
53    #[serde(deserialize_with = "option_explicit_none")]
54    pub gtk_theme_variant: Option<String>,
55
56    /// TODO: DEPRECATED
57    #[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/// Window Dimensions
128///
129/// Newtype to avoid passing values incorrectly
130#[serde(default)]
131#[derive(Default, Debug, Copy, Clone, Deserialize, PartialEq, Eq)]
132pub struct Dimensions {
133    /// Window width in character columns
134    #[serde(deserialize_with = "failure_default")]
135    columns: Column,
136
137    /// Window Height in character lines
138    #[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    /// Get lines
148    #[inline]
149    pub fn lines_u32(&self) -> u32 {
150        self.lines.0 as u32
151    }
152
153    /// Get columns
154    #[inline]
155    pub fn columns_u32(&self) -> u32 {
156        self.columns.0 as u32
157    }
158}
159
160/// Window class hint
161#[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}