[PATCH 3/7] uxtheme: Implement OpenThemeDataForDpi().

Zhiyi Zhang zzhang at codeweavers.com
Wed Sep 1 01:37:38 CDT 2021


Signed-off-by: Zhiyi Zhang <zzhang at codeweavers.com>
---
 dlls/uxtheme/msstyles.c     |  4 +++-
 dlls/uxtheme/msstyles.h     |  3 ++-
 dlls/uxtheme/system.c       | 31 +++++++++++++++++++++++++------
 dlls/uxtheme/tests/system.c | 31 +++++++++++++++++++++++++++++++
 dlls/uxtheme/uxtheme.spec   |  1 +
 include/uxtheme.h           |  1 +
 6 files changed, 63 insertions(+), 8 deletions(-)

diff --git a/dlls/uxtheme/msstyles.c b/dlls/uxtheme/msstyles.c
index 6f74d2d3d7d..99eda64233c 100644
--- a/dlls/uxtheme/msstyles.c
+++ b/dlls/uxtheme/msstyles.c
@@ -971,8 +971,9 @@ static void MSSTYLES_ParseThemeIni(PTHEME_FILE tf, BOOL setMetrics)
  *     pszAppName          Application name, for theme styles specific
  *                         to a particular application
  *     pszClassList        List of requested classes, semicolon delimited
+ *     dpi                 DPI for theme parts
  */
-PTHEME_CLASS MSSTYLES_OpenThemeClass(LPCWSTR pszAppName, LPCWSTR pszClassList)
+PTHEME_CLASS MSSTYLES_OpenThemeClass(LPCWSTR pszAppName, LPCWSTR pszClassList, UINT dpi)
 {
     PTHEME_CLASS cls = NULL;
     WCHAR szClassName[MAX_THEME_CLASS_NAME];
@@ -1004,6 +1005,7 @@ PTHEME_CLASS MSSTYLES_OpenThemeClass(LPCWSTR pszAppName, LPCWSTR pszClassList)
         TRACE("Opened app %s, class %s from list %s\n", debugstr_w(cls->szAppName), debugstr_w(cls->szClassName), debugstr_w(pszClassList));
 	cls->tf = tfActiveTheme;
 	cls->tf->dwRefCount++;
+        cls->dpi = dpi;
     }
     return cls;
 }
