Commit 1f2c3e85 authored by Jacek Caban's avatar Jacek Caban Committed by Alexandre Julliard

win32u: Move NtUserEnumDisplaySettings implementation from user32.

parent 8b9b2580
...@@ -274,11 +274,6 @@ static BOOL CDECL loaderdrv_EnumDisplayMonitors( HDC hdc, LPRECT rect, MONITOREN ...@@ -274,11 +274,6 @@ static BOOL CDECL loaderdrv_EnumDisplayMonitors( HDC hdc, LPRECT rect, MONITOREN
return load_driver()->pEnumDisplayMonitors( hdc, rect, proc, lp ); 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 ) static BOOL CDECL loaderdrv_GetMonitorInfo( HMONITOR handle, LPMONITORINFO info )
{ {
return load_driver()->pGetMonitorInfo( handle, info ); return load_driver()->pGetMonitorInfo( handle, info );
...@@ -345,7 +340,7 @@ static struct user_driver_funcs lazy_load_driver = ...@@ -345,7 +340,7 @@ static struct user_driver_funcs lazy_load_driver =
/* display modes */ /* display modes */
loaderdrv_ChangeDisplaySettingsEx, loaderdrv_ChangeDisplaySettingsEx,
loaderdrv_EnumDisplayMonitors, loaderdrv_EnumDisplayMonitors,
loaderdrv_EnumDisplaySettingsEx, NULL,
loaderdrv_GetMonitorInfo, loaderdrv_GetMonitorInfo,
NULL, NULL,
/* windowing functions */ /* windowing functions */
......
...@@ -3296,43 +3296,16 @@ BOOL WINAPI EnumDisplaySettingsExA(LPCSTR lpszDeviceName, DWORD iModeNum, ...@@ -3296,43 +3296,16 @@ BOOL WINAPI EnumDisplaySettingsExA(LPCSTR lpszDeviceName, DWORD iModeNum,
/*********************************************************************** /***********************************************************************
* EnumDisplaySettingsExW (USER32.@) * EnumDisplaySettingsExW (USER32.@)
*/ */
BOOL WINAPI EnumDisplaySettingsExW(LPCWSTR lpszDeviceName, DWORD iModeNum, BOOL WINAPI EnumDisplaySettingsExW( const WCHAR *device, DWORD mode,
LPDEVMODEW lpDevMode, DWORD dwFlags) DEVMODEW *dev_mode, DWORD flags )
{ {
WCHAR primary_adapter[CCHDEVICENAME]; UNICODE_STRING str;
BOOL ret; RtlInitUnicodeString( &str, device );
return NtUserEnumDisplaySettings( &str, mode, dev_mode, flags );
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;
} }
/********************************************************************** /**********************************************************************
* get_monitor_dpi * get_monitor_dpi
*/ */
......
...@@ -263,18 +263,18 @@ static INT CDECL nulldrv_GetDeviceCaps( PHYSDEV dev, INT cap ) ...@@ -263,18 +263,18 @@ static INT CDECL nulldrv_GetDeviceCaps( PHYSDEV dev, INT cap )
} }
case BITSPIXEL: case BITSPIXEL:
{ {
UNICODE_STRING display;
DEVMODEW devmode; DEVMODEW devmode;
WCHAR *display;
DC *dc; DC *dc;
if (NtGdiGetDeviceCaps( dev->hdc, TECHNOLOGY ) == DT_RASDISPLAY && user_callbacks) if (NtGdiGetDeviceCaps( dev->hdc, TECHNOLOGY ) == DT_RASDISPLAY)
{ {
dc = get_nulldrv_dc( dev ); dc = get_nulldrv_dc( dev );
display = dc->display[0] ? dc->display : NULL;
memset( &devmode, 0, sizeof(devmode) ); memset( &devmode, 0, sizeof(devmode) );
devmode.dmSize = sizeof(devmode); devmode.dmSize = sizeof(devmode);
if (user_callbacks->pEnumDisplaySettingsW( display, ENUM_CURRENT_SETTINGS, &devmode ) init_unicode_string( &display, dc->display );
&& devmode.dmFields & DM_BITSPERPEL && devmode.dmBitsPerPel) if (NtUserEnumDisplaySettings( &display, ENUM_CURRENT_SETTINGS, &devmode, 0 ) &&
(devmode.dmFields & DM_BITSPERPEL) && devmode.dmBitsPerPel)
return devmode.dmBitsPerPel; return devmode.dmBitsPerPel;
} }
return 32; return 32;
...@@ -313,24 +313,21 @@ static INT CDECL nulldrv_GetDeviceCaps( PHYSDEV dev, INT cap ) ...@@ -313,24 +313,21 @@ static INT CDECL nulldrv_GetDeviceCaps( PHYSDEV dev, INT cap )
case SCALINGFACTORY: return 0; case SCALINGFACTORY: return 0;
case VREFRESH: case VREFRESH:
{ {
UNICODE_STRING display;
DEVMODEW devmode; DEVMODEW devmode;
WCHAR *display;
DC *dc; DC *dc;
if (NtGdiGetDeviceCaps( dev->hdc, TECHNOLOGY ) != DT_RASDISPLAY) if (NtGdiGetDeviceCaps( dev->hdc, TECHNOLOGY ) != DT_RASDISPLAY)
return 0; return 0;
if (user_callbacks) dc = get_nulldrv_dc( dev );
{
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;
}
memset( &devmode, 0, sizeof(devmode) );
devmode.dmSize = sizeof(devmode);
init_unicode_string( &display, dc->display );
if (NtUserEnumDisplaySettings( &display, ENUM_CURRENT_SETTINGS, &devmode, 0 ) &&
devmode.dmDisplayFrequency)
return devmode.dmDisplayFrequency;
return 1; return 1;
} }
case DESKTOPHORZRES: case DESKTOPHORZRES:
...@@ -1044,6 +1041,11 @@ static SHORT CDECL loaderdrv_VkKeyScanEx( WCHAR ch, HKL layout ) ...@@ -1044,6 +1041,11 @@ static SHORT CDECL loaderdrv_VkKeyScanEx( WCHAR ch, HKL layout )
return load_driver()->pVkKeyScanEx( ch, 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) static void CDECL loaderdrv_UpdateClipboard(void)
{ {
load_driver()->pUpdateClipboard(); load_driver()->pUpdateClipboard();
...@@ -1064,6 +1066,7 @@ static const struct user_driver_funcs lazy_load_driver = ...@@ -1064,6 +1066,7 @@ static const struct user_driver_funcs lazy_load_driver =
.pToUnicodeEx = loaderdrv_ToUnicodeEx, .pToUnicodeEx = loaderdrv_ToUnicodeEx,
.pUnregisterHotKey = loaderdrv_UnregisterHotKey, .pUnregisterHotKey = loaderdrv_UnregisterHotKey,
.pVkKeyScanEx = loaderdrv_VkKeyScanEx, .pVkKeyScanEx = loaderdrv_VkKeyScanEx,
.pEnumDisplaySettingsEx = loaderdrv_EnumDisplaySettingsEx,
.pUpdateDisplayDevices = loaderdrv_UpdateDisplayDevices, .pUpdateDisplayDevices = loaderdrv_UpdateDisplayDevices,
.pUpdateClipboard = loaderdrv_UpdateClipboard, .pUpdateClipboard = loaderdrv_UpdateClipboard,
.pScrollDC = nulldrv_ScrollDC, .pScrollDC = nulldrv_ScrollDC,
......
...@@ -1170,6 +1170,7 @@ static struct unix_funcs unix_funcs = ...@@ -1170,6 +1170,7 @@ static struct unix_funcs unix_funcs =
NtUserActivateKeyboardLayout, NtUserActivateKeyboardLayout,
NtUserCountClipboardFormats, NtUserCountClipboardFormats,
NtUserEnumDisplayDevices, NtUserEnumDisplayDevices,
NtUserEnumDisplaySettings,
NtUserGetDisplayConfigBufferSizes, NtUserGetDisplayConfigBufferSizes,
NtUserGetKeyNameText, NtUserGetKeyNameText,
NtUserGetKeyboardLayoutList, NtUserGetKeyboardLayoutList,
......
...@@ -1282,3 +1282,36 @@ BOOL WINAPI NtUserEnumDisplayDevices( UNICODE_STRING *device, DWORD index, ...@@ -1282,3 +1282,36 @@ BOOL WINAPI NtUserEnumDisplayDevices( UNICODE_STRING *device, DWORD index,
unlock_display_devices(); unlock_display_devices();
return !!found; 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;
}
...@@ -877,7 +877,7 @@ ...@@ -877,7 +877,7 @@
@ stub NtUserEndPaint @ stub NtUserEndPaint
@ stdcall NtUserEnumDisplayDevices(ptr long ptr long) @ stdcall NtUserEnumDisplayDevices(ptr long ptr long)
@ stub NtUserEnumDisplayMonitors @ stub NtUserEnumDisplayMonitors
@ stub NtUserEnumDisplaySettings @ stdcall NtUserEnumDisplaySettings(ptr long ptr long)
@ stub NtUserEvent @ stub NtUserEvent
@ stub NtUserExcludeUpdateRgn @ stub NtUserExcludeUpdateRgn
@ stub NtUserFillWindow @ stub NtUserFillWindow
......
...@@ -38,7 +38,6 @@ struct user_callbacks ...@@ -38,7 +38,6 @@ struct user_callbacks
INT (WINAPI *pGetSystemMetrics)(INT); INT (WINAPI *pGetSystemMetrics)(INT);
BOOL (WINAPI *pGetWindowRect)( HWND hwnd, LPRECT rect ); BOOL (WINAPI *pGetWindowRect)( HWND hwnd, LPRECT rect );
BOOL (WINAPI *pEnumDisplayMonitors)( HDC, LPRECT, MONITORENUMPROC, LPARAM ); BOOL (WINAPI *pEnumDisplayMonitors)( HDC, LPRECT, MONITORENUMPROC, LPARAM );
BOOL (WINAPI *pEnumDisplaySettingsW)(LPCWSTR, DWORD, LPDEVMODEW );
BOOL (WINAPI *pRedrawWindow)( HWND, const RECT*, HRGN, UINT ); BOOL (WINAPI *pRedrawWindow)( HWND, const RECT*, HRGN, UINT );
DPI_AWARENESS_CONTEXT (WINAPI *pSetThreadDpiAwarenessContext)( DPI_AWARENESS_CONTEXT ); DPI_AWARENESS_CONTEXT (WINAPI *pSetThreadDpiAwarenessContext)( DPI_AWARENESS_CONTEXT );
HWND (WINAPI *pWindowFromDC)( HDC ); HWND (WINAPI *pWindowFromDC)( HDC );
...@@ -200,6 +199,8 @@ struct unix_funcs ...@@ -200,6 +199,8 @@ struct unix_funcs
INT (WINAPI *pNtUserCountClipboardFormats)(void); INT (WINAPI *pNtUserCountClipboardFormats)(void);
BOOL (WINAPI *pNtUserEnumDisplayDevices)( UNICODE_STRING *device, DWORD index, BOOL (WINAPI *pNtUserEnumDisplayDevices)( UNICODE_STRING *device, DWORD index,
DISPLAY_DEVICEW *info, DWORD flags ); 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, LONG (WINAPI *pNtUserGetDisplayConfigBufferSizes)( UINT32 flags, UINT32 *num_path_info,
UINT32 *num_mode_info ); UINT32 *num_mode_info );
INT (WINAPI *pNtUserGetKeyNameText)( LONG lparam, WCHAR *buffer, INT size ); INT (WINAPI *pNtUserGetKeyNameText)( LONG lparam, WCHAR *buffer, INT size );
...@@ -394,6 +395,13 @@ static inline BOOL is_win9x(void) ...@@ -394,6 +395,13 @@ static inline BOOL is_win9x(void)
return NtCurrentTeb()->Peb->OSPlatformId == VER_PLATFORM_WIN32s; 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 ) static inline const char *debugstr_us( const UNICODE_STRING *us )
{ {
if (!us) return "<null>"; if (!us) return "<null>";
......
...@@ -612,6 +612,12 @@ BOOL WINAPI NtUserEnumDisplayDevices( UNICODE_STRING *device, DWORD index, ...@@ -612,6 +612,12 @@ BOOL WINAPI NtUserEnumDisplayDevices( UNICODE_STRING *device, DWORD index,
return unix_funcs->pNtUserEnumDisplayDevices( device, index, info, flags ); 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, LONG WINAPI NtUserGetDisplayConfigBufferSizes( UINT32 flags, UINT32 *num_path_info,
UINT32 *num_mode_info ) UINT32 *num_mode_info )
{ {
...@@ -821,14 +827,6 @@ static BOOL WINAPI call_EnumDisplayMonitors( HDC hdc, RECT *rect, MONITORENUMPRO ...@@ -821,14 +827,6 @@ static BOOL WINAPI call_EnumDisplayMonitors( HDC hdc, RECT *rect, MONITORENUMPRO
return pEnumDisplayMonitors && pEnumDisplayMonitors( hdc, rect, proc, lparam ); 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 call_RedrawWindow( HWND hwnd, const RECT *rect, HRGN rgn, UINT flags )
{ {
static BOOL (WINAPI *pRedrawWindow)( HWND, const RECT*, HRGN, UINT ); static BOOL (WINAPI *pRedrawWindow)( HWND, const RECT*, HRGN, UINT );
...@@ -861,7 +859,6 @@ static const struct user_callbacks user_funcs = ...@@ -861,7 +859,6 @@ static const struct user_callbacks user_funcs =
call_GetSystemMetrics, call_GetSystemMetrics,
call_GetWindowRect, call_GetWindowRect,
call_EnumDisplayMonitors, call_EnumDisplayMonitors,
call_EnumDisplaySettingsW,
call_RedrawWindow, call_RedrawWindow,
call_SetThreadDpiAwarenessContext, call_SetThreadDpiAwarenessContext,
call_WindowFromDC, call_WindowFromDC,
......
...@@ -66,6 +66,8 @@ HWINSTA WINAPI NtUserCreateWindowStation( OBJECT_ATTRIBUTES *attr, ACCESS_MASK m ...@@ -66,6 +66,8 @@ HWINSTA WINAPI NtUserCreateWindowStation( OBJECT_ATTRIBUTES *attr, ACCESS_MASK m
ULONG arg4, ULONG arg5, ULONG arg6, ULONG arg7 ); ULONG arg4, ULONG arg5, ULONG arg6, ULONG arg7 );
BOOL WINAPI NtUserEnumDisplayDevices( UNICODE_STRING *device, DWORD index, BOOL WINAPI NtUserEnumDisplayDevices( UNICODE_STRING *device, DWORD index,
DISPLAY_DEVICEW *info, DWORD flags ); 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 ); INT WINAPI NtUserGetClipboardFormatName( UINT format, WCHAR *buffer, INT maxlen );
HWND WINAPI NtUserGetClipboardOwner(void); HWND WINAPI NtUserGetClipboardOwner(void);
DWORD WINAPI NtUserGetClipboardSequenceNumber(void); DWORD WINAPI NtUserGetClipboardSequenceNumber(void);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment