win32u: Move NtUserEnumDisplaySettings implementation from user32.

Signed-off-by: Jacek Caban <jacek@codeweavers.com>
Signed-off-by: Huw Davies <huw@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Jacek Caban 2021-12-01 16:02:43 +01:00 committed by Alexandre Julliard
parent 8b9b2580a5
commit 1f2c3e8538
9 changed files with 78 additions and 66 deletions

View File

@ -274,11 +274,6 @@ static BOOL CDECL loaderdrv_EnumDisplayMonitors( HDC hdc, LPRECT rect, MONITOREN
return load_driver()->pEnumDisplayMonitors( hdc, rect, proc, lp );
}
static BOOL CDECL loaderdrv_EnumDisplaySettingsEx( LPCWSTR name, DWORD num, LPDEVMODEW mode, DWORD flags )
{
return load_driver()->pEnumDisplaySettingsEx( name, num, mode, flags );
}
static BOOL CDECL loaderdrv_GetMonitorInfo( HMONITOR handle, LPMONITORINFO info )
{
return load_driver()->pGetMonitorInfo( handle, info );
@ -345,7 +340,7 @@ static struct user_driver_funcs lazy_load_driver =
/* display modes */
loaderdrv_ChangeDisplaySettingsEx,
loaderdrv_EnumDisplayMonitors,
loaderdrv_EnumDisplaySettingsEx,
NULL,
loaderdrv_GetMonitorInfo,
NULL,
/* windowing functions */

View File

@ -3298,41 +3298,14 @@ BOOL WINAPI EnumDisplaySettingsExA(LPCSTR lpszDeviceName, DWORD iModeNum,
/***********************************************************************
* EnumDisplaySettingsExW (USER32.@)
*/
BOOL WINAPI EnumDisplaySettingsExW(LPCWSTR lpszDeviceName, DWORD iModeNum,
LPDEVMODEW lpDevMode, DWORD dwFlags)
BOOL WINAPI EnumDisplaySettingsExW( const WCHAR *device, DWORD mode,
DEVMODEW *dev_mode, DWORD flags )
{
WCHAR primary_adapter[CCHDEVICENAME];
BOOL ret;
TRACE("%s %#x %p %#x\n", wine_dbgstr_w(lpszDeviceName), iModeNum, lpDevMode, dwFlags);
if (!lpszDeviceName)
{
if (!get_primary_adapter(primary_adapter))
return FALSE;
lpszDeviceName = primary_adapter;
}
if (!is_valid_adapter_name(lpszDeviceName))
{
ERR("Invalid device name %s.\n", wine_dbgstr_w(lpszDeviceName));
return FALSE;
}
ret = USER_Driver->pEnumDisplaySettingsEx(lpszDeviceName, iModeNum, lpDevMode, dwFlags);
if (ret)
TRACE("device:%s mode index:%#x position:(%d,%d) resolution:%ux%u frequency:%uHz "
"depth:%ubits orientation:%#x.\n", wine_dbgstr_w(lpszDeviceName), iModeNum,
lpDevMode->u1.s2.dmPosition.x, lpDevMode->u1.s2.dmPosition.y, lpDevMode->dmPelsWidth,
lpDevMode->dmPelsHeight, lpDevMode->dmDisplayFrequency, lpDevMode->dmBitsPerPel,
lpDevMode->u1.s2.dmDisplayOrientation);
else
WARN("Failed to query %s display settings.\n", wine_dbgstr_w(lpszDeviceName));
return ret;
UNICODE_STRING str;
RtlInitUnicodeString( &str, device );
return NtUserEnumDisplaySettings( &str, mode, dev_mode, flags );
}
/**********************************************************************
* get_monitor_dpi
*/

View File

@ -263,18 +263,18 @@ static INT CDECL nulldrv_GetDeviceCaps( PHYSDEV dev, INT cap )
}
case BITSPIXEL:
{
UNICODE_STRING display;
DEVMODEW devmode;
WCHAR *display;
DC *dc;
if (NtGdiGetDeviceCaps( dev->hdc, TECHNOLOGY ) == DT_RASDISPLAY && user_callbacks)
if (NtGdiGetDeviceCaps( dev->hdc, TECHNOLOGY ) == DT_RASDISPLAY)
{
dc = get_nulldrv_dc( dev );
display = dc->display[0] ? dc->display : NULL;
memset( &devmode, 0, sizeof(devmode) );
devmode.dmSize = sizeof(devmode);
if (user_callbacks->pEnumDisplaySettingsW( display, ENUM_CURRENT_SETTINGS, &devmode )
&& devmode.dmFields & DM_BITSPERPEL && devmode.dmBitsPerPel)
init_unicode_string( &display, dc->display );
if (NtUserEnumDisplaySettings( &display, ENUM_CURRENT_SETTINGS, &devmode, 0 ) &&
(devmode.dmFields & DM_BITSPERPEL) && devmode.dmBitsPerPel)
return devmode.dmBitsPerPel;
}
return 32;
@ -313,24 +313,21 @@ static INT CDECL nulldrv_GetDeviceCaps( PHYSDEV dev, INT cap )
case SCALINGFACTORY: return 0;
case VREFRESH:
{
UNICODE_STRING display;
DEVMODEW devmode;
WCHAR *display;
DC *dc;
if (NtGdiGetDeviceCaps( dev->hdc, TECHNOLOGY ) != DT_RASDISPLAY)
return 0;
if (user_callbacks)
{
dc = get_nulldrv_dc( dev );
memset( &devmode, 0, sizeof(devmode) );
devmode.dmSize = sizeof(devmode);
display = dc->display[0] ? dc->display : NULL;
if (user_callbacks->pEnumDisplaySettingsW( display, ENUM_CURRENT_SETTINGS, &devmode ))
return devmode.dmDisplayFrequency ? devmode.dmDisplayFrequency : 1;
}
init_unicode_string( &display, dc->display );
if (NtUserEnumDisplaySettings( &display, ENUM_CURRENT_SETTINGS, &devmode, 0 ) &&
devmode.dmDisplayFrequency)
return devmode.dmDisplayFrequency;
return 1;
}
case DESKTOPHORZRES:
@ -1044,6 +1041,11 @@ static SHORT CDECL loaderdrv_VkKeyScanEx( WCHAR ch, HKL layout )
return load_driver()->pVkKeyScanEx( ch, layout );
}
static BOOL CDECL loaderdrv_EnumDisplaySettingsEx( LPCWSTR name, DWORD num, LPDEVMODEW mode, DWORD flags )
{
return load_driver()->pEnumDisplaySettingsEx( name, num, mode, flags );
}
static void CDECL loaderdrv_UpdateClipboard(void)
{
load_driver()->pUpdateClipboard();
@ -1064,6 +1066,7 @@ static const struct user_driver_funcs lazy_load_driver =
.pToUnicodeEx = loaderdrv_ToUnicodeEx,
.pUnregisterHotKey = loaderdrv_UnregisterHotKey,
.pVkKeyScanEx = loaderdrv_VkKeyScanEx,
.pEnumDisplaySettingsEx = loaderdrv_EnumDisplaySettingsEx,
.pUpdateDisplayDevices = loaderdrv_UpdateDisplayDevices,
.pUpdateClipboard = loaderdrv_UpdateClipboard,
.pScrollDC = nulldrv_ScrollDC,

View File

@ -1170,6 +1170,7 @@ static struct unix_funcs unix_funcs =
NtUserActivateKeyboardLayout,
NtUserCountClipboardFormats,
NtUserEnumDisplayDevices,
NtUserEnumDisplaySettings,
NtUserGetDisplayConfigBufferSizes,
NtUserGetKeyNameText,
NtUserGetKeyboardLayoutList,

View File

@ -1282,3 +1282,36 @@ BOOL WINAPI NtUserEnumDisplayDevices( UNICODE_STRING *device, DWORD index,
unlock_display_devices();
return !!found;
}
/***********************************************************************
* NtUserEnumDisplaySettings (win32u.@)
*/
BOOL WINAPI NtUserEnumDisplaySettings( UNICODE_STRING *device, DWORD mode,
DEVMODEW *dev_mode, DWORD flags )
{
WCHAR device_name[CCHDEVICENAME];
struct adapter *adapter;
BOOL ret;
TRACE( "%s %#x %p %#x\n", debugstr_us(device), mode, dev_mode, flags );
if (!lock_display_devices()) return FALSE;
if ((adapter = find_adapter( device ))) lstrcpyW( device_name, adapter->dev.device_name );
unlock_display_devices();
if (!adapter)
{
WARN( "Invalid device name %s.\n", debugstr_us(device) );
return FALSE;
}
ret = user_driver->pEnumDisplaySettingsEx( device_name, mode, dev_mode, flags );
if (ret)
TRACE( "device:%s mode index:%#x position:(%d,%d) resolution:%ux%u frequency:%uHz "
"depth:%ubits orientation:%#x.\n", debugstr_w(device_name), mode,
dev_mode->dmPosition.x, dev_mode->dmPosition.y, dev_mode->dmPelsWidth,
dev_mode->dmPelsHeight, dev_mode->dmDisplayFrequency, dev_mode->dmBitsPerPel,
dev_mode->dmDisplayOrientation );
else
WARN( "Failed to query %s display settings.\n", wine_dbgstr_w(device_name) );
return ret;
}

View File

@ -877,7 +877,7 @@
@ stub NtUserEndPaint
@ stdcall NtUserEnumDisplayDevices(ptr long ptr long)
@ stub NtUserEnumDisplayMonitors
@ stub NtUserEnumDisplaySettings
@ stdcall NtUserEnumDisplaySettings(ptr long ptr long)
@ stub NtUserEvent
@ stub NtUserExcludeUpdateRgn
@ stub NtUserFillWindow

View File

@ -38,7 +38,6 @@ struct user_callbacks
INT (WINAPI *pGetSystemMetrics)(INT);
BOOL (WINAPI *pGetWindowRect)( HWND hwnd, LPRECT rect );
BOOL (WINAPI *pEnumDisplayMonitors)( HDC, LPRECT, MONITORENUMPROC, LPARAM );
BOOL (WINAPI *pEnumDisplaySettingsW)(LPCWSTR, DWORD, LPDEVMODEW );
BOOL (WINAPI *pRedrawWindow)( HWND, const RECT*, HRGN, UINT );
DPI_AWARENESS_CONTEXT (WINAPI *pSetThreadDpiAwarenessContext)( DPI_AWARENESS_CONTEXT );
HWND (WINAPI *pWindowFromDC)( HDC );
@ -200,6 +199,8 @@ struct unix_funcs
INT (WINAPI *pNtUserCountClipboardFormats)(void);
BOOL (WINAPI *pNtUserEnumDisplayDevices)( UNICODE_STRING *device, DWORD index,
DISPLAY_DEVICEW *info, DWORD flags );
BOOL (WINAPI *pNtUserEnumDisplaySettings)( UNICODE_STRING *device, DWORD mode,
DEVMODEW *dev_mode, DWORD flags );
LONG (WINAPI *pNtUserGetDisplayConfigBufferSizes)( UINT32 flags, UINT32 *num_path_info,
UINT32 *num_mode_info );
INT (WINAPI *pNtUserGetKeyNameText)( LONG lparam, WCHAR *buffer, INT size );
@ -394,6 +395,13 @@ static inline BOOL is_win9x(void)
return NtCurrentTeb()->Peb->OSPlatformId == VER_PLATFORM_WIN32s;
}
static inline void init_unicode_string( UNICODE_STRING *str, const WCHAR *data )
{
str->Length = lstrlenW(data) * sizeof(WCHAR);
str->MaximumLength = str->Length + sizeof(WCHAR);
str->Buffer = (WCHAR *)data;
}
static inline const char *debugstr_us( const UNICODE_STRING *us )
{
if (!us) return "<null>";

View File

@ -612,6 +612,12 @@ BOOL WINAPI NtUserEnumDisplayDevices( UNICODE_STRING *device, DWORD index,
return unix_funcs->pNtUserEnumDisplayDevices( device, index, info, flags );
}
BOOL WINAPI NtUserEnumDisplaySettings( UNICODE_STRING *device, DWORD mode,
DEVMODEW *dev_mode, DWORD flags )
{
return unix_funcs->pNtUserEnumDisplaySettings( device, mode, dev_mode, flags );
}
LONG WINAPI NtUserGetDisplayConfigBufferSizes( UINT32 flags, UINT32 *num_path_info,
UINT32 *num_mode_info )
{
@ -821,14 +827,6 @@ static BOOL WINAPI call_EnumDisplayMonitors( HDC hdc, RECT *rect, MONITORENUMPRO
return pEnumDisplayMonitors && pEnumDisplayMonitors( hdc, rect, proc, lparam );
}
static BOOL WINAPI call_EnumDisplaySettingsW( const WCHAR *device, DWORD mode, DEVMODEW *devmode )
{
static BOOL (WINAPI *pEnumDisplaySettingsW)(LPCWSTR, DWORD, LPDEVMODEW );
if (!pEnumDisplaySettingsW)
pEnumDisplaySettingsW = get_user_proc( "EnumDisplaySettingsW", FALSE );
return pEnumDisplaySettingsW && pEnumDisplaySettingsW( device, mode, devmode );
}
static BOOL WINAPI call_RedrawWindow( HWND hwnd, const RECT *rect, HRGN rgn, UINT flags )
{
static BOOL (WINAPI *pRedrawWindow)( HWND, const RECT*, HRGN, UINT );
@ -861,7 +859,6 @@ static const struct user_callbacks user_funcs =
call_GetSystemMetrics,
call_GetWindowRect,
call_EnumDisplayMonitors,
call_EnumDisplaySettingsW,
call_RedrawWindow,
call_SetThreadDpiAwarenessContext,
call_WindowFromDC,

View File

@ -66,6 +66,8 @@ HWINSTA WINAPI NtUserCreateWindowStation( OBJECT_ATTRIBUTES *attr, ACCESS_MASK m
ULONG arg4, ULONG arg5, ULONG arg6, ULONG arg7 );
BOOL WINAPI NtUserEnumDisplayDevices( UNICODE_STRING *device, DWORD index,
DISPLAY_DEVICEW *info, DWORD flags );
BOOL WINAPI NtUserEnumDisplaySettings( UNICODE_STRING *device, DWORD mode,
DEVMODEW *dev_mode, DWORD flags );
INT WINAPI NtUserGetClipboardFormatName( UINT format, WCHAR *buffer, INT maxlen );
HWND WINAPI NtUserGetClipboardOwner(void);
DWORD WINAPI NtUserGetClipboardSequenceNumber(void);