From 599102573aa3c091df4788634b51fc796751da9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E5=B0=8F=E7=99=BD?= <364772080@qq.com> Date: Fri, 14 Jun 2024 01:52:53 +0800 Subject: [PATCH] windows: Implement `window_appearance()` and `should_auto_hide_scrollbars()` (#12527) Release Notes: - N/A --- Cargo.toml | 1 + crates/gpui/src/platform/windows/platform.rs | 35 +++++++++++++++++--- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 21dfd5c9f2..56bae1d7b3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -416,6 +416,7 @@ features = [ "Foundation_Numerics", "System", "System_Threading", + "UI_ViewManagement", "Wdk_System_SystemServices", "Win32_Globalization", "Win32_Graphics_Direct2D", diff --git a/crates/gpui/src/platform/windows/platform.rs b/crates/gpui/src/platform/windows/platform.rs index 9079430979..17498305f8 100644 --- a/crates/gpui/src/platform/windows/platform.rs +++ b/crates/gpui/src/platform/windows/platform.rs @@ -27,6 +27,10 @@ use windows::{ System::{Com::*, LibraryLoader::*, Ole::*, SystemInformation::*, Threading::*, Time::*}, UI::{Input::KeyboardAndMouse::*, Shell::*, WindowsAndMessaging::*}, }, + UI::{ + Color, + ViewManagement::{UIColorType, UISettings}, + }, }; use crate::*; @@ -300,9 +304,8 @@ impl Platform for WindowsPlatform { Ok(Box::new(window)) } - // todo(windows) fn window_appearance(&self) -> WindowAppearance { - WindowAppearance::Dark + system_appearance().log_err().unwrap_or_default() } fn open_url(&self, url: &str) { @@ -498,9 +501,8 @@ impl Platform for WindowsPlatform { } } - // todo(windows) fn should_auto_hide_scrollbars(&self) -> bool { - false + should_auto_hide_scrollbars().log_err().unwrap_or(false) } fn write_to_clipboard(&self, item: ClipboardItem) { @@ -682,3 +684,28 @@ fn load_icon() -> Result { }; Ok(HICON(handle.0)) } + +// https://learn.microsoft.com/en-us/windows/apps/desktop/modernize/apply-windows-themes +#[inline] +fn system_appearance() -> Result { + let ui_settings = UISettings::new()?; + let foreground_color = ui_settings.GetColorValue(UIColorType::Foreground)?; + // If the foreground is light, then is_color_light will evaluate to true, + // meaning Dark mode is enabled. + if is_color_light(&foreground_color) { + Ok(WindowAppearance::Dark) + } else { + Ok(WindowAppearance::Light) + } +} + +#[inline(always)] +fn is_color_light(color: &Color) -> bool { + ((5 * color.G as u32) + (2 * color.R as u32) + color.B as u32) > (8 * 128) +} + +#[inline] +fn should_auto_hide_scrollbars() -> Result { + let ui_settings = UISettings::new()?; + Ok(ui_settings.AutoHideScrollBars()?) +}