use crate::config::defaults::*;
use serde::{Deserialize, Serialize};
use sugarloaf::ImageProperties;
#[derive(Default, Clone, Serialize, Deserialize, Copy, Debug, PartialEq)]
pub enum WindowMode {
#[serde(alias = "maximized")]
Maximized,
#[serde(alias = "fullscreen")]
Fullscreen,
#[default]
#[serde(alias = "windowed")]
Windowed,
}
#[derive(Clone, Serialize, Deserialize, Copy, Debug, PartialEq)]
pub enum Colorspace {
#[serde(alias = "srgb")]
Srgb,
#[serde(alias = "display-p3")]
DisplayP3,
#[serde(alias = "rec2020")]
Rec2020,
}
#[allow(clippy::derivable_impls)]
impl Default for Colorspace {
fn default() -> Colorspace {
Colorspace::Srgb
}
}
#[derive(Clone, Serialize, Deserialize, Copy, Debug, PartialEq)]
pub enum Decorations {
#[serde(alias = "enabled")]
Enabled,
#[serde(alias = "disabled")]
Disabled,
#[serde(alias = "transparent")]
Transparent,
#[serde(alias = "buttonless")]
Buttonless,
}
#[cfg(target_os = "macos")]
#[allow(clippy::derivable_impls)]
impl Default for Decorations {
fn default() -> Decorations {
Decorations::Transparent
}
}
#[cfg(not(target_os = "macos"))]
#[allow(clippy::derivable_impls)]
impl Default for Decorations {
fn default() -> Decorations {
Decorations::Enabled
}
}
#[derive(PartialEq, Serialize, Deserialize, Clone, Debug)]
pub enum WindowsCornerPreference {
#[serde(alias = "default")]
Default = 0,
#[serde(alias = "donotround")]
DoNotRound = 1,
#[serde(alias = "round")]
Round = 2,
#[serde(alias = "roundsmall")]
RoundSmall = 3,
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub enum WindowBlur {
#[default]
Off,
System,
MacosGlassRegular,
MacosGlassClear,
}
impl WindowBlur {
#[inline]
pub fn is_enabled(self) -> bool {
!matches!(self, WindowBlur::Off)
}
#[inline]
pub fn is_glass(self) -> bool {
matches!(
self,
WindowBlur::MacosGlassRegular | WindowBlur::MacosGlassClear
)
}
}
impl From<WindowBlur> for rio_window::window::BlurStyle {
fn from(b: WindowBlur) -> Self {
match b {
WindowBlur::Off => rio_window::window::BlurStyle::Off,
WindowBlur::System => rio_window::window::BlurStyle::System,
WindowBlur::MacosGlassRegular => {
rio_window::window::BlurStyle::MacosGlassRegular
}
WindowBlur::MacosGlassClear => rio_window::window::BlurStyle::MacosGlassClear,
}
}
}
impl Serialize for WindowBlur {
fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
match self {
WindowBlur::Off => s.serialize_bool(false),
WindowBlur::System => s.serialize_bool(true),
WindowBlur::MacosGlassRegular => s.serialize_str("macos-glass-regular"),
WindowBlur::MacosGlassClear => s.serialize_str("macos-glass-clear"),
}
}
}
impl<'de> Deserialize<'de> for WindowBlur {
fn deserialize<D: serde::Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
#[derive(Deserialize)]
#[serde(untagged)]
enum Raw {
Bool(bool),
Str(String),
}
match Raw::deserialize(d)? {
Raw::Bool(false) => Ok(WindowBlur::Off),
Raw::Bool(true) => Ok(WindowBlur::System),
Raw::Str(s) => match s.as_str() {
"macos-glass-regular" => Ok(WindowBlur::MacosGlassRegular),
"macos-glass-clear" => Ok(WindowBlur::MacosGlassClear),
other => Err(serde::de::Error::custom(format!(
"unknown window.blur value `{other}`; expected a bool or one of \
\"macos-glass-regular\", \"macos-glass-clear\""
))),
},
}
}
}
#[derive(PartialEq, Serialize, Deserialize, Clone, Debug)]
pub struct Window {
#[serde(default = "default_window_width")]
pub width: i32,
#[serde(default = "default_window_height")]
pub height: i32,
#[serde(default = "WindowMode::default")]
pub mode: WindowMode,
#[serde(default = "default_opacity")]
pub opacity: f32,
#[serde(rename = "opacity-cells", default = "bool::default")]
pub opacity_cells: bool,
#[serde(default)]
pub blur: WindowBlur,
#[serde(rename = "background-image", skip_serializing)]
pub background_image: Option<ImageProperties>,
#[serde(default = "Decorations::default")]
pub decorations: Decorations,
#[serde(default = "bool::default", rename = "macos-use-unified-titlebar")]
pub macos_use_unified_titlebar: bool,
#[serde(rename = "macos-use-shadow", default = "default_bool_true")]
pub macos_use_shadow: bool,
#[serde(rename = "macos-traffic-light-position-x", default = "Option::default")]
pub macos_traffic_light_position_x: Option<f64>,
#[serde(rename = "macos-traffic-light-position-y", default = "Option::default")]
pub macos_traffic_light_position_y: Option<f64>,
#[serde(rename = "initial-title", skip_serializing)]
pub initial_title: Option<String>,
#[serde(rename = "windows-use-undecorated-shadow", default = "Option::default")]
pub windows_use_undecorated_shadow: Option<bool>,
#[serde(
rename = "windows-use-no-redirection-bitmap",
default = "Option::default"
)]
pub windows_use_no_redirection_bitmap: Option<bool>,
#[serde(rename = "windows-corner-preference", default = "Option::default")]
pub windows_corner_preference: Option<WindowsCornerPreference>,
#[serde(default = "Colorspace::default")]
pub colorspace: Colorspace,
#[serde(default = "Option::default")]
pub columns: Option<u16>,
#[serde(default = "Option::default")]
pub rows: Option<u16>,
}
impl Default for Window {
fn default() -> Window {
Window {
width: default_window_width(),
height: default_window_height(),
mode: WindowMode::default(),
opacity: default_opacity(),
opacity_cells: false,
background_image: None,
decorations: Decorations::default(),
blur: WindowBlur::default(),
macos_use_unified_titlebar: false,
macos_use_shadow: true,
macos_traffic_light_position_x: None,
macos_traffic_light_position_y: None,
initial_title: None,
windows_use_undecorated_shadow: None,
windows_use_no_redirection_bitmap: None,
windows_corner_preference: None,
colorspace: Colorspace::default(),
columns: None,
rows: None,
}
}
}
impl Colorspace {
pub fn to_sugarloaf_colorspace(&self) -> sugarloaf::Colorspace {
match self {
Colorspace::Srgb => sugarloaf::Colorspace::Srgb,
Colorspace::DisplayP3 => sugarloaf::Colorspace::DisplayP3,
Colorspace::Rec2020 => sugarloaf::Colorspace::Rec2020,
}
}
#[cfg(target_os = "macos")]
pub fn to_rio_window_colorspace(&self) -> rio_window::platform::macos::Colorspace {
match self {
Colorspace::Srgb => rio_window::platform::macos::Colorspace::Srgb,
Colorspace::DisplayP3 => rio_window::platform::macos::Colorspace::DisplayP3,
Colorspace::Rec2020 => rio_window::platform::macos::Colorspace::Rec2020,
}
}
#[cfg(not(target_os = "macos"))]
pub fn to_rio_window_colorspace(&self) {
}
}
impl Window {
pub fn is_fullscreen(&self) -> bool {
self.mode == WindowMode::Fullscreen
}
}