diff --git a/dlls/uxtheme/msstyles.h b/dlls/uxtheme/msstyles.h
index 0b7e1ab35cc..1cb27b93ab3 100644
--- a/dlls/uxtheme/msstyles.h
+++ b/dlls/uxtheme/msstyles.h
@@ -53,6 +53,7 @@ typedef struct _THEME_CLASS {
     struct _THEME_FILE* tf;
     WCHAR szAppName[MAX_THEME_APP_NAME];
     WCHAR szClassName[MAX_THEME_CLASS_NAME];
+    UINT dpi;
     PTHEME_PARTSTATE partstate;
     struct _THEME_CLASS *overrides;
 
@@ -87,7 +88,7 @@ typedef struct _UXINI_FILE *PUXINI_FILE;
 HRESULT MSSTYLES_OpenThemeFile(LPCWSTR lpThemeFile, LPCWSTR pszColorName, LPCWSTR pszSizeName, PTHEME_FILE *tf) DECLSPEC_HIDDEN;
 void MSSTYLES_CloseThemeFile(PTHEME_FILE tf) DECLSPEC_HIDDEN;
 HRESULT MSSTYLES_SetActiveTheme(PTHEME_FILE tf, BOOL setMetrics) DECLSPEC_HIDDEN;
-PTHEME_CLASS MSSTYLES_OpenThemeClass(LPCWSTR pszAppName, LPCWSTR pszClassList) DECLSPEC_HIDDEN;
+PTHEME_CLASS MSSTYLES_OpenThemeClass(LPCWSTR pszAppName, LPCWSTR pszClassList, UINT dpi) DECLSPEC_HIDDEN;
 HRESULT MSSTYLES_CloseThemeClass(PTHEME_CLASS tc) DECLSPEC_HIDDEN;
 BOOL MSSTYLES_LookupProperty(LPCWSTR pszPropertyName, int *dwPrimitive, int *dwId) DECLSPEC_HIDDEN;
 BOOL MSSTYLES_LookupEnum(LPCWSTR pszValueName, int dwEnum, int *dwValue) DECLSPEC_HIDDEN;
diff --git a/dlls/uxtheme/system.c b/dlls/uxtheme/system.c
index afae1e23f2b..ca0dd228b2c 100644
--- a/dlls/uxtheme/system.c
+++ b/dlls/uxtheme/system.c
@@ -617,10 +617,7 @@ static LPWSTR UXTHEME_GetWindowProperty(HWND hwnd, ATOM aProp, LPWSTR pszBuffer,
     return NULL;
 }
 
-/***********************************************************************
- *      OpenThemeDataEx                                     (UXTHEME.61)
- */
-HTHEME WINAPI OpenThemeDataEx(HWND hwnd, LPCWSTR pszClassList, DWORD flags)
+static HTHEME open_theme_data(HWND hwnd, LPCWSTR pszClassList, DWORD flags, UINT dpi)
 {
     WCHAR szAppBuff[256];
     WCHAR szClassBuff[256];
@@ -647,11 +644,11 @@ HTHEME WINAPI OpenThemeDataEx(HWND hwnd, LPCWSTR pszClassList, DWORD flags)
             pszUseClassList = pszClassList;
 
         if (pszUseClassList)
-            hTheme = MSSTYLES_OpenThemeClass(pszAppName, pszUseClassList);
+            hTheme = MSSTYLES_OpenThemeClass(pszAppName, pszUseClassList, dpi);
 
         /* Fall back to default class if the specified subclass is not found */
         if (!hTheme)
-            hTheme = MSSTYLES_OpenThemeClass(NULL, pszUseClassList);
+            hTheme = MSSTYLES_OpenThemeClass(NULL, pszUseClassList, dpi);
     }
     if(IsWindow(hwnd))
         SetPropW(hwnd, (LPCWSTR)MAKEINTATOM(atWindowTheme), hTheme);
@@ -661,6 +658,28 @@ HTHEME WINAPI OpenThemeDataEx(HWND hwnd, LPCWSTR pszClassList, DWORD flags)
     return hTheme;
 }
 
+/***********************************************************************
+ *      OpenThemeDataEx                                     (UXTHEME.61)
+ */
+HTHEME WINAPI OpenThemeDataEx(HWND hwnd, LPCWSTR pszClassList, DWORD flags)
+{
+    UINT dpi;
+
+    dpi = GetDpiForWindow(hwnd);
+    if (!dpi)
+        dpi = 96;
+
+    return open_theme_data(hwnd, pszClassList, flags, dpi);
+}
+
+/***********************************************************************
+ *      OpenThemeDataForDpi                                 (UXTHEME.@)
+ */
+HTHEME WINAPI OpenThemeDataForDpi(HWND hwnd, LPCWSTR class_list, UINT dpi)
+{
+    return open_theme_data(hwnd, class_list, 0, dpi);
+}
+
 /***********************************************************************
  *      OpenThemeData                                       (UXTHEME.@)
  */
diff --git a/dlls/uxtheme/tests/system.c b/dlls/uxtheme/tests/system.c
index b3b1afde14e..584a71a82b4 100644
--- a/dlls/uxtheme/tests/system.c
+++ b/dlls/uxtheme/tests/system.c
@@ -34,6 +34,7 @@
 #include "wine/test.h"
 
 static HTHEME  (WINAPI * pOpenThemeDataEx)(HWND, LPCWSTR, DWORD);
+static HTHEME (WINAPI *pOpenThemeDataForDpi)(HWND, LPCWSTR, UINT);
 static HPAINTBUFFER (WINAPI *pBeginBufferedPaint)(HDC, const RECT *, BP_BUFFERFORMAT, BP_PAINTPARAMS *, HDC *);
 static HRESULT (WINAPI *pBufferedPaintClear)(HPAINTBUFFER, const RECT *);
 static HRESULT (WINAPI *pEndBufferedPaint)(HPAINTBUFFER, BOOL);
