diff --git a/Cargo.lock b/Cargo.lock index 4f1e6ff2..61003ace 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -587,7 +587,7 @@ dependencies = [ [[package]] name = "base16-egui-themes" version = "0.1.0" -source = "git+https://github.com/LGUG2Z/base16-egui-themes?rev=24362c4#24362c44459dc8e42c7c6080529c4cc719803d30" +source = "git+https://github.com/LGUG2Z/base16-egui-themes?rev=911079d#911079d1ee7d60bbebf1f8e05d0e5a6bc596ad79" dependencies = [ "egui", "schemars", diff --git a/komorebi-client/src/lib.rs b/komorebi-client/src/lib.rs index 8c53c7e0..589a760c 100644 --- a/komorebi-client/src/lib.rs +++ b/komorebi-client/src/lib.rs @@ -2,10 +2,15 @@ #![allow(clippy::missing_errors_doc)] pub use komorebi::animation::prefix::AnimationPrefix; +pub use komorebi::animation::PerAnimationPrefixConfig; pub use komorebi::asc::ApplicationSpecificConfiguration; pub use komorebi::colour::Colour; pub use komorebi::colour::Rgb; pub use komorebi::config_generation::ApplicationConfiguration; +pub use komorebi::config_generation::IdWithIdentifier; +pub use komorebi::config_generation::IdWithIdentifierAndComment; +pub use komorebi::config_generation::MatchingRule; +pub use komorebi::config_generation::MatchingStrategy; pub use komorebi::container::Container; pub use komorebi::core::config_generation::ApplicationConfigurationGenerator; pub use komorebi::core::resolve_home_path; @@ -39,17 +44,24 @@ pub use komorebi::ring::Ring; pub use komorebi::window::Window; pub use komorebi::window_manager_event::WindowManagerEvent; pub use komorebi::workspace::Workspace; +pub use komorebi::AnimationsConfig; +pub use komorebi::AspectRatio; pub use komorebi::BorderColours; +pub use komorebi::CrossBoundaryBehaviour; pub use komorebi::GlobalState; pub use komorebi::KomorebiTheme; +pub use komorebi::MonitorConfig; pub use komorebi::Notification; pub use komorebi::NotificationEvent; +pub use komorebi::PredefinedAspectRatio; pub use komorebi::RuleDebug; pub use komorebi::StackbarConfig; pub use komorebi::State; pub use komorebi::StaticConfig; pub use komorebi::SubscribeOptions; pub use komorebi::TabsConfig; +pub use komorebi::WindowContainerBehaviour; +pub use komorebi::WorkspaceConfig; use komorebi::DATA_DIR; diff --git a/komorebi-themes/Cargo.toml b/komorebi-themes/Cargo.toml index 435ebc09..e3402567 100644 --- a/komorebi-themes/Cargo.toml +++ b/komorebi-themes/Cargo.toml @@ -4,11 +4,11 @@ version = "0.1.34" edition = "2021" [dependencies] -base16-egui-themes = { git = "https://github.com/LGUG2Z/base16-egui-themes", rev = "24362c4" } +base16-egui-themes = { git = "https://github.com/LGUG2Z/base16-egui-themes", rev = "911079d" } catppuccin-egui = { git = "https://github.com/LGUG2Z/catppuccin-egui", rev = "f85cc3c", default-features = false, features = ["egui30"] } #catppuccin-egui = { version = "5", default-features = false, features = ["egui30"] } eframe = { workspace = true } schemars = { workspace = true } serde = { workspace = true } serde_variant = "0.1" -strum = "0.26" \ No newline at end of file +strum = "0.26" diff --git a/komorebi-themes/src/lib.rs b/komorebi-themes/src/lib.rs index e278c653..1aaeaac2 100644 --- a/komorebi-themes/src/lib.rs +++ b/komorebi-themes/src/lib.rs @@ -4,6 +4,7 @@ use schemars::JsonSchema; use serde::Deserialize; use serde::Serialize; +use strum::Display; use strum::IntoEnumIterator; pub use base16_egui_themes::Base16; @@ -11,7 +12,7 @@ pub use catppuccin_egui; pub use eframe::egui::Color32; use serde_variant::to_variant_name; -#[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema)] +#[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq)] #[serde(tag = "type")] pub enum Theme { /// A theme from catppuccin-egui @@ -48,7 +49,7 @@ impl Theme { } } -#[derive(Copy, Clone, Debug, Default, Serialize, Deserialize, JsonSchema)] +#[derive(Copy, Clone, Debug, Default, Serialize, Deserialize, JsonSchema, Display, PartialEq)] pub enum Base16Value { Base00, Base01, @@ -92,7 +93,7 @@ impl Base16Value { } } -#[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema)] +#[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, Display, PartialEq)] pub enum Catppuccin { Frappe, Latte, @@ -117,7 +118,7 @@ impl From for catppuccin_egui::Theme { } } -#[derive(Copy, Clone, Debug, Default, Serialize, Deserialize, JsonSchema)] +#[derive(Copy, Clone, Debug, Default, Serialize, Deserialize, JsonSchema, Display, PartialEq)] pub enum CatppuccinValue { Rosewater, Flamingo, diff --git a/komorebi/src/animation/mod.rs b/komorebi/src/animation/mod.rs index 47bf763c..4b2ab46c 100644 --- a/komorebi/src/animation/mod.rs +++ b/komorebi/src/animation/mod.rs @@ -22,7 +22,7 @@ use schemars::JsonSchema; use serde::Deserialize; use serde::Serialize; -#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema)] +#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq)] #[serde(untagged)] pub enum PerAnimationPrefixConfig { Prefix(HashMap), diff --git a/komorebi/src/border_manager/mod.rs b/komorebi/src/border_manager/mod.rs index 88b088fb..914dba56 100644 --- a/komorebi/src/border_manager/mod.rs +++ b/komorebi/src/border_manager/mod.rs @@ -29,6 +29,7 @@ use std::sync::atomic::AtomicU32; use std::sync::atomic::Ordering; use std::sync::Arc; use std::sync::OnceLock; +use strum::Display; use windows::Win32::Graphics::Direct2D::ID2D1HwndRenderTarget; pub static BORDER_WIDTH: AtomicI32 = AtomicI32::new(8); @@ -579,7 +580,7 @@ pub fn handle_notifications(wm: Arc>) -> color_eyre::Result Ok(()) } -#[derive(Debug, Copy, Clone, Serialize, Deserialize, JsonSchema)] +#[derive(Debug, Copy, Clone, Display, Serialize, Deserialize, JsonSchema, PartialEq)] pub enum ZOrder { Top, NoTopMost, diff --git a/komorebi/src/colour.rs b/komorebi/src/colour.rs index 7577ccd0..efa9ef47 100644 --- a/komorebi/src/colour.rs +++ b/komorebi/src/colour.rs @@ -8,7 +8,7 @@ use schemars::JsonSchema; use serde::Deserialize; use serde::Serialize; -#[derive(Debug, Copy, Clone, Serialize, Deserialize, JsonSchema)] +#[derive(Debug, Copy, Clone, Serialize, Deserialize, JsonSchema, PartialEq)] #[serde(untagged)] pub enum Colour { /// Colour represented as RGB @@ -51,7 +51,7 @@ impl From for Color32 { } } -#[derive(Debug, Copy, Clone, Serialize, Deserialize)] +#[derive(Debug, Copy, Clone, Serialize, Deserialize, PartialEq)] pub struct Hex(HexColor); impl JsonSchema for Hex { @@ -78,7 +78,7 @@ impl From for u32 { } } -#[derive(Debug, Copy, Clone, Serialize, Deserialize, JsonSchema)] +#[derive(Debug, Copy, Clone, Serialize, Deserialize, JsonSchema, PartialEq)] pub struct Rgb { /// Red pub r: u32, diff --git a/komorebi/src/core/animation.rs b/komorebi/src/core/animation.rs index 19e410b0..258b50d5 100644 --- a/komorebi/src/core/animation.rs +++ b/komorebi/src/core/animation.rs @@ -6,7 +6,16 @@ use strum::Display; use strum::EnumString; #[derive( - Copy, Clone, Debug, Serialize, Deserialize, Display, EnumString, ValueEnum, JsonSchema, + Copy, + Clone, + Debug, + Serialize, + Deserialize, + Display, + EnumString, + ValueEnum, + JsonSchema, + PartialEq, )] pub enum AnimationStyle { Linear, diff --git a/komorebi/src/core/config_generation.rs b/komorebi/src/core/config_generation.rs index 932a5f8a..f45c965c 100644 --- a/komorebi/src/core/config_generation.rs +++ b/komorebi/src/core/config_generation.rs @@ -75,7 +75,7 @@ pub struct IdWithIdentifier { pub matching_strategy: Option, } -#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize, JsonSchema)] +#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize, Display, JsonSchema)] pub enum MatchingStrategy { Legacy, Equals, diff --git a/komorebi/src/core/mod.rs b/komorebi/src/core/mod.rs index 56cdfc40..ba29d215 100644 --- a/komorebi/src/core/mod.rs +++ b/komorebi/src/core/mod.rs @@ -432,7 +432,16 @@ pub enum MoveBehaviour { } #[derive( - Clone, Copy, Debug, Serialize, Deserialize, Display, EnumString, ValueEnum, JsonSchema, + Clone, + Copy, + Debug, + Serialize, + Deserialize, + Display, + EnumString, + ValueEnum, + JsonSchema, + PartialEq, )] pub enum CrossBoundaryBehaviour { /// Attempt to perform actions across a workspace boundary @@ -442,7 +451,16 @@ pub enum CrossBoundaryBehaviour { } #[derive( - Copy, Clone, Debug, Serialize, Deserialize, Display, EnumString, ValueEnum, JsonSchema, + Copy, + Clone, + Debug, + Serialize, + Deserialize, + Display, + EnumString, + ValueEnum, + JsonSchema, + PartialEq, )] pub enum HidingBehaviour { /// Use the SW_HIDE flag to hide windows when switching workspaces (has issues with Electron apps) diff --git a/komorebi/src/monitor.rs b/komorebi/src/monitor.rs index 64a74e6b..f8cec260 100644 --- a/komorebi/src/monitor.rs +++ b/komorebi/src/monitor.rs @@ -118,6 +118,26 @@ pub fn new( } impl Monitor { + pub fn new( + id: isize, + size: Rect, + work_area_size: Rect, + name: String, + device: String, + device_id: String, + serial_number_id: Option, + ) -> Self { + new( + id, + size, + work_area_size, + name, + device, + device_id, + serial_number_id, + ) + } + pub fn placeholder() -> Self { Self { id: 0, diff --git a/komorebi/src/static_config.rs b/komorebi/src/static_config.rs index af2227d9..4dcdfde9 100644 --- a/komorebi/src/static_config.rs +++ b/komorebi/src/static_config.rs @@ -101,21 +101,26 @@ use std::sync::Arc; use uds_windows::UnixListener; use uds_windows::UnixStream; -#[derive(Debug, Serialize, Deserialize, JsonSchema)] +#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq)] pub struct BorderColours { /// Border colour when the container contains a single window + #[serde(skip_serializing_if = "Option::is_none")] pub single: Option, /// Border colour when the container contains multiple windows + #[serde(skip_serializing_if = "Option::is_none")] pub stack: Option, /// Border colour when the container is in monocle mode + #[serde(skip_serializing_if = "Option::is_none")] pub monocle: Option, /// Border colour when the container is in floating mode + #[serde(skip_serializing_if = "Option::is_none")] pub floating: Option, /// Border colour when the container is unfocused + #[serde(skip_serializing_if = "Option::is_none")] pub unfocused: Option, } -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)] +#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq)] pub struct WorkspaceConfig { /// Name pub name: String, @@ -223,7 +228,7 @@ impl From<&Workspace> for WorkspaceConfig { } } -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)] +#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq)] pub struct MonitorConfig { /// Workspace configurations pub workspaces: Vec, @@ -254,7 +259,7 @@ impl From<&Monitor> for MonitorConfig { } } -#[derive(Debug, Serialize, Deserialize, JsonSchema)] +#[derive(Clone, Debug, Default, Serialize, Deserialize, JsonSchema, PartialEq)] /// The `komorebi.json` static configuration file reference for `v0.1.34` pub struct StaticConfig { /// DEPRECATED from v0.1.22: no longer required @@ -391,8 +396,8 @@ pub struct StaticConfig { #[serde(skip_serializing_if = "Option::is_none")] pub slow_application_compensation_time: Option, /// Komorebi status bar configuration files for multiple instances on different monitors - #[serde(skip_serializing_if = "Option::is_none")] // this option is a little special because it is only consumed by komorebic + #[serde(skip_serializing_if = "Option::is_none")] pub bar_configurations: Option>, /// HEAVILY DISCOURAGED: Identify applications for which komorebi should forcibly remove title bars #[serde(skip_serializing_if = "Option::is_none")] @@ -402,18 +407,22 @@ pub struct StaticConfig { pub floating_window_aspect_ratio: Option, } -#[derive(Debug, Serialize, Deserialize, JsonSchema)] +#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq)] pub struct AnimationsConfig { /// Enable or disable animations (default: false) - enabled: PerAnimationPrefixConfig, + pub enabled: PerAnimationPrefixConfig, /// Set the animation duration in ms (default: 250) - duration: Option>, + #[serde(skip_serializing_if = "Option::is_none")] + pub duration: Option>, /// Set the animation style (default: Linear) - style: Option>, + #[serde(skip_serializing_if = "Option::is_none")] + pub style: Option>, /// Set the animation FPS (default: 60) - fps: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub fps: Option, } -#[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema)] + +#[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq)] #[serde(tag = "palette")] pub enum KomorebiTheme { /// A theme from catppuccin-egui @@ -421,22 +430,31 @@ pub enum KomorebiTheme { /// Name of the Catppuccin theme (theme previews: https://github.com/catppuccin/catppuccin) name: komorebi_themes::Catppuccin, /// Border colour when the container contains a single window (default: Blue) + #[serde(skip_serializing_if = "Option::is_none")] single_border: Option, /// Border colour when the container contains multiple windows (default: Green) + #[serde(skip_serializing_if = "Option::is_none")] stack_border: Option, /// Border colour when the container is in monocle mode (default: Pink) + #[serde(skip_serializing_if = "Option::is_none")] monocle_border: Option, /// Border colour when the window is floating (default: Yellow) + #[serde(skip_serializing_if = "Option::is_none")] floating_border: Option, /// Border colour when the container is unfocused (default: Base) + #[serde(skip_serializing_if = "Option::is_none")] unfocused_border: Option, /// Stackbar focused tab text colour (default: Green) + #[serde(skip_serializing_if = "Option::is_none")] stackbar_focused_text: Option, /// Stackbar unfocused tab text colour (default: Text) + #[serde(skip_serializing_if = "Option::is_none")] stackbar_unfocused_text: Option, /// Stackbar tab background colour (default: Base) + #[serde(skip_serializing_if = "Option::is_none")] stackbar_background: Option, /// Komorebi status bar accent (default: Blue) + #[serde(skip_serializing_if = "Option::is_none")] bar_accent: Option, }, /// A theme from base16-egui-themes @@ -444,22 +462,31 @@ pub enum KomorebiTheme { /// Name of the Base16 theme (theme previews: https://tinted-theming.github.io/tinted-gallery/) name: komorebi_themes::Base16, /// Border colour when the container contains a single window (default: Base0D) + #[serde(skip_serializing_if = "Option::is_none")] single_border: Option, /// Border colour when the container contains multiple windows (default: Base0B) + #[serde(skip_serializing_if = "Option::is_none")] stack_border: Option, /// Border colour when the container is in monocle mode (default: Base0F) + #[serde(skip_serializing_if = "Option::is_none")] monocle_border: Option, /// Border colour when the window is floating (default: Base09) + #[serde(skip_serializing_if = "Option::is_none")] floating_border: Option, /// Border colour when the container is unfocused (default: Base01) + #[serde(skip_serializing_if = "Option::is_none")] unfocused_border: Option, /// Stackbar focused tab text colour (default: Base0B) + #[serde(skip_serializing_if = "Option::is_none")] stackbar_focused_text: Option, /// Stackbar unfocused tab text colour (default: Base05) + #[serde(skip_serializing_if = "Option::is_none")] stackbar_unfocused_text: Option, /// Stackbar tab background colour (default: Base01) + #[serde(skip_serializing_if = "Option::is_none")] stackbar_background: Option, /// Komorebi status bar accent (default: Base0D) + #[serde(skip_serializing_if = "Option::is_none")] bar_accent: Option, }, } @@ -545,31 +572,41 @@ impl StaticConfig { } } -#[derive(Debug, Serialize, Deserialize, JsonSchema)] +#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq)] pub struct TabsConfig { /// Width of a stackbar tab - width: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub width: Option, /// Focused tab text colour - focused_text: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub focused_text: Option, /// Unfocused tab text colour - unfocused_text: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub unfocused_text: Option, /// Tab background colour - background: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub background: Option, /// Font family - font_family: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub font_family: Option, /// Font size - font_size: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub font_size: Option, } -#[derive(Debug, Serialize, Deserialize, JsonSchema)] +#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq)] pub struct StackbarConfig { /// Stackbar height + #[serde(skip_serializing_if = "Option::is_none")] pub height: Option, /// Stackbar label + #[serde(skip_serializing_if = "Option::is_none")] pub label: Option, /// Stackbar mode + #[serde(skip_serializing_if = "Option::is_none")] pub mode: Option, /// Stackbar tab configuration options + #[serde(skip_serializing_if = "Option::is_none")] pub tabs: Option, } diff --git a/komorebi/src/window.rs b/komorebi/src/window.rs index 358da482..a191db50 100644 --- a/komorebi/src/window.rs +++ b/komorebi/src/window.rs @@ -40,6 +40,8 @@ use serde::ser::SerializeStruct; use serde::Deserialize; use serde::Serialize; use serde::Serializer; +use strum::Display; +use strum::EnumString; use windows::Win32::Foundation::HWND; use crate::core::ApplicationIdentifier; @@ -297,7 +299,9 @@ impl RenderDispatcher for TransparencyRenderDispatcher { } } -#[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema)] +#[derive( + Copy, Clone, Debug, Display, EnumString, Serialize, Deserialize, JsonSchema, PartialEq, +)] #[serde(untagged)] pub enum AspectRatio { /// A predefined aspect ratio @@ -306,13 +310,22 @@ pub enum AspectRatio { Custom(i32, i32), } -#[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema)] +impl Default for AspectRatio { + fn default() -> Self { + AspectRatio::Predefined(PredefinedAspectRatio::default()) + } +} + +#[derive( + Copy, Clone, Debug, Default, Display, EnumString, Serialize, Deserialize, JsonSchema, PartialEq, +)] pub enum PredefinedAspectRatio { /// 21:9 Ultrawide, /// 16:9 Widescreen, /// 4:3 + #[default] Standard, }