user32: Implement GetDpiForSystem().

Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Alexandre Julliard 2018-03-29 14:54:08 +02:00
parent e9000b4e8b
commit ca878114cb
3 changed files with 30 additions and 36 deletions

View File

@ -625,19 +625,6 @@ void release_display_dc( HDC hdc )
LeaveCriticalSection( &display_dc_section ); LeaveCriticalSection( &display_dc_section );
} }
static inline int get_display_dpi(void)
{
static int display_dpi;
HDC hdc;
if (!display_dpi)
{
hdc = get_display_dc();
display_dpi = GetDeviceCaps( hdc, LOGPIXELSY );
release_display_dc( hdc );
}
return display_dpi;
}
static INT CALLBACK real_fontname_proc(const LOGFONTW *lf, const TEXTMETRICW *ntm, DWORD type, LPARAM lparam) static INT CALLBACK real_fontname_proc(const LOGFONTW *lf, const TEXTMETRICW *ntm, DWORD type, LPARAM lparam)
{ {
const ENUMLOGFONTW *elf = (const ENUMLOGFONTW *)lf; const ENUMLOGFONTW *elf = (const ENUMLOGFONTW *)lf;
@ -768,7 +755,7 @@ static BOOL get_twips_entry( union sysparam_all_entry *entry, UINT int_param, vo
* Technical Reference to the Windows 2000 Registry -> * Technical Reference to the Windows 2000 Registry ->
* HKEY_CURRENT_USER -> Control Panel -> Desktop -> WindowMetrics * HKEY_CURRENT_USER -> Control Panel -> Desktop -> WindowMetrics
*/ */
if (val < 0) val = (-val * get_display_dpi() + 720) / 1440; if (val < 0) val = (-val * GetDpiForSystem() + 720) / 1440;
entry->uint.val = val; entry->uint.val = val;
} }
} }
@ -952,13 +939,13 @@ static BOOL get_font_entry( union sysparam_all_entry *entry, UINT int_param, voi
{ {
case sizeof(font): case sizeof(font):
if (font.lfHeight > 0) /* positive height value means points ( inch/72 ) */ if (font.lfHeight > 0) /* positive height value means points ( inch/72 ) */
font.lfHeight = -MulDiv( font.lfHeight, get_display_dpi(), 72 ); font.lfHeight = -MulDiv( font.lfHeight, GetDpiForSystem(), 72 );
entry->font.val = font; entry->font.val = font;
break; break;
case sizeof(LOGFONT16): /* win9x-winME format */ case sizeof(LOGFONT16): /* win9x-winME format */
SYSPARAMS_LogFont16To32W( (LOGFONT16 *)&font, &entry->font.val ); SYSPARAMS_LogFont16To32W( (LOGFONT16 *)&font, &entry->font.val );
if (entry->font.val.lfHeight > 0) if (entry->font.val.lfHeight > 0)
entry->font.val.lfHeight = -MulDiv( entry->font.val.lfHeight, get_display_dpi(), 72 ); entry->font.val.lfHeight = -MulDiv( entry->font.val.lfHeight, GetDpiForSystem(), 72 );
break; break;
default: default:
WARN( "Unknown format in key %s value %s\n", WARN( "Unknown format in key %s value %s\n",
@ -1509,9 +1496,7 @@ BOOL WINAPI SystemParametersInfoW( UINT uiAction, UINT uiParam,
ret = get_entry( &entry_ICONHORIZONTALSPACING, uiParam, pvParam ); ret = get_entry( &entry_ICONHORIZONTALSPACING, uiParam, pvParam );
else else
{ {
int min_val = 32; int min_val = MulDiv( 32, GetDpiForSystem(), USER_DEFAULT_SCREEN_DPI );
if (IsProcessDPIAware())
min_val = MulDiv( min_val, get_display_dpi(), USER_DEFAULT_SCREEN_DPI );
ret = set_entry( &entry_ICONHORIZONTALSPACING, max( min_val, uiParam ), pvParam, fWinIni ); ret = set_entry( &entry_ICONHORIZONTALSPACING, max( min_val, uiParam ), pvParam, fWinIni );
} }
break; break;
@ -1552,9 +1537,7 @@ BOOL WINAPI SystemParametersInfoW( UINT uiAction, UINT uiParam,
ret = get_entry( &entry_ICONVERTICALSPACING, uiParam, pvParam ); ret = get_entry( &entry_ICONVERTICALSPACING, uiParam, pvParam );
else else
{ {
int min_val = 32; int min_val = MulDiv( 32, GetDpiForSystem(), USER_DEFAULT_SCREEN_DPI );
if (IsProcessDPIAware())
min_val = MulDiv( min_val, get_display_dpi(), USER_DEFAULT_SCREEN_DPI );
ret = set_entry( &entry_ICONVERTICALSPACING, max( min_val, uiParam ), pvParam, fWinIni ); ret = set_entry( &entry_ICONVERTICALSPACING, max( min_val, uiParam ), pvParam, fWinIni );
} }
break; break;
@ -2435,18 +2418,12 @@ INT WINAPI GetSystemMetrics( INT index )
return max( 8, ret ); return max( 8, ret );
case SM_CXICON: case SM_CXICON:
case SM_CYICON: case SM_CYICON:
ret = 32; return MulDiv( 32, GetDpiForSystem(), USER_DEFAULT_SCREEN_DPI );
if (IsProcessDPIAware())
ret = MulDiv( ret, get_display_dpi(), USER_DEFAULT_SCREEN_DPI );
return ret;
case SM_CXCURSOR: case SM_CXCURSOR:
case SM_CYCURSOR: case SM_CYCURSOR:
if (IsProcessDPIAware()) ret = MulDiv( 32, GetDpiForSystem(), USER_DEFAULT_SCREEN_DPI );
{
ret = MulDiv( 32, get_display_dpi(), USER_DEFAULT_SCREEN_DPI );
if (ret >= 64) return 64; if (ret >= 64) return 64;
if (ret >= 48) return 48; if (ret >= 48) return 48;
}
return 32; return 32;
case SM_CYMENU: case SM_CYMENU:
return GetSystemMetrics(SM_CYMENUSIZE) + 1; return GetSystemMetrics(SM_CYMENUSIZE) + 1;
@ -2537,10 +2514,7 @@ INT WINAPI GetSystemMetrics( INT index )
return GetSystemMetrics(SM_CYMINIMIZED) + max( 0, (INT)ret ); return GetSystemMetrics(SM_CYMINIMIZED) + max( 0, (INT)ret );
case SM_CXSMICON: case SM_CXSMICON:
case SM_CYSMICON: case SM_CYSMICON:
ret = 16; return MulDiv( 16, GetDpiForSystem(), USER_DEFAULT_SCREEN_DPI ) & ~1;
if (IsProcessDPIAware())
ret = MulDiv( ret, get_display_dpi(), USER_DEFAULT_SCREEN_DPI ) & ~1;
return ret;
case SM_CYSMCAPTION: case SM_CYSMCAPTION:
return GetSystemMetrics(SM_CYSMSIZE) + 1; return GetSystemMetrics(SM_CYSMSIZE) + 1;
case SM_CXSMSIZE: case SM_CXSMSIZE:
@ -2963,6 +2937,24 @@ BOOL WINAPI IsProcessDPIAware(void)
return TRUE; return TRUE;
} }
/***********************************************************************
* GetDpiForSystem (USER32.@)
*/
UINT WINAPI GetDpiForSystem(void)
{
static int display_dpi;
if (!IsProcessDPIAware()) return USER_DEFAULT_SCREEN_DPI;
if (!display_dpi)
{
HDC hdc = get_display_dc();
display_dpi = GetDeviceCaps( hdc, LOGPIXELSY );
release_display_dc( hdc );
}
return display_dpi;
}
/********************************************************************** /**********************************************************************
* SetThreadDpiAwarenessContext (USER32.@) * SetThreadDpiAwarenessContext (USER32.@)
*/ */

View File

@ -292,6 +292,7 @@
@ stdcall GetDlgItemTextA(long long ptr long) @ stdcall GetDlgItemTextA(long long ptr long)
@ stdcall GetDlgItemTextW(long long ptr long) @ stdcall GetDlgItemTextW(long long ptr long)
@ stdcall GetDoubleClickTime() @ stdcall GetDoubleClickTime()
@ stdcall GetDpiForSystem()
@ stdcall GetFocus() @ stdcall GetFocus()
@ stdcall GetForegroundWindow() @ stdcall GetForegroundWindow()
@ stdcall GetGestureConfig(long long long ptr ptr long) @ stdcall GetGestureConfig(long long long ptr ptr long)

View File

@ -3675,6 +3675,7 @@ WINUSERAPI UINT WINAPI GetDlgItemTextA(HWND,INT,LPSTR,INT);
WINUSERAPI UINT WINAPI GetDlgItemTextW(HWND,INT,LPWSTR,INT); WINUSERAPI UINT WINAPI GetDlgItemTextW(HWND,INT,LPWSTR,INT);
#define GetDlgItemText WINELIB_NAME_AW(GetDlgItemText) #define GetDlgItemText WINELIB_NAME_AW(GetDlgItemText)
WINUSERAPI UINT WINAPI GetDoubleClickTime(void); WINUSERAPI UINT WINAPI GetDoubleClickTime(void);
WINUSERAPI UINT WINAPI GetDpiForSystem(void);
WINUSERAPI HWND WINAPI GetFocus(void); WINUSERAPI HWND WINAPI GetFocus(void);
WINUSERAPI HWND WINAPI GetForegroundWindow(void); WINUSERAPI HWND WINAPI GetForegroundWindow(void);
WINUSERAPI BOOL WINAPI GetGestureConfig(HWND,DWORD,DWORD,UINT*,GESTURECONFIG*,UINT); WINUSERAPI BOOL WINAPI GetGestureConfig(HWND,DWORD,DWORD,UINT*,GESTURECONFIG*,UINT);