@@ -79,6 +80,7 @@ static void init_funcs(void)
     GET_PROC(uxtheme, GetBufferedPaintTargetDC)
     GET_PROC(uxtheme, GetBufferedPaintTargetRect)
     GET_PROC(uxtheme, OpenThemeDataEx)
+    GET_PROC(uxtheme, OpenThemeDataForDpi)
 
     GET_PROC(user32, DisplayConfigGetDeviceInfo)
     GET_PROC(user32, DisplayConfigSetDeviceInfo)
@@ -642,6 +644,34 @@ static void test_OpenThemeDataEx(void)
     DestroyWindow(hWnd);
 }
 
+static void test_OpenThemeDataForDpi(void)
+{
+    BOOL is_theme_active;
+    HTHEME htheme;
+
+    if (!pOpenThemeDataForDpi)
+    {
+        win_skip("OpenThemeDataForDpi is unavailable.\n");
+        return;
+    }
+
+    is_theme_active = IsThemeActive();
+    SetLastError(0xdeadbeef);
+    htheme = OpenThemeDataForDpi(NULL, WC_BUTTONW, 96);
+    if (is_theme_active)
+    {
+        ok(!!htheme, "Got a NULL handle.\n");
+        ok(GetLastError() == NO_ERROR, "Expected error %u, got %u.\n", NO_ERROR, GetLastError());
+        CloseThemeData(htheme);
+    }
+    else
+    {
+        ok(!htheme, "Got a non-NULL handle.\n");
+        ok(GetLastError() == E_PROP_ID_UNSUPPORTED, "Expected error %u, got %u.\n",
+           E_PROP_ID_UNSUPPORTED, GetLastError());
+    }
+}
+
 static void test_GetCurrentThemeName(void)
 {
     BOOL    bThemeActive;
@@ -1084,6 +1114,7 @@ START_TEST(system)
     test_SetWindowTheme();
     test_OpenThemeData();
     test_OpenThemeDataEx();
+    test_OpenThemeDataForDpi();
     test_GetCurrentThemeName();
     test_GetThemePartSize();
     test_CloseThemeData();
diff --git a/dlls/uxtheme/uxtheme.spec b/dlls/uxtheme/uxtheme.spec
index 22b1fc4ac3c..140388245f2 100644
--- a/dlls/uxtheme/uxtheme.spec
+++ b/dlls/uxtheme/uxtheme.spec
@@ -106,6 +106,7 @@
 @ stdcall IsThemeDialogTextureEnabled(ptr)
 @ stdcall IsThemePartDefined(ptr long long)
 @ stdcall OpenThemeData(ptr wstr)
+@ stdcall OpenThemeDataForDpi(ptr wstr long)
 @ stdcall SetThemeAppProperties(long)
 @ stdcall SetWindowTheme(ptr wstr wstr)
 @ stdcall SetWindowThemeAttribute(ptr long ptr long)
diff --git a/include/uxtheme.h b/include/uxtheme.h
index 449dc6f6d40..384c3655b41 100644
--- a/include/uxtheme.h
+++ b/include/uxtheme.h
@@ -213,6 +213,7 @@ BOOL WINAPI IsThemeDialogTextureEnabled(HWND);
 BOOL WINAPI IsThemePartDefined(HTHEME,int,int);
 HTHEME WINAPI OpenThemeData(HWND,LPCWSTR);
 HTHEME WINAPI OpenThemeDataEx(HWND,LPCWSTR,DWORD);
+HTHEME WINAPI OpenThemeDataForDpi(HWND,LPCWSTR,UINT);
 void WINAPI SetThemeAppProperties(DWORD);
 HRESULT WINAPI SetWindowTheme(HWND,LPCWSTR,LPCWSTR);
 HRESULT WINAPI SetWindowThemeAttribute(HWND,enum WINDOWTHEMEATTRIBUTETYPE,PVOID,DWORD);
-- 
2.30.2




More information about the wine-devel mailing list