Module: wine Branch: master Commit: ea92a74133a4ba86cf1fdbe0b2dd390410c74d2b URL: https://source.winehq.org/git/wine.git/?a=commit;h=ea92a74133a4ba86cf1fdbe0b...
Author: Alexandre Julliard julliard@winehq.org Date: Thu Jun 21 14:20:38 2018 +0200
user32: Check the DpiScalingVer registry key to enable DPI scaling.
Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/user32/sysparams.c | 74 ++++++++++++++++++++++--------------------------- 1 file changed, 33 insertions(+), 41 deletions(-)
diff --git a/dlls/user32/sysparams.c b/dlls/user32/sysparams.c index 28ebae6..3245f20 100644 --- a/dlls/user32/sysparams.c +++ b/dlls/user32/sysparams.c @@ -144,6 +144,8 @@ static const WCHAR DESKPATTERN_VALNAME[]= {DESKTOP_KEY,'P','a','t', static const WCHAR FONTSMOOTHING_VALNAME[]= {DESKTOP_KEY,'F','o','n','t','S','m','o','o','t','h','i','n','g',0}; static const WCHAR DRAGWIDTH_VALNAME[]= {DESKTOP_KEY,'D','r','a','g','W','i','d','t','h',0}; static const WCHAR DRAGHEIGHT_VALNAME[]= {DESKTOP_KEY,'D','r','a','g','H','e','i','g','h','t',0}; +static const WCHAR DPISCALINGVER_VALNAME[]= {DESKTOP_KEY,'D','p','i','S','c','a','l','i','n','g','V','e','r',0}; +static const WCHAR LOGPIXELS_VALNAME[]= {DESKTOP_KEY,'L','o','g','P','i','x','e','l','s',0}; static const WCHAR LOWPOWERACTIVE_VALNAME[]= {DESKTOP_KEY,'L','o','w','P','o','w','e','r','A','c','t','i','v','e',0}; static const WCHAR POWEROFFACTIVE_VALNAME[]= {DESKTOP_KEY,'P','o','w','e','r','O','f','f','A','c','t','i','v','e',0}; static const WCHAR USERPREFERENCESMASK_VALNAME[]= {DESKTOP_KEY,'U','s','e','r','P','r','e','f','e','r','e','n','c','e','s','M','a','s','k',0}; @@ -251,6 +253,9 @@ static BOOL notify_change = TRUE;
/* System parameters storage */ static RECT work_area; +static UINT system_dpi; +static DPI_AWARENESS dpi_awareness; +static DPI_AWARENESS default_awareness = DPI_AWARENESS_UNAWARE;
static HKEY volatile_base_key;
@@ -612,37 +617,6 @@ static BOOL init_entry_string( struct sysparam_entry *entry, const WCHAR *str ) return init_entry( entry, str, (strlenW(str) + 1) * sizeof(WCHAR), REG_SZ ); }
-static DWORD get_reg_dword( HKEY base, const WCHAR *key_name, const WCHAR *value_name ) -{ - HKEY key; - DWORD type, ret = 0, size = sizeof(ret); - - if (RegOpenKeyW( base, key_name, &key )) return 0; - if (RegQueryValueExW( key, value_name, NULL, &type, (void *)&ret, &size ) || type != REG_DWORD) - ret = 0; - RegCloseKey( key ); - return ret; -} - -/* get the system dpi from the registry */ -static UINT get_system_dpi(void) -{ - static const WCHAR dpi_key_name[] = {'C','o','n','t','r','o','l',' ','P','a','n','e','l','\','D','e','s','k','t','o','p','\0'}; - static const WCHAR def_dpi_key_name[] = {'S','o','f','t','w','a','r','e','\','F','o','n','t','s','\0'}; - static const WCHAR dpi_value_name[] = {'L','o','g','P','i','x','e','l','s','\0'}; - static UINT system_dpi; - UINT dpi; - - if (!system_dpi) - { - if (!(dpi = get_reg_dword( HKEY_CURRENT_USER, dpi_key_name, dpi_value_name )) && - !(dpi = get_reg_dword( HKEY_CURRENT_CONFIG, def_dpi_key_name, dpi_value_name ))) - dpi = USER_DEFAULT_SCREEN_DPI; - system_dpi = dpi; - } - return system_dpi; -} - HDC get_display_dc(void) { static const WCHAR DISPLAY[] = {'D','I','S','P','L','A','Y',0}; @@ -897,7 +871,7 @@ static BOOL get_dword_entry( union sysparam_all_entry *entry, UINT int_param, vo DWORD val; if (load_entry( &entry->hdr, &val, sizeof(val) ) == sizeof(DWORD)) entry->dword.val = val; } - *(DWORD *)ptr_param = entry->bool.val; + *(DWORD *)ptr_param = entry->dword.val; return TRUE; }
@@ -1285,6 +1259,7 @@ static TWIPS_ENTRY( SMCAPTIONWIDTH, -225 ); static DWORD_ENTRY( ACTIVEWINDOWTRACKING, 0 ); static DWORD_ENTRY( ACTIVEWNDTRKTIMEOUT, 0 ); static DWORD_ENTRY( CARETWIDTH, 1 ); +static DWORD_ENTRY( DPISCALINGVER, 0 ); static DWORD_ENTRY( FOCUSBORDERHEIGHT, 1 ); static DWORD_ENTRY( FOCUSBORDERWIDTH, 1 ); static DWORD_ENTRY( FONTSMOOTHINGCONTRAST, 0 ); @@ -1292,6 +1267,7 @@ static DWORD_ENTRY( FONTSMOOTHINGORIENTATION, FE_FONTSMOOTHINGORIENTATIONRGB ); static DWORD_ENTRY( FONTSMOOTHINGTYPE, FE_FONTSMOOTHINGSTANDARD ); static DWORD_ENTRY( FOREGROUNDFLASHCOUNT, 3 ); static DWORD_ENTRY( FOREGROUNDLOCKTIMEOUT, 0 ); +static DWORD_ENTRY( LOGPIXELS, 0 ); static DWORD_ENTRY( MOUSECLICKLOCKTIME, 1200 );
static PATH_ENTRY( DESKPATTERN ); @@ -1430,8 +1406,10 @@ static union sysparam_all_entry * const default_entries[] = */ void SYSPARAMS_Init(void) { + static const WCHAR def_key_name[] = {'S','o','f','t','w','a','r','e','\','F','o','n','t','s',0}; + static const WCHAR def_value_name[] = {'L','o','g','P','i','x','e','l','s',0}; HKEY key; - DWORD i, dispos; + DWORD i, dispos, dpi_scaling;
/* this one must be non-volatile */ if (RegCreateKeyW( HKEY_CURRENT_USER, WINE_CURRENT_USER_REGKEY, &key )) @@ -1447,6 +1425,24 @@ void SYSPARAMS_Init(void)
RegCloseKey( key );
+ get_dword_entry( (union sysparam_all_entry *)&entry_LOGPIXELS, 0, &system_dpi, 0 ); + if (!system_dpi) /* check fallback key */ + { + if (!RegOpenKeyW( HKEY_CURRENT_CONFIG, def_key_name, &key )) + { + DWORD type, size = sizeof(system_dpi); + if (RegQueryValueExW( key, def_value_name, NULL, &type, (void *)&system_dpi, &size ) || + type != REG_DWORD) + system_dpi = 0; + RegCloseKey( key ); + } + } + if (!system_dpi) system_dpi = USER_DEFAULT_SCREEN_DPI; + + /* FIXME: what do the DpiScalingVer flags mean? */ + get_dword_entry( (union sysparam_all_entry *)&entry_DPISCALINGVER, 0, &dpi_scaling, 0 ); + if (!dpi_scaling) default_awareness = DPI_AWARENESS_PER_MONITOR_AWARE; + if (volatile_base_key && dispos == REG_CREATED_NEW_KEY) /* first process, initialize entries */ { for (i = 0; i < ARRAY_SIZE( default_entries ); i++) @@ -3171,15 +3167,13 @@ BOOL WINAPI EnumDisplaySettingsExW(LPCWSTR lpszDeviceName, DWORD iModeNum, }
-static DPI_AWARENESS dpi_awareness; - /********************************************************************** * get_monitor_dpi */ UINT get_monitor_dpi( HWND hwnd ) { /* FIXME: use the monitor DPI instead */ - return get_system_dpi(); + return system_dpi; }
/********************************************************************** @@ -3300,7 +3294,7 @@ BOOL WINAPI IsProcessDPIAware(void) UINT WINAPI GetDpiForSystem(void) { if (!IsProcessDPIAware()) return USER_DEFAULT_SCREEN_DPI; - return get_system_dpi(); + return system_dpi; }
/*********************************************************************** @@ -3308,7 +3302,7 @@ UINT WINAPI GetDpiForSystem(void) */ BOOL WINAPI GetDpiForMonitorInternal( HMONITOR monitor, UINT type, UINT *x, UINT *y ) { - UINT dpi = get_system_dpi(); + UINT dpi = system_dpi;
WARN( "(%p, %u, %p, %p): semi-stub\n", monitor, type, x, y );
@@ -3326,7 +3320,7 @@ DPI_AWARENESS_CONTEXT WINAPI GetThreadDpiAwarenessContext(void)
if (info->dpi_awareness) return ULongToHandle( info->dpi_awareness ); if (dpi_awareness) return ULongToHandle( dpi_awareness ); - return (DPI_AWARENESS_CONTEXT)(0x10 | DPI_AWARENESS_SYSTEM_AWARE); /* FIXME: should default to unaware */ + return ULongToHandle( 0x10 | default_awareness ); }
/********************************************************************** @@ -3358,7 +3352,6 @@ DPI_AWARENESS_CONTEXT WINAPI SetThreadDpiAwarenessContext( DPI_AWARENESS_CONTEXT */ BOOL WINAPI LogicalToPhysicalPointForPerMonitorDPI( HWND hwnd, POINT *pt ) { - UINT system_dpi = get_system_dpi(); UINT dpi = GetDpiForWindow( hwnd ); RECT rect;
@@ -3375,7 +3368,6 @@ BOOL WINAPI LogicalToPhysicalPointForPerMonitorDPI( HWND hwnd, POINT *pt ) BOOL WINAPI PhysicalToLogicalPointForPerMonitorDPI( HWND hwnd, POINT *pt ) { DPI_AWARENESS_CONTEXT context; - UINT system_dpi = get_system_dpi(); UINT dpi = GetDpiForWindow( hwnd ); RECT rect;