From c07689de908fda9ed64060c8535f92726c099bd5 Mon Sep 17 00:00:00 2001 From: LGUG2Z Date: Thu, 27 Feb 2025 17:12:49 -0800 Subject: [PATCH] refactor(cargo): upgrade to rust edition 2024 --- komorebi-bar/Cargo.toml | 2 +- komorebi-bar/src/bar.rs | 32 ++-- komorebi-bar/src/battery.rs | 4 +- komorebi-bar/src/config.rs | 6 +- komorebi-bar/src/cpu.rs | 2 +- komorebi-bar/src/date.rs | 2 +- komorebi-bar/src/keyboard.rs | 2 +- komorebi-bar/src/komorebi.rs | 16 +- komorebi-bar/src/komorebi_layout.rs | 4 +- komorebi-bar/src/main.rs | 20 ++- komorebi-bar/src/media.rs | 4 +- komorebi-bar/src/memory.rs | 2 +- komorebi-bar/src/network.rs | 2 +- komorebi-bar/src/render.rs | 2 +- komorebi-bar/src/storage.rs | 2 +- komorebi-bar/src/time.rs | 2 +- komorebi-bar/src/update.rs | 2 +- komorebi-client/Cargo.toml | 2 +- komorebi-client/src/lib.rs | 44 ++--- komorebi-gui/Cargo.toml | 2 +- komorebi-gui/src/main.rs | 13 +- komorebi-themes/Cargo.toml | 2 +- komorebi/Cargo.toml | 2 +- komorebi/src/animation/animation_manager.rs | 2 +- komorebi/src/animation/engine.rs | 2 +- komorebi/src/animation/lerp.rs | 2 +- komorebi/src/animation/mod.rs | 2 +- komorebi/src/border_manager/border.rs | 40 ++--- komorebi/src/border_manager/mod.rs | 116 +++++++------ komorebi/src/colour.rs | 4 +- komorebi/src/com/interfaces.rs | 16 +- komorebi/src/com/mod.rs | 6 +- komorebi/src/core/arrangement.rs | 6 +- komorebi/src/core/custom_layout.rs | 2 +- komorebi/src/core/direction.rs | 4 +- komorebi/src/core/mod.rs | 4 +- komorebi/src/core/operation_direction.rs | 2 +- komorebi/src/focus_manager.rs | 16 +- komorebi/src/lib.rs | 4 +- komorebi/src/main.rs | 56 +++--- komorebi/src/monitor.rs | 12 +- komorebi/src/monitor_reconciliator/hidden.rs | 27 +-- komorebi/src/monitor_reconciliator/mod.rs | 42 +++-- komorebi/src/process_command.rs | 172 ++++++++++--------- komorebi/src/process_event.rs | 22 +-- komorebi/src/process_movement.rs | 2 +- komorebi/src/reaper.rs | 46 ++--- komorebi/src/stackbar_manager/mod.rs | 37 ++-- komorebi/src/stackbar_manager/stackbar.rs | 46 ++--- komorebi/src/static_config.rs | 76 ++++---- komorebi/src/theme_manager.rs | 22 +-- komorebi/src/transparency_manager.rs | 30 ++-- komorebi/src/window.rs | 76 ++++---- komorebi/src/window_manager.rs | 135 ++++++++------- komorebi/src/window_manager_event.rs | 6 +- komorebi/src/windows_api.rs | 114 ++++++------ komorebi/src/windows_callbacks.rs | 4 +- komorebi/src/winevent_listener.rs | 4 +- komorebi/src/workspace.rs | 16 +- komorebi/src/workspace_reconciliator.rs | 24 +-- komorebic-no-console/Cargo.toml | 2 +- komorebic/Cargo.toml | 2 +- komorebic/src/main.rs | 141 ++++++++++----- 63 files changed, 822 insertions(+), 691 deletions(-) diff --git a/komorebi-bar/Cargo.toml b/komorebi-bar/Cargo.toml index 42b002dd..318ad055 100644 --- a/komorebi-bar/Cargo.toml +++ b/komorebi-bar/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "komorebi-bar" version = "0.1.35" -edition = "2021" +edition = "2024" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/komorebi-bar/src/bar.rs b/komorebi-bar/src/bar.rs index 1ddc636d..b202e242 100644 --- a/komorebi-bar/src/bar.rs +++ b/komorebi-bar/src/bar.rs @@ -1,9 +1,16 @@ -use crate::config::get_individual_spacing; +use crate::BAR_HEIGHT; +use crate::DEFAULT_PADDING; +use crate::KomorebiEvent; +use crate::MAX_LABEL_WIDTH; +use crate::MONITOR_LEFT; +use crate::MONITOR_RIGHT; +use crate::MONITOR_TOP; use crate::config::KomobarConfig; use crate::config::KomobarTheme; use crate::config::MonitorConfigOrIndex; use crate::config::Position; use crate::config::PositionConfig; +use crate::config::get_individual_spacing; use crate::komorebi::Komorebi; use crate::komorebi::KomorebiNotificationState; use crate::process_hwnd; @@ -13,13 +20,6 @@ use crate::render::RenderConfig; use crate::render::RenderExt; use crate::widget::BarWidget; use crate::widget::WidgetConfig; -use crate::KomorebiEvent; -use crate::BAR_HEIGHT; -use crate::DEFAULT_PADDING; -use crate::MAX_LABEL_WIDTH; -use crate::MONITOR_LEFT; -use crate::MONITOR_RIGHT; -use crate::MONITOR_TOP; use crossbeam_channel::Receiver; use crossbeam_channel::TryRecvError; use eframe::egui::Align; @@ -47,16 +47,16 @@ use komorebi_client::KomorebiTheme; use komorebi_client::MonitorNotification; use komorebi_client::NotificationEvent; use komorebi_client::SocketMessage; -use komorebi_themes::catppuccin_egui; use komorebi_themes::Base16Value; use komorebi_themes::Catppuccin; use komorebi_themes::CatppuccinValue; +use komorebi_themes::catppuccin_egui; use std::cell::RefCell; use std::collections::HashMap; use std::path::PathBuf; use std::rc::Rc; -use std::sync::atomic::Ordering; use std::sync::Arc; +use std::sync::atomic::Ordering; pub struct Komobar { pub hwnd: Option, @@ -373,10 +373,14 @@ impl Komobar { } } } else if self.komorebi_notification_state.is_some() && !self.disabled { - tracing::warn!("couldn't find the monitor index of this bar! Disabling the bar until the monitor connects..."); + tracing::warn!( + "couldn't find the monitor index of this bar! Disabling the bar until the monitor connects..." + ); self.disabled = true; } else { - tracing::warn!("couldn't find the monitor index of this bar, if the bar is starting up this is normal until it receives the first state from komorebi."); + tracing::warn!( + "couldn't find the monitor index of this bar, if the bar is starting up this is normal until it receives the first state from komorebi." + ); self.disabled = true; } @@ -419,7 +423,9 @@ impl Komobar { end.x -= margin.left + margin.right; if end.y == 0.0 { - tracing::warn!("position.end.y is set to 0.0 which will make your bar invisible on a config reload - this is usually set to 50.0 by default") + tracing::warn!( + "position.end.y is set to 0.0 which will make your bar invisible on a config reload - this is usually set to 50.0 by default" + ) } self.size_rect = komorebi_client::Rect { diff --git a/komorebi-bar/src/battery.rs b/komorebi-bar/src/battery.rs index 84ba5990..28d87b50 100644 --- a/komorebi-bar/src/battery.rs +++ b/komorebi-bar/src/battery.rs @@ -2,18 +2,18 @@ use crate::config::LabelPrefix; use crate::render::RenderConfig; use crate::selected_frame::SelectableFrame; use crate::widget::BarWidget; -use eframe::egui::text::LayoutJob; use eframe::egui::Align; use eframe::egui::Context; use eframe::egui::Label; use eframe::egui::TextFormat; use eframe::egui::Ui; +use eframe::egui::text::LayoutJob; use schemars::JsonSchema; use serde::Deserialize; use serde::Serialize; -use starship_battery::units::ratio::percent; use starship_battery::Manager; use starship_battery::State; +use starship_battery::units::ratio::percent; use std::process::Command; use std::time::Duration; use std::time::Instant; diff --git a/komorebi-bar/src/config.rs b/komorebi-bar/src/config.rs index 38adb891..49a18b6c 100644 --- a/komorebi-bar/src/config.rs +++ b/komorebi-bar/src/config.rs @@ -1,6 +1,6 @@ +use crate::DEFAULT_PADDING; use crate::render::Grouping; use crate::widget::WidgetConfig; -use crate::DEFAULT_PADDING; use eframe::egui::Pos2; use eframe::egui::TextBuffer; use eframe::egui::Vec2; @@ -115,7 +115,9 @@ impl KomobarConfig { } if display { - println!("\nYour bar configuration file contains some options that have been renamed or deprecated:\n"); + println!( + "\nYour bar configuration file contains some options that have been renamed or deprecated:\n" + ); for (canonical, aliases) in map { for alias in aliases { if raw.contains(alias) { diff --git a/komorebi-bar/src/cpu.rs b/komorebi-bar/src/cpu.rs index 83017842..f8fe0921 100644 --- a/komorebi-bar/src/cpu.rs +++ b/komorebi-bar/src/cpu.rs @@ -2,12 +2,12 @@ use crate::config::LabelPrefix; use crate::render::RenderConfig; use crate::selected_frame::SelectableFrame; use crate::widget::BarWidget; -use eframe::egui::text::LayoutJob; use eframe::egui::Align; use eframe::egui::Context; use eframe::egui::Label; use eframe::egui::TextFormat; use eframe::egui::Ui; +use eframe::egui::text::LayoutJob; use schemars::JsonSchema; use serde::Deserialize; use serde::Serialize; diff --git a/komorebi-bar/src/date.rs b/komorebi-bar/src/date.rs index f68dc0eb..de4dc880 100644 --- a/komorebi-bar/src/date.rs +++ b/komorebi-bar/src/date.rs @@ -2,13 +2,13 @@ use crate::config::LabelPrefix; use crate::render::RenderConfig; use crate::selected_frame::SelectableFrame; use crate::widget::BarWidget; -use eframe::egui::text::LayoutJob; use eframe::egui::Align; use eframe::egui::Context; use eframe::egui::Label; use eframe::egui::TextFormat; use eframe::egui::Ui; use eframe::egui::WidgetText; +use eframe::egui::text::LayoutJob; use schemars::JsonSchema; use serde::Deserialize; use serde::Serialize; diff --git a/komorebi-bar/src/keyboard.rs b/komorebi-bar/src/keyboard.rs index 14143e7d..76cb647a 100755 --- a/komorebi-bar/src/keyboard.rs +++ b/komorebi-bar/src/keyboard.rs @@ -1,13 +1,13 @@ use crate::config::LabelPrefix; use crate::render::RenderConfig; use crate::widget::BarWidget; -use eframe::egui::text::LayoutJob; use eframe::egui::Align; use eframe::egui::Context; use eframe::egui::Label; use eframe::egui::TextFormat; use eframe::egui::Ui; use eframe::egui::WidgetText; +use eframe::egui::text::LayoutJob; use schemars::JsonSchema; use serde::Deserialize; use serde::Serialize; diff --git a/komorebi-bar/src/komorebi.rs b/komorebi-bar/src/komorebi.rs index c480ebe1..bd47bf80 100644 --- a/komorebi-bar/src/komorebi.rs +++ b/komorebi-bar/src/komorebi.rs @@ -1,3 +1,6 @@ +use crate::ICON_CACHE; +use crate::MAX_LABEL_WIDTH; +use crate::MONITOR_INDEX; use crate::bar::apply_theme; use crate::config::DisplayFormat; use crate::config::KomobarTheme; @@ -8,10 +11,6 @@ use crate::render::RenderConfig; use crate::selected_frame::SelectableFrame; use crate::ui::CustomUi; use crate::widget::BarWidget; -use crate::ICON_CACHE; -use crate::MAX_LABEL_WIDTH; -use crate::MONITOR_INDEX; -use eframe::egui::vec2; use eframe::egui::Color32; use eframe::egui::ColorImage; use eframe::egui::Context; @@ -28,6 +27,7 @@ use eframe::egui::TextureHandle; use eframe::egui::TextureOptions; use eframe::egui::Ui; use eframe::egui::Vec2; +use eframe::egui::vec2; use image::RgbaImage; use komorebi_client::Container; use komorebi_client::NotificationEvent; @@ -599,9 +599,13 @@ impl KomorebiNotificationState { grouping, render_config, ); - tracing::info!("removed theme from updated komorebi.json and applied default theme"); + tracing::info!( + "removed theme from updated komorebi.json and applied default theme" + ); } else { - tracing::warn!("theme was removed from updated komorebi.json but there was no default theme to apply"); + tracing::warn!( + "theme was removed from updated komorebi.json but there was no default theme to apply" + ); } } } diff --git a/komorebi-bar/src/komorebi_layout.rs b/komorebi-bar/src/komorebi_layout.rs index a2926f09..3b233008 100644 --- a/komorebi-bar/src/komorebi_layout.rs +++ b/komorebi-bar/src/komorebi_layout.rs @@ -2,7 +2,6 @@ use crate::config::DisplayFormat; use crate::komorebi::KomorebiLayoutConfig; use crate::render::RenderConfig; use crate::selected_frame::SelectableFrame; -use eframe::egui::vec2; use eframe::egui::Context; use eframe::egui::CornerRadius; use eframe::egui::FontId; @@ -13,12 +12,13 @@ use eframe::egui::Stroke; use eframe::egui::StrokeKind; use eframe::egui::Ui; use eframe::egui::Vec2; +use eframe::egui::vec2; use komorebi_client::SocketMessage; use schemars::JsonSchema; -use serde::de::Error; use serde::Deserialize; use serde::Deserializer; use serde::Serialize; +use serde::de::Error; use serde_json::from_str; use std::fmt::Display; use std::fmt::Formatter; diff --git a/komorebi-bar/src/main.rs b/komorebi-bar/src/main.rs index de6e0f0b..fc7c8e8f 100644 --- a/komorebi-bar/src/main.rs +++ b/komorebi-bar/src/main.rs @@ -30,24 +30,24 @@ use hotwatch::Hotwatch; use image::RgbaImage; use komorebi_client::SocketMessage; use komorebi_client::SubscribeOptions; -use schemars::gen::SchemaSettings; +use schemars::r#gen::SchemaSettings; use std::collections::HashMap; use std::io::BufReader; use std::io::Read; use std::path::PathBuf; +use std::sync::LazyLock; +use std::sync::Mutex; use std::sync::atomic::AtomicI32; use std::sync::atomic::AtomicUsize; use std::sync::atomic::Ordering; -use std::sync::LazyLock; -use std::sync::Mutex; use std::time::Duration; use tracing_subscriber::EnvFilter; use windows::Win32::Foundation::HWND; use windows::Win32::Foundation::LPARAM; use windows::Win32::System::Threading::GetCurrentProcessId; use windows::Win32::System::Threading::GetCurrentThreadId; -use windows::Win32::UI::HiDpi::SetProcessDpiAwarenessContext; use windows::Win32::UI::HiDpi::DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2; +use windows::Win32::UI::HiDpi::SetProcessDpiAwarenessContext; use windows::Win32::UI::WindowsAndMessaging::EnumThreadWindows; use windows::Win32::UI::WindowsAndMessaging::GetWindowThreadProcessId; use windows_core::BOOL; @@ -132,8 +132,8 @@ fn main() -> color_eyre::Result<()> { s.inline_subschemas = true; }); - let gen = settings.into_generator(); - let socket_message = gen.into_root_schema_for::(); + let r#gen = settings.into_generator(); + let socket_message = r#gen.into_root_schema_for::(); let schema = serde_json::to_string_pretty(&socket_message)?; println!("{schema}"); @@ -149,13 +149,15 @@ fn main() -> color_eyre::Result<()> { } if std::env::var("RUST_LIB_BACKTRACE").is_err() { - std::env::set_var("RUST_LIB_BACKTRACE", "1"); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { std::env::set_var("RUST_LIB_BACKTRACE", "1") }; } color_eyre::install()?; if std::env::var("RUST_LOG").is_err() { - std::env::set_var("RUST_LOG", "info"); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { std::env::set_var("RUST_LOG", "info") }; } tracing::subscriber::set_global_default( @@ -349,7 +351,7 @@ fn main() -> color_eyre::Result<()> { let ctx_komorebi = cc.egui_ctx.clone(); std::thread::spawn(move || { - let subscriber_name = format!("komorebi-bar-{}", random_word::gen(random_word::Lang::En)); + let subscriber_name = format!("komorebi-bar-{}", random_word::r#gen(random_word::Lang::En)); let listener = komorebi_client::subscribe_with_options(&subscriber_name, SubscribeOptions { filter_state_changes: true, diff --git a/komorebi-bar/src/media.rs b/komorebi-bar/src/media.rs index c163c2e8..fb27039b 100644 --- a/komorebi-bar/src/media.rs +++ b/komorebi-bar/src/media.rs @@ -1,15 +1,15 @@ +use crate::MAX_LABEL_WIDTH; use crate::render::RenderConfig; use crate::selected_frame::SelectableFrame; use crate::ui::CustomUi; use crate::widget::BarWidget; -use crate::MAX_LABEL_WIDTH; -use eframe::egui::text::LayoutJob; use eframe::egui::Align; use eframe::egui::Context; use eframe::egui::Label; use eframe::egui::TextFormat; use eframe::egui::Ui; use eframe::egui::Vec2; +use eframe::egui::text::LayoutJob; use schemars::JsonSchema; use serde::Deserialize; use serde::Serialize; diff --git a/komorebi-bar/src/memory.rs b/komorebi-bar/src/memory.rs index 7fcf7317..8ef911d1 100644 --- a/komorebi-bar/src/memory.rs +++ b/komorebi-bar/src/memory.rs @@ -2,12 +2,12 @@ use crate::config::LabelPrefix; use crate::render::RenderConfig; use crate::selected_frame::SelectableFrame; use crate::widget::BarWidget; -use eframe::egui::text::LayoutJob; use eframe::egui::Align; use eframe::egui::Context; use eframe::egui::Label; use eframe::egui::TextFormat; use eframe::egui::Ui; +use eframe::egui::text::LayoutJob; use schemars::JsonSchema; use serde::Deserialize; use serde::Serialize; diff --git a/komorebi-bar/src/network.rs b/komorebi-bar/src/network.rs index 3ee9bcaf..8f62e364 100644 --- a/komorebi-bar/src/network.rs +++ b/komorebi-bar/src/network.rs @@ -2,12 +2,12 @@ use crate::config::LabelPrefix; use crate::render::RenderConfig; use crate::selected_frame::SelectableFrame; use crate::widget::BarWidget; -use eframe::egui::text::LayoutJob; use eframe::egui::Align; use eframe::egui::Context; use eframe::egui::Label; use eframe::egui::TextFormat; use eframe::egui::Ui; +use eframe::egui::text::LayoutJob; use num_derive::FromPrimitive; use schemars::JsonSchema; use serde::Deserialize; diff --git a/komorebi-bar/src/render.rs b/komorebi-bar/src/render.rs index 4834d806..175183a6 100644 --- a/komorebi-bar/src/render.rs +++ b/komorebi-bar/src/render.rs @@ -14,9 +14,9 @@ use eframe::egui::Ui; use schemars::JsonSchema; use serde::Deserialize; use serde::Serialize; +use std::sync::Arc; use std::sync::atomic::AtomicUsize; use std::sync::atomic::Ordering; -use std::sync::Arc; static SHOW_KOMOREBI_LAYOUT_OPTIONS: AtomicUsize = AtomicUsize::new(0); diff --git a/komorebi-bar/src/storage.rs b/komorebi-bar/src/storage.rs index 805c34c5..12c85335 100644 --- a/komorebi-bar/src/storage.rs +++ b/komorebi-bar/src/storage.rs @@ -2,12 +2,12 @@ use crate::config::LabelPrefix; use crate::render::RenderConfig; use crate::selected_frame::SelectableFrame; use crate::widget::BarWidget; -use eframe::egui::text::LayoutJob; use eframe::egui::Align; use eframe::egui::Context; use eframe::egui::Label; use eframe::egui::TextFormat; use eframe::egui::Ui; +use eframe::egui::text::LayoutJob; use schemars::JsonSchema; use serde::Deserialize; use serde::Serialize; diff --git a/komorebi-bar/src/time.rs b/komorebi-bar/src/time.rs index 984da476..762582ed 100644 --- a/komorebi-bar/src/time.rs +++ b/komorebi-bar/src/time.rs @@ -3,7 +3,6 @@ use crate::config::LabelPrefix; use crate::render::RenderConfig; use crate::selected_frame::SelectableFrame; use crate::widget::BarWidget; -use eframe::egui::text::LayoutJob; use eframe::egui::Align; use eframe::egui::Context; use eframe::egui::CornerRadius; @@ -13,6 +12,7 @@ use eframe::egui::Stroke; use eframe::egui::TextFormat; use eframe::egui::Ui; use eframe::egui::Vec2; +use eframe::egui::text::LayoutJob; use eframe::epaint::StrokeKind; use schemars::JsonSchema; use serde::Deserialize; diff --git a/komorebi-bar/src/update.rs b/komorebi-bar/src/update.rs index d70f31d3..6db0e95f 100644 --- a/komorebi-bar/src/update.rs +++ b/komorebi-bar/src/update.rs @@ -2,12 +2,12 @@ use crate::config::LabelPrefix; use crate::render::RenderConfig; use crate::selected_frame::SelectableFrame; use crate::widget::BarWidget; -use eframe::egui::text::LayoutJob; use eframe::egui::Align; use eframe::egui::Context; use eframe::egui::Label; use eframe::egui::TextFormat; use eframe::egui::Ui; +use eframe::egui::text::LayoutJob; use schemars::JsonSchema; use serde::Deserialize; use serde::Serialize; diff --git a/komorebi-client/Cargo.toml b/komorebi-client/Cargo.toml index 10b36255..2be8b7cb 100644 --- a/komorebi-client/Cargo.toml +++ b/komorebi-client/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "komorebi-client" version = "0.1.35" -edition = "2021" +edition = "2024" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/komorebi-client/src/lib.rs b/komorebi-client/src/lib.rs index dea7c6a6..1269f596 100644 --- a/komorebi-client/src/lib.rs +++ b/komorebi-client/src/lib.rs @@ -1,8 +1,27 @@ #![warn(clippy::all)] #![allow(clippy::missing_errors_doc)] -pub use komorebi::animation::prefix::AnimationPrefix; +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::WindowsApi; +pub use komorebi::WorkspaceConfig; pub use komorebi::animation::PerAnimationPrefixConfig; +pub use komorebi::animation::prefix::AnimationPrefix; pub use komorebi::asc::ApplicationSpecificConfiguration; pub use komorebi::colour::Colour; pub use komorebi::colour::Rgb; @@ -12,8 +31,6 @@ 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; pub use komorebi::core::AnimationStyle; pub use komorebi::core::ApplicationIdentifier; pub use komorebi::core::Arrangement; @@ -42,6 +59,8 @@ pub use komorebi::core::StackbarLabel; pub use komorebi::core::StackbarMode; pub use komorebi::core::StateQuery; pub use komorebi::core::WindowKind; +pub use komorebi::core::config_generation::ApplicationConfigurationGenerator; +pub use komorebi::core::resolve_home_path; pub use komorebi::monitor::Monitor; pub use komorebi::monitor_reconciliator::MonitorNotification; pub use komorebi::ring::Ring; @@ -50,25 +69,6 @@ pub use komorebi::window_manager_event::WindowManagerEvent; pub use komorebi::workspace::Workspace; pub use komorebi::workspace::WorkspaceGlobals; pub use komorebi::workspace::WorkspaceLayer; -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::WindowsApi; -pub use komorebi::WorkspaceConfig; use komorebi::DATA_DIR; diff --git a/komorebi-gui/Cargo.toml b/komorebi-gui/Cargo.toml index 359d1c82..69f51153 100644 --- a/komorebi-gui/Cargo.toml +++ b/komorebi-gui/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "komorebi-gui" version = "0.1.35" -edition = "2021" +edition = "2024" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/komorebi-gui/src/main.rs b/komorebi-gui/src/main.rs index 593d4b8f..cc40aa38 100644 --- a/komorebi-gui/src/main.rs +++ b/komorebi-gui/src/main.rs @@ -1,9 +1,9 @@ #![warn(clippy::all)] use eframe::egui; -use eframe::egui::color_picker::Alpha; use eframe::egui::Color32; use eframe::egui::ViewportBuilder; +use eframe::egui::color_picker::Alpha; use komorebi_client::BorderStyle; use komorebi_client::Colour; use komorebi_client::DefaultLayout; @@ -101,7 +101,7 @@ impl From<&komorebi_client::Workspace> for WorkspaceConfig { let name = value .name() .to_owned() - .unwrap_or_else(|| random_word::gen(random_word::Lang::En).to_string()); + .unwrap_or_else(|| random_word::r#gen(random_word::Lang::En).to_string()); Self { layout, @@ -248,10 +248,11 @@ impl eframe::App for KomorebiGui { ui.collapsing("Window Rules", |ui| { let window = Window::from(self.debug_hwnd); - let label = if let (Ok(title), Ok(exe)) = (window.title(), window.exe()) { - format!("{title} ({exe})") - } else { - String::from("Select a Window") + let label = match (window.title(), window.exe()) { + (Ok(title), Ok(exe)) => { + format!("{title} ({exe})") + } + _ => String::from("Select a Window"), }; if ui.button("Refresh Windows").clicked() { diff --git a/komorebi-themes/Cargo.toml b/komorebi-themes/Cargo.toml index 07aa2f89..9cf67e6a 100644 --- a/komorebi-themes/Cargo.toml +++ b/komorebi-themes/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "komorebi-themes" version = "0.1.35" -edition = "2021" +edition = "2024" [dependencies] base16-egui-themes = { git = "https://github.com/LGUG2Z/base16-egui-themes", rev = "96f26c88d83781f234d42222293ec73d23a39ad8" } diff --git a/komorebi/Cargo.toml b/komorebi/Cargo.toml index 39546b34..5f190556 100644 --- a/komorebi/Cargo.toml +++ b/komorebi/Cargo.toml @@ -3,7 +3,7 @@ name = "komorebi" version = "0.1.35" description = "A tiling window manager for Windows" repository = "https://github.com/LGUG2Z/komorebi" -edition = "2021" +edition = "2024" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/komorebi/src/animation/animation_manager.rs b/komorebi/src/animation/animation_manager.rs index 5eb1587c..614b1051 100644 --- a/komorebi/src/animation/animation_manager.rs +++ b/komorebi/src/animation/animation_manager.rs @@ -1,5 +1,5 @@ -use std::collections::hash_map::Entry; use std::collections::HashMap; +use std::collections::hash_map::Entry; use super::prefix::AnimationPrefix; diff --git a/komorebi/src/animation/engine.rs b/komorebi/src/animation/engine.rs index ab12663c..d031004f 100644 --- a/komorebi/src/animation/engine.rs +++ b/komorebi/src/animation/engine.rs @@ -8,10 +8,10 @@ use std::sync::atomic::Ordering; use std::time::Duration; use std::time::Instant; -use super::RenderDispatcher; use super::ANIMATION_DURATION_GLOBAL; use super::ANIMATION_FPS; use super::ANIMATION_MANAGER; +use super::RenderDispatcher; #[derive(Debug, Default, Clone, Copy, Serialize, Deserialize, JsonSchema, PartialEq)] pub struct AnimationEngine; diff --git a/komorebi/src/animation/lerp.rs b/komorebi/src/animation/lerp.rs index 4044341c..98df60b9 100644 --- a/komorebi/src/animation/lerp.rs +++ b/komorebi/src/animation/lerp.rs @@ -1,5 +1,5 @@ -use crate::core::Rect; use crate::AnimationStyle; +use crate::core::Rect; use super::style::apply_ease_func; diff --git a/komorebi/src/animation/mod.rs b/komorebi/src/animation/mod.rs index 4b2ab46c..a5cfa0fc 100644 --- a/komorebi/src/animation/mod.rs +++ b/komorebi/src/animation/mod.rs @@ -4,9 +4,9 @@ use crate::core::animation::AnimationStyle; use lazy_static::lazy_static; use prefix::AnimationPrefix; use std::collections::HashMap; +use std::sync::Arc; use std::sync::atomic::AtomicBool; use std::sync::atomic::AtomicU64; -use std::sync::Arc; use parking_lot::Mutex; diff --git a/komorebi/src/border_manager/border.rs b/komorebi/src/border_manager/border.rs index 9c99ae47..b6670907 100644 --- a/komorebi/src/border_manager/border.rs +++ b/komorebi/src/border_manager/border.rs @@ -1,37 +1,34 @@ -use crate::border_manager::window_kind_colour; -use crate::border_manager::RenderTarget; -use crate::border_manager::WindowKind; +use crate::WINDOWS_11; +use crate::WindowsApi; use crate::border_manager::BORDER_OFFSET; use crate::border_manager::BORDER_WIDTH; use crate::border_manager::FOCUS_STATE; use crate::border_manager::RENDER_TARGETS; +use crate::border_manager::RenderTarget; use crate::border_manager::STYLE; +use crate::border_manager::WindowKind; +use crate::border_manager::window_kind_colour; use crate::core::BorderStyle; use crate::core::Rect; use crate::windows_api; -use crate::WindowsApi; -use crate::WINDOWS_11; use color_eyre::eyre::anyhow; use std::collections::HashMap; use std::ops::Deref; -use std::sync::atomic::Ordering; -use std::sync::mpsc; use std::sync::LazyLock; use std::sync::OnceLock; +use std::sync::atomic::Ordering; +use std::sync::mpsc; use windows::Win32::Foundation::FALSE; use windows::Win32::Foundation::HWND; use windows::Win32::Foundation::LPARAM; use windows::Win32::Foundation::LRESULT; use windows::Win32::Foundation::TRUE; use windows::Win32::Foundation::WPARAM; +use windows::Win32::Graphics::Direct2D::Common::D2D_RECT_F; +use windows::Win32::Graphics::Direct2D::Common::D2D_SIZE_U; use windows::Win32::Graphics::Direct2D::Common::D2D1_ALPHA_MODE_PREMULTIPLIED; use windows::Win32::Graphics::Direct2D::Common::D2D1_COLOR_F; use windows::Win32::Graphics::Direct2D::Common::D2D1_PIXEL_FORMAT; -use windows::Win32::Graphics::Direct2D::Common::D2D_RECT_F; -use windows::Win32::Graphics::Direct2D::Common::D2D_SIZE_U; -use windows::Win32::Graphics::Direct2D::D2D1CreateFactory; -use windows::Win32::Graphics::Direct2D::ID2D1Factory; -use windows::Win32::Graphics::Direct2D::ID2D1SolidColorBrush; use windows::Win32::Graphics::Direct2D::D2D1_ANTIALIAS_MODE_PER_PRIMITIVE; use windows::Win32::Graphics::Direct2D::D2D1_BRUSH_PROPERTIES; use windows::Win32::Graphics::Direct2D::D2D1_FACTORY_TYPE_MULTI_THREADED; @@ -40,28 +37,31 @@ use windows::Win32::Graphics::Direct2D::D2D1_PRESENT_OPTIONS_IMMEDIATELY; use windows::Win32::Graphics::Direct2D::D2D1_RENDER_TARGET_PROPERTIES; use windows::Win32::Graphics::Direct2D::D2D1_RENDER_TARGET_TYPE_DEFAULT; use windows::Win32::Graphics::Direct2D::D2D1_ROUNDED_RECT; -use windows::Win32::Graphics::Dwm::DwmEnableBlurBehindWindow; +use windows::Win32::Graphics::Direct2D::D2D1CreateFactory; +use windows::Win32::Graphics::Direct2D::ID2D1Factory; +use windows::Win32::Graphics::Direct2D::ID2D1SolidColorBrush; use windows::Win32::Graphics::Dwm::DWM_BB_BLURREGION; use windows::Win32::Graphics::Dwm::DWM_BB_ENABLE; use windows::Win32::Graphics::Dwm::DWM_BLURBEHIND; +use windows::Win32::Graphics::Dwm::DwmEnableBlurBehindWindow; use windows::Win32::Graphics::Dxgi::Common::DXGI_FORMAT_UNKNOWN; use windows::Win32::Graphics::Gdi::CreateRectRgn; use windows::Win32::Graphics::Gdi::InvalidateRect; use windows::Win32::Graphics::Gdi::ValidateRect; +use windows::Win32::UI::WindowsAndMessaging::CREATESTRUCTW; use windows::Win32::UI::WindowsAndMessaging::DefWindowProcW; use windows::Win32::UI::WindowsAndMessaging::DispatchMessageW; -use windows::Win32::UI::WindowsAndMessaging::GetMessageW; -use windows::Win32::UI::WindowsAndMessaging::GetSystemMetrics; -use windows::Win32::UI::WindowsAndMessaging::GetWindowLongPtrW; -use windows::Win32::UI::WindowsAndMessaging::PostQuitMessage; -use windows::Win32::UI::WindowsAndMessaging::SetWindowLongPtrW; -use windows::Win32::UI::WindowsAndMessaging::TranslateMessage; -use windows::Win32::UI::WindowsAndMessaging::CREATESTRUCTW; use windows::Win32::UI::WindowsAndMessaging::EVENT_OBJECT_DESTROY; use windows::Win32::UI::WindowsAndMessaging::EVENT_OBJECT_LOCATIONCHANGE; use windows::Win32::UI::WindowsAndMessaging::GWLP_USERDATA; +use windows::Win32::UI::WindowsAndMessaging::GetMessageW; +use windows::Win32::UI::WindowsAndMessaging::GetSystemMetrics; +use windows::Win32::UI::WindowsAndMessaging::GetWindowLongPtrW; use windows::Win32::UI::WindowsAndMessaging::MSG; +use windows::Win32::UI::WindowsAndMessaging::PostQuitMessage; use windows::Win32::UI::WindowsAndMessaging::SM_CXVIRTUALSCREEN; +use windows::Win32::UI::WindowsAndMessaging::SetWindowLongPtrW; +use windows::Win32::UI::WindowsAndMessaging::TranslateMessage; use windows::Win32::UI::WindowsAndMessaging::WM_CREATE; use windows::Win32::UI::WindowsAndMessaging::WM_DESTROY; use windows::Win32::UI::WindowsAndMessaging::WM_PAINT; diff --git a/komorebi/src/border_manager/mod.rs b/komorebi/src/border_manager/mod.rs index d86029cc..4d43e1cc 100644 --- a/komorebi/src/border_manager/mod.rs +++ b/komorebi/src/border_manager/mod.rs @@ -1,18 +1,18 @@ #![deny(clippy::unwrap_used, clippy::expect_used)] mod border; +use crate::Colour; +use crate::Rgb; +use crate::WindowManager; +use crate::WindowsApi; use crate::core::BorderImplementation; use crate::core::BorderStyle; use crate::core::WindowKind; use crate::ring::Ring; use crate::workspace::WorkspaceLayer; use crate::workspace_reconciliator::ALT_TAB_HWND; -use crate::Colour; -use crate::Rgb; -use crate::WindowManager; -use crate::WindowsApi; -use border::border_hwnds; pub use border::Border; +use border::border_hwnds; use crossbeam_channel::Receiver; use crossbeam_channel::Sender; use crossbeam_utils::atomic::AtomicCell; @@ -22,15 +22,15 @@ use parking_lot::Mutex; use schemars::JsonSchema; use serde::Deserialize; use serde::Serialize; -use std::collections::hash_map::Entry; use std::collections::HashMap; +use std::collections::hash_map::Entry; use std::ops::Deref; +use std::sync::Arc; +use std::sync::OnceLock; use std::sync::atomic::AtomicBool; use std::sync::atomic::AtomicI32; 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; @@ -146,13 +146,15 @@ fn window_kind_colour(focus_kind: WindowKind) -> u32 { } pub fn listen_for_notifications(wm: Arc>) { - std::thread::spawn(move || loop { - match handle_notifications(wm.clone()) { - Ok(()) => { - tracing::warn!("restarting finished thread"); - } - Err(error) => { - tracing::warn!("restarting failed thread: {}", error); + std::thread::spawn(move || { + loop { + match handle_notifications(wm.clone()) { + Ok(()) => { + tracing::warn!("restarting finished thread"); + } + Err(error) => { + tracing::warn!("restarting failed thread: {}", error); + } } } }); @@ -348,14 +350,17 @@ pub fn handle_notifications(wm: Arc>) -> color_eyre::Result let border = match borders.entry(monocle.id().clone()) { Entry::Occupied(entry) => entry.into_mut(), Entry::Vacant(entry) => { - if let Ok(border) = Border::create( + match Border::create( monocle.id(), monocle.focused_window().copied().unwrap_or_default().hwnd, ) { - new_border = true; - entry.insert(border) - } else { - continue 'monitors; + Ok(border) => { + new_border = true; + entry.insert(border) + } + _ => { + continue 'monitors; + } } } }; @@ -483,12 +488,14 @@ pub fn handle_notifications(wm: Arc>) -> color_eyre::Result let border = match borders.entry(c.id().clone()) { Entry::Occupied(entry) => entry.into_mut(), Entry::Vacant(entry) => { - if let Ok(border) = Border::create(c.id(), focused_window_hwnd) - { - new_border = true; - entry.insert(border) - } else { - continue 'monitors; + match Border::create(c.id(), focused_window_hwnd) { + Ok(border) => { + new_border = true; + entry.insert(border) + } + _ => { + continue 'monitors; + } } } }; @@ -515,31 +522,34 @@ pub fn handle_notifications(wm: Arc>) -> color_eyre::Result // tracking the correct window. if border.tracking_hwnd != focused_window_hwnd { // Create new border - if let Ok(b) = Border::create( + match Border::create( c.id(), c.focused_window().copied().unwrap_or_default().hwnd, ) { - // Destroy previously stacked border window and remove its hwnd - // and tracking_hwnd. - border.destroy()?; - focus_state.remove(&border.hwnd); - if let Some(previous) = - windows_borders.get(&border.tracking_hwnd) - { - // Only remove the border from `windows_borders` if it - // still is the same border, if it isn't then it means it - // was already updated by another border for that window - // and in that case we don't want to remove it. - if previous.hwnd == border.hwnd { - windows_borders.remove(&border.tracking_hwnd); + Ok(b) => { + // Destroy previously stacked border window and remove its hwnd + // and tracking_hwnd. + border.destroy()?; + focus_state.remove(&border.hwnd); + if let Some(previous) = + windows_borders.get(&border.tracking_hwnd) + { + // Only remove the border from `windows_borders` if it + // still is the same border, if it isn't then it means it + // was already updated by another border for that window + // and in that case we don't want to remove it. + if previous.hwnd == border.hwnd { + windows_borders.remove(&border.tracking_hwnd); + } } - } - // Replace with new border - new_border = true; - *border = b; - } else { - continue 'monitors; + // Replace with new border + new_border = true; + *border = b; + } + _ => { + continue 'monitors; + } } } @@ -591,13 +601,15 @@ pub fn handle_notifications(wm: Arc>) -> color_eyre::Result let border = match borders.entry(window.hwnd.to_string()) { Entry::Occupied(entry) => entry.into_mut(), Entry::Vacant(entry) => { - if let Ok(border) = - Border::create(&window.hwnd.to_string(), window.hwnd) + match Border::create(&window.hwnd.to_string(), window.hwnd) { - new_border = true; - entry.insert(border) - } else { - continue 'monitors; + Ok(border) => { + new_border = true; + entry.insert(border) + } + _ => { + continue 'monitors; + } } } }; diff --git a/komorebi/src/colour.rs b/komorebi/src/colour.rs index 77622e25..71549077 100644 --- a/komorebi/src/colour.rs +++ b/komorebi/src/colour.rs @@ -1,10 +1,10 @@ use hex_color::HexColor; use komorebi_themes::Color32; -use schemars::gen::SchemaGenerator; +use schemars::JsonSchema; +use schemars::r#gen::SchemaGenerator; use schemars::schema::InstanceType; use schemars::schema::Schema; use schemars::schema::SchemaObject; -use schemars::JsonSchema; use serde::Deserialize; use serde::Serialize; diff --git a/komorebi/src/com/interfaces.rs b/komorebi/src/com/interfaces.rs index 8299d7a8..ec657ca3 100644 --- a/komorebi/src/com/interfaces.rs +++ b/komorebi/src/com/interfaces.rs @@ -6,17 +6,17 @@ use std::ffi::c_void; use std::ops::Deref; -use windows::core::IUnknown; -use windows::core::IUnknown_Vtbl; -use windows::core::GUID; -use windows::core::HRESULT; -use windows::core::HSTRING; -use windows::core::PCWSTR; -use windows::core::PWSTR; use windows::Win32::Foundation::HWND; use windows::Win32::Foundation::RECT; use windows::Win32::Foundation::SIZE; use windows::Win32::UI::Shell::Common::IObjectArray; +use windows::core::GUID; +use windows::core::HRESULT; +use windows::core::HSTRING; +use windows::core::IUnknown; +use windows::core::IUnknown_Vtbl; +use windows::core::PCWSTR; +use windows::core::PWSTR; use windows_core::BOOL; type DesktopID = GUID; @@ -129,7 +129,7 @@ pub unsafe trait IApplicationView: IUnknown { pub unsafe fn get_app_user_model_id(&self, id: *mut PWSTR) -> HRESULT; // Proc17 pub unsafe fn set_app_user_model_id(&self, id: PCWSTR) -> HRESULT; pub unsafe fn is_equal_by_app_user_model_id(&self, id: PCWSTR, out_result: *mut INT) - -> HRESULT; + -> HRESULT; /*** IApplicationView methods ***/ pub unsafe fn get_view_state(&self, out_state: *mut UINT) -> HRESULT; // Proc20 diff --git a/komorebi/src/com/mod.rs b/komorebi/src/com/mod.rs index 352de590..b05eaa8c 100644 --- a/komorebi/src/com/mod.rs +++ b/komorebi/src/com/mod.rs @@ -11,11 +11,11 @@ use interfaces::IServiceProvider; use std::ffi::c_void; use windows::Win32::Foundation::HWND; +use windows::Win32::System::Com::CLSCTX_ALL; +use windows::Win32::System::Com::COINIT_MULTITHREADED; use windows::Win32::System::Com::CoCreateInstance; use windows::Win32::System::Com::CoInitializeEx; use windows::Win32::System::Com::CoUninitialize; -use windows::Win32::System::Com::CLSCTX_ALL; -use windows::Win32::System::Com::COINIT_MULTITHREADED; use windows_core::Interface; struct ComInit(); @@ -64,7 +64,7 @@ fn get_iapplication_view_collection(provider: &IServiceProvider) -> IApplication }) } -#[no_mangle] +#[unsafe(no_mangle)] pub extern "C" fn SetCloak(hwnd: HWND, cloak_type: u32, flags: i32) { COM_INIT.with(|_| { let provider = get_iservice_provider(); diff --git a/komorebi/src/core/arrangement.rs b/komorebi/src/core/arrangement.rs index 150b308a..3f6b87d6 100644 --- a/komorebi/src/core/arrangement.rs +++ b/komorebi/src/core/arrangement.rs @@ -7,12 +7,12 @@ use serde::Serialize; use strum::Display; use strum::EnumString; -use super::custom_layout::Column; -use super::custom_layout::ColumnSplit; -use super::custom_layout::ColumnSplitWithCapacity; use super::CustomLayout; use super::DefaultLayout; use super::Rect; +use super::custom_layout::Column; +use super::custom_layout::ColumnSplit; +use super::custom_layout::ColumnSplitWithCapacity; pub trait Arrangement { fn calculate( diff --git a/komorebi/src/core/custom_layout.rs b/komorebi/src/core/custom_layout.rs index 45d439f7..84ded10e 100644 --- a/komorebi/src/core/custom_layout.rs +++ b/komorebi/src/core/custom_layout.rs @@ -5,9 +5,9 @@ use std::ops::Deref; use std::ops::DerefMut; use std::path::Path; +use color_eyre::Result; use color_eyre::eyre::anyhow; use color_eyre::eyre::bail; -use color_eyre::Result; use schemars::JsonSchema; use serde::Deserialize; use serde::Serialize; diff --git a/komorebi/src/core/direction.rs b/komorebi/src/core/direction.rs index 37f95bcc..aca8d10c 100644 --- a/komorebi/src/core/direction.rs +++ b/komorebi/src/core/direction.rs @@ -1,9 +1,9 @@ +use super::DefaultLayout; +use super::OperationDirection; use super::custom_layout::Column; use super::custom_layout::ColumnSplit; use super::custom_layout::ColumnSplitWithCapacity; use super::custom_layout::CustomLayout; -use super::DefaultLayout; -use super::OperationDirection; pub trait Direction { fn index_in_direction( diff --git a/komorebi/src/core/mod.rs b/komorebi/src/core/mod.rs index c9fd4c11..e7c23cd3 100644 --- a/komorebi/src/core/mod.rs +++ b/komorebi/src/core/mod.rs @@ -6,16 +6,16 @@ use std::path::PathBuf; use std::str::FromStr; use clap::ValueEnum; -use color_eyre::eyre::anyhow; use color_eyre::Result; +use color_eyre::eyre::anyhow; use schemars::JsonSchema; use serde::Deserialize; use serde::Serialize; use strum::Display; use strum::EnumString; -use crate::animation::prefix::AnimationPrefix; use crate::KomorebiTheme; +use crate::animation::prefix::AnimationPrefix; pub use animation::AnimationStyle; pub use arrangement::Arrangement; pub use arrangement::Axis; diff --git a/komorebi/src/core/operation_direction.rs b/komorebi/src/core/operation_direction.rs index 2fdda9bc..23286718 100644 --- a/komorebi/src/core/operation_direction.rs +++ b/komorebi/src/core/operation_direction.rs @@ -7,8 +7,8 @@ use serde::Serialize; use strum::Display; use strum::EnumString; -use super::direction::Direction; use super::Axis; +use super::direction::Direction; #[derive( Clone, Copy, Debug, Serialize, Deserialize, Display, EnumString, ValueEnum, JsonSchema, diff --git a/komorebi/src/focus_manager.rs b/komorebi/src/focus_manager.rs index 1aa43561..e6055ff8 100644 --- a/komorebi/src/focus_manager.rs +++ b/komorebi/src/focus_manager.rs @@ -44,13 +44,15 @@ pub fn send_notification(hwnd: isize) { } pub fn listen_for_notifications(wm: Arc>) { - std::thread::spawn(move || loop { - match handle_notifications(wm.clone()) { - Ok(()) => { - tracing::warn!("restarting finished thread"); - } - Err(error) => { - tracing::warn!("restarting failed thread: {}", error); + std::thread::spawn(move || { + loop { + match handle_notifications(wm.clone()) { + Ok(()) => { + tracing::warn!("restarting finished thread"); + } + Err(error) => { + tracing::warn!("restarting failed thread: {}", error); + } } } }); diff --git a/komorebi/src/lib.rs b/komorebi/src/lib.rs index 59b93b74..de5be14a 100644 --- a/komorebi/src/lib.rs +++ b/komorebi/src/lib.rs @@ -40,12 +40,12 @@ use std::io::Write; use std::net::TcpStream; use std::path::PathBuf; use std::process::Command; +use std::sync::Arc; use std::sync::atomic::AtomicBool; use std::sync::atomic::AtomicI32; use std::sync::atomic::AtomicU32; use std::sync::atomic::AtomicU64; use std::sync::atomic::Ordering; -use std::sync::Arc; pub use colour::*; pub use core::*; @@ -71,8 +71,8 @@ use serde::Deserialize; use serde::Serialize; use uds_windows::UnixStream; use which::which; -use winreg::enums::HKEY_CURRENT_USER; use winreg::RegKey; +use winreg::enums::HKEY_CURRENT_USER; lazy_static! { static ref HIDDEN_HWNDS: Arc>> = Arc::new(Mutex::new(vec![])); diff --git a/komorebi/src/main.rs b/komorebi/src/main.rs index a76d97f9..3ad75043 100644 --- a/komorebi/src/main.rs +++ b/komorebi/src/main.rs @@ -10,27 +10,32 @@ use std::env::temp_dir; use std::net::Shutdown; use std::path::PathBuf; -use std::sync::atomic::Ordering; use std::sync::Arc; +use std::sync::atomic::Ordering; #[cfg(feature = "deadlock_detection")] use std::time::Duration; use clap::Parser; use color_eyre::Result; use crossbeam_utils::Backoff; -use komorebi::animation::AnimationEngine; use komorebi::animation::ANIMATION_ENABLED_GLOBAL; use komorebi::animation::ANIMATION_ENABLED_PER_ANIMATION; +use komorebi::animation::AnimationEngine; +use parking_lot::Mutex; #[cfg(feature = "deadlock_detection")] use parking_lot::deadlock; -use parking_lot::Mutex; use sysinfo::Process; use sysinfo::ProcessesToUpdate; use tracing_appender::non_blocking::WorkerGuard; -use tracing_subscriber::layer::SubscriberExt; use tracing_subscriber::EnvFilter; +use tracing_subscriber::layer::SubscriberExt; use uds_windows::UnixStream; +use komorebi::CUSTOM_FFM; +use komorebi::DATA_DIR; +use komorebi::HOME_DIR; +use komorebi::INITIAL_CONFIGURATION_LOADED; +use komorebi::SESSION_ID; use komorebi::border_manager; use komorebi::focus_manager; use komorebi::load_configuration; @@ -49,23 +54,20 @@ use komorebi::window_manager::WindowManager; use komorebi::windows_api::WindowsApi; use komorebi::winevent_listener; use komorebi::workspace_reconciliator; -use komorebi::CUSTOM_FFM; -use komorebi::DATA_DIR; -use komorebi::HOME_DIR; -use komorebi::INITIAL_CONFIGURATION_LOADED; -use komorebi::SESSION_ID; shadow_rs::shadow!(build); fn setup() -> Result<(WorkerGuard, WorkerGuard)> { if std::env::var("RUST_LIB_BACKTRACE").is_err() { - std::env::set_var("RUST_LIB_BACKTRACE", "1"); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { std::env::set_var("RUST_LIB_BACKTRACE", "1") }; } color_eyre::install()?; if std::env::var("RUST_LOG").is_err() { - std::env::set_var("RUST_LOG", "info"); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { std::env::set_var("RUST_LOG", "info") }; } let appender = tracing_appender::rolling::daily(std::env::temp_dir(), "komorebi_plaintext.log"); @@ -124,20 +126,22 @@ fn setup() -> Result<(WorkerGuard, WorkerGuard)> { #[tracing::instrument] fn detect_deadlocks() { // Create a background thread which checks for deadlocks every 10s - std::thread::spawn(move || loop { - tracing::info!("running deadlock detector"); - std::thread::sleep(Duration::from_secs(5)); - let deadlocks = deadlock::check_deadlock(); - if deadlocks.is_empty() { - continue; - } + std::thread::spawn(move || { + loop { + tracing::info!("running deadlock detector"); + std::thread::sleep(Duration::from_secs(5)); + let deadlocks = deadlock::check_deadlock(); + if deadlocks.is_empty() { + continue; + } - tracing::error!("{} deadlocks detected", deadlocks.len()); - for (i, threads) in deadlocks.iter().enumerate() { - tracing::error!("deadlock #{}", i); - for t in threads { - tracing::error!("thread id: {:#?}", t.thread_id()); - tracing::error!("{:#?}", t.backtrace()); + tracing::error!("{} deadlocks detected", deadlocks.len()); + for (i, threads) in deadlocks.iter().enumerate() { + tracing::error!("deadlock #{}", i); + for t in threads { + tracing::error!("thread id: {:#?}", t.thread_id()); + tracing::error!("{:#?}", t.backtrace()); + } } } }); @@ -192,7 +196,9 @@ fn main() -> Result<()> { } if len > 1 { - tracing::error!("komorebi.exe is already running, please exit the existing process before starting a new one"); + tracing::error!( + "komorebi.exe is already running, please exit the existing process before starting a new one" + ); std::process::exit(1); } } diff --git a/komorebi/src/monitor.rs b/komorebi/src/monitor.rs index 914139a6..4d7af195 100644 --- a/komorebi/src/monitor.rs +++ b/komorebi/src/monitor.rs @@ -2,9 +2,9 @@ use std::collections::HashMap; use std::collections::VecDeque; use std::sync::atomic::Ordering; +use color_eyre::Result; use color_eyre::eyre::anyhow; use color_eyre::eyre::bail; -use color_eyre::Result; use getset::CopyGetters; use getset::Getters; use getset::MutGetters; @@ -15,15 +15,15 @@ use serde::Serialize; use crate::core::Rect; -use crate::container::Container; -use crate::ring::Ring; -use crate::workspace::Workspace; +use crate::DEFAULT_CONTAINER_PADDING; +use crate::DEFAULT_WORKSPACE_PADDING; use crate::DefaultLayout; use crate::Layout; use crate::OperationDirection; use crate::WindowsApi; -use crate::DEFAULT_CONTAINER_PADDING; -use crate::DEFAULT_WORKSPACE_PADDING; +use crate::container::Container; +use crate::ring::Ring; +use crate::workspace::Workspace; #[derive( Debug, diff --git a/komorebi/src/monitor_reconciliator/hidden.rs b/komorebi/src/monitor_reconciliator/hidden.rs index 307478c8..ca940c6e 100644 --- a/komorebi/src/monitor_reconciliator/hidden.rs +++ b/komorebi/src/monitor_reconciliator/hidden.rs @@ -1,7 +1,6 @@ use std::sync::mpsc; use std::time::Duration; -use windows::core::PCWSTR; use windows::Win32::Devices::Display::GUID_DEVINTERFACE_DISPLAY_ADAPTER; use windows::Win32::Devices::Display::GUID_DEVINTERFACE_MONITOR; use windows::Win32::Devices::Display::GUID_DEVINTERFACE_VIDEO_OUTPUT_ARRIVAL; @@ -11,10 +10,6 @@ use windows::Win32::Foundation::LRESULT; use windows::Win32::Foundation::WPARAM; use windows::Win32::System::Power::POWERBROADCAST_SETTING; use windows::Win32::System::SystemServices::GUID_LIDSWITCH_STATE_CHANGE; -use windows::Win32::UI::WindowsAndMessaging::DefWindowProcW; -use windows::Win32::UI::WindowsAndMessaging::DispatchMessageW; -use windows::Win32::UI::WindowsAndMessaging::GetMessageW; -use windows::Win32::UI::WindowsAndMessaging::TranslateMessage; use windows::Win32::UI::WindowsAndMessaging::CS_HREDRAW; use windows::Win32::UI::WindowsAndMessaging::CS_VREDRAW; use windows::Win32::UI::WindowsAndMessaging::DBT_CONFIGCHANGED; @@ -23,6 +18,9 @@ use windows::Win32::UI::WindowsAndMessaging::DBT_DEVICEREMOVECOMPLETE; use windows::Win32::UI::WindowsAndMessaging::DBT_DEVNODES_CHANGED; use windows::Win32::UI::WindowsAndMessaging::DBT_DEVTYP_DEVICEINTERFACE; use windows::Win32::UI::WindowsAndMessaging::DEV_BROADCAST_DEVICEINTERFACE_W; +use windows::Win32::UI::WindowsAndMessaging::DefWindowProcW; +use windows::Win32::UI::WindowsAndMessaging::DispatchMessageW; +use windows::Win32::UI::WindowsAndMessaging::GetMessageW; use windows::Win32::UI::WindowsAndMessaging::MSG; use windows::Win32::UI::WindowsAndMessaging::PBT_APMRESUMEAUTOMATIC; use windows::Win32::UI::WindowsAndMessaging::PBT_APMRESUMESUSPEND; @@ -30,6 +28,7 @@ use windows::Win32::UI::WindowsAndMessaging::PBT_APMSUSPEND; use windows::Win32::UI::WindowsAndMessaging::PBT_POWERSETTINGCHANGE; use windows::Win32::UI::WindowsAndMessaging::REGISTER_NOTIFICATION_FLAGS; use windows::Win32::UI::WindowsAndMessaging::SPI_SETWORKAREA; +use windows::Win32::UI::WindowsAndMessaging::TranslateMessage; use windows::Win32::UI::WindowsAndMessaging::WM_DEVICECHANGE; use windows::Win32::UI::WindowsAndMessaging::WM_DISPLAYCHANGE; use windows::Win32::UI::WindowsAndMessaging::WM_POWERBROADCAST; @@ -38,10 +37,11 @@ use windows::Win32::UI::WindowsAndMessaging::WM_WTSSESSION_CHANGE; use windows::Win32::UI::WindowsAndMessaging::WNDCLASSW; use windows::Win32::UI::WindowsAndMessaging::WTS_SESSION_LOCK; use windows::Win32::UI::WindowsAndMessaging::WTS_SESSION_UNLOCK; +use windows::core::PCWSTR; +use crate::WindowsApi; use crate::monitor_reconciliator; use crate::windows_api; -use crate::WindowsApi; // This is a hidden window specifically spawned to listen to system-wide events related to monitors #[derive(Debug, Clone, Copy)] @@ -224,14 +224,18 @@ impl Hidden { WM_WTSSESSION_CHANGE => { match wparam.0 as u32 { WTS_SESSION_LOCK => { - tracing::debug!("WM_WTSSESSION_CHANGE event received with WTS_SESSION_LOCK - screen locked"); + tracing::debug!( + "WM_WTSSESSION_CHANGE event received with WTS_SESSION_LOCK - screen locked" + ); monitor_reconciliator::send_notification( monitor_reconciliator::MonitorNotification::SessionLocked, ); } WTS_SESSION_UNLOCK => { - tracing::debug!("WM_WTSSESSION_CHANGE event received with WTS_SESSION_UNLOCK - screen unlocked"); + tracing::debug!( + "WM_WTSSESSION_CHANGE event received with WTS_SESSION_UNLOCK - screen unlocked" + ); monitor_reconciliator::send_notification( monitor_reconciliator::MonitorNotification::SessionUnlocked, @@ -251,7 +255,8 @@ impl Hidden { // and resolution changes here WM_DISPLAYCHANGE => { tracing::debug!( - "WM_DISPLAYCHANGE event received with wparam: {}- work area or display resolution changed", wparam.0 + "WM_DISPLAYCHANGE event received with wparam: {}- work area or display resolution changed", + wparam.0 ); monitor_reconciliator::send_notification( @@ -265,8 +270,8 @@ impl Hidden { #[allow(clippy::cast_possible_truncation)] if wparam.0 as u32 == SPI_SETWORKAREA.0 { tracing::debug!( - "WM_SETTINGCHANGE event received with SPI_SETWORKAREA - work area changed (probably butterytaskbar or something similar)" - ); + "WM_SETTINGCHANGE event received with SPI_SETWORKAREA - work area changed (probably butterytaskbar or something similar)" + ); monitor_reconciliator::send_notification( monitor_reconciliator::MonitorNotification::WorkAreaChanged, diff --git a/komorebi/src/monitor_reconciliator/mod.rs b/komorebi/src/monitor_reconciliator/mod.rs index 636b4d47..eb69de64 100644 --- a/komorebi/src/monitor_reconciliator/mod.rs +++ b/komorebi/src/monitor_reconciliator/mod.rs @@ -1,5 +1,11 @@ #![deny(clippy::unwrap_used, clippy::expect_used)] +use crate::Notification; +use crate::NotificationEvent; +use crate::State; +use crate::WORKSPACE_MATCHING_RULES; +use crate::WindowManager; +use crate::WindowsApi; use crate::border_manager; use crate::config_generation::WorkspaceMatchingRule; use crate::core::Rect; @@ -7,12 +13,6 @@ use crate::monitor; use crate::monitor::Monitor; use crate::monitor_reconciliator::hidden::Hidden; use crate::notify_subscribers; -use crate::Notification; -use crate::NotificationEvent; -use crate::State; -use crate::WindowManager; -use crate::WindowsApi; -use crate::WORKSPACE_MATCHING_RULES; use crossbeam_channel::Receiver; use crossbeam_channel::Sender; use crossbeam_utils::atomic::AtomicConsume; @@ -21,10 +21,10 @@ use schemars::JsonSchema; use serde::Deserialize; use serde::Serialize; use std::collections::HashMap; -use std::sync::atomic::AtomicBool; -use std::sync::atomic::Ordering; use std::sync::Arc; use std::sync::OnceLock; +use std::sync::atomic::AtomicBool; +use std::sync::atomic::Ordering; pub mod hidden; @@ -112,16 +112,18 @@ pub fn listen_for_notifications(wm: Arc>) -> color_eyre::Re tracing::info!("created hidden window to listen for monitor-related events"); - std::thread::spawn(move || loop { - match handle_notifications(wm.clone()) { - Ok(()) => { - tracing::warn!("restarting finished thread"); - } - Err(error) => { - if cfg!(debug_assertions) { - tracing::error!("restarting failed thread: {:?}", error) - } else { - tracing::error!("restarting failed thread: {}", error) + std::thread::spawn(move || { + loop { + match handle_notifications(wm.clone()) { + Ok(()) => { + tracing::warn!("restarting finished thread"); + } + Err(error) => { + if cfg!(debug_assertions) { + tracing::error!("restarting failed thread: {:?}", error) + } else { + tracing::error!("restarting failed thread: {}", error) + } } } } @@ -461,7 +463,9 @@ pub fn handle_notifications(wm: Arc>) -> color_eyre::Result cache_hit = true; cached_id = id.clone(); - tracing::info!("found monitor and workspace configuration for {id} in the monitor cache, applying"); + tracing::info!( + "found monitor and workspace configuration for {id} in the monitor cache, applying" + ); // If it does, update the cached monitor info with the new one and // load the cached monitor removing any window that has since been diff --git a/komorebi/src/process_command.rs b/komorebi/src/process_command.rs index d7d799d3..89bac09c 100644 --- a/komorebi/src/process_command.rs +++ b/komorebi/src/process_command.rs @@ -8,26 +8,22 @@ use std::net::TcpListener; use std::net::TcpStream; use std::num::NonZeroUsize; use std::str::FromStr; -use std::sync::atomic::Ordering; use std::sync::Arc; +use std::sync::atomic::Ordering; use std::time::Duration; -use color_eyre::eyre::anyhow; use color_eyre::Result; +use color_eyre::eyre::anyhow; use miow::pipe::connect; use net2::TcpStreamExt; use parking_lot::Mutex; -use schemars::gen::SchemaSettings; +use schemars::r#gen::SchemaSettings; use schemars::schema_for; use uds_windows::UnixStream; use crate::animation::ANIMATION_DURATION_PER_ANIMATION; use crate::animation::ANIMATION_ENABLED_PER_ANIMATION; use crate::animation::ANIMATION_STYLE_PER_ANIMATION; -use crate::core::config_generation::ApplicationConfiguration; -use crate::core::config_generation::IdWithIdentifier; -use crate::core::config_generation::MatchingRule; -use crate::core::config_generation::MatchingStrategy; use crate::core::ApplicationIdentifier; use crate::core::Axis; use crate::core::BorderImplementation; @@ -41,7 +37,34 @@ use crate::core::SocketMessage; use crate::core::StateQuery; use crate::core::WindowContainerBehaviour; use crate::core::WindowKind; +use crate::core::config_generation::ApplicationConfiguration; +use crate::core::config_generation::IdWithIdentifier; +use crate::core::config_generation::MatchingRule; +use crate::core::config_generation::MatchingStrategy; +use crate::CUSTOM_FFM; +use crate::DATA_DIR; +use crate::DISPLAY_INDEX_PREFERENCES; +use crate::GlobalState; +use crate::HIDING_BEHAVIOUR; +use crate::IGNORE_IDENTIFIERS; +use crate::INITIAL_CONFIGURATION_LOADED; +use crate::LAYERED_WHITELIST; +use crate::MANAGE_IDENTIFIERS; +use crate::MONITOR_INDEX_PREFERENCES; +use crate::NO_TITLEBAR; +use crate::Notification; +use crate::NotificationEvent; +use crate::OBJECT_NAME_CHANGE_ON_LAUNCH; +use crate::REMOVE_TITLEBARS; +use crate::SUBSCRIPTION_PIPES; +use crate::SUBSCRIPTION_SOCKET_OPTIONS; +use crate::SUBSCRIPTION_SOCKETS; +use crate::State; +use crate::TCP_CONNECTIONS; +use crate::TRAY_AND_MULTI_WINDOW_IDENTIFIERS; +use crate::WINDOWS_11; +use crate::WORKSPACE_MATCHING_RULES; use crate::animation::ANIMATION_DURATION_GLOBAL; use crate::animation::ANIMATION_ENABLED_GLOBAL; use crate::animation::ANIMATION_FPS; @@ -68,29 +91,6 @@ use crate::windows_api::WindowsApi; use crate::winevent_listener; use crate::workspace::WorkspaceLayer; use crate::workspace::WorkspaceWindowLocation; -use crate::GlobalState; -use crate::Notification; -use crate::NotificationEvent; -use crate::State; -use crate::CUSTOM_FFM; -use crate::DATA_DIR; -use crate::DISPLAY_INDEX_PREFERENCES; -use crate::HIDING_BEHAVIOUR; -use crate::IGNORE_IDENTIFIERS; -use crate::INITIAL_CONFIGURATION_LOADED; -use crate::LAYERED_WHITELIST; -use crate::MANAGE_IDENTIFIERS; -use crate::MONITOR_INDEX_PREFERENCES; -use crate::NO_TITLEBAR; -use crate::OBJECT_NAME_CHANGE_ON_LAUNCH; -use crate::REMOVE_TITLEBARS; -use crate::SUBSCRIPTION_PIPES; -use crate::SUBSCRIPTION_SOCKETS; -use crate::SUBSCRIPTION_SOCKET_OPTIONS; -use crate::TCP_CONNECTIONS; -use crate::TRAY_AND_MULTI_WINDOW_IDENTIFIERS; -use crate::WINDOWS_11; -use crate::WORKSPACE_MATCHING_RULES; use stackbar_manager::STACKBAR_FOCUSED_TEXT_COLOUR; use stackbar_manager::STACKBAR_LABEL; use stackbar_manager::STACKBAR_MODE; @@ -101,42 +101,44 @@ use stackbar_manager::STACKBAR_UNFOCUSED_TEXT_COLOUR; #[tracing::instrument] pub fn listen_for_commands(wm: Arc>) { - std::thread::spawn(move || loop { - let wm = wm.clone(); + std::thread::spawn(move || { + loop { + let wm = wm.clone(); - let _ = std::thread::spawn(move || { - let listener = wm - .lock() - .command_listener - .try_clone() - .expect("could not clone unix listener"); + let _ = std::thread::spawn(move || { + let listener = wm + .lock() + .command_listener + .try_clone() + .expect("could not clone unix listener"); - tracing::info!("listening on komorebi.sock"); - for client in listener.incoming() { - match client { - Ok(stream) => { - let wm_clone = wm.clone(); - std::thread::spawn(move || { - match stream.set_read_timeout(Some(Duration::from_secs(1))) { - Ok(()) => {} - Err(error) => tracing::error!("{}", error), - } - match read_commands_uds(&wm_clone, stream) { - Ok(()) => {} - Err(error) => tracing::error!("{}", error), - } - }); - } - Err(error) => { - tracing::error!("{}", error); - break; + tracing::info!("listening on komorebi.sock"); + for client in listener.incoming() { + match client { + Ok(stream) => { + let wm_clone = wm.clone(); + std::thread::spawn(move || { + match stream.set_read_timeout(Some(Duration::from_secs(1))) { + Ok(()) => {} + Err(error) => tracing::error!("{}", error), + } + match read_commands_uds(&wm_clone, stream) { + Ok(()) => {} + Err(error) => tracing::error!("{}", error), + } + }); + } + Err(error) => { + tracing::error!("{}", error); + break; + } } } - } - }) - .join(); + }) + .join(); - tracing::error!("restarting failed thread"); + tracing::error!("restarting failed thread"); + } }); } @@ -1214,7 +1216,7 @@ impl WindowManager { let container_len = workspace.containers().len(); let no_layout_rules = workspace.layout_rules().is_empty(); - if let Layout::Custom(ref mut custom) = workspace.layout_mut() { + if let Layout::Custom(custom) = workspace.layout_mut() { if matches!(axis, Axis::Horizontal) { #[allow(clippy::cast_precision_loss)] let percentage = custom @@ -1376,7 +1378,9 @@ impl WindowManager { self.focus_follows_mouse = None; } Some(FocusFollowsMouseImplementation::Windows) => { - tracing::warn!("ignoring command that could mix different focus follows mouse implementations"); + tracing::warn!( + "ignoring command that could mix different focus follows mouse implementations" + ); } } } @@ -1400,7 +1404,9 @@ impl WindowManager { self.focus_follows_mouse = None; } Some(FocusFollowsMouseImplementation::Komorebi) => { - tracing::warn!("ignoring command that could mix different focus follows mouse implementations"); + tracing::warn!( + "ignoring command that could mix different focus follows mouse implementations" + ); } } } @@ -1642,33 +1648,41 @@ impl WindowManager { } SocketMessage::ToggleWorkspaceWindowContainerBehaviour => { let current_global_behaviour = self.window_management_behaviour.current_behaviour; - if let Some(behaviour) = self + match self .focused_workspace_mut()? .window_container_behaviour_mut() { - match behaviour { + Some(behaviour) => match behaviour { WindowContainerBehaviour::Create => { *behaviour = WindowContainerBehaviour::Append } WindowContainerBehaviour::Append => { *behaviour = WindowContainerBehaviour::Create } + }, + _ => { + self.focused_workspace_mut()? + .set_window_container_behaviour(Some(match current_global_behaviour { + WindowContainerBehaviour::Create => { + WindowContainerBehaviour::Append + } + WindowContainerBehaviour::Append => { + WindowContainerBehaviour::Create + } + })); } - } else { - self.focused_workspace_mut()? - .set_window_container_behaviour(Some(match current_global_behaviour { - WindowContainerBehaviour::Create => WindowContainerBehaviour::Append, - WindowContainerBehaviour::Append => WindowContainerBehaviour::Create, - })); }; } SocketMessage::ToggleWorkspaceFloatOverride => { let current_global_override = self.window_management_behaviour.float_override; - if let Some(float_override) = self.focused_workspace_mut()?.float_override_mut() { - *float_override = !*float_override; - } else { - self.focused_workspace_mut()? - .set_float_override(Some(!current_global_override)); + match self.focused_workspace_mut()?.float_override_mut() { + Some(float_override) => { + *float_override = !*float_override; + } + _ => { + self.focused_workspace_mut()? + .set_float_override(Some(!current_global_override)); + } }; } SocketMessage::WindowHidingBehaviour(behaviour) => { @@ -1852,8 +1866,8 @@ impl WindowManager { s.inline_subschemas = true; }); - let gen = settings.into_generator(); - let socket_message = gen.into_root_schema_for::(); + let r#gen = settings.into_generator(); + let socket_message = r#gen.into_root_schema_for::(); let schema = serde_json::to_string_pretty(&socket_message)?; reply.write_all(schema.as_bytes())?; diff --git a/komorebi/src/process_event.rs b/komorebi/src/process_event.rs index 298d6d8d..ce650fb9 100644 --- a/komorebi/src/process_event.rs +++ b/komorebi/src/process_event.rs @@ -1,10 +1,10 @@ -use std::sync::atomic::Ordering; use std::sync::Arc; +use std::sync::atomic::Ordering; use std::time::Duration; use std::time::Instant; -use color_eyre::eyre::anyhow; use color_eyre::Result; +use color_eyre::eyre::anyhow; use crossbeam_utils::atomic::AtomicConsume; use parking_lot::Mutex; @@ -13,6 +13,13 @@ use crate::core::Rect; use crate::core::Sizing; use crate::core::WindowContainerBehaviour; +use crate::FLOATING_APPLICATIONS; +use crate::HIDDEN_HWNDS; +use crate::Notification; +use crate::NotificationEvent; +use crate::REGEX_IDENTIFIERS; +use crate::State; +use crate::TRAY_AND_MULTI_WINDOW_IDENTIFIERS; use crate::border_manager; use crate::border_manager::BORDER_OFFSET; use crate::border_manager::BORDER_WIDTH; @@ -20,8 +27,8 @@ use crate::current_virtual_desktop; use crate::notify_subscribers; use crate::stackbar_manager; use crate::transparency_manager; -use crate::window::should_act; use crate::window::RuleDebug; +use crate::window::should_act; use crate::window_manager::WindowManager; use crate::window_manager_event::WindowManagerEvent; use crate::windows_api::WindowsApi; @@ -30,13 +37,6 @@ use crate::workspace::WorkspaceLayer; use crate::workspace_reconciliator; use crate::workspace_reconciliator::ALT_TAB_HWND; use crate::workspace_reconciliator::ALT_TAB_HWND_INSTANT; -use crate::Notification; -use crate::NotificationEvent; -use crate::State; -use crate::FLOATING_APPLICATIONS; -use crate::HIDDEN_HWNDS; -use crate::REGEX_IDENTIFIERS; -use crate::TRAY_AND_MULTI_WINDOW_IDENTIFIERS; #[tracing::instrument] pub fn listen_for_events(wm: Arc>) { @@ -661,7 +661,7 @@ impl WindowManager { let mut ops = vec![]; macro_rules! resize_op { - ($coordinate:expr, $comparator:tt, $direction:expr) => {{ + ($coordinate:expr_2021, $comparator:tt, $direction:expr_2021) => {{ let adjusted = $coordinate * 2; let sizing = if adjusted $comparator 0 { Sizing::Decrease diff --git a/komorebi/src/process_movement.rs b/komorebi/src/process_movement.rs index 47dceebb..5f4d896a 100644 --- a/komorebi/src/process_movement.rs +++ b/komorebi/src/process_movement.rs @@ -1,9 +1,9 @@ use std::sync::Arc; use parking_lot::Mutex; +use winput::Action; use winput::message_loop; use winput::message_loop::Event; -use winput::Action; use crate::core::FocusFollowsMouseImplementation; diff --git a/komorebi/src/reaper.rs b/komorebi/src/reaper.rs index cc102910..591ec2fd 100644 --- a/komorebi/src/reaper.rs +++ b/komorebi/src/reaper.rs @@ -1,13 +1,13 @@ #![deny(clippy::unwrap_used, clippy::expect_used)] -use crate::border_manager; -use crate::notify_subscribers; -use crate::winevent::WinEvent; +use crate::DATA_DIR; use crate::NotificationEvent; use crate::Window; use crate::WindowManager; use crate::WindowManagerEvent; -use crate::DATA_DIR; +use crate::border_manager; +use crate::notify_subscribers; +use crate::winevent::WinEvent; use crossbeam_channel::Receiver; use crossbeam_channel::Sender; @@ -53,13 +53,15 @@ pub fn listen_for_notifications( ) { watch_for_orphans(known_hwnds); - std::thread::spawn(move || loop { - match handle_notifications(wm.clone()) { - Ok(()) => { - tracing::warn!("restarting finished thread"); - } - Err(error) => { - tracing::warn!("restarting failed thread: {}", error); + std::thread::spawn(move || { + loop { + match handle_notifications(wm.clone()) { + Ok(()) => { + tracing::warn!("restarting finished thread"); + } + Err(error) => { + tracing::warn!("restarting failed thread: {}", error); + } } } }); @@ -148,16 +150,18 @@ fn watch_for_orphans(known_hwnds: HashMap) { *cache = known_hwnds; } - std::thread::spawn(move || loop { - match find_orphans() { - Ok(()) => { - tracing::warn!("restarting finished thread"); - } - Err(error) => { - if cfg!(debug_assertions) { - tracing::error!("restarting failed thread: {:?}", error) - } else { - tracing::error!("restarting failed thread: {}", error) + std::thread::spawn(move || { + loop { + match find_orphans() { + Ok(()) => { + tracing::warn!("restarting finished thread"); + } + Err(error) => { + if cfg!(debug_assertions) { + tracing::error!("restarting failed thread: {:?}", error) + } else { + tracing::error!("restarting failed thread: {}", error) + } } } } diff --git a/komorebi/src/stackbar_manager/mod.rs b/komorebi/src/stackbar_manager/mod.rs index 9749d8b2..5f924b55 100644 --- a/komorebi/src/stackbar_manager/mod.rs +++ b/komorebi/src/stackbar_manager/mod.rs @@ -1,26 +1,26 @@ mod stackbar; +use crate::DEFAULT_CONTAINER_PADDING; +use crate::WindowManager; +use crate::WindowsApi; use crate::container::Container; use crate::core::StackbarLabel; use crate::core::StackbarMode; use crate::stackbar_manager::stackbar::Stackbar; -use crate::WindowManager; -use crate::WindowsApi; -use crate::DEFAULT_CONTAINER_PADDING; use crossbeam_channel::Receiver; use crossbeam_channel::Sender; use crossbeam_utils::atomic::AtomicCell; use crossbeam_utils::atomic::AtomicConsume; use lazy_static::lazy_static; use parking_lot::Mutex; -use std::collections::hash_map::Entry; use std::collections::HashMap; +use std::collections::hash_map::Entry; +use std::sync::Arc; +use std::sync::OnceLock; use std::sync::atomic::AtomicBool; use std::sync::atomic::AtomicI32; use std::sync::atomic::AtomicU32; use std::sync::atomic::Ordering; -use std::sync::Arc; -use std::sync::OnceLock; pub static STACKBAR_FONT_SIZE: AtomicI32 = AtomicI32::new(0); // 0 will produce the system default pub static STACKBAR_FOCUSED_TEXT_COLOUR: AtomicU32 = AtomicU32::new(16777215); // white @@ -71,13 +71,15 @@ pub fn should_have_stackbar(window_count: usize) -> bool { } pub fn listen_for_notifications(wm: Arc>) { - std::thread::spawn(move || loop { - match handle_notifications(wm.clone()) { - Ok(()) => { - tracing::warn!("restarting finished thread"); - } - Err(error) => { - tracing::warn!("restarting failed thread: {}", error); + std::thread::spawn(move || { + loop { + match handle_notifications(wm.clone()) { + Ok(()) => { + tracing::warn!("restarting finished thread"); + } + Err(error) => { + tracing::warn!("restarting failed thread: {}", error); + } } } }); @@ -193,13 +195,12 @@ pub fn handle_notifications(wm: Arc>) -> color_eyre::Result // Get the stackbar entry for this container from the map or create one let stackbar = match stackbars.entry(container.id().clone()) { Entry::Occupied(entry) => entry.into_mut(), - Entry::Vacant(entry) => { - if let Ok(stackbar) = Stackbar::create(container.id()) { - entry.insert(stackbar) - } else { + Entry::Vacant(entry) => match Stackbar::create(container.id()) { + Ok(stackbar) => entry.insert(stackbar), + _ => { continue 'receiver; } - } + }, }; stackbars_monitors.insert(container.id().clone(), monitor_idx); diff --git a/komorebi/src/stackbar_manager/stackbar.rs b/komorebi/src/stackbar_manager/stackbar.rs index a03f120e..e4e15779 100644 --- a/komorebi/src/stackbar_manager/stackbar.rs +++ b/komorebi/src/stackbar_manager/stackbar.rs @@ -1,3 +1,6 @@ +use crate::DEFAULT_CONTAINER_PADDING; +use crate::WINDOWS_11; +use crate::WindowsApi; use crate::border_manager::BORDER_OFFSET; use crate::border_manager::BORDER_WIDTH; use crate::border_manager::STYLE; @@ -5,7 +8,6 @@ use crate::container::Container; use crate::core::BorderStyle; use crate::core::Rect; use crate::core::StackbarLabel; -use crate::stackbar_manager::STACKBARS_CONTAINERS; use crate::stackbar_manager::STACKBAR_FOCUSED_TEXT_COLOUR; use crate::stackbar_manager::STACKBAR_FONT_FAMILY; use crate::stackbar_manager::STACKBAR_FONT_SIZE; @@ -14,16 +16,13 @@ use crate::stackbar_manager::STACKBAR_TAB_BACKGROUND_COLOUR; use crate::stackbar_manager::STACKBAR_TAB_HEIGHT; use crate::stackbar_manager::STACKBAR_TAB_WIDTH; use crate::stackbar_manager::STACKBAR_UNFOCUSED_TEXT_COLOUR; +use crate::stackbar_manager::STACKBARS_CONTAINERS; use crate::windows_api; -use crate::WindowsApi; -use crate::DEFAULT_CONTAINER_PADDING; -use crate::WINDOWS_11; use crossbeam_utils::atomic::AtomicConsume; use std::os::windows::ffi::OsStrExt; use std::sync::atomic::Ordering; use std::sync::mpsc; use std::time::Duration; -use windows::core::PCWSTR; use windows::Win32::Foundation::COLORREF; use windows::Win32::Foundation::HINSTANCE; use windows::Win32::Foundation::HWND; @@ -33,38 +32,38 @@ use windows::Win32::Foundation::WPARAM; use windows::Win32::Graphics::Gdi::CreateFontIndirectW; use windows::Win32::Graphics::Gdi::CreatePen; use windows::Win32::Graphics::Gdi::CreateSolidBrush; +use windows::Win32::Graphics::Gdi::DT_CENTER; +use windows::Win32::Graphics::Gdi::DT_END_ELLIPSIS; +use windows::Win32::Graphics::Gdi::DT_SINGLELINE; +use windows::Win32::Graphics::Gdi::DT_VCENTER; use windows::Win32::Graphics::Gdi::DeleteObject; use windows::Win32::Graphics::Gdi::DrawTextW; +use windows::Win32::Graphics::Gdi::FONT_QUALITY; +use windows::Win32::Graphics::Gdi::FW_BOLD; use windows::Win32::Graphics::Gdi::GetDC; use windows::Win32::Graphics::Gdi::GetDeviceCaps; +use windows::Win32::Graphics::Gdi::LOGFONTW; +use windows::Win32::Graphics::Gdi::LOGPIXELSY; +use windows::Win32::Graphics::Gdi::PROOF_QUALITY; +use windows::Win32::Graphics::Gdi::PS_SOLID; use windows::Win32::Graphics::Gdi::Rectangle; use windows::Win32::Graphics::Gdi::ReleaseDC; use windows::Win32::Graphics::Gdi::RoundRect; use windows::Win32::Graphics::Gdi::SelectObject; use windows::Win32::Graphics::Gdi::SetBkColor; use windows::Win32::Graphics::Gdi::SetTextColor; -use windows::Win32::Graphics::Gdi::DT_CENTER; -use windows::Win32::Graphics::Gdi::DT_END_ELLIPSIS; -use windows::Win32::Graphics::Gdi::DT_SINGLELINE; -use windows::Win32::Graphics::Gdi::DT_VCENTER; -use windows::Win32::Graphics::Gdi::FONT_QUALITY; -use windows::Win32::Graphics::Gdi::FW_BOLD; -use windows::Win32::Graphics::Gdi::LOGFONTW; -use windows::Win32::Graphics::Gdi::LOGPIXELSY; -use windows::Win32::Graphics::Gdi::PROOF_QUALITY; -use windows::Win32::Graphics::Gdi::PS_SOLID; use windows::Win32::System::WindowsProgramming::MulDiv; +use windows::Win32::UI::WindowsAndMessaging::CS_HREDRAW; +use windows::Win32::UI::WindowsAndMessaging::CS_VREDRAW; use windows::Win32::UI::WindowsAndMessaging::CreateWindowExW; use windows::Win32::UI::WindowsAndMessaging::DefWindowProcW; use windows::Win32::UI::WindowsAndMessaging::DispatchMessageW; use windows::Win32::UI::WindowsAndMessaging::GetMessageW; +use windows::Win32::UI::WindowsAndMessaging::LWA_COLORKEY; +use windows::Win32::UI::WindowsAndMessaging::MSG; use windows::Win32::UI::WindowsAndMessaging::PostQuitMessage; use windows::Win32::UI::WindowsAndMessaging::SetLayeredWindowAttributes; use windows::Win32::UI::WindowsAndMessaging::TranslateMessage; -use windows::Win32::UI::WindowsAndMessaging::CS_HREDRAW; -use windows::Win32::UI::WindowsAndMessaging::CS_VREDRAW; -use windows::Win32::UI::WindowsAndMessaging::LWA_COLORKEY; -use windows::Win32::UI::WindowsAndMessaging::MSG; use windows::Win32::UI::WindowsAndMessaging::WM_DESTROY; use windows::Win32::UI::WindowsAndMessaging::WM_LBUTTONDOWN; use windows::Win32::UI::WindowsAndMessaging::WNDCLASSW; @@ -72,6 +71,7 @@ use windows::Win32::UI::WindowsAndMessaging::WS_EX_LAYERED; use windows::Win32::UI::WindowsAndMessaging::WS_EX_TOOLWINDOW; use windows::Win32::UI::WindowsAndMessaging::WS_POPUP; use windows::Win32::UI::WindowsAndMessaging::WS_VISIBLE; +use windows::core::PCWSTR; #[derive(Debug)] pub struct Stackbar { @@ -342,10 +342,10 @@ impl Stackbar { window.set_position(&focused_window_rect, false) { tracing::error!( - "stackbar WM_LBUTTONDOWN repositioning error: hwnd {} ({})", - *window, - err - ); + "stackbar WM_LBUTTONDOWN repositioning error: hwnd {} ({})", + *window, + err + ); } } diff --git a/komorebi/src/static_config.rs b/komorebi/src/static_config.rs index 84770773..cef7a0af 100644 --- a/komorebi/src/static_config.rs +++ b/komorebi/src/static_config.rs @@ -1,4 +1,28 @@ -use crate::animation::PerAnimationPrefixConfig; +use crate::AspectRatio; +use crate::Axis; +use crate::CrossBoundaryBehaviour; +use crate::DATA_DIR; +use crate::DEFAULT_CONTAINER_PADDING; +use crate::DEFAULT_WORKSPACE_PADDING; +use crate::DISPLAY_INDEX_PREFERENCES; +use crate::FLOATING_APPLICATIONS; +use crate::FLOATING_WINDOW_TOGGLE_ASPECT_RATIO; +use crate::HIDING_BEHAVIOUR; +use crate::IGNORE_IDENTIFIERS; +use crate::LAYERED_WHITELIST; +use crate::MANAGE_IDENTIFIERS; +use crate::MONITOR_INDEX_PREFERENCES; +use crate::NO_TITLEBAR; +use crate::OBJECT_NAME_CHANGE_ON_LAUNCH; +use crate::OBJECT_NAME_CHANGE_TITLE_IGNORE_LIST; +use crate::PredefinedAspectRatio; +use crate::REGEX_IDENTIFIERS; +use crate::SLOW_APPLICATION_COMPENSATION_TIME; +use crate::SLOW_APPLICATION_IDENTIFIERS; +use crate::TRANSPARENCY_BLACKLIST; +use crate::TRAY_AND_MULTI_WINDOW_IDENTIFIERS; +use crate::WINDOWS_11; +use crate::WORKSPACE_MATCHING_RULES; use crate::animation::ANIMATION_DURATION_GLOBAL; use crate::animation::ANIMATION_DURATION_PER_ANIMATION; use crate::animation::ANIMATION_ENABLED_GLOBAL; @@ -7,10 +31,11 @@ use crate::animation::ANIMATION_FPS; use crate::animation::ANIMATION_STYLE_GLOBAL; use crate::animation::ANIMATION_STYLE_PER_ANIMATION; use crate::animation::DEFAULT_ANIMATION_FPS; +use crate::animation::PerAnimationPrefixConfig; use crate::border_manager; -use crate::border_manager::ZOrder; use crate::border_manager::IMPLEMENTATION; use crate::border_manager::STYLE; +use crate::border_manager::ZOrder; use crate::colour::Colour; use crate::core::BorderImplementation; use crate::core::StackbarLabel; @@ -36,41 +61,10 @@ use crate::window_manager::WindowManager; use crate::window_manager_event::WindowManagerEvent; use crate::windows_api::WindowsApi; use crate::workspace::Workspace; -use crate::AspectRatio; -use crate::Axis; -use crate::CrossBoundaryBehaviour; -use crate::PredefinedAspectRatio; -use crate::DATA_DIR; -use crate::DEFAULT_CONTAINER_PADDING; -use crate::DEFAULT_WORKSPACE_PADDING; -use crate::DISPLAY_INDEX_PREFERENCES; -use crate::FLOATING_APPLICATIONS; -use crate::FLOATING_WINDOW_TOGGLE_ASPECT_RATIO; -use crate::HIDING_BEHAVIOUR; -use crate::IGNORE_IDENTIFIERS; -use crate::LAYERED_WHITELIST; -use crate::MANAGE_IDENTIFIERS; -use crate::MONITOR_INDEX_PREFERENCES; -use crate::NO_TITLEBAR; -use crate::OBJECT_NAME_CHANGE_ON_LAUNCH; -use crate::OBJECT_NAME_CHANGE_TITLE_IGNORE_LIST; -use crate::REGEX_IDENTIFIERS; -use crate::SLOW_APPLICATION_COMPENSATION_TIME; -use crate::SLOW_APPLICATION_IDENTIFIERS; -use crate::TRANSPARENCY_BLACKLIST; -use crate::TRAY_AND_MULTI_WINDOW_IDENTIFIERS; -use crate::WINDOWS_11; -use crate::WORKSPACE_MATCHING_RULES; use crate::asc::ApplicationSpecificConfiguration; use crate::asc::AscApplicationRulesOrSchema; use crate::config_generation::WorkspaceMatchingRule; -use crate::core::config_generation::ApplicationConfiguration; -use crate::core::config_generation::ApplicationConfigurationGenerator; -use crate::core::config_generation::ApplicationOptions; -use crate::core::config_generation::MatchingRule; -use crate::core::config_generation::MatchingStrategy; -use crate::core::resolve_home_path; use crate::core::AnimationStyle; use crate::core::BorderStyle; use crate::core::DefaultLayout; @@ -83,6 +77,12 @@ use crate::core::Rect; use crate::core::SocketMessage; use crate::core::WindowContainerBehaviour; use crate::core::WindowManagementBehaviour; +use crate::core::config_generation::ApplicationConfiguration; +use crate::core::config_generation::ApplicationConfigurationGenerator; +use crate::core::config_generation::ApplicationOptions; +use crate::core::config_generation::MatchingRule; +use crate::core::config_generation::MatchingStrategy; +use crate::core::resolve_home_path; use color_eyre::Result; use crossbeam_channel::Receiver; use hotwatch::EventKind; @@ -97,8 +97,8 @@ use std::collections::HashSet; use std::io::ErrorKind; use std::io::Write; use std::path::PathBuf; -use std::sync::atomic::Ordering; use std::sync::Arc; +use std::sync::atomic::Ordering; use uds_windows::UnixListener; use uds_windows::UnixStream; @@ -555,7 +555,9 @@ impl StaticConfig { } if display { - println!("\nEnd-of-life features will not receive any further bug fixes or updates; they should not be used\n") + println!( + "\nEnd-of-life features will not receive any further bug fixes or updates; they should not be used\n" + ) } } @@ -580,7 +582,9 @@ impl StaticConfig { } if display { - println!("\nYour configuration file contains some options that have been renamed or deprecated:\n"); + println!( + "\nYour configuration file contains some options that have been renamed or deprecated:\n" + ); for (canonical, aliases) in map { for alias in aliases { if raw.contains(alias) { diff --git a/komorebi/src/theme_manager.rs b/komorebi/src/theme_manager.rs index eb4790d7..8e850b09 100644 --- a/komorebi/src/theme_manager.rs +++ b/komorebi/src/theme_manager.rs @@ -1,18 +1,18 @@ #![deny(clippy::unwrap_used, clippy::expect_used)] +use crate::Colour; +use crate::KomorebiTheme; use crate::border_manager; use crate::stackbar_manager; use crate::stackbar_manager::STACKBAR_FOCUSED_TEXT_COLOUR; use crate::stackbar_manager::STACKBAR_TAB_BACKGROUND_COLOUR; use crate::stackbar_manager::STACKBAR_UNFOCUSED_TEXT_COLOUR; -use crate::Colour; -use crate::KomorebiTheme; use crossbeam_channel::Receiver; use crossbeam_channel::Sender; use crossbeam_utils::atomic::AtomicCell; use std::ops::Deref; -use std::sync::atomic::Ordering; use std::sync::OnceLock; +use std::sync::atomic::Ordering; pub struct Notification(KomorebiTheme); @@ -50,13 +50,15 @@ pub fn send_notification(theme: KomorebiTheme) { } pub fn listen_for_notifications() { - std::thread::spawn(move || loop { - match handle_notifications() { - Ok(()) => { - tracing::warn!("restarting finished thread"); - } - Err(error) => { - tracing::warn!("restarting failed thread: {}", error); + std::thread::spawn(move || { + loop { + match handle_notifications() { + Ok(()) => { + tracing::warn!("restarting finished thread"); + } + Err(error) => { + tracing::warn!("restarting failed thread: {}", error); + } } } }); diff --git a/komorebi/src/transparency_manager.rs b/komorebi/src/transparency_manager.rs index 6546d889..46679883 100644 --- a/komorebi/src/transparency_manager.rs +++ b/komorebi/src/transparency_manager.rs @@ -4,17 +4,17 @@ use crossbeam_channel::Receiver; use crossbeam_channel::Sender; use crossbeam_utils::atomic::AtomicConsume; use parking_lot::Mutex; -use std::sync::atomic::AtomicBool; -use std::sync::atomic::AtomicU8; use std::sync::Arc; use std::sync::OnceLock; +use std::sync::atomic::AtomicBool; +use std::sync::atomic::AtomicU8; -use crate::should_act; +use crate::REGEX_IDENTIFIERS; +use crate::TRANSPARENCY_BLACKLIST; use crate::Window; use crate::WindowManager; use crate::WindowsApi; -use crate::REGEX_IDENTIFIERS; -use crate::TRANSPARENCY_BLACKLIST; +use crate::should_act; pub static TRANSPARENCY_ENABLED: AtomicBool = AtomicBool::new(false); pub static TRANSPARENCY_ALPHA: AtomicU8 = AtomicU8::new(200); @@ -49,13 +49,15 @@ pub fn send_notification() { } pub fn listen_for_notifications(wm: Arc>) { - std::thread::spawn(move || loop { - match handle_notifications(wm.clone()) { - Ok(()) => { - tracing::warn!("restarting finished thread"); - } - Err(error) => { - tracing::warn!("restarting failed thread: {}", error); + std::thread::spawn(move || { + loop { + match handle_notifications(wm.clone()) { + Ok(()) => { + tracing::warn!("restarting finished thread"); + } + Err(error) => { + tracing::warn!("restarting failed thread: {}", error); + } } } }); @@ -175,7 +177,9 @@ pub fn handle_notifications(wm: Arc>) -> color_eyre::Result match window.transparent() { Err(error) => { let hwnd = foreground_hwnd; - tracing::error!("failed to make unfocused window {hwnd} transparent: {error}" ) + tracing::error!( + "failed to make unfocused window {hwnd} transparent: {error}" + ) } Ok(..) => { known_hwnds.lock().push(window.hwnd); diff --git a/komorebi/src/window.rs b/komorebi/src/window.rs index 91df0e37..9b0e0407 100644 --- a/komorebi/src/window.rs +++ b/komorebi/src/window.rs @@ -1,8 +1,7 @@ -use crate::animation::lerp::Lerp; -use crate::animation::prefix::new_animation_key; -use crate::animation::prefix::AnimationPrefix; -use crate::animation::AnimationEngine; -use crate::animation::RenderDispatcher; +use crate::AnimationStyle; +use crate::FLOATING_WINDOW_TOGGLE_ASPECT_RATIO; +use crate::SLOW_APPLICATION_COMPENSATION_TIME; +use crate::SLOW_APPLICATION_IDENTIFIERS; use crate::animation::ANIMATION_DURATION_GLOBAL; use crate::animation::ANIMATION_DURATION_PER_ANIMATION; use crate::animation::ANIMATION_ENABLED_GLOBAL; @@ -10,14 +9,15 @@ use crate::animation::ANIMATION_ENABLED_PER_ANIMATION; use crate::animation::ANIMATION_MANAGER; use crate::animation::ANIMATION_STYLE_GLOBAL; use crate::animation::ANIMATION_STYLE_PER_ANIMATION; +use crate::animation::AnimationEngine; +use crate::animation::RenderDispatcher; +use crate::animation::lerp::Lerp; +use crate::animation::prefix::AnimationPrefix; +use crate::animation::prefix::new_animation_key; use crate::com::SetCloak; use crate::focus_manager; use crate::stackbar_manager; use crate::windows_api; -use crate::AnimationStyle; -use crate::FLOATING_WINDOW_TOGGLE_ASPECT_RATIO; -use crate::SLOW_APPLICATION_COMPENSATION_TIME; -use crate::SLOW_APPLICATION_IDENTIFIERS; use std::collections::HashMap; use std::convert::TryFrom; use std::fmt::Display; @@ -31,15 +31,15 @@ use std::time::Duration; use crate::core::config_generation::IdWithIdentifier; use crate::core::config_generation::MatchingRule; use crate::core::config_generation::MatchingStrategy; -use color_eyre::eyre; use color_eyre::Result; +use color_eyre::eyre; use crossbeam_utils::atomic::AtomicConsume; use regex::Regex; use schemars::JsonSchema; -use serde::ser::SerializeStruct; use serde::Deserialize; use serde::Serialize; use serde::Serializer; +use serde::ser::SerializeStruct; use strum::Display; use strum::EnumString; use windows::Win32::Foundation::HWND; @@ -48,11 +48,6 @@ use crate::core::ApplicationIdentifier; use crate::core::HidingBehaviour; use crate::core::Rect; -use crate::styles::ExtendedWindowStyle; -use crate::styles::WindowStyle; -use crate::transparency_manager; -use crate::window_manager_event::WindowManagerEvent; -use crate::windows_api::WindowsApi; use crate::FLOATING_APPLICATIONS; use crate::HIDDEN_HWNDS; use crate::HIDING_BEHAVIOUR; @@ -63,6 +58,11 @@ use crate::NO_TITLEBAR; use crate::PERMAIGNORE_CLASSES; use crate::REGEX_IDENTIFIERS; use crate::WSL2_UI_PROCESSES; +use crate::styles::ExtendedWindowStyle; +use crate::styles::WindowStyle; +use crate::transparency_manager; +use crate::window_manager_event::WindowManagerEvent; +use crate::windows_api::WindowsApi; pub static MINIMUM_WIDTH: AtomicI32 = AtomicI32::new(0); pub static MINIMUM_HEIGHT: AtomicI32 = AtomicI32::new(0); @@ -886,7 +886,7 @@ fn window_is_eligible( let regex_identifiers = REGEX_IDENTIFIERS.lock(); let ignore_identifiers = IGNORE_IDENTIFIERS.lock(); - let should_ignore = if let Some(rule) = should_act( + let should_ignore = match should_act( title, exe_name, class, @@ -894,14 +894,15 @@ fn window_is_eligible( &ignore_identifiers, ®ex_identifiers, ) { - debug.matches_ignore_identifier = Some(rule); - true - } else { - false + Some(rule) => { + debug.matches_ignore_identifier = Some(rule); + true + } + _ => false, }; let manage_identifiers = MANAGE_IDENTIFIERS.lock(); - let managed_override = if let Some(rule) = should_act( + let managed_override = match should_act( title, exe_name, class, @@ -909,10 +910,11 @@ fn window_is_eligible( &manage_identifiers, ®ex_identifiers, ) { - debug.matches_managed_override = Some(rule); - true - } else { - false + Some(rule) => { + debug.matches_managed_override = Some(rule); + true + } + _ => false, }; let floating_identifiers = FLOATING_APPLICATIONS.lock(); @@ -932,7 +934,7 @@ fn window_is_eligible( } let layered_whitelist = LAYERED_WHITELIST.lock(); - let mut allow_layered = if let Some(rule) = should_act( + let mut allow_layered = match should_act( title, exe_name, class, @@ -940,10 +942,11 @@ fn window_is_eligible( &layered_whitelist, ®ex_identifiers, ) { - debug.matches_layered_whitelist = Some(rule); - true - } else { - false + Some(rule) => { + debug.matches_layered_whitelist = Some(rule); + true + } + _ => false, }; let known_layered_hwnds = transparency_manager::known_hwnds(); @@ -970,7 +973,7 @@ fn window_is_eligible( }; let titlebars_removed = NO_TITLEBAR.lock(); - let allow_titlebar_removed = if let Some(rule) = should_act( + let allow_titlebar_removed = match should_act( title, exe_name, class, @@ -978,10 +981,11 @@ fn window_is_eligible( &titlebars_removed, ®ex_identifiers, ) { - debug.matches_no_titlebar = Some(rule); - true - } else { - false + Some(rule) => { + debug.matches_no_titlebar = Some(rule); + true + } + _ => false, }; { diff --git a/komorebi/src/window_manager.rs b/komorebi/src/window_manager.rs index aaebe47d..a1ed321e 100644 --- a/komorebi/src/window_manager.rs +++ b/komorebi/src/window_manager.rs @@ -8,16 +8,16 @@ use std::net::Shutdown; use std::num::NonZeroUsize; use std::path::Path; use std::path::PathBuf; -use std::sync::atomic::Ordering; use std::sync::Arc; +use std::sync::atomic::Ordering; +use color_eyre::Result; use color_eyre::eyre::anyhow; use color_eyre::eyre::bail; -use color_eyre::Result; use crossbeam_channel::Receiver; -use hotwatch::notify::ErrorKind as NotifyErrorKind; use hotwatch::EventKind; use hotwatch::Hotwatch; +use hotwatch::notify::ErrorKind as NotifyErrorKind; use parking_lot::Mutex; use schemars::JsonSchema; use serde::Deserialize; @@ -25,11 +25,9 @@ use serde::Serialize; use uds_windows::UnixListener; use uds_windows::UnixStream; -use crate::animation::AnimationEngine; use crate::animation::ANIMATION_ENABLED_GLOBAL; use crate::animation::ANIMATION_ENABLED_PER_ANIMATION; -use crate::core::config_generation::MatchingRule; -use crate::core::custom_layout::CustomLayout; +use crate::animation::AnimationEngine; use crate::core::Arrangement; use crate::core::Axis; use crate::core::BorderImplementation; @@ -47,7 +45,30 @@ use crate::core::Sizing; use crate::core::StackbarLabel; use crate::core::WindowContainerBehaviour; use crate::core::WindowManagementBehaviour; +use crate::core::config_generation::MatchingRule; +use crate::core::custom_layout::CustomLayout; +use crate::BorderColours; +use crate::CUSTOM_FFM; +use crate::Colour; +use crate::CrossBoundaryBehaviour; +use crate::DATA_DIR; +use crate::DISPLAY_INDEX_PREFERENCES; +use crate::HIDING_BEHAVIOUR; +use crate::HOME_DIR; +use crate::IGNORE_IDENTIFIERS; +use crate::LAYERED_WHITELIST; +use crate::MANAGE_IDENTIFIERS; +use crate::MONITOR_INDEX_PREFERENCES; +use crate::NO_TITLEBAR; +use crate::OBJECT_NAME_CHANGE_ON_LAUNCH; +use crate::REGEX_IDENTIFIERS; +use crate::REMOVE_TITLEBARS; +use crate::Rgb; +use crate::SUBSCRIPTION_SOCKETS; +use crate::TRANSPARENCY_BLACKLIST; +use crate::TRAY_AND_MULTI_WINDOW_IDENTIFIERS; +use crate::WORKSPACE_MATCHING_RULES; use crate::border_manager; use crate::border_manager::BORDER_OFFSET; use crate::border_manager::BORDER_WIDTH; @@ -78,27 +99,6 @@ use crate::windows_api::WindowsApi; use crate::winevent_listener; use crate::workspace::Workspace; use crate::workspace::WorkspaceLayer; -use crate::BorderColours; -use crate::Colour; -use crate::CrossBoundaryBehaviour; -use crate::Rgb; -use crate::CUSTOM_FFM; -use crate::DATA_DIR; -use crate::DISPLAY_INDEX_PREFERENCES; -use crate::HIDING_BEHAVIOUR; -use crate::HOME_DIR; -use crate::IGNORE_IDENTIFIERS; -use crate::LAYERED_WHITELIST; -use crate::MANAGE_IDENTIFIERS; -use crate::MONITOR_INDEX_PREFERENCES; -use crate::NO_TITLEBAR; -use crate::OBJECT_NAME_CHANGE_ON_LAUNCH; -use crate::REGEX_IDENTIFIERS; -use crate::REMOVE_TITLEBARS; -use crate::SUBSCRIPTION_SOCKETS; -use crate::TRANSPARENCY_BLACKLIST; -use crate::TRAY_AND_MULTI_WINDOW_IDENTIFIERS; -use crate::WORKSPACE_MATCHING_RULES; #[derive(Debug)] pub struct WindowManager { @@ -1317,32 +1317,41 @@ impl WindowManager { .update_focused_workspace(offset)?; if follow_focus { - if let Some(window) = self.focused_workspace()?.maximized_window() { - if trigger_focus { - window.focus(self.mouse_follows_focus)?; - } - } else if let Some(container) = self.focused_workspace()?.monocle_container() { - if let Some(window) = container.focused_window() { + match self.focused_workspace()?.maximized_window() { + Some(window) => { if trigger_focus { window.focus(self.mouse_follows_focus)?; } } - } else if let Ok(window) = self.focused_window_mut() { - if trigger_focus { - window.focus(self.mouse_follows_focus)?; - } - } else { - let desktop_window = Window::from(WindowsApi::desktop_window()?); - - let rect = self.focused_monitor_size()?; - WindowsApi::center_cursor_in_rect(&rect)?; - - match WindowsApi::raise_and_focus_window(desktop_window.hwnd) { - Ok(()) => {} - Err(error) => { - tracing::warn!("{} {}:{}", error, file!(), line!()); + _ => match self.focused_workspace()?.monocle_container() { + Some(container) => { + if let Some(window) = container.focused_window() { + if trigger_focus { + window.focus(self.mouse_follows_focus)?; + } + } } - } + _ => match self.focused_window_mut() { + Ok(window) => { + if trigger_focus { + window.focus(self.mouse_follows_focus)?; + } + } + _ => { + let desktop_window = Window::from(WindowsApi::desktop_window()?); + + let rect = self.focused_monitor_size()?; + WindowsApi::center_cursor_in_rect(&rect)?; + + match WindowsApi::raise_and_focus_window(desktop_window.hwnd) { + Ok(()) => {} + Err(error) => { + tracing::warn!("{} {}:{}", error, file!(), line!()); + } + } + } + }, + }, } } else { if self.focused_workspace()?.is_empty() { @@ -2511,12 +2520,10 @@ impl WindowManager { tracing::info!("cycling container windows"); - let container = - if let Some(container) = self.focused_workspace_mut()?.monocle_container_mut() { - container - } else { - self.focused_container_mut()? - }; + let container = match self.focused_workspace_mut()?.monocle_container_mut() { + Some(container) => container, + _ => self.focused_container_mut()?, + }; let len = NonZeroUsize::new(container.windows().len()) .ok_or_else(|| anyhow!("there must be at least one window in a container"))?; @@ -2543,12 +2550,10 @@ impl WindowManager { tracing::info!("cycling container window index"); - let container = - if let Some(container) = self.focused_workspace_mut()?.monocle_container_mut() { - container - } else { - self.focused_container_mut()? - }; + let container = match self.focused_workspace_mut()?.monocle_container_mut() { + Some(container) => container, + _ => self.focused_container_mut()?, + }; let len = NonZeroUsize::new(container.windows().len()) .ok_or_else(|| anyhow!("there must be at least one window in a container"))?; @@ -2573,12 +2578,10 @@ impl WindowManager { tracing::info!("focusing container window at index {idx}"); - let container = - if let Some(container) = self.focused_workspace_mut()?.monocle_container_mut() { - container - } else { - self.focused_container_mut()? - }; + let container = match self.focused_workspace_mut()?.monocle_container_mut() { + Some(container) => container, + _ => self.focused_container_mut()?, + }; let len = NonZeroUsize::new(container.windows().len()) .ok_or_else(|| anyhow!("there must be at least one window in a container"))?; diff --git a/komorebi/src/window_manager_event.rs b/komorebi/src/window_manager_event.rs index 0c02770c..c7704b3f 100644 --- a/komorebi/src/window_manager_event.rs +++ b/komorebi/src/window_manager_event.rs @@ -5,12 +5,12 @@ use schemars::JsonSchema; use serde::Deserialize; use serde::Serialize; -use crate::window::should_act; -use crate::window::Window; -use crate::winevent::WinEvent; use crate::OBJECT_NAME_CHANGE_ON_LAUNCH; use crate::OBJECT_NAME_CHANGE_TITLE_IGNORE_LIST; use crate::REGEX_IDENTIFIERS; +use crate::window::Window; +use crate::window::should_act; +use crate::winevent::WinEvent; #[derive(Debug, Copy, Clone, Serialize, Deserialize, JsonSchema)] #[serde(tag = "type", content = "content")] diff --git a/komorebi/src/windows_api.rs b/komorebi/src/windows_api.rs index 6ffd1508..d8feec18 100644 --- a/komorebi/src/windows_api.rs +++ b/komorebi/src/windows_api.rs @@ -4,15 +4,12 @@ use std::collections::VecDeque; use std::convert::TryFrom; use std::mem::size_of; +use color_eyre::Result; +use color_eyre::eyre::Error; use color_eyre::eyre::anyhow; use color_eyre::eyre::bail; -use color_eyre::eyre::Error; -use color_eyre::Result; -use windows::core::Result as WindowsCrateResult; -use windows::core::PCWSTR; -use windows::core::PWSTR; -use windows::Win32::Foundation::CloseHandle; use windows::Win32::Foundation::COLORREF; +use windows::Win32::Foundation::CloseHandle; use windows::Win32::Foundation::HANDLE; use windows::Win32::Foundation::HINSTANCE; use windows::Win32::Foundation::HMODULE; @@ -21,8 +18,9 @@ use windows::Win32::Foundation::LPARAM; use windows::Win32::Foundation::POINT; use windows::Win32::Foundation::RECT; use windows::Win32::Foundation::WPARAM; -use windows::Win32::Graphics::Dwm::DwmGetWindowAttribute; -use windows::Win32::Graphics::Dwm::DwmSetWindowAttribute; +use windows::Win32::Graphics::Dwm::DWM_CLOAKED_APP; +use windows::Win32::Graphics::Dwm::DWM_CLOAKED_INHERITED; +use windows::Win32::Graphics::Dwm::DWM_CLOAKED_SHELL; use windows::Win32::Graphics::Dwm::DWMWA_BORDER_COLOR; use windows::Win32::Graphics::Dwm::DWMWA_CLOAKED; use windows::Win32::Graphics::Dwm::DWMWA_COLOR_NONE; @@ -30,52 +28,56 @@ use windows::Win32::Graphics::Dwm::DWMWA_EXTENDED_FRAME_BOUNDS; use windows::Win32::Graphics::Dwm::DWMWA_WINDOW_CORNER_PREFERENCE; use windows::Win32::Graphics::Dwm::DWMWCP_ROUND; use windows::Win32::Graphics::Dwm::DWMWINDOWATTRIBUTE; -use windows::Win32::Graphics::Dwm::DWM_CLOAKED_APP; -use windows::Win32::Graphics::Dwm::DWM_CLOAKED_INHERITED; -use windows::Win32::Graphics::Dwm::DWM_CLOAKED_SHELL; +use windows::Win32::Graphics::Dwm::DwmGetWindowAttribute; +use windows::Win32::Graphics::Dwm::DwmSetWindowAttribute; use windows::Win32::Graphics::Gdi::CreateSolidBrush; use windows::Win32::Graphics::Gdi::EnumDisplayMonitors; use windows::Win32::Graphics::Gdi::GetMonitorInfoW; +use windows::Win32::Graphics::Gdi::HBRUSH; +use windows::Win32::Graphics::Gdi::HDC; +use windows::Win32::Graphics::Gdi::HMONITOR; use windows::Win32::Graphics::Gdi::InvalidateRect; +use windows::Win32::Graphics::Gdi::MONITOR_DEFAULTTONEAREST; +use windows::Win32::Graphics::Gdi::MONITORENUMPROC; +use windows::Win32::Graphics::Gdi::MONITORINFOEXW; use windows::Win32::Graphics::Gdi::MonitorFromPoint; use windows::Win32::Graphics::Gdi::MonitorFromWindow; use windows::Win32::Graphics::Gdi::Rectangle; use windows::Win32::Graphics::Gdi::RoundRect; -use windows::Win32::Graphics::Gdi::HBRUSH; -use windows::Win32::Graphics::Gdi::HDC; -use windows::Win32::Graphics::Gdi::HMONITOR; -use windows::Win32::Graphics::Gdi::MONITORENUMPROC; -use windows::Win32::Graphics::Gdi::MONITORINFOEXW; -use windows::Win32::Graphics::Gdi::MONITOR_DEFAULTTONEAREST; use windows::Win32::System::LibraryLoader::GetModuleHandleW; -use windows::Win32::System::Power::RegisterPowerSettingNotification; use windows::Win32::System::Power::HPOWERNOTIFY; +use windows::Win32::System::Power::RegisterPowerSettingNotification; use windows::Win32::System::RemoteDesktop::ProcessIdToSessionId; use windows::Win32::System::RemoteDesktop::WTSRegisterSessionNotification; use windows::Win32::System::Threading::GetCurrentProcessId; use windows::Win32::System::Threading::OpenProcess; -use windows::Win32::System::Threading::QueryFullProcessImageNameW; use windows::Win32::System::Threading::PROCESS_ACCESS_RIGHTS; use windows::Win32::System::Threading::PROCESS_NAME_WIN32; use windows::Win32::System::Threading::PROCESS_QUERY_INFORMATION; -use windows::Win32::UI::HiDpi::GetDpiForMonitor; -use windows::Win32::UI::HiDpi::SetProcessDpiAwarenessContext; +use windows::Win32::System::Threading::QueryFullProcessImageNameW; use windows::Win32::UI::HiDpi::DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2; +use windows::Win32::UI::HiDpi::GetDpiForMonitor; use windows::Win32::UI::HiDpi::MDT_EFFECTIVE_DPI; +use windows::Win32::UI::HiDpi::SetProcessDpiAwarenessContext; use windows::Win32::UI::Input::KeyboardAndMouse::GetKeyState; -use windows::Win32::UI::Input::KeyboardAndMouse::SendInput; use windows::Win32::UI::Input::KeyboardAndMouse::INPUT; use windows::Win32::UI::Input::KeyboardAndMouse::INPUT_0; use windows::Win32::UI::Input::KeyboardAndMouse::INPUT_MOUSE; use windows::Win32::UI::Input::KeyboardAndMouse::MOUSEEVENTF_LEFTDOWN; use windows::Win32::UI::Input::KeyboardAndMouse::MOUSEEVENTF_LEFTUP; use windows::Win32::UI::Input::KeyboardAndMouse::MOUSEINPUT; +use windows::Win32::UI::Input::KeyboardAndMouse::SendInput; use windows::Win32::UI::Input::KeyboardAndMouse::VK_LBUTTON; use windows::Win32::UI::Input::KeyboardAndMouse::VK_MENU; use windows::Win32::UI::WindowsAndMessaging::AllowSetForegroundWindow; use windows::Win32::UI::WindowsAndMessaging::BringWindowToTop; +use windows::Win32::UI::WindowsAndMessaging::CW_USEDEFAULT; use windows::Win32::UI::WindowsAndMessaging::CreateWindowExW; +use windows::Win32::UI::WindowsAndMessaging::DEV_BROADCAST_DEVICEINTERFACE_W; use windows::Win32::UI::WindowsAndMessaging::EnumWindows; +use windows::Win32::UI::WindowsAndMessaging::GW_HWNDNEXT; +use windows::Win32::UI::WindowsAndMessaging::GWL_EXSTYLE; +use windows::Win32::UI::WindowsAndMessaging::GWL_STYLE; use windows::Win32::UI::WindowsAndMessaging::GetCursorPos; use windows::Win32::UI::WindowsAndMessaging::GetDesktopWindow; use windows::Win32::UI::WindowsAndMessaging::GetForegroundWindow; @@ -86,15 +88,37 @@ use windows::Win32::UI::WindowsAndMessaging::GetWindowLongPtrW; use windows::Win32::UI::WindowsAndMessaging::GetWindowRect; use windows::Win32::UI::WindowsAndMessaging::GetWindowTextW; use windows::Win32::UI::WindowsAndMessaging::GetWindowThreadProcessId; +use windows::Win32::UI::WindowsAndMessaging::HDEVNOTIFY; +use windows::Win32::UI::WindowsAndMessaging::HWND_BOTTOM; +use windows::Win32::UI::WindowsAndMessaging::HWND_TOP; use windows::Win32::UI::WindowsAndMessaging::IsIconic; use windows::Win32::UI::WindowsAndMessaging::IsWindow; use windows::Win32::UI::WindowsAndMessaging::IsWindowVisible; use windows::Win32::UI::WindowsAndMessaging::IsZoomed; +use windows::Win32::UI::WindowsAndMessaging::LWA_ALPHA; use windows::Win32::UI::WindowsAndMessaging::MoveWindow; use windows::Win32::UI::WindowsAndMessaging::PostMessageW; +use windows::Win32::UI::WindowsAndMessaging::REGISTER_NOTIFICATION_FLAGS; use windows::Win32::UI::WindowsAndMessaging::RealGetWindowClassW; use windows::Win32::UI::WindowsAndMessaging::RegisterClassW; use windows::Win32::UI::WindowsAndMessaging::RegisterDeviceNotificationW; +use windows::Win32::UI::WindowsAndMessaging::SET_WINDOW_POS_FLAGS; +use windows::Win32::UI::WindowsAndMessaging::SHOW_WINDOW_CMD; +use windows::Win32::UI::WindowsAndMessaging::SPI_GETACTIVEWINDOWTRACKING; +use windows::Win32::UI::WindowsAndMessaging::SPI_GETFOREGROUNDLOCKTIMEOUT; +use windows::Win32::UI::WindowsAndMessaging::SPI_SETACTIVEWINDOWTRACKING; +use windows::Win32::UI::WindowsAndMessaging::SPI_SETFOREGROUNDLOCKTIMEOUT; +use windows::Win32::UI::WindowsAndMessaging::SPIF_SENDCHANGE; +use windows::Win32::UI::WindowsAndMessaging::SW_HIDE; +use windows::Win32::UI::WindowsAndMessaging::SW_MAXIMIZE; +use windows::Win32::UI::WindowsAndMessaging::SW_MINIMIZE; +use windows::Win32::UI::WindowsAndMessaging::SW_NORMAL; +use windows::Win32::UI::WindowsAndMessaging::SW_SHOWNOACTIVATE; +use windows::Win32::UI::WindowsAndMessaging::SWP_NOMOVE; +use windows::Win32::UI::WindowsAndMessaging::SWP_NOSIZE; +use windows::Win32::UI::WindowsAndMessaging::SWP_SHOWWINDOW; +use windows::Win32::UI::WindowsAndMessaging::SYSTEM_PARAMETERS_INFO_ACTION; +use windows::Win32::UI::WindowsAndMessaging::SYSTEM_PARAMETERS_INFO_UPDATE_FLAGS; use windows::Win32::UI::WindowsAndMessaging::SetCursorPos; use windows::Win32::UI::WindowsAndMessaging::SetForegroundWindow; use windows::Win32::UI::WindowsAndMessaging::SetLayeredWindowAttributes; @@ -102,34 +126,6 @@ use windows::Win32::UI::WindowsAndMessaging::SetWindowLongPtrW; use windows::Win32::UI::WindowsAndMessaging::SetWindowPos; use windows::Win32::UI::WindowsAndMessaging::ShowWindow; use windows::Win32::UI::WindowsAndMessaging::SystemParametersInfoW; -use windows::Win32::UI::WindowsAndMessaging::WindowFromPoint; -use windows::Win32::UI::WindowsAndMessaging::CW_USEDEFAULT; -use windows::Win32::UI::WindowsAndMessaging::DEV_BROADCAST_DEVICEINTERFACE_W; -use windows::Win32::UI::WindowsAndMessaging::GWL_EXSTYLE; -use windows::Win32::UI::WindowsAndMessaging::GWL_STYLE; -use windows::Win32::UI::WindowsAndMessaging::GW_HWNDNEXT; -use windows::Win32::UI::WindowsAndMessaging::HDEVNOTIFY; -use windows::Win32::UI::WindowsAndMessaging::HWND_BOTTOM; -use windows::Win32::UI::WindowsAndMessaging::HWND_TOP; -use windows::Win32::UI::WindowsAndMessaging::LWA_ALPHA; -use windows::Win32::UI::WindowsAndMessaging::REGISTER_NOTIFICATION_FLAGS; -use windows::Win32::UI::WindowsAndMessaging::SET_WINDOW_POS_FLAGS; -use windows::Win32::UI::WindowsAndMessaging::SHOW_WINDOW_CMD; -use windows::Win32::UI::WindowsAndMessaging::SPIF_SENDCHANGE; -use windows::Win32::UI::WindowsAndMessaging::SPI_GETACTIVEWINDOWTRACKING; -use windows::Win32::UI::WindowsAndMessaging::SPI_GETFOREGROUNDLOCKTIMEOUT; -use windows::Win32::UI::WindowsAndMessaging::SPI_SETACTIVEWINDOWTRACKING; -use windows::Win32::UI::WindowsAndMessaging::SPI_SETFOREGROUNDLOCKTIMEOUT; -use windows::Win32::UI::WindowsAndMessaging::SWP_NOMOVE; -use windows::Win32::UI::WindowsAndMessaging::SWP_NOSIZE; -use windows::Win32::UI::WindowsAndMessaging::SWP_SHOWWINDOW; -use windows::Win32::UI::WindowsAndMessaging::SW_HIDE; -use windows::Win32::UI::WindowsAndMessaging::SW_MAXIMIZE; -use windows::Win32::UI::WindowsAndMessaging::SW_MINIMIZE; -use windows::Win32::UI::WindowsAndMessaging::SW_NORMAL; -use windows::Win32::UI::WindowsAndMessaging::SW_SHOWNOACTIVATE; -use windows::Win32::UI::WindowsAndMessaging::SYSTEM_PARAMETERS_INFO_ACTION; -use windows::Win32::UI::WindowsAndMessaging::SYSTEM_PARAMETERS_INFO_UPDATE_FLAGS; use windows::Win32::UI::WindowsAndMessaging::WINDOW_LONG_PTR_INDEX; use windows::Win32::UI::WindowsAndMessaging::WM_CLOSE; use windows::Win32::UI::WindowsAndMessaging::WNDCLASSW; @@ -140,23 +136,27 @@ use windows::Win32::UI::WindowsAndMessaging::WS_EX_TOOLWINDOW; use windows::Win32::UI::WindowsAndMessaging::WS_EX_TOPMOST; use windows::Win32::UI::WindowsAndMessaging::WS_POPUP; use windows::Win32::UI::WindowsAndMessaging::WS_SYSMENU; +use windows::Win32::UI::WindowsAndMessaging::WindowFromPoint; +use windows::core::PCWSTR; +use windows::core::PWSTR; +use windows::core::Result as WindowsCrateResult; use windows_core::BOOL; use crate::core::Rect; +use crate::DISPLAY_INDEX_PREFERENCES; +use crate::MONITOR_INDEX_PREFERENCES; +use crate::Window; +use crate::WindowManager; use crate::container::Container; use crate::monitor; use crate::monitor::Monitor; use crate::ring::Ring; use crate::set_window_position::SetWindowPosition; use crate::windows_callbacks; -use crate::Window; -use crate::WindowManager; -use crate::DISPLAY_INDEX_PREFERENCES; -use crate::MONITOR_INDEX_PREFERENCES; macro_rules! as_ptr { - ($value:expr) => { + ($value:expr_2021) => { $value as *mut core::ffi::c_void }; } @@ -1037,7 +1037,9 @@ impl WindowsApi { tracing::info!("current value of ForegroundLockTimeout is {value}"); if value != 0 { - tracing::info!("updating value of ForegroundLockTimeout to {value} in order to enable keyboard-driven focus updating"); + tracing::info!( + "updating value of ForegroundLockTimeout to {value} in order to enable keyboard-driven focus updating" + ); Self::system_parameters_info_w( SPI_SETFOREGROUNDLOCKTIMEOUT, diff --git a/komorebi/src/windows_callbacks.rs b/komorebi/src/windows_callbacks.rs index a5786cc8..c01010ef 100644 --- a/komorebi/src/windows_callbacks.rs +++ b/komorebi/src/windows_callbacks.rs @@ -12,11 +12,11 @@ use windows::Win32::Foundation::HWND; use windows::Win32::Foundation::LPARAM; use windows::Win32::Foundation::WPARAM; use windows::Win32::UI::Accessibility::HWINEVENTHOOK; -use windows::Win32::UI::WindowsAndMessaging::GetWindowLongW; -use windows::Win32::UI::WindowsAndMessaging::SendNotifyMessageW; use windows::Win32::UI::WindowsAndMessaging::GWL_EXSTYLE; use windows::Win32::UI::WindowsAndMessaging::GWL_STYLE; +use windows::Win32::UI::WindowsAndMessaging::GetWindowLongW; use windows::Win32::UI::WindowsAndMessaging::OBJID_WINDOW; +use windows::Win32::UI::WindowsAndMessaging::SendNotifyMessageW; use windows::Win32::UI::WindowsAndMessaging::WS_CHILD; use windows::Win32::UI::WindowsAndMessaging::WS_EX_NOACTIVATE; use windows::Win32::UI::WindowsAndMessaging::WS_EX_TOOLWINDOW; diff --git a/komorebi/src/winevent_listener.rs b/komorebi/src/winevent_listener.rs index 710ac0b7..4068e1aa 100644 --- a/komorebi/src/winevent_listener.rs +++ b/komorebi/src/winevent_listener.rs @@ -5,11 +5,11 @@ use crossbeam_channel::Receiver; use crossbeam_channel::Sender; use windows::Win32::UI::Accessibility::SetWinEventHook; use windows::Win32::UI::WindowsAndMessaging::DispatchMessageW; -use windows::Win32::UI::WindowsAndMessaging::GetMessageW; -use windows::Win32::UI::WindowsAndMessaging::TranslateMessage; use windows::Win32::UI::WindowsAndMessaging::EVENT_MAX; use windows::Win32::UI::WindowsAndMessaging::EVENT_MIN; +use windows::Win32::UI::WindowsAndMessaging::GetMessageW; use windows::Win32::UI::WindowsAndMessaging::MSG; +use windows::Win32::UI::WindowsAndMessaging::TranslateMessage; use windows::Win32::UI::WindowsAndMessaging::WINEVENT_OUTOFCONTEXT; use windows::Win32::UI::WindowsAndMessaging::WINEVENT_SKIPOWNPROCESS; diff --git a/komorebi/src/workspace.rs b/komorebi/src/workspace.rs index feed1671..a9c1a315 100644 --- a/komorebi/src/workspace.rs +++ b/komorebi/src/workspace.rs @@ -4,8 +4,8 @@ use std::fmt::Formatter; use std::num::NonZeroUsize; use std::sync::atomic::Ordering; -use color_eyre::eyre::anyhow; use color_eyre::Result; +use color_eyre::eyre::anyhow; use getset::CopyGetters; use getset::Getters; use getset::MutGetters; @@ -22,6 +22,13 @@ use crate::core::Layout; use crate::core::OperationDirection; use crate::core::Rect; +use crate::DEFAULT_CONTAINER_PADDING; +use crate::DEFAULT_WORKSPACE_PADDING; +use crate::INITIAL_CONFIGURATION_LOADED; +use crate::NO_TITLEBAR; +use crate::REGEX_IDENTIFIERS; +use crate::REMOVE_TITLEBARS; +use crate::WindowContainerBehaviour; use crate::border_manager::BORDER_OFFSET; use crate::border_manager::BORDER_WIDTH; use crate::container::Container; @@ -33,13 +40,6 @@ use crate::static_config::WorkspaceConfig; use crate::window::Window; use crate::window::WindowDetails; use crate::windows_api::WindowsApi; -use crate::WindowContainerBehaviour; -use crate::DEFAULT_CONTAINER_PADDING; -use crate::DEFAULT_WORKSPACE_PADDING; -use crate::INITIAL_CONFIGURATION_LOADED; -use crate::NO_TITLEBAR; -use crate::REGEX_IDENTIFIERS; -use crate::REMOVE_TITLEBARS; #[allow(clippy::struct_field_names)] #[derive( diff --git a/komorebi/src/workspace_reconciliator.rs b/komorebi/src/workspace_reconciliator.rs index d3417ea1..a2ab7ef5 100644 --- a/komorebi/src/workspace_reconciliator.rs +++ b/komorebi/src/workspace_reconciliator.rs @@ -1,7 +1,7 @@ #![deny(clippy::unwrap_used, clippy::expect_used)] -use crate::border_manager; use crate::WindowManager; +use crate::border_manager; use crossbeam_channel::Receiver; use crossbeam_channel::Sender; use crossbeam_utils::atomic::AtomicCell; @@ -51,16 +51,18 @@ pub fn send_notification(monitor_idx: usize, workspace_idx: usize) { } pub fn listen_for_notifications(wm: Arc>) { - std::thread::spawn(move || loop { - match handle_notifications(wm.clone()) { - Ok(()) => { - tracing::warn!("restarting finished thread"); - } - Err(error) => { - if cfg!(debug_assertions) { - tracing::error!("restarting failed thread: {:?}", error) - } else { - tracing::error!("restarting failed thread: {}", error) + std::thread::spawn(move || { + loop { + match handle_notifications(wm.clone()) { + Ok(()) => { + tracing::warn!("restarting finished thread"); + } + Err(error) => { + if cfg!(debug_assertions) { + tracing::error!("restarting failed thread: {:?}", error) + } else { + tracing::error!("restarting failed thread: {}", error) + } } } } diff --git a/komorebic-no-console/Cargo.toml b/komorebic-no-console/Cargo.toml index 31509909..fffd7975 100644 --- a/komorebic-no-console/Cargo.toml +++ b/komorebic-no-console/Cargo.toml @@ -3,7 +3,7 @@ name = "komorebic-no-console" version = "0.1.35" description = "The command-line interface (without a console) for Komorebi, a tiling window manager for Windows" repository = "https://github.com/LGUG2Z/komorebi" -edition = "2021" +edition = "2024" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/komorebic/Cargo.toml b/komorebic/Cargo.toml index 096b125a..fca8ffe6 100644 --- a/komorebic/Cargo.toml +++ b/komorebic/Cargo.toml @@ -3,7 +3,7 @@ name = "komorebic" version = "0.1.35" description = "The command-line interface for Komorebi, a tiling window manager for Windows" repository = "https://github.com/LGUG2Z/komorebi" -edition = "2021" +edition = "2024" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/komorebic/src/main.rs b/komorebic/src/main.rs index 1ad1cef4..16023ecd 100644 --- a/komorebic/src/main.rs +++ b/komorebic/src/main.rs @@ -17,31 +17,31 @@ use std::time::Duration; use clap::CommandFactory; use clap::Parser; use clap::ValueEnum; +use color_eyre::Result; use color_eyre::eyre::anyhow; use color_eyre::eyre::bail; -use color_eyre::Result; use dirs::data_local_dir; use fs_tail::TailedFile; +use komorebi_client::ApplicationSpecificConfiguration; +use komorebi_client::Notification; use komorebi_client::resolve_home_path; use komorebi_client::send_message; use komorebi_client::send_query; -use komorebi_client::ApplicationSpecificConfiguration; -use komorebi_client::Notification; use lazy_static::lazy_static; use miette::NamedSource; use miette::Report; use miette::SourceOffset; use miette::SourceSpan; use paste::paste; -use schemars::gen::SchemaSettings; +use schemars::r#gen::SchemaSettings; use schemars::schema_for; use serde::Deserialize; use sysinfo::ProcessesToUpdate; use which::which; use windows::Win32::Foundation::HWND; -use windows::Win32::UI::WindowsAndMessaging::ShowWindow; use windows::Win32::UI::WindowsAndMessaging::SHOW_WINDOW_CMD; use windows::Win32::UI::WindowsAndMessaging::SW_RESTORE; +use windows::Win32::UI::WindowsAndMessaging::ShowWindow; use komorebi_client::ApplicationConfigurationGenerator; use komorebi_client::ApplicationIdentifier; @@ -1541,7 +1541,9 @@ fn main() -> Result<()> { let whkdrc = include_str!("../../docs/whkdrc.sample"); std::fs::write(WHKD_CONFIG_DIR.join("whkdrc"), whkdrc)?; - println!("Example komorebi.json, komorebi.bar.json, whkdrc and latest applications.json files created"); + println!( + "Example komorebi.json, komorebi.bar.json, whkdrc and latest applications.json files created" + ); println!("You can now run komorebic start --whkd --bar"); } SubCommand::EnableAutostart(args) => { @@ -1587,8 +1589,12 @@ fn main() -> Result<()> { .env("TARGET_ARGS", arguments) .output()?; - println!("NOTE: If your komorebi.json file contains a reference to $Env:KOMOREBI_CONFIG_HOME,"); - println!("you need to add this to System Properties > Environment Variables > User Variables"); + println!( + "NOTE: If your komorebi.json file contains a reference to $Env:KOMOREBI_CONFIG_HOME," + ); + println!( + "you need to add this to System Properties > Environment Variables > User Variables" + ); println!("in order for the autostart command to work properly"); } SubCommand::DisableAutostart => { @@ -1652,16 +1658,23 @@ fn main() -> Result<()> { println!("{:?}", Report::new(diagnostic)); } - println!("Found komorebi.json; this file can be passed to the start command with the --config flag\n"); + println!( + "Found komorebi.json; this file can be passed to the start command with the --config flag\n" + ); if let Ok(config) = StaticConfig::read(&static_config) { match config.app_specific_configuration_path { None => { - println!("Application specific configuration file path has not been set. Try running 'komorebic fetch-asc'\n"); + println!( + "Application specific configuration file path has not been set. Try running 'komorebic fetch-asc'\n" + ); } Some(path) => { if !Path::exists(Path::new(&path)) { - println!("Application specific configuration file path '{}' does not exist. Try running 'komorebic fetch-asc'\n", path.display()); + println!( + "Application specific configuration file path '{}' does not exist. Try running 'komorebic fetch-asc'\n", + path.display() + ); } } } @@ -1679,9 +1692,14 @@ fn main() -> Result<()> { StaticConfig::end_of_life(&raw); if config_whkd.exists() { - println!("Found {}; key bindings will be loaded from here when whkd is started, and you can start it automatically using the --whkd flag\n", config_whkd.to_string_lossy()); + println!( + "Found {}; key bindings will be loaded from here when whkd is started, and you can start it automatically using the --whkd flag\n", + config_whkd.to_string_lossy() + ); } else { - println!("No ~/.config/whkdrc found; you may not be able to control komorebi with your keyboard\n"); + println!( + "No ~/.config/whkdrc found; you may not be able to control komorebi with your keyboard\n" + ); } } else if config_pwsh.exists() { println!("Found komorebi.ps1; this file will be autoloaded by komorebi\n"); @@ -1691,13 +1709,17 @@ fn main() -> Result<()> { config_whkd.to_string_lossy() ); } else { - println!("No ~/.config/whkdrc found; you may not be able to control komorebi with your keyboard\n"); + println!( + "No ~/.config/whkdrc found; you may not be able to control komorebi with your keyboard\n" + ); } } else if config_ahk.exists() { println!("Found komorebi.ahk; this file will be autoloaded by komorebi\n"); } else { println!("No komorebi configuration found in {home_display}\n"); - println!("If running 'komorebic start --await-configuration', you will manually have to call the following command to begin tiling: komorebic complete-configuration\n"); + println!( + "If running 'komorebic start --await-configuration', you will manually have to call the following command to begin tiling: komorebic complete-configuration\n" + ); } let client = reqwest::blocking::Client::new(); @@ -1719,7 +1741,9 @@ fn main() -> Result<()> { { let trimmed = release.tag_name.trim_start_matches("v"); if trimmed > version { - println!("An updated version of komorebi is available! https://github.com/LGUG2Z/komorebi/releases/v{trimmed}"); + println!( + "An updated version of komorebi is available! https://github.com/LGUG2Z/komorebi/releases/v{trimmed}" + ); } } } @@ -2034,38 +2058,45 @@ fn main() -> Result<()> { } if arg.whkd && which("whkd").is_err() { - bail!("could not find whkd, please make sure it is installed before using the --whkd flag"); + bail!( + "could not find whkd, please make sure it is installed before using the --whkd flag" + ); } if arg.masir && which("masir").is_err() { - bail!("could not find masir, please make sure it is installed before using the --masir flag"); + bail!( + "could not find masir, please make sure it is installed before using the --masir flag" + ); } if arg.ahk && which(&ahk).is_err() { - bail!("could not find autohotkey, please make sure it is installed before using the --ahk flag"); + bail!( + "could not find autohotkey, please make sure it is installed before using the --ahk flag" + ); } let mut buf: PathBuf; // The komorebi.ps1 shim will only exist in the Path if installed by Scoop - let exec = if let Ok(output) = Command::new("where.exe").arg("komorebi.ps1").output() { - let stdout = String::from_utf8(output.stdout)?; - match stdout.trim() { - "" => None, - // It's possible that a komorebi.ps1 config will be in %USERPROFILE% - ignore this - stdout if !stdout.contains("scoop") => None, - stdout => { - buf = PathBuf::from(stdout); - buf.pop(); // %USERPROFILE%\scoop\shims - buf.pop(); // %USERPROFILE%\scoop - buf.push("apps\\komorebi\\current\\komorebi.exe"); //%USERPROFILE%\scoop\komorebi\current\komorebi.exe - Some(buf.to_str().ok_or_else(|| { - anyhow!("cannot create a string from the scoop komorebi path") - })?) + let exec = match Command::new("where.exe").arg("komorebi.ps1").output() { + Ok(output) => { + let stdout = String::from_utf8(output.stdout)?; + match stdout.trim() { + "" => None, + // It's possible that a komorebi.ps1 config will be in %USERPROFILE% - ignore this + stdout if !stdout.contains("scoop") => None, + stdout => { + buf = PathBuf::from(stdout); + buf.pop(); // %USERPROFILE%\scoop\shims + buf.pop(); // %USERPROFILE%\scoop + buf.push("apps\\komorebi\\current\\komorebi.exe"); //%USERPROFILE%\scoop\komorebi\current\komorebi.exe + Some(buf.to_str().ok_or_else(|| { + anyhow!("cannot create a string from the scoop komorebi path") + })?) + } } } - } else { - None + _ => None, }; let mut flags = vec![]; @@ -2267,18 +2298,28 @@ if (!(Get-Process masir -ErrorAction SilentlyContinue)) println!("\nThank you for using komorebi!\n"); println!("# Commercial Use License"); - println!("* View licensing options https://lgug2z.com/software/komorebi - A commercial use license is required to use komorebi at work"); + println!( + "* View licensing options https://lgug2z.com/software/komorebi - A commercial use license is required to use komorebi at work" + ); println!("\n# Personal Use Sponsorship"); - println!("* Become a sponsor https://github.com/sponsors/LGUG2Z - $5/month makes a big difference"); + println!( + "* Become a sponsor https://github.com/sponsors/LGUG2Z - $5/month makes a big difference" + ); println!("* Leave a tip https://ko-fi.com/lgug2z - An alternative to GitHub Sponsors"); println!("\n# Community"); - println!("* Join the Discord https://discord.gg/mGkn66PHkx - Chat, ask questions, share your desktops"); + println!( + "* Join the Discord https://discord.gg/mGkn66PHkx - Chat, ask questions, share your desktops" + ); println!( "* Subscribe to https://youtube.com/@LGUG2Z - Development videos, feature previews and release overviews" ); - println!("* Explore the Awesome Komorebi list https://github.com/LGUG2Z/awesome-komorebi - Projects in the komorebi ecosystem"); + println!( + "* Explore the Awesome Komorebi list https://github.com/LGUG2Z/awesome-komorebi - Projects in the komorebi ecosystem" + ); println!("\n# Documentation"); - println!("* Read the docs https://lgug2z.github.io/komorebi - Quickly search through all komorebic commands"); + println!( + "* Read the docs https://lgug2z.github.io/komorebi - Quickly search through all komorebic commands" + ); let bar_config = arg.config.map_or_else( || { @@ -2325,7 +2366,9 @@ if (!(Get-Process masir -ErrorAction SilentlyContinue)) { let trimmed = release.tag_name.trim_start_matches("v"); if trimmed > version { - println!("An updated version of komorebi is available! https://github.com/LGUG2Z/komorebi/releases/v{trimmed}"); + println!( + "An updated version of komorebi is available! https://github.com/LGUG2Z/komorebi/releases/v{trimmed}" + ); } } } @@ -2950,7 +2993,9 @@ if (Get-Command Get-CimInstance -ErrorAction SilentlyContinue) { file.write_all(formatted_content.as_bytes())?; - println!("File successfully formatted for PRs to https://github.com/LGUG2Z/komorebi-application-specific-configuration"); + println!( + "File successfully formatted for PRs to https://github.com/LGUG2Z/komorebi-application-specific-configuration" + ); } SubCommand::FetchAppSpecificConfiguration => { let content = reqwest::blocking::get("https://raw.githubusercontent.com/LGUG2Z/komorebi-application-specific-configuration/master/applications.json")? @@ -2966,10 +3011,12 @@ if (Get-Command Get-CimInstance -ErrorAction SilentlyContinue) { file.write_all(content.as_bytes())?; - println!("Latest version of applications.json from https://github.com/LGUG2Z/komorebi-application-specific-configuration downloaded\n"); println!( - "You can add this to your komorebi.json static configuration file like this: \n\n\"app_specific_configuration_path\": \"{}\"", - output_file.display().to_string().replace("\\", "/") + "Latest version of applications.json from https://github.com/LGUG2Z/komorebi-application-specific-configuration downloaded\n" + ); + println!( + "You can add this to your komorebi.json static configuration file like this: \n\n\"app_specific_configuration_path\": \"{}\"", + output_file.display().to_string().replace("\\", "/") ); } SubCommand::ApplicationSpecificConfigurationSchema => { @@ -2994,8 +3041,8 @@ if (Get-Command Get-CimInstance -ErrorAction SilentlyContinue) { s.inline_subschemas = true; }); - let gen = settings.into_generator(); - let socket_message = gen.into_root_schema_for::(); + let r#gen = settings.into_generator(); + let socket_message = r#gen.into_root_schema_for::(); let schema = serde_json::to_string_pretty(&socket_message)?; println!("{schema}"); }