Alexandre Julliard : user32: Implement SetProcessDpiAwarenessContext().
Alexandre Julliard
julliard at winehq.org
Fri Mar 30 12:32:36 CDT 2018
Module: wine
Branch: master
Commit: bd0cd09e69ef5feed483fb11401667544c68ee21
URL: https://source.winehq.org/git/wine.git/?a=commit;h=bd0cd09e69ef5feed483fb11401667544c68ee21
Author: Alexandre Julliard <julliard at winehq.org>
Date: Fri Mar 30 12:37:55 2018 +0200
user32: Implement SetProcessDpiAwarenessContext().
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/user32/sysparams.c | 27 +++++++++++++++++++++++++--
dlls/user32/tests/sysparams.c | 26 ++++++++++++++++++++++++++
dlls/user32/user32.spec | 3 ++-
include/winuser.h | 1 +
4 files changed, 54 insertions(+), 3 deletions(-)
diff --git a/dlls/user32/sysparams.c b/dlls/user32/sysparams.c
index 42e6a44..2c4ff5e 100644
--- a/dlls/user32/sysparams.c
+++ b/dlls/user32/sysparams.c
@@ -2942,6 +2942,28 @@ BOOL WINAPI EnumDisplaySettingsExW(LPCWSTR lpszDeviceName, DWORD iModeNum,
return USER_Driver->pEnumDisplaySettingsEx(lpszDeviceName, iModeNum, lpDevMode, dwFlags);
}
+
+static DPI_AWARENESS_CONTEXT dpi_awareness;
+
+/**********************************************************************
+ * SetProcessDpiAwarenessContext (USER32.@)
+ */
+BOOL WINAPI SetProcessDpiAwarenessContext( DPI_AWARENESS_CONTEXT context )
+{
+ if (!IsValidDpiAwarenessContext( context ))
+ {
+ SetLastError( ERROR_INVALID_PARAMETER );
+ return FALSE;
+ }
+ if (InterlockedCompareExchangePointer( (void **)&dpi_awareness, context, NULL ))
+ {
+ SetLastError( ERROR_ACCESS_DENIED );
+ return FALSE;
+ }
+ TRACE( "set to %p\n", context );
+ return TRUE;
+}
+
/***********************************************************************
* AreDpiAwarenessContextsEqual (USER32.@)
*/
@@ -2980,6 +3002,7 @@ BOOL WINAPI IsValidDpiAwarenessContext( DPI_AWARENESS_CONTEXT context )
BOOL WINAPI SetProcessDPIAware(void)
{
TRACE("\n");
+ InterlockedCompareExchangePointer( (void **)&dpi_awareness, DPI_AWARENESS_CONTEXT_SYSTEM_AWARE, NULL );
return TRUE;
}
@@ -2988,8 +3011,8 @@ BOOL WINAPI SetProcessDPIAware(void)
*/
BOOL WINAPI IsProcessDPIAware(void)
{
- TRACE("returning TRUE\n");
- return TRUE;
+ /* FIXME: should default to FALSE when not set */
+ return dpi_awareness != DPI_AWARENESS_CONTEXT_UNAWARE;
}
/***********************************************************************
diff --git a/dlls/user32/tests/sysparams.c b/dlls/user32/tests/sysparams.c
index 5dd8e58..03fa8d5 100644
--- a/dlls/user32/tests/sysparams.c
+++ b/dlls/user32/tests/sysparams.c
@@ -41,6 +41,7 @@
static LONG (WINAPI *pChangeDisplaySettingsExA)(LPCSTR, LPDEVMODEA, HWND, DWORD, LPVOID);
static BOOL (WINAPI *pIsProcessDPIAware)(void);
static BOOL (WINAPI *pSetProcessDPIAware)(void);
+static BOOL (WINAPI *pSetProcessDpiAwarenessContext)(DPI_AWARENESS_CONTEXT);
static BOOL strict;
static int dpi, real_dpi;
@@ -2995,6 +2996,30 @@ static void test_dpi_aware(void)
return;
}
+ if (pSetProcessDpiAwarenessContext)
+ {
+ SetLastError( 0xdeadbeef );
+ ret = pSetProcessDpiAwarenessContext( NULL );
+ ok( !ret, "got %d\n", ret );
+ ok( GetLastError() == ERROR_INVALID_PARAMETER, "wrong error %u\n", GetLastError() );
+ SetLastError( 0xdeadbeef );
+ ret = pSetProcessDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)-5 );
+ ok( !ret, "got %d\n", ret );
+ ok( GetLastError() == ERROR_INVALID_PARAMETER, "wrong error %u\n", GetLastError() );
+ ret = pSetProcessDpiAwarenessContext( DPI_AWARENESS_CONTEXT_SYSTEM_AWARE );
+ ok( ret, "got %d\n", ret );
+ SetLastError( 0xdeadbeef );
+ ret = pSetProcessDpiAwarenessContext( DPI_AWARENESS_CONTEXT_SYSTEM_AWARE );
+ ok( !ret, "got %d\n", ret );
+ ok( GetLastError() == ERROR_ACCESS_DENIED, "wrong error %u\n", GetLastError() );
+ SetLastError( 0xdeadbeef );
+ ret = pSetProcessDpiAwarenessContext( DPI_AWARENESS_CONTEXT_UNAWARE );
+ ok( !ret, "got %d\n", ret );
+ ok( GetLastError() == ERROR_ACCESS_DENIED, "wrong error %u\n", GetLastError() );
+ ret = pIsProcessDPIAware();
+ ok(ret, "got %d\n", ret);
+ }
+
ret = pSetProcessDPIAware();
ok(ret, "got %d\n", ret);
@@ -3019,6 +3044,7 @@ START_TEST(sysparams)
pChangeDisplaySettingsExA = (void*)GetProcAddress(hdll, "ChangeDisplaySettingsExA");
pIsProcessDPIAware = (void*)GetProcAddress(hdll, "IsProcessDPIAware");
pSetProcessDPIAware = (void*)GetProcAddress(hdll, "SetProcessDPIAware");
+ pSetProcessDpiAwarenessContext = (void*)GetProcAddress(hdll, "SetProcessDpiAwarenessContext");
hInstance = GetModuleHandleA( NULL );
hdc = GetDC(0);
diff --git a/dlls/user32/user32.spec b/dlls/user32/user32.spec
index f37b6a4..b0109cb 100644
--- a/dlls/user32/user32.spec
+++ b/dlls/user32/user32.spec
@@ -671,8 +671,9 @@
@ stdcall SetMessageQueue(long)
@ stdcall SetParent(long long)
@ stdcall SetPhysicalCursorPos(long long)
-@ stdcall SetProcessDefaultLayout(long)
@ stdcall SetProcessDPIAware()
+@ stdcall SetProcessDefaultLayout(long)
+@ stdcall SetProcessDpiAwarenessContext(long)
@ stdcall SetProcessWindowStation(long)
@ stdcall SetProgmanWindow (long)
@ stdcall SetPropA(long str long)
diff --git a/include/winuser.h b/include/winuser.h
index 213a83a..24d9e57 100644
--- a/include/winuser.h
+++ b/include/winuser.h
@@ -4064,6 +4064,7 @@ WINUSERAPI HWND WINAPI SetParent(HWND,HWND);
WINUSERAPI BOOL WINAPI SetPhysicalCursorPos(INT,INT);
WINUSERAPI BOOL WINAPI SetProcessDPIAware(void);
WINUSERAPI BOOL WINAPI SetProcessDefaultLayout(DWORD);
+WINUSERAPI BOOL WINAPI SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT);
WINUSERAPI BOOL WINAPI SetProcessWindowStation(HWINSTA);
WINUSERAPI BOOL WINAPI SetPropA(HWND,LPCSTR,HANDLE);
WINUSERAPI BOOL WINAPI SetPropW(HWND,LPCWSTR,HANDLE);
More information about the wine-cvs
mailing list