Zhiyi Zhang : uxtheme: Get and set system metrics in 96 DPI.

Alexandre Julliard julliard at winehq.org
Fri Feb 25 07:30:24 CST 2022


Module: wine
Branch: oldstable
Commit: f0143c1bc9b1186324fafa896fe242eab4da727c
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=f0143c1bc9b1186324fafa896fe242eab4da727c

Author: Zhiyi Zhang <zzhang at codeweavers.com>
Date:   Thu Sep  9 14:46:24 2021 +0800

uxtheme: Get and set system metrics in 96 DPI.

Fix a bug that font size may be smaller than normal after toggling theming.

For example, the following steps will change the system metrics to incorrect values.
1. Open winecfg, and set DPI to 192. Do not restart winecfg.
2. Change the theme to Light. UXTHEME_BackupSystemMetrics() backs up system metrics in 96 DPI
because the current DPI is still 96.
3. Restart winecfg and turn off theming. UXTHEME_RestoreSystemMetrics() restores system metrics in
192 DPI because the current DPI is 192. So system metrics will be scaled to 1/2 of the original size.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=37592
Signed-off-by: Zhiyi Zhang <zzhang at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
(cherry picked from commit 7290db3e7a9652fcc39717b2fb492071dd52c641)
Signed-off-by: Michael Stefaniuc <mstefani at winehq.org>

---

 dlls/uxtheme/msstyles.c |  4 ++++
 dlls/uxtheme/system.c   | 10 ++++++++++
 2 files changed, 14 insertions(+)

diff --git a/dlls/uxtheme/msstyles.c b/dlls/uxtheme/msstyles.c
index 3624bb2d4a6..ded8685a98e 100644
--- a/dlls/uxtheme/msstyles.c
+++ b/dlls/uxtheme/msstyles.c
@@ -830,12 +830,16 @@ static BOOL parse_handle_nonclient_size (struct PARSENONCLIENTSTATE* state,
 
 static void parse_apply_nonclient (struct PARSENONCLIENTSTATE* state)
 {
+    DPI_AWARENESS_CONTEXT old_context;
+
     if (state->metricsDirty)
     {
+        old_context = SetThreadDpiAwarenessContext(DPI_AWARENESS_CONTEXT_UNAWARE);
         SystemParametersInfoW (SPI_SETNONCLIENTMETRICS, sizeof (state->metrics),
             &state->metrics, 0);
         SystemParametersInfoW (SPI_SETICONTITLELOGFONT, sizeof (state->iconTitleFont),
             &state->iconTitleFont, 0);
+        SetThreadDpiAwarenessContext(old_context);
     }
 }
 
diff --git a/dlls/uxtheme/system.c b/dlls/uxtheme/system.c
index f8cc876b0c9..8b772a946d3 100644
--- a/dlls/uxtheme/system.c
+++ b/dlls/uxtheme/system.c
@@ -276,9 +276,12 @@ static void save_sys_colors (HKEY baseKey)
  * is deactivated */
 static void UXTHEME_BackupSystemMetrics(void)
 {
+    DPI_AWARENESS_CONTEXT old_context;
     HKEY hKey;
     const struct BackupSysParam* bsp = backupSysParams;
 
+    old_context = SetThreadDpiAwarenessContext(DPI_AWARENESS_CONTEXT_UNAWARE);
+
     if (RegCreateKeyExW( HKEY_CURRENT_USER, szThemeManager,
                          0, 0, 0, KEY_ALL_ACCESS,
                          0, &hKey, 0) == ERROR_SUCCESS)
@@ -315,14 +318,19 @@ static void UXTHEME_BackupSystemMetrics(void)
     
         RegCloseKey (hKey);
     }
+
+    SetThreadDpiAwarenessContext(old_context);
 }
 
 /* Read back old settings after a theme was deactivated */
 static void UXTHEME_RestoreSystemMetrics(void)
 {
+    DPI_AWARENESS_CONTEXT old_context;
     HKEY hKey;
     const struct BackupSysParam* bsp = backupSysParams;
 
+    old_context = SetThreadDpiAwarenessContext(DPI_AWARENESS_CONTEXT_UNAWARE);
+
     if (RegOpenKeyExW (HKEY_CURRENT_USER, szThemeManager,
                        0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS) 
     {
@@ -402,6 +410,8 @@ static void UXTHEME_RestoreSystemMetrics(void)
       
         RegCloseKey (hKey);
     }
+
+    SetThreadDpiAwarenessContext(old_context);
 }
 
 /* Make system settings persistent, so they're in effect even w/o uxtheme 




More information about the wine-cvs mailing list