feat(wm): use monitor hardware ids where available

This commit pulls in changes to win32-display-data which provide the
monitor hardware serial number id taken from WmiMonitorID where
available.

No work has yet been done to integrate this with options such as
display_index_preferences.
This commit is contained in:
LGUG2Z
2025-01-25 15:16:52 -08:00
parent 81c143d7c2
commit e2f7fe50c9
7 changed files with 215 additions and 12 deletions
+2 -5
View File
@@ -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()
}
+28
View File
@@ -44,6 +44,8 @@ pub struct Monitor {
#[getset(get = "pub", set = "pub")]
device_id: String,
#[getset(get = "pub", set = "pub")]
serial_number_id: Option<String>,
#[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<String>,
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<String>,
) -> 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,
@@ -99,10 +99,12 @@ pub fn attached_display_devices() -> color_eyre::Result<Vec<Monitor>> {
name,
device,
device_id,
display.serial_number_id,
)
})
.collect::<Vec<_>>())
}
pub fn listen_for_notifications(wm: Arc<Mutex<WindowManager>>) -> color_eyre::Result<()> {
#[allow(clippy::expect_used)]
Hidden::create("komorebi-hidden")?;
@@ -126,6 +128,7 @@ pub fn listen_for_notifications(wm: Arc<Mutex<WindowManager>>) -> color_eyre::Re
Ok(())
}
pub fn handle_notifications(wm: Arc<Mutex<WindowManager>>) -> color_eyre::Result<()> {
tracing::info!("listening");
+3 -2
View File
@@ -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)
+2
View File
@@ -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);