mirror of
https://github.com/LGUG2Z/komorebi.git
synced 2026-07-18 02:51:14 +02:00
wip vibes
This commit is contained in:
@@ -258,6 +258,26 @@ pub fn handle_notifications(wm: Arc<Mutex<WindowManager>>) -> color_eyre::Result
|
|||||||
| MonitorNotification::SessionUnlocked
|
| MonitorNotification::SessionUnlocked
|
||||||
| MonitorNotification::DisplayConnectionChange => {
|
| MonitorNotification::DisplayConnectionChange => {
|
||||||
tracing::debug!("handling display connection change notification");
|
tracing::debug!("handling display connection change notification");
|
||||||
|
let mut has_duplicate_serial_ids = false;
|
||||||
|
|
||||||
|
{
|
||||||
|
let mut serial_id_tracker = vec![];
|
||||||
|
|
||||||
|
for m in wm.monitors() {
|
||||||
|
if let Some(id) = m.serial_number_id() {
|
||||||
|
serial_id_tracker.push(id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
serial_id_tracker.sort();
|
||||||
|
let before_dedup = serial_id_tracker.len();
|
||||||
|
serial_id_tracker.dedup();
|
||||||
|
let after_dedup = serial_id_tracker.len();
|
||||||
|
if before_dedup != after_dedup {
|
||||||
|
has_duplicate_serial_ids = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let mut monitor_cache = MONITOR_CACHE
|
let mut monitor_cache = MONITOR_CACHE
|
||||||
.get_or_init(|| Mutex::new(HashMap::new()))
|
.get_or_init(|| Mutex::new(HashMap::new()))
|
||||||
.lock();
|
.lock();
|
||||||
@@ -270,8 +290,9 @@ pub fn handle_notifications(wm: Arc<Mutex<WindowManager>>) -> color_eyre::Result
|
|||||||
// Make sure that in our state any attached displays have the latest Win32 data
|
// Make sure that in our state any attached displays have the latest Win32 data
|
||||||
for monitor in wm.monitors_mut() {
|
for monitor in wm.monitors_mut() {
|
||||||
for attached in &attached_devices {
|
for attached in &attached_devices {
|
||||||
if attached.serial_number_id().eq(monitor.serial_number_id())
|
// Acer monitors are dumb and can have the same serial ID, so check by device ID first
|
||||||
|| attached.device_id().eq(monitor.device_id())
|
if attached.device_id().eq(monitor.device_id())
|
||||||
|
|| attached.serial_number_id().eq(monitor.serial_number_id())
|
||||||
{
|
{
|
||||||
monitor.set_id(attached.id());
|
monitor.set_id(attached.id());
|
||||||
monitor.set_device(attached.device().clone());
|
monitor.set_device(attached.device().clone());
|
||||||
@@ -313,13 +334,17 @@ pub fn handle_notifications(wm: Arc<Mutex<WindowManager>>) -> color_eyre::Result
|
|||||||
|
|
||||||
for (m_idx, m) in wm.monitors().iter().enumerate() {
|
for (m_idx, m) in wm.monitors().iter().enumerate() {
|
||||||
if !attached_devices.iter().any(|attached| {
|
if !attached_devices.iter().any(|attached| {
|
||||||
attached.serial_number_id().eq(m.serial_number_id())
|
// Acer monitors are dumb and can have the same serial ID, so check by device ID first
|
||||||
|| attached.device_id().eq(m.device_id())
|
attached.device_id().eq(m.device_id())
|
||||||
|
|| attached.serial_number_id().eq(m.serial_number_id())
|
||||||
}) {
|
}) {
|
||||||
let id = m
|
let id = if has_duplicate_serial_ids {
|
||||||
.serial_number_id()
|
m.device_id().clone()
|
||||||
|
} else {
|
||||||
|
m.serial_number_id()
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.map_or(m.device_id().clone(), |sn| sn.clone());
|
.map_or(m.device_id().clone(), |sn| sn.clone())
|
||||||
|
};
|
||||||
|
|
||||||
newly_removed_displays.push(id.clone());
|
newly_removed_displays.push(id.clone());
|
||||||
|
|
||||||
|
|||||||
@@ -1199,6 +1199,8 @@ impl StaticConfig {
|
|||||||
|
|
||||||
let offset = wm.work_area_offset;
|
let offset = wm.work_area_offset;
|
||||||
for (i, monitor) in wm.monitors_mut().iter_mut().enumerate() {
|
for (i, monitor) in wm.monitors_mut().iter_mut().enumerate() {
|
||||||
|
let mut prefers_device_id = false;
|
||||||
|
|
||||||
let preferred_config_idx = {
|
let preferred_config_idx = {
|
||||||
let display_index_preferences = DISPLAY_INDEX_PREFERENCES.read();
|
let display_index_preferences = DISPLAY_INDEX_PREFERENCES.read();
|
||||||
let c_idx = display_index_preferences.iter().find_map(|(c_idx, id)| {
|
let c_idx = display_index_preferences.iter().find_map(|(c_idx, id)| {
|
||||||
@@ -1209,6 +1211,15 @@ impl StaticConfig {
|
|||||||
|| monitor.device_id() == id)
|
|| monitor.device_id() == id)
|
||||||
.then_some(*c_idx)
|
.then_some(*c_idx)
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if let Some(c_idx) = c_idx {
|
||||||
|
if let Some(id) = display_index_preferences.get(&c_idx) {
|
||||||
|
if id.contains("UID") {
|
||||||
|
prefers_device_id = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
c_idx
|
c_idx
|
||||||
};
|
};
|
||||||
let idx = preferred_config_idx.or({
|
let idx = preferred_config_idx.or({
|
||||||
@@ -1256,10 +1267,16 @@ impl StaticConfig {
|
|||||||
// Check if this monitor config is the preferred config for this monitor and store
|
// Check if this monitor config is the preferred config for this monitor and store
|
||||||
// a copy of the monitor itself on the monitor cache if it is.
|
// a copy of the monitor itself on the monitor cache if it is.
|
||||||
if idx == preferred_config_idx {
|
if idx == preferred_config_idx {
|
||||||
let id = monitor
|
// Don't even consider the serial ID if the user prefers the device ID
|
||||||
|
let id = if prefers_device_id {
|
||||||
|
monitor.device_id()
|
||||||
|
} else {
|
||||||
|
monitor
|
||||||
.serial_number_id()
|
.serial_number_id()
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.map_or(monitor.device_id(), |sn| sn);
|
.map_or(monitor.device_id(), |sn| sn)
|
||||||
|
};
|
||||||
|
|
||||||
monitor_reconciliator::insert_in_monitor_cache(id, monitor.clone());
|
monitor_reconciliator::insert_in_monitor_cache(id, monitor.clone());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1368,6 +1385,8 @@ impl StaticConfig {
|
|||||||
|
|
||||||
let offset = wm.work_area_offset;
|
let offset = wm.work_area_offset;
|
||||||
for (i, monitor) in wm.monitors_mut().iter_mut().enumerate() {
|
for (i, monitor) in wm.monitors_mut().iter_mut().enumerate() {
|
||||||
|
let mut prefers_device_id = false;
|
||||||
|
|
||||||
let preferred_config_idx = {
|
let preferred_config_idx = {
|
||||||
let display_index_preferences = DISPLAY_INDEX_PREFERENCES.read();
|
let display_index_preferences = DISPLAY_INDEX_PREFERENCES.read();
|
||||||
let c_idx = display_index_preferences.iter().find_map(|(c_idx, id)| {
|
let c_idx = display_index_preferences.iter().find_map(|(c_idx, id)| {
|
||||||
@@ -1378,6 +1397,15 @@ impl StaticConfig {
|
|||||||
|| monitor.device_id() == id)
|
|| monitor.device_id() == id)
|
||||||
.then_some(*c_idx)
|
.then_some(*c_idx)
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if let Some(c_idx) = c_idx {
|
||||||
|
if let Some(id) = display_index_preferences.get(&c_idx) {
|
||||||
|
if id.contains("UID") {
|
||||||
|
prefers_device_id = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
c_idx
|
c_idx
|
||||||
};
|
};
|
||||||
let idx = preferred_config_idx.or({
|
let idx = preferred_config_idx.or({
|
||||||
@@ -1428,10 +1456,16 @@ impl StaticConfig {
|
|||||||
// Check if this monitor config is the preferred config for this monitor and store
|
// Check if this monitor config is the preferred config for this monitor and store
|
||||||
// a copy of the monitor itself on the monitor cache if it is.
|
// a copy of the monitor itself on the monitor cache if it is.
|
||||||
if idx == preferred_config_idx {
|
if idx == preferred_config_idx {
|
||||||
let id = monitor
|
// Don't even consider the serial ID if the user prefers the device ID
|
||||||
|
let id = if prefers_device_id {
|
||||||
|
monitor.device_id()
|
||||||
|
} else {
|
||||||
|
monitor
|
||||||
.serial_number_id()
|
.serial_number_id()
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.map_or(monitor.device_id(), |sn| sn);
|
.map_or(monitor.device_id(), |sn| sn)
|
||||||
|
};
|
||||||
|
|
||||||
monitor_reconciliator::insert_in_monitor_cache(id, monitor.clone());
|
monitor_reconciliator::insert_in_monitor_cache(id, monitor.clone());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user