Module: wine Branch: master Commit: 4c71db15ca72f099d5237857a3e9eb03764c7f1b URL: https://source.winehq.org/git/wine.git/?a=commit;h=4c71db15ca72f099d5237857a...
Author: Alexandre Julliard julliard@winehq.org Date: Fri Mar 30 16:45:22 2018 +0200
user32: Set the process DPI awareness from the manifest.
Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/user32/user_main.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++ dlls/user32/user_private.h | 2 ++ 2 files changed, 59 insertions(+)
diff --git a/dlls/user32/user_main.c b/dlls/user32/user_main.c index 74a7617..057c7aa 100644 --- a/dlls/user32/user_main.c +++ b/dlls/user32/user_main.c @@ -212,6 +212,62 @@ static const WCHAR *get_default_desktop(void)
/*********************************************************************** + * dpiaware_init + * + * Initialize the DPI awareness style. + */ +static void dpiaware_init(void) +{ + WCHAR buffer[256]; + static const WCHAR dpiAwareW[] = {'d','p','i','A','w','a','r','e',0}; + static const WCHAR dpiAwarenessW[] = {'d','p','i','A','w','a','r','e','n','e','s','s',0}; + static const WCHAR namespace2005W[] = {'h','t','t','p',':','/','/','s','c','h','e','m','a','s','.','m','i','c','r','o','s','o','f','t','.','c','o','m','/','S','M','I','/','2','0','0','5','/','W','i','n','d','o','w','s','S','e','t','t','i','n','g','s',0}; + static const WCHAR namespace2016W[] = {'h','t','t','p',':','/','/','s','c','h','e','m','a','s','.','m','i','c','r','o','s','o','f','t','.','c','o','m','/','S','M','I','/','2','0','1','6','/','W','i','n','d','o','w','s','S','e','t','t','i','n','g','s',0}; + + if (QueryActCtxSettingsW( 0, NULL, namespace2016W, dpiAwarenessW, buffer, ARRAY_SIZE(buffer), NULL )) + { + static const WCHAR unawareW[] = {'u','n','a','w','a','r','e',0}; + static const WCHAR systemW[] = {'s','y','s','t','e','m',0}; + static const WCHAR permonW[] = {'p','e','r','m','o','n','i','t','o','r',0}; + static const WCHAR permonv2W[] = {'p','e','r','m','o','n','i','t','o','r','v','2',0}; + static const WCHAR spacesW[] = {' ','\t','\r','\n',0}; + static const WCHAR * const types[] = { unawareW, systemW, permonW, permonv2W }; + WCHAR *p, *start = buffer, *end; + ULONG_PTR i; + + TRACE( "got dpiAwareness=%s\n", debugstr_w(buffer) ); + for (start = buffer; *start; start = end) + { + start += strspnW( start, spacesW ); + if (!(end = strchrW( start, ',' ))) end = start + strlenW(start); + else *end++ = 0; + if ((p = strpbrkW( start, spacesW ))) *p = 0; + for (i = 0; i < ARRAY_SIZE(types); i++) + { + if (strcmpiW( start, types[i] )) continue; + SetProcessDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)~i ); + return; + } + } + } + else if (QueryActCtxSettingsW( 0, NULL, namespace2005W, dpiAwareW, buffer, ARRAY_SIZE(buffer), NULL )) + { + static const WCHAR trueW[] = {'t','r','u','e',0}; + static const WCHAR truepmW[] = {'t','r','u','e','/','p','m',0}; + static const WCHAR permonW[] = {'p','e','r',' ','m','o','n','i','t','o','r',0}; + + TRACE( "got dpiAware=%s\n", debugstr_w(buffer) ); + if (!strcmpiW( buffer, trueW )) + SetProcessDpiAwarenessContext( DPI_AWARENESS_CONTEXT_SYSTEM_AWARE ); + else if (!strcmpiW( buffer, truepmW ) || !strcmpiW( buffer, permonW )) + SetProcessDpiAwarenessContext( DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE ); + else + SetProcessDpiAwarenessContext( DPI_AWARENESS_CONTEXT_UNAWARE ); + } +} + + +/*********************************************************************** * winstation_init * * Connect to the process window station and desktop. @@ -272,6 +328,7 @@ static void winstation_init(void) */ static BOOL process_attach(void) { + dpiaware_init(); winstation_init();
/* Initialize system colors and metrics */ diff --git a/dlls/user32/user_private.h b/dlls/user32/user_private.h index 7e4f699..5d54cb1 100644 --- a/dlls/user32/user_private.h +++ b/dlls/user32/user_private.h @@ -32,6 +32,8 @@ #define GET_WORD(ptr) (*(const WORD *)(ptr)) #define GET_DWORD(ptr) (*(const DWORD *)(ptr))
+#define ARRAY_SIZE(array) (sizeof(array) / sizeof((array)[0])) + #define WM_SYSTIMER 0x0118 #define WM_POPUPSYSTEMMENU 0x0313