From 6ccbc723ba6b9002f75b6ccb62b4cf6124cb12bb Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Sun, 6 Aug 2023 09:11:11 -0700 Subject: [PATCH] wezterm.gui.screens: add optional effective_dpi field This commit implements it for Windows. The other systems report None for now. --- lua-api-crates/window-funcs/src/lib.rs | 2 ++ window/Cargo.toml | 1 + window/src/os/macos/connection.rs | 1 + window/src/os/wayland/connection.rs | 1 + window/src/os/wayland/output.rs | 1 + window/src/os/windows/connection.rs | 21 +++++++++++++++++++++ window/src/os/x11/connection.rs | 1 + window/src/screen.rs | 1 + 8 files changed, 29 insertions(+) diff --git a/lua-api-crates/window-funcs/src/lib.rs b/lua-api-crates/window-funcs/src/lib.rs index 673d2b03c..06fdc18c4 100644 --- a/lua-api-crates/window-funcs/src/lib.rs +++ b/lua-api-crates/window-funcs/src/lib.rs @@ -21,6 +21,7 @@ pub struct ScreenInfo { pub height: isize, pub scale: f64, pub max_fps: Option, + pub effective_dpi: Option, } impl_lua_conversion_dynamic!(ScreenInfo); @@ -46,6 +47,7 @@ impl From for ScreenInfo { height: info.rect.height(), scale: info.scale, max_fps: info.max_fps, + effective_dpi: info.effective_dpi, } } } diff --git a/window/Cargo.toml b/window/Cargo.toml index 6168d0da8..c1243b723 100644 --- a/window/Cargo.toml +++ b/window/Cargo.toml @@ -55,6 +55,7 @@ winapi = { version = "0.3", features = [ "handleapi", "imm", "libloaderapi", + "shellscalingapi", "synchapi", "sysinfoapi", "winerror", diff --git a/window/src/os/macos/connection.rs b/window/src/os/macos/connection.rs index 5c5fd5e35..226b8db83 100644 --- a/window/src/os/macos/connection.rs +++ b/window/src/os/macos/connection.rs @@ -229,6 +229,7 @@ pub fn nsscreen_to_screen_info(screen: *mut Object) -> ScreenInfo { rect, scale: 1.0, max_fps, + effective_dpi: None, } } diff --git a/window/src/os/wayland/connection.rs b/window/src/os/wayland/connection.rs index cfbb7710a..27191dfb0 100644 --- a/window/src/os/wayland/connection.rs +++ b/window/src/os/wayland/connection.rs @@ -511,6 +511,7 @@ impl ConnectionOps for WaylandConnection { rect, scale, max_fps: None, + effective_dpi: None, }, ); }); diff --git a/window/src/os/wayland/output.rs b/window/src/os/wayland/output.rs index 236097233..fdc05f949 100644 --- a/window/src/os/wayland/output.rs +++ b/window/src/os/wayland/output.rs @@ -234,6 +234,7 @@ impl OutputHandler { rect, scale, max_fps: None, + effective_dpi: None, }, ); } diff --git a/window/src/os/windows/connection.rs b/window/src/os/windows/connection.rs index e8bc28a41..892a83545 100644 --- a/window/src/os/windows/connection.rs +++ b/window/src/os/windows/connection.rs @@ -5,6 +5,7 @@ use crate::screen::{ScreenInfo, Screens}; use crate::spawn::*; use crate::{Appearance, ScreenRect}; use anyhow::Context; +use config::ConfigHandle; use std::cell::RefCell; use std::collections::HashMap; use std::ffi::OsString; @@ -14,6 +15,7 @@ use std::rc::Rc; use winapi::shared::minwindef::*; use winapi::shared::windef::*; use winapi::shared::winerror::{ERROR_INSUFFICIENT_BUFFER, ERROR_SUCCESS}; +use winapi::um::shellscalingapi::{GetDpiForMonitor, MDT_EFFECTIVE_DPI}; use winapi::um::winbase::INFINITE; use winapi::um::wingdi::{ DEVMODEW, DISPLAY_DEVICEW, DM_DISPLAYFREQUENCY, QDC_ONLY_ACTIVE_PATHS, QDC_VIRTUAL_MODE_AWARE, @@ -177,6 +179,7 @@ pub(crate) struct ScreenInfoHelper { active_handle: HMONITOR, friendly_names: HashMap, gdi_to_adapater: HashMap, + config: ConfigHandle, } impl ScreenInfoHelper { @@ -189,6 +192,7 @@ impl ScreenInfoHelper { active_handle: unsafe { MonitorFromWindow(GetFocus(), MONITOR_DEFAULTTONEAREST) }, friendly_names: gdi_display_name_to_friendly_monitor_names()?, gdi_to_adapater: gdi_display_name_to_adapter_names(), + config: config::configuration(), }) } @@ -218,6 +222,22 @@ impl ScreenInfoHelper { }; let monitor_name = info.monitor_name(&mi); + + let mut effective_dpi = None; + + if let Some(dpi) = info.config.dpi_by_screen.get(&monitor_name).copied() { + effective_dpi.replace(dpi); + } else if let Some(dpi) = info.config.dpi { + effective_dpi.replace(dpi); + } else { + let mut dpi_x = 0; + let mut dpi_y = 0; + GetDpiForMonitor(mon, MDT_EFFECTIVE_DPI, &mut dpi_x, &mut dpi_y); + if dpi_x != 0 { + effective_dpi.replace(dpi_x as f64); + } + } + let screen_info = ScreenInfo { name: monitor_name.clone(), rect: euclid::rect( @@ -228,6 +248,7 @@ impl ScreenInfoHelper { ), scale: 1.0, max_fps, + effective_dpi, }; info.virtual_rect = info.virtual_rect.union(&screen_info.rect); diff --git a/window/src/os/x11/connection.rs b/window/src/os/x11/connection.rs index 1e0f1ecdb..6534c80e6 100644 --- a/window/src/os/x11/connection.rs +++ b/window/src/os/x11/connection.rs @@ -276,6 +276,7 @@ impl ConnectionOps for XConnection { rect: bounds, scale: 1.0, max_fps, + effective_dpi: None, }; by_name.insert(name, info); } diff --git a/window/src/screen.rs b/window/src/screen.rs index 4ac98cd6a..7243d06f6 100644 --- a/window/src/screen.rs +++ b/window/src/screen.rs @@ -15,4 +15,5 @@ pub struct ScreenInfo { pub rect: ScreenRect, pub scale: f64, pub max_fps: Option, + pub effective_dpi: Option, } -- 2.51.2