From a3c81119e87c7de721dd3a2218dbdf224cbb5dc9 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Wed, 14 Aug 2024 17:12:41 -0600 Subject: [PATCH] Use fallback scale if size is invalid --- src/backend/kms/device.rs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/backend/kms/device.rs b/src/backend/kms/device.rs index ee6edd5e..a0949bc8 100644 --- a/src/backend/kms/device.rs +++ b/src/backend/kms/device.rs @@ -676,9 +676,14 @@ pub fn calculate_scale( ) -> f64 { let (w_mm, h_mm) = monitor_size_mm; let (w_px, h_px) = resolution; + let shorter_res = w_px.min(h_px); + let fallback_scale = match shorter_res { + px if px <= 1600 => 1.0, + _ => 2.0, + }; if w_mm == 0 || h_mm == 0 { // possibly projector, but could just be some no-brand display - return 1.0; + return fallback_scale; } let (w_in, h_in) = (w_mm as f64 / 25.4, h_mm as f64 / 25.4); @@ -686,12 +691,11 @@ pub fn calculate_scale( // lets be really careful we don't devide by 0 (or non-normal values) when deriving values from size. // (also the size should be positive, but the u16 arguments already force that.) if !w_in.is_normal() || !h_in.is_normal() { - return 1.0; + return fallback_scale; } let diag = (w_in.powf(2.) * h_in.powf(2.)).sqrt(); let dpi = (w_px as f64 / w_in + h_px as f64 / h_in) / 2.0; - let shorter_res = if w_mm < h_mm { w_px } else { h_px }; match diag { _diag if diag < 20. || interface == connector::Interface::EmbeddedDisplayPort => { @@ -819,7 +823,7 @@ mod test { for &iface in &[Interface::DisplayPort, Interface::HDMIA, Interface::HDMIB] { assert_eq!(scale(iface, 0.0, 1920, 1080), 100); assert_eq!(scale(iface, 0.0, 2560, 1440), 100); - assert_eq!(scale(iface, 0.0, 3840, 2160), 100); + assert_eq!(scale(iface, 0.0, 3840, 2160), 200); } } }