Alexandre Julliard : user32: Add more allowed values in GetAwarenessFromDpiAwarenessContext() and IsValidDpiAwarenessContext().

Alexandre Julliard julliard at winehq.org
Wed Apr 11 16:12:55 CDT 2018


Module: wine
Branch: master
Commit: 165f552c34a0dbbd1a47a4409f43ceb80468937e
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=165f552c34a0dbbd1a47a4409f43ceb80468937e

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed Apr 11 15:52:11 2018 +0200

user32: Add more allowed values in GetAwarenessFromDpiAwarenessContext() and IsValidDpiAwarenessContext().

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/user32/sysparams.c       | 31 +++++++++++++++++----------
 dlls/user32/tests/sysparams.c | 50 +++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 70 insertions(+), 11 deletions(-)

diff --git a/dlls/user32/sysparams.c b/dlls/user32/sysparams.c
index 8b6ea50..5d57b5d 100644
--- a/dlls/user32/sysparams.c
+++ b/dlls/user32/sysparams.c
@@ -2999,8 +2999,9 @@ BOOL WINAPI SetProcessDpiAwarenessInternal( DPI_AWARENESS awareness )
  */
 BOOL WINAPI AreDpiAwarenessContextsEqual( DPI_AWARENESS_CONTEXT ctx1, DPI_AWARENESS_CONTEXT ctx2 )
 {
-    if (!IsValidDpiAwarenessContext( ctx1 )) return FALSE;
-    return ctx1 == ctx2;
+    DPI_AWARENESS aware1 = GetAwarenessFromDpiAwarenessContext( ctx1 );
+    DPI_AWARENESS aware2 = GetAwarenessFromDpiAwarenessContext( ctx2 );
+    return aware1 != DPI_AWARENESS_INVALID && aware1 == aware2;
 }
 
 /***********************************************************************
@@ -3008,11 +3009,22 @@ BOOL WINAPI AreDpiAwarenessContextsEqual( DPI_AWARENESS_CONTEXT ctx1, DPI_AWAREN
  */
 DPI_AWARENESS WINAPI GetAwarenessFromDpiAwarenessContext( DPI_AWARENESS_CONTEXT context )
 {
-    if (context == DPI_AWARENESS_CONTEXT_UNAWARE) return DPI_AWARENESS_UNAWARE;
-    if (context == DPI_AWARENESS_CONTEXT_SYSTEM_AWARE) return DPI_AWARENESS_SYSTEM_AWARE;
-    if (context == DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE) return DPI_AWARENESS_PER_MONITOR_AWARE;
-    if (context == DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2) return DPI_AWARENESS_PER_MONITOR_AWARE;
-    return DPI_AWARENESS_INVALID;
+    switch ((ULONG_PTR)context)
+    {
+    case 0x10:
+    case 0x11:
+    case 0x12:
+    case 0x80000010:
+    case 0x80000011:
+    case 0x80000012:
+        return (ULONG_PTR)context & 3;
+    case (ULONG_PTR)DPI_AWARENESS_CONTEXT_UNAWARE:
+    case (ULONG_PTR)DPI_AWARENESS_CONTEXT_SYSTEM_AWARE:
+    case (ULONG_PTR)DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE:
+        return ~(ULONG_PTR)context;
+    default:
+        return DPI_AWARENESS_INVALID;
+    }
 }
 
 /***********************************************************************
@@ -3020,10 +3032,7 @@ DPI_AWARENESS WINAPI GetAwarenessFromDpiAwarenessContext( DPI_AWARENESS_CONTEXT
  */
 BOOL WINAPI IsValidDpiAwarenessContext( DPI_AWARENESS_CONTEXT context )
 {
-    return (context == DPI_AWARENESS_CONTEXT_UNAWARE ||
-            context == DPI_AWARENESS_CONTEXT_SYSTEM_AWARE ||
-            context == DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE ||
-            context == DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2);
+    return GetAwarenessFromDpiAwarenessContext( context ) != DPI_AWARENESS_INVALID;
 }
 
 /***********************************************************************
diff --git a/dlls/user32/tests/sysparams.c b/dlls/user32/tests/sysparams.c
index e132992..75a5f87 100644
--- a/dlls/user32/tests/sysparams.c
+++ b/dlls/user32/tests/sysparams.c
@@ -48,6 +48,7 @@ static DPI_AWARENESS_CONTEXT (WINAPI *pGetThreadDpiAwarenessContext)(void);
 static DPI_AWARENESS_CONTEXT (WINAPI *pSetThreadDpiAwarenessContext)(DPI_AWARENESS_CONTEXT);
 static DPI_AWARENESS_CONTEXT (WINAPI *pGetWindowDpiAwarenessContext)(HWND);
 static DPI_AWARENESS (WINAPI *pGetAwarenessFromDpiAwarenessContext)(DPI_AWARENESS_CONTEXT);
+static BOOL (WINAPI *pIsValidDpiAwarenessContext)(DPI_AWARENESS_CONTEXT);
 
 static BOOL strict;
 static int dpi, real_dpi;
@@ -3006,6 +3007,7 @@ static void test_dpi_aware(void)
     {
         DPI_AWARENESS awareness;
         DPI_AWARENESS_CONTEXT context;
+        ULONG_PTR i;
 
         context = pGetThreadDpiAwarenessContext();
         awareness = pGetAwarenessFromDpiAwarenessContext( context );
@@ -3074,6 +3076,53 @@ static void test_dpi_aware(void)
         context = pSetThreadDpiAwarenessContext( DPI_AWARENESS_CONTEXT_SYSTEM_AWARE );
         awareness = pGetAwarenessFromDpiAwarenessContext( context );
         ok( awareness == DPI_AWARENESS_PER_MONITOR_AWARE, "wrong awareness %u\n", awareness );
+        for (i = 0; i < 0x100; i++)
+        {
+            awareness = pGetAwarenessFromDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)i );
+            switch (i)
+            {
+            case 0x10:
+            case 0x11:
+            case 0x12:
+                ok( awareness == (i & ~0x10), "%lx: wrong value %u\n", i, awareness );
+                ok( pIsValidDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)i ), "%lx: not valid\n", i );
+                break;
+            default:
+                ok( awareness == DPI_AWARENESS_INVALID, "%lx: wrong value %u\n", i, awareness );
+                ok( !pIsValidDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)i ), "%lx: valid\n", i );
+                break;
+            }
+            awareness = pGetAwarenessFromDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)(i | 0x80000000) );
+            switch (i)
+            {
+            case 0x10:
+            case 0x11:
+            case 0x12:
+                ok( awareness == (i & ~0x10), "%lx: wrong value %u\n", i | 0x80000000, awareness );
+                ok( pIsValidDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)(i | 0x80000000) ),
+                    "%lx: not valid\n", i | 0x80000000 );
+                break;
+            default:
+                ok( awareness == DPI_AWARENESS_INVALID, "%lx: wrong value %u\n", i | 0x80000000, awareness );
+                ok( !pIsValidDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)(i | 0x80000000) ),
+                    "%lx: valid\n", i | 0x80000000 );
+                break;
+            }
+            awareness = pGetAwarenessFromDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)~i );
+            switch (~i)
+            {
+            case (ULONG_PTR)DPI_AWARENESS_CONTEXT_UNAWARE:
+            case (ULONG_PTR)DPI_AWARENESS_CONTEXT_SYSTEM_AWARE:
+            case (ULONG_PTR)DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE:
+                ok( awareness == i, "%lx: wrong value %u\n", ~i, awareness );
+                ok( pIsValidDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)~i ), "%lx: not valid\n", ~i );
+                break;
+            default:
+                ok( awareness == DPI_AWARENESS_INVALID, "%lx: wrong value %u\n", ~i, awareness );
+                ok( !pIsValidDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)~i ), "%lx: valid\n", ~i );
+                break;
+            }
+        }
     }
     else win_skip( "SetProcessDPIAware not supported\n" );
 
@@ -3165,6 +3214,7 @@ START_TEST(sysparams)
     pSetThreadDpiAwarenessContext = (void*)GetProcAddress(hdll, "SetThreadDpiAwarenessContext");
     pGetWindowDpiAwarenessContext = (void*)GetProcAddress(hdll, "GetWindowDpiAwarenessContext");
     pGetAwarenessFromDpiAwarenessContext = (void*)GetProcAddress(hdll, "GetAwarenessFromDpiAwarenessContext");
+    pIsValidDpiAwarenessContext = (void*)GetProcAddress(hdll, "IsValidDpiAwarenessContext");
 
     hInstance = GetModuleHandleA( NULL );
     hdc = GetDC(0);




More information about the wine-cvs mailing list