diff --git a/Cargo.lock b/Cargo.lock index 3519da0b..c003e3bb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -855,6 +855,7 @@ dependencies = [ "iana-time-zone", "js-sys", "num-traits", + "serde", "wasm-bindgen", "windows-targets 0.52.6", ] @@ -1759,6 +1760,21 @@ dependencies = [ "libc", ] +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + [[package]] name = "futures-channel" version = "0.3.31" @@ -1775,6 +1791,17 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + [[package]] name = "futures-io" version = "0.3.31" @@ -1823,6 +1850,7 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ + "futures-channel", "futures-core", "futures-io", "futures-macro", @@ -5882,11 +5910,13 @@ dependencies = [ [[package]] name = "win32-display-data" version = "0.1.0" -source = "git+https://github.com/LGUG2Z/win32-display-data?rev=dd65e3f22d0521b78fcddde11abc2a3e9dcc32a8#dd65e3f22d0521b78fcddde11abc2a3e9dcc32a8" +source = "git+https://github.com/LGUG2Z/win32-display-data?rev=75286e77c068a89d12adcd6404c9c4874a60acf5#75286e77c068a89d12adcd6404c9c4874a60acf5" dependencies = [ "itertools", + "serde", "thiserror 1.0.69", "windows 0.58.0", + "wmi", ] [[package]] @@ -5940,6 +5970,16 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f919aee0a93304be7f62e8e5027811bbba96bcb1de84d6618be56e43f8a32a1" +dependencies = [ + "windows-core 0.59.0", + "windows-targets 0.53.0", +] + [[package]] name = "windows-core" version = "0.52.0" @@ -5970,10 +6010,23 @@ dependencies = [ "windows-implement 0.58.0", "windows-interface 0.58.0", "windows-result 0.2.0", - "windows-strings", + "windows-strings 0.1.0", "windows-targets 0.52.6", ] +[[package]] +name = "windows-core" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "810ce18ed2112484b0d4e15d022e5f598113e220c53e373fb31e67e21670c1ce" +dependencies = [ + "windows-implement 0.59.0", + "windows-interface 0.59.0", + "windows-result 0.3.0", + "windows-strings 0.3.0", + "windows-targets 0.53.0", +] + [[package]] name = "windows-icons" version = "0.1.0" @@ -6007,6 +6060,17 @@ dependencies = [ "syn", ] +[[package]] +name = "windows-implement" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83577b051e2f49a058c308f17f273b570a6a758386fc291b5f6a934dd84e48c1" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "windows-interface" version = "0.57.0" @@ -6029,6 +6093,17 @@ dependencies = [ "syn", ] +[[package]] +name = "windows-interface" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb26fd936d991781ea39e87c3a27285081e3c0da5ca0fcbc02d368cc6f52ff01" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "windows-registry" version = "0.2.0" @@ -6036,7 +6111,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" dependencies = [ "windows-result 0.2.0", - "windows-strings", + "windows-strings 0.1.0", "windows-targets 0.52.6", ] @@ -6058,6 +6133,15 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-result" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d08106ce80268c4067c0571ca55a9b4e9516518eaa1a1fe9b37ca403ae1d1a34" +dependencies = [ + "windows-targets 0.53.0", +] + [[package]] name = "windows-strings" version = "0.1.0" @@ -6068,6 +6152,15 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-strings" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b888f919960b42ea4e11c2f408fadb55f78a9f236d5eef084103c8ce52893491" +dependencies = [ + "windows-targets 0.53.0", +] + [[package]] name = "windows-sys" version = "0.45.0" @@ -6143,13 +6236,29 @@ dependencies = [ "windows_aarch64_gnullvm 0.52.6", "windows_aarch64_msvc 0.52.6", "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm", + "windows_i686_gnullvm 0.52.6", "windows_i686_msvc 0.52.6", "windows_x86_64_gnu 0.52.6", "windows_x86_64_gnullvm 0.52.6", "windows_x86_64_msvc 0.52.6", ] +[[package]] +name = "windows-targets" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" +dependencies = [ + "windows_aarch64_gnullvm 0.53.0", + "windows_aarch64_msvc 0.53.0", + "windows_i686_gnu 0.53.0", + "windows_i686_gnullvm 0.53.0", + "windows_i686_msvc 0.53.0", + "windows_x86_64_gnu 0.53.0", + "windows_x86_64_gnullvm 0.53.0", + "windows_x86_64_msvc 0.53.0", +] + [[package]] name = "windows_aarch64_gnullvm" version = "0.42.2" @@ -6168,6 +6277,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" + [[package]] name = "windows_aarch64_msvc" version = "0.42.2" @@ -6186,6 +6301,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" + [[package]] name = "windows_i686_gnu" version = "0.42.2" @@ -6204,12 +6325,24 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" +[[package]] +name = "windows_i686_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" + [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" + [[package]] name = "windows_i686_msvc" version = "0.42.2" @@ -6228,6 +6361,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +[[package]] +name = "windows_i686_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" + [[package]] name = "windows_x86_64_gnu" version = "0.42.2" @@ -6246,6 +6385,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" + [[package]] name = "windows_x86_64_gnullvm" version = "0.42.2" @@ -6264,6 +6409,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" + [[package]] name = "windows_x86_64_msvc" version = "0.42.2" @@ -6282,6 +6433,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" + [[package]] name = "winit" version = "0.30.8" @@ -6368,6 +6525,21 @@ version = "0.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d135d17ab770252ad95e9a872d365cf3090e3be864a34ab46f48555993efc904" +[[package]] +name = "wmi" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a73f536e843f309e9f7f1036561f844c0d07cf735603cb0fc230ae76e6da9aff" +dependencies = [ + "chrono", + "futures", + "log", + "serde", + "thiserror 2.0.11", + "windows 0.59.0", + "windows-core 0.59.0", +] + [[package]] name = "write16" version = "1.0.0" diff --git a/Cargo.toml b/Cargo.toml index 4efdcff4..83ee6017 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -33,7 +33,7 @@ tracing-subscriber = { version = "0.3", features = ["env-filter"] } paste = "1" sysinfo = "0.33" uds_windows = "1" -win32-display-data = { git = "https://github.com/LGUG2Z/win32-display-data", rev = "dd65e3f22d0521b78fcddde11abc2a3e9dcc32a8" } +win32-display-data = { git = "https://github.com/LGUG2Z/win32-display-data", rev = "75286e77c068a89d12adcd6404c9c4874a60acf5" } windows-implement = { version = "0.58" } windows-interface = { version = "0.58" } windows-core = { version = "0.58" } diff --git a/komorebi/src/com/mod.rs b/komorebi/src/com/mod.rs index 8067a051..352de590 100644 --- a/komorebi/src/com/mod.rs +++ b/komorebi/src/com/mod.rs @@ -15,7 +15,7 @@ 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_APARTMENTTHREADED; +use windows::Win32::System::Com::COINIT_MULTITHREADED; use windows_core::Interface; struct ComInit(); @@ -23,10 +23,7 @@ struct ComInit(); impl ComInit { pub fn new() -> Self { unsafe { - // Notice: Only COINIT_APARTMENTTHREADED works correctly! - // - // Not COINIT_MULTITHREADED or CoIncrementMTAUsage, they cause a seldom crashes in threading tests. - CoInitializeEx(None, COINIT_APARTMENTTHREADED).unwrap(); + CoInitializeEx(None, COINIT_MULTITHREADED).unwrap(); } Self() } diff --git a/komorebi/src/monitor.rs b/komorebi/src/monitor.rs index d38ffeb3..64a74e6b 100644 --- a/komorebi/src/monitor.rs +++ b/komorebi/src/monitor.rs @@ -44,6 +44,8 @@ pub struct Monitor { #[getset(get = "pub", set = "pub")] device_id: String, #[getset(get = "pub", set = "pub")] + serial_number_id: Option, + #[getset(get = "pub", set = "pub")] size: Rect, #[getset(get = "pub", set = "pub")] work_area_size: Rect, @@ -63,6 +65,29 @@ pub struct Monitor { impl_ring_elements!(Monitor, Workspace); +#[derive(Serialize)] +pub struct MonitorInformation { + pub id: isize, + pub name: String, + pub device: String, + pub device_id: String, + pub serial_number_id: Option, + pub size: Rect, +} + +impl From<&Monitor> for MonitorInformation { + fn from(monitor: &Monitor) -> Self { + Self { + id: monitor.id, + name: monitor.name.clone(), + device: monitor.device.clone(), + device_id: monitor.device_id.clone(), + serial_number_id: monitor.serial_number_id.clone(), + size: monitor.size, + } + } +} + pub fn new( id: isize, size: Rect, @@ -70,6 +95,7 @@ pub fn new( name: String, device: String, device_id: String, + serial_number_id: Option, ) -> Monitor { let mut workspaces = Ring::default(); workspaces.elements_mut().push_back(Workspace::default()); @@ -79,6 +105,7 @@ pub fn new( name, device, device_id, + serial_number_id, size, work_area_size, work_area_offset: None, @@ -97,6 +124,7 @@ impl Monitor { name: "PLACEHOLDER".to_string(), device: "".to_string(), device_id: "".to_string(), + serial_number_id: None, size: Default::default(), work_area_size: Default::default(), work_area_offset: None, diff --git a/komorebi/src/monitor_reconciliator/mod.rs b/komorebi/src/monitor_reconciliator/mod.rs index ae3122cd..e8f3a000 100644 --- a/komorebi/src/monitor_reconciliator/mod.rs +++ b/komorebi/src/monitor_reconciliator/mod.rs @@ -99,10 +99,12 @@ pub fn attached_display_devices() -> color_eyre::Result> { name, device, device_id, + display.serial_number_id, ) }) .collect::>()) } + pub fn listen_for_notifications(wm: Arc>) -> color_eyre::Result<()> { #[allow(clippy::expect_used)] Hidden::create("komorebi-hidden")?; @@ -126,6 +128,7 @@ pub fn listen_for_notifications(wm: Arc>) -> color_eyre::Re Ok(()) } + pub fn handle_notifications(wm: Arc>) -> color_eyre::Result<()> { tracing::info!("listening"); diff --git a/komorebi/src/process_command.rs b/komorebi/src/process_command.rs index 4c10e15f..29d715f5 100644 --- a/komorebi/src/process_command.rs +++ b/komorebi/src/process_command.rs @@ -52,6 +52,7 @@ use crate::border_manager::STYLE; use crate::colour::Rgb; use crate::config_generation::WorkspaceMatchingRule; use crate::current_virtual_desktop; +use crate::monitor::MonitorInformation; use crate::notify_subscribers; use crate::stackbar_manager; use crate::stackbar_manager::STACKBAR_FONT_FAMILY; @@ -1051,9 +1052,9 @@ impl WindowManager { reply.write_all(visible_windows_state.as_bytes())?; } SocketMessage::MonitorInformation => { - let mut monitors = HashMap::new(); + let mut monitors = vec![]; for monitor in self.monitors() { - monitors.insert(monitor.device_id(), monitor.size()); + monitors.push(MonitorInformation::from(monitor)); } let monitors_state = serde_json::to_string_pretty(&monitors) diff --git a/komorebi/src/windows_api.rs b/komorebi/src/windows_api.rs index 9469492e..cefc7119 100644 --- a/komorebi/src/windows_api.rs +++ b/komorebi/src/windows_api.rs @@ -283,6 +283,7 @@ impl WindowsApi { name, device, device_id, + display.serial_number_id, ); let mut index_preference = None; @@ -936,6 +937,7 @@ impl WindowsApi { name, device, device_id, + display.serial_number_id, ); return Ok(monitor);