[PATCH 3/5] win32u: Move reading mode from registry out of graphics drivers.
Rémi Bernon
wine at gitlab.winehq.org
Fri Jul 1 00:53:12 CDT 2022
From: Rémi Bernon <rbernon at codeweavers.com>
Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
dlls/win32u/sysparams.c | 86 ++++++++++++++++++++++++++++++++++---
dlls/wineandroid.drv/init.c | 2 +-
dlls/winemac.drv/display.c | 52 ----------------------
dlls/winex11.drv/display.c | 62 --------------------------
4 files changed, 81 insertions(+), 121 deletions(-)
diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c
index c99f0d39ac2..5f4a3bd9311 100644
--- a/dlls/win32u/sysparams.c
+++ b/dlls/win32u/sysparams.c
@@ -169,6 +169,15 @@ static const WCHAR displayW[] = {'D','i','s','p','l','a','y',0};
static const WCHAR monitorW[] = {'M','o','n','i','t','o','r',0};
static const WCHAR yesW[] = {'Y','e','s',0};
static const WCHAR noW[] = {'N','o',0};
+static const WCHAR bits_per_pelW[] = {'B','i','t','s','P','e','r','P','e','l',0};
+static const WCHAR x_resolutionW[] = {'X','R','e','s','o','l','u','t','i','o','n',0};
+static const WCHAR y_resolutionW[] = {'Y','R','e','s','o','l','u','t','i','o','n',0};
+static const WCHAR v_refreshW[] = {'V','R','e','f','r','e','s','h',0};
+static const WCHAR flagsW[] = {'F','l','a','g','s',0};
+static const WCHAR x_panningW[] = {'X','P','a','n','n','i','n','g',0};
+static const WCHAR y_panningW[] = {'Y','P','a','n','n','i','n','g',0};
+static const WCHAR orientationW[] = {'O','r','i','e','n','t','a','t','i','o','n',0};
+static const WCHAR fixed_outputW[] = {'F','i','x','e','d','O','u','t','p','u','t',0};
static const char guid_devclass_displayA[] = "{4D36E968-E325-11CE-BFC1-08002BE10318}";
static const WCHAR guid_devclass_displayW[] =
@@ -399,6 +408,62 @@ static void release_display_device_init_mutex( HANDLE mutex )
NtClose( mutex );
}
+static BOOL read_adapter_mode( HKEY adapter_key, DEVMODEW *mode )
+{
+ static const WCHAR default_settingsW[] = {'D','e','f','a','u','l','t','S','e','t','t','i','n','g','s','.',0};
+ char value_buf[offsetof(KEY_VALUE_PARTIAL_INFORMATION, Data[sizeof(DWORD)])];
+ KEY_VALUE_PARTIAL_INFORMATION *value = (void *)value_buf;
+ WCHAR bufferW[MAX_PATH];
+
+#define query_mode_field( name, field, flag ) \
+ do \
+ { \
+ lstrcpyW( bufferW, default_settingsW ); \
+ lstrcatW( bufferW, (name) ); \
+ if (query_reg_value( adapter_key, bufferW, value, sizeof(value_buf) ) && \
+ value->Type == REG_DWORD) \
+ { \
+ mode->field = *(const DWORD *)value->Data; \
+ mode->dmFields |= (flag); \
+ } \
+ } while (0)
+
+ query_mode_field( bits_per_pelW, dmBitsPerPel, DM_BITSPERPEL );
+ query_mode_field( x_resolutionW, dmPelsWidth, DM_PELSWIDTH );
+ query_mode_field( y_resolutionW, dmPelsHeight, DM_PELSHEIGHT );
+ query_mode_field( v_refreshW, dmDisplayFrequency, DM_DISPLAYFREQUENCY );
+ query_mode_field( flagsW, dmDisplayFlags, DM_DISPLAYFLAGS );
+ query_mode_field( orientationW, dmDisplayOrientation, DM_DISPLAYORIENTATION );
+ query_mode_field( fixed_outputW, dmDisplayFixedOutput, DM_DISPLAYFIXEDOUTPUT );
+ query_mode_field( x_panningW, dmPosition.x, DM_POSITION );
+ query_mode_field( y_panningW, dmPosition.y, DM_POSITION );
+
+#undef query_mode_field
+
+ return TRUE;
+}
+
+static BOOL read_registry_settings( const WCHAR *adapter_path, DEVMODEW *mode )
+{
+ HANDLE mutex;
+ HKEY hkey;
+ BOOL ret;
+
+ mutex = get_display_device_init_mutex();
+
+ if (!config_key && !(config_key = reg_open_key( NULL, config_keyW, sizeof(config_keyW) ))) return FALSE;
+ if (!(hkey = reg_open_key( config_key, adapter_path, lstrlenW( adapter_path ) * sizeof(WCHAR) )))
+ {
+ release_display_device_init_mutex( mutex );
+ return FALSE;
+ }
+ ret = read_adapter_mode( hkey, mode );
+ NtClose( hkey );
+
+ release_display_device_init_mutex( mutex );
+ return ret;
+}
+
static BOOL read_display_adapter_settings( unsigned int index, struct adapter *info )
{
char buffer[4096];
@@ -1813,7 +1878,7 @@ static BOOL is_detached_mode( const DEVMODEW *mode )
LONG WINAPI NtUserChangeDisplaySettings( UNICODE_STRING *devname, DEVMODEW *devmode, HWND hwnd,
DWORD flags, void *lparam )
{
- WCHAR device_name[CCHDEVICENAME];
+ WCHAR device_name[CCHDEVICENAME], adapter_path[MAX_PATH];
struct adapter *adapter;
BOOL def_mode = TRUE;
DEVMODEW dm;
@@ -1831,7 +1896,11 @@ LONG WINAPI NtUserChangeDisplaySettings( UNICODE_STRING *devname, DEVMODEW *devm
}
if (!lock_display_devices()) return DISP_CHANGE_FAILED;
- if ((adapter = find_adapter( devname ))) lstrcpyW( device_name, adapter->dev.device_name );
+ if ((adapter = find_adapter( devname )))
+ {
+ lstrcpyW( device_name, adapter->dev.device_name );
+ lstrcpyW( adapter_path, adapter->config_key );
+ }
unlock_display_devices();
if (!adapter)
{
@@ -1858,7 +1927,7 @@ LONG WINAPI NtUserChangeDisplaySettings( UNICODE_STRING *devname, DEVMODEW *devm
{
memset( &dm, 0, sizeof(dm) );
dm.dmSize = sizeof(dm);
- if (!NtUserEnumDisplaySettings( devname, ENUM_REGISTRY_SETTINGS, &dm, 0 ))
+ if (!read_registry_settings( adapter_path, &dm ))
{
ERR( "Default mode not found!\n" );
return DISP_CHANGE_BADMODE;
@@ -1902,14 +1971,18 @@ LONG WINAPI NtUserChangeDisplaySettings( UNICODE_STRING *devname, DEVMODEW *devm
BOOL WINAPI NtUserEnumDisplaySettings( UNICODE_STRING *device, DWORD index, DEVMODEW *devmode, DWORD flags )
{
static const WCHAR wine_display_driverW[] = {'W','i','n','e',' ','D','i','s','p','l','a','y',' ','D','r','i','v','e','r',0};
- WCHAR device_name[CCHDEVICENAME];
+ WCHAR device_name[CCHDEVICENAME], adapter_path[MAX_PATH];
struct adapter *adapter;
BOOL ret;
TRACE( "device %s, index %#x, devmode %p, flags %#x\n", debugstr_us(device), index, devmode, flags );
if (!lock_display_devices()) return FALSE;
- if ((adapter = find_adapter( device ))) lstrcpyW( device_name, adapter->dev.device_name );
+ if ((adapter = find_adapter( device )))
+ {
+ lstrcpyW( device_name, adapter->dev.device_name );
+ lstrcpyW( adapter_path, adapter->config_key );
+ }
unlock_display_devices();
if (!adapter)
{
@@ -1923,7 +1996,8 @@ BOOL WINAPI NtUserEnumDisplaySettings( UNICODE_STRING *device, DWORD index, DEVM
devmode->dmSize = offsetof(DEVMODEW, dmICMMethod);
memset( &devmode->dmDriverExtra, 0, devmode->dmSize - offsetof(DEVMODEW, dmDriverExtra) );
- ret = user_driver->pEnumDisplaySettingsEx( device_name, index, devmode, flags );
+ if (index == ENUM_REGISTRY_SETTINGS) ret = read_registry_settings( adapter_path, devmode );
+ else ret = user_driver->pEnumDisplaySettingsEx( device_name, index, devmode, flags );
if (!ret) WARN( "Failed to query %s display settings.\n", debugstr_w(device_name) );
else TRACE( "position %dx%d, resolution %ux%u, frequency %u, depth %u, orientation %#x.\n",
diff --git a/dlls/wineandroid.drv/init.c b/dlls/wineandroid.drv/init.c
index e2cebb974c3..a82932bf65f 100644
--- a/dlls/wineandroid.drv/init.c
+++ b/dlls/wineandroid.drv/init.c
@@ -310,7 +310,7 @@ BOOL ANDROID_EnumDisplaySettingsEx( LPCWSTR name, DWORD n, LPDEVMODEW devmode, D
devmode->u1.s2.dmDisplayOrientation = 0;
devmode->u1.s2.dmDisplayFixedOutput = 0;
- if (n == ENUM_CURRENT_SETTINGS || n == ENUM_REGISTRY_SETTINGS) n = 0;
+ if (n == ENUM_CURRENT_SETTINGS) n = 0;
if (n == 0)
{
devmode->dmPelsWidth = screen_width;
diff --git a/dlls/winemac.drv/display.c b/dlls/winemac.drv/display.c
index 191dc1f789b..6444f7bef30 100644
--- a/dlls/winemac.drv/display.c
+++ b/dlls/winemac.drv/display.c
@@ -144,52 +144,6 @@ static BOOL query_display_setting(HKEY hkey, const char *name, DWORD *ret)
}
-static BOOL read_registry_settings(const WCHAR *device_name, DEVMODEW *dm)
-{
- HANDLE mutex;
- HKEY hkey;
- BOOL ret = TRUE;
-
- dm->dmFields = 0;
-
- mutex = get_display_device_init_mutex();
- if (!(hkey = get_display_device_reg_key(device_name)))
- {
- release_display_device_init_mutex(mutex);
- return FALSE;
- }
-
- ret &= query_display_setting(hkey, "DefaultSettings.BitsPerPel", &dm->dmBitsPerPel);
- dm->dmFields |= DM_BITSPERPEL;
- ret &= query_display_setting(hkey, "DefaultSettings.XResolution", &dm->dmPelsWidth);
- dm->dmFields |= DM_PELSWIDTH;
- ret &= query_display_setting(hkey, "DefaultSettings.YResolution", &dm->dmPelsHeight);
- dm->dmFields |= DM_PELSHEIGHT;
- ret &= query_display_setting(hkey, "DefaultSettings.VRefresh", &dm->dmDisplayFrequency);
- dm->dmFields |= DM_DISPLAYFREQUENCY;
- ret &= query_display_setting(hkey, "DefaultSettings.Flags", &dm->dmDisplayFlags);
- dm->dmFields |= DM_DISPLAYFLAGS;
- ret &= query_display_setting(hkey, "DefaultSettings.XPanning", (DWORD *)&dm->dmPosition.x);
- ret &= query_display_setting(hkey, "DefaultSettings.YPanning", (DWORD *)&dm->dmPosition.y);
- dm->dmFields |= DM_POSITION;
- ret &= query_display_setting(hkey, "DefaultSettings.Orientation", &dm->dmDisplayOrientation);
- dm->dmFields |= DM_DISPLAYORIENTATION;
- ret &= query_display_setting(hkey, "DefaultSettings.FixedOutput", &dm->dmDisplayFixedOutput);
-
- NtClose(hkey);
- release_display_device_init_mutex(mutex);
- return ret;
-}
-
-
-static BOOL set_setting_value(HKEY hkey, const char *name, DWORD val)
-{
- WCHAR nameW[128];
- UNICODE_STRING str = { asciiz_to_unicode(nameW, name) - sizeof(WCHAR), sizeof(nameW), nameW };
- return !NtSetValueKey(hkey, &str, 0, REG_DWORD, &val, sizeof(val));
-}
-
-
static BOOL write_registry_settings(const WCHAR *device_name, const DEVMODEW *dm)
{
HANDLE mutex;
@@ -1056,12 +1010,6 @@ BOOL macdrv_EnumDisplaySettingsEx(LPCWSTR devname, DWORD mode, DEVMODEW *devmode
init_original_display_mode();
- if (mode == ENUM_REGISTRY_SETTINGS)
- {
- TRACE("mode %d (registry) -- getting default mode\n", mode);
- return read_registry_settings(devname, devmode);
- }
-
if (macdrv_get_displays(&displays, &num_displays))
goto failed;
diff --git a/dlls/winex11.drv/display.c b/dlls/winex11.drv/display.c
index 740e018247b..b45a317603a 100644
--- a/dlls/winex11.drv/display.c
+++ b/dlls/winex11.drv/display.c
@@ -257,58 +257,6 @@ static HKEY get_display_device_reg_key( const WCHAR *device_name )
return reg_open_key( NULL, buffer, lstrlenW(buffer) * sizeof(WCHAR) );
}
-static BOOL query_display_setting( HKEY hkey, const char *name, DWORD *ret )
-{
- char buffer[1024];
- WCHAR nameW[128];
- KEY_VALUE_PARTIAL_INFORMATION *value = (void *)buffer;
-
- asciiz_to_unicode( nameW, name );
- if (query_reg_value( hkey, nameW, value, sizeof(buffer) ) != sizeof(DWORD) ||
- value->Type != REG_DWORD)
- return FALSE;
-
- *ret = *(DWORD *)value->Data;
- return TRUE;
-}
-
-static BOOL read_registry_settings(const WCHAR *device_name, DEVMODEW *dm)
-{
- HANDLE mutex;
- HKEY hkey;
- BOOL ret = TRUE;
-
- dm->dmFields = 0;
-
- mutex = get_display_device_init_mutex();
- if (!(hkey = get_display_device_reg_key( device_name )))
- {
- release_display_device_init_mutex(mutex);
- return FALSE;
- }
-
- ret &= query_display_setting( hkey, "DefaultSettings.BitsPerPel", &dm->dmBitsPerPel );
- dm->dmFields |= DM_BITSPERPEL;
- ret &= query_display_setting( hkey, "DefaultSettings.XResolution", &dm->dmPelsWidth );
- dm->dmFields |= DM_PELSWIDTH;
- ret &= query_display_setting( hkey, "DefaultSettings.YResolution", &dm->dmPelsHeight );
- dm->dmFields |= DM_PELSHEIGHT;
- ret &= query_display_setting( hkey, "DefaultSettings.VRefresh", &dm->dmDisplayFrequency );
- dm->dmFields |= DM_DISPLAYFREQUENCY;
- ret &= query_display_setting( hkey, "DefaultSettings.Flags", &dm->dmDisplayFlags );
- dm->dmFields |= DM_DISPLAYFLAGS;
- ret &= query_display_setting( hkey, "DefaultSettings.XPanning", (DWORD *)&dm->dmPosition.x );
- ret &= query_display_setting( hkey, "DefaultSettings.YPanning", (DWORD *)&dm->dmPosition.y );
- dm->dmFields |= DM_POSITION;
- ret &= query_display_setting( hkey, "DefaultSettings.Orientation", &dm->dmDisplayOrientation );
- dm->dmFields |= DM_DISPLAYORIENTATION;
- ret &= query_display_setting( hkey, "DefaultSettings.FixedOutput", &dm->dmDisplayFixedOutput );
-
- NtClose( hkey );
- release_display_device_init_mutex(mutex);
- return ret;
-}
-
static BOOL set_setting_value( HKEY hkey, const char *name, DWORD val )
{
WCHAR nameW[128];
@@ -468,16 +416,6 @@ BOOL X11DRV_EnumDisplaySettingsEx( LPCWSTR name, DWORD n, LPDEVMODEW devmode, DW
UINT mode_count;
ULONG_PTR id;
- if (n == ENUM_REGISTRY_SETTINGS)
- {
- if (!read_registry_settings(name, devmode))
- {
- ERR("Failed to get %s registry display settings.\n", wine_dbgstr_w(name));
- return FALSE;
- }
- return TRUE;
- }
-
if (n == ENUM_CURRENT_SETTINGS)
{
if (!settings_handler.get_id( name, &id ) || !settings_handler.get_current_mode( id, &mode ))
--
GitLab
https://gitlab.winehq.org/wine/wine/-/merge_requests/355
More information about the wine-devel
mailing list