Alexandre Julliard : user32: Partially implement GetWindowDpiAwarenessContext().

Alexandre Julliard julliard at winehq.org
Mon Apr 2 16:32:52 CDT 2018


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Mon Apr  2 13:28:20 2018 +0200

user32: Partially implement GetWindowDpiAwarenessContext().

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

---

 dlls/user32/tests/sysparams.c | 60 +++++++++++++++++++++++++++++++++++++++++++
 dlls/user32/user32.spec       |  1 +
 dlls/user32/win.c             | 27 +++++++++++++++++++
 dlls/user32/win.h             |  1 +
 include/winuser.h             |  1 +
 5 files changed, 90 insertions(+)

diff --git a/dlls/user32/tests/sysparams.c b/dlls/user32/tests/sysparams.c
index b541be4..876f84f 100644
--- a/dlls/user32/tests/sysparams.c
+++ b/dlls/user32/tests/sysparams.c
@@ -44,6 +44,7 @@ static BOOL (WINAPI *pSetProcessDPIAware)(void);
 static BOOL (WINAPI *pSetProcessDpiAwarenessContext)(DPI_AWARENESS_CONTEXT);
 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 strict;
@@ -3067,6 +3068,63 @@ static void test_dpi_aware(void)
     test_GetSystemMetrics();
 }
 
+static void test_window_dpi(void)
+{
+    DPI_AWARENESS_CONTEXT context, orig;
+    DPI_AWARENESS awareness;
+    HWND hwnd;
+
+    if (!pGetWindowDpiAwarenessContext)
+    {
+        win_skip( "GetWindowDpiAwarenessContext not supported\n" );
+        return;
+    }
+    orig = pSetThreadDpiAwarenessContext( DPI_AWARENESS_CONTEXT_UNAWARE );
+    hwnd = CreateWindowA( "SysParamsTestClass", "Test System Parameters Application",
+                          WS_OVERLAPPEDWINDOW, 0, 0, 100, 100, 0, 0, GetModuleHandleA(0), NULL );
+    ok( hwnd != 0, "failed to create window\n" );
+    context = GetWindowDpiAwarenessContext( hwnd );
+    awareness = pGetAwarenessFromDpiAwarenessContext( context );
+    ok( awareness == DPI_AWARENESS_UNAWARE, "wrong awareness %u\n", awareness );
+    DestroyWindow( hwnd );
+
+    pSetThreadDpiAwarenessContext( DPI_AWARENESS_CONTEXT_SYSTEM_AWARE );
+    hwnd = CreateWindowA( "SysParamsTestClass", "Test System Parameters Application",
+                          WS_OVERLAPPEDWINDOW, 0, 0, 100, 100, 0, 0, GetModuleHandleA(0), NULL );
+    ok( hwnd != 0, "failed to create window\n" );
+    context = GetWindowDpiAwarenessContext( hwnd );
+    awareness = pGetAwarenessFromDpiAwarenessContext( context );
+    ok( awareness == DPI_AWARENESS_SYSTEM_AWARE, "wrong awareness %u\n", awareness );
+    DestroyWindow( hwnd );
+
+    pSetThreadDpiAwarenessContext( DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE );
+    hwnd = CreateWindowA( "SysParamsTestClass", "Test System Parameters Application",
+                          WS_OVERLAPPEDWINDOW, 0, 0, 100, 100, 0, 0, GetModuleHandleA(0), NULL );
+    ok( hwnd != 0, "failed to create window\n" );
+    context = GetWindowDpiAwarenessContext( hwnd );
+    awareness = pGetAwarenessFromDpiAwarenessContext( context );
+    ok( awareness == DPI_AWARENESS_PER_MONITOR_AWARE, "wrong awareness %u\n", awareness );
+    DestroyWindow( hwnd );
+
+    SetLastError( 0xdeadbeef );
+    context = GetWindowDpiAwarenessContext( (HWND)0xdeadbeef );
+    ok( !context, "got %p\n", context );
+    ok( GetLastError() == ERROR_INVALID_WINDOW_HANDLE, "wrong error %u\n", GetLastError() );
+
+    SetLastError( 0xdeadbeef );
+    context = GetWindowDpiAwarenessContext( GetDesktopWindow() );
+    awareness = pGetAwarenessFromDpiAwarenessContext( context );
+    ok( awareness == DPI_AWARENESS_PER_MONITOR_AWARE, "wrong awareness %u\n", awareness );
+
+    pSetThreadDpiAwarenessContext( DPI_AWARENESS_CONTEXT_UNAWARE );
+    SetLastError( 0xdeadbeef );
+    context = GetWindowDpiAwarenessContext( GetDesktopWindow() );
+    awareness = pGetAwarenessFromDpiAwarenessContext( context );
+    ok( awareness == DPI_AWARENESS_PER_MONITOR_AWARE, "wrong awareness %u\n", awareness );
+
+    pSetThreadDpiAwarenessContext( orig );
+}
+
 START_TEST(sysparams)
 {
     int argc;
@@ -3084,6 +3142,7 @@ START_TEST(sysparams)
     pSetProcessDpiAwarenessContext = (void*)GetProcAddress(hdll, "SetProcessDpiAwarenessContext");
     pGetThreadDpiAwarenessContext = (void*)GetProcAddress(hdll, "GetThreadDpiAwarenessContext");
     pSetThreadDpiAwarenessContext = (void*)GetProcAddress(hdll, "SetThreadDpiAwarenessContext");
+    pGetWindowDpiAwarenessContext = (void*)GetProcAddress(hdll, "GetWindowDpiAwarenessContext");
     pGetAwarenessFromDpiAwarenessContext = (void*)GetProcAddress(hdll, "GetAwarenessFromDpiAwarenessContext");
 
     hInstance = GetModuleHandleA( NULL );
@@ -3136,4 +3195,5 @@ START_TEST(sysparams)
     ReleaseDC( 0, hdc);
 
     test_dpi_aware();
+    test_window_dpi();
 }
diff --git a/dlls/user32/user32.spec b/dlls/user32/user32.spec
index 85499b6..d407a18 100644
--- a/dlls/user32/user32.spec
+++ b/dlls/user32/user32.spec
@@ -394,6 +394,7 @@
 @ stdcall GetWindowContextHelpId(long)
 @ stdcall GetWindowDC(long)
 @ stdcall GetWindowDisplayAffinity(long ptr)
+@ stdcall GetWindowDpiAwarenessContext(long)
 @ stdcall GetWindowInfo(long ptr)
 @ stdcall GetWindowLongA(long long)
 @ stdcall -arch=win64 GetWindowLongPtrA(long long)
diff --git a/dlls/user32/win.c b/dlls/user32/win.c
index 019b178..0272566 100644
--- a/dlls/user32/win.c
+++ b/dlls/user32/win.c
@@ -1498,6 +1498,7 @@ HWND WIN_CreateWindowEx( CREATESTRUCTW *cs, LPCWSTR className, HINSTANCE module,
     wndPtr->hIconSmall     = 0;
     wndPtr->hIconSmall2    = 0;
     wndPtr->hSysMenu       = 0;
+    wndPtr->dpi_awareness  = GetThreadDpiAwarenessContext();
 
     wndPtr->min_pos.x = wndPtr->min_pos.y = -1;
     wndPtr->max_pos.x = wndPtr->max_pos.y = -1;
@@ -2215,6 +2216,32 @@ BOOL WINAPI IsWindowUnicode( HWND hwnd )
 }
 
 
+/***********************************************************************
+ *		GetWindowDpiAwarenessContext  (USER32.@)
+ */
+DPI_AWARENESS_CONTEXT WINAPI GetWindowDpiAwarenessContext( HWND hwnd )
+{
+    WND *win;
+    DPI_AWARENESS_CONTEXT ret;
+
+    if (!(win = WIN_GetPtr( hwnd )))
+    {
+        SetLastError( ERROR_INVALID_WINDOW_HANDLE );
+        return 0;
+    }
+    if (win == WND_DESKTOP) return DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE;
+    if (win == WND_OTHER_PROCESS)
+    {
+        if (IsWindow( hwnd )) FIXME( "not supported on other process window %p\n", hwnd );
+        else SetLastError( ERROR_INVALID_WINDOW_HANDLE );
+        return 0;
+    }
+    ret = win->dpi_awareness;
+    WIN_ReleasePtr( win );
+    return ret;
+}
+
+
 /**********************************************************************
  *	     WIN_GetWindowLong
  *
diff --git a/dlls/user32/win.h b/dlls/user32/win.h
index f728d19..0c7fcc8 100644
--- a/dlls/user32/win.h
+++ b/dlls/user32/win.h
@@ -61,6 +61,7 @@ typedef struct tagWND
     HICON          hIcon;         /* window's icon */
     HICON          hIconSmall;    /* window's small icon */
     HICON          hIconSmall2;   /* window's secondary small icon, derived from hIcon */
+    DPI_AWARENESS_CONTEXT  dpi_awareness; /* DPI awareness context */
     struct window_surface *surface; /* Window surface if any */
     struct tagDIALOGINFO *dlgInfo;/* Dialog additional info (dialogs only) */
     int            pixel_format;  /* Pixel format set by the graphics driver */
diff --git a/include/winuser.h b/include/winuser.h
index 31ab49e..63cfd5c 100644
--- a/include/winuser.h
+++ b/include/winuser.h
@@ -3780,6 +3780,7 @@ WINUSERAPI HWND        WINAPI GetWindow(HWND,UINT);
 WINUSERAPI DWORD       WINAPI GetWindowContextHelpId(HWND);
 WINUSERAPI HDC         WINAPI GetWindowDC(HWND);
 WINUSERAPI BOOL        WINAPI GetWindowDisplayAffinity(HWND,DWORD*);
+WINUSERAPI DPI_AWARENESS_CONTEXT WINAPI GetWindowDpiAwarenessContext(HWND);
 WINUSERAPI BOOL        WINAPI GetWindowInfo(HWND, PWINDOWINFO);
 WINUSERAPI LONG        WINAPI GetWindowLongA(HWND,INT);
 WINUSERAPI LONG        WINAPI GetWindowLongW(HWND,INT);




More information about the wine-cvs mailing list