[PATCH v2 3/5] win32u: Move reading mode from registry out of graphics drivers.

Rémi Bernon wine at gitlab.winehq.org
Fri Jul 1 04:50:04 CDT 2022


From: Rémi Bernon <rbernon at codeweavers.com>

Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
 dlls/win32u/sysparams.c     | 85 ++++++++++++++++++++++++++++++++++---
 dlls/wineandroid.drv/init.c |  2 +-
 dlls/winemac.drv/display.c  | 52 -----------------------
 dlls/winex11.drv/display.c  | 62 ---------------------------
 4 files changed, 80 insertions(+), 121 deletions(-)

diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c
index 5a072b97352..f2732eac662 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,61 @@ 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 )
+{
+    BOOL ret = FALSE;
+    HANDLE mutex;
+    HKEY hkey;
+
+    mutex = get_display_device_init_mutex();
+
+    if (!config_key && !(config_key = reg_open_key( NULL, config_keyW, sizeof(config_keyW) ))) ret = FALSE;
+    else if (!(hkey = reg_open_key( config_key, adapter_path, lstrlenW( adapter_path ) * sizeof(WCHAR) ))) ret = FALSE;
+    else
+    {
+        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];
@@ -1809,7 +1873,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;
@@ -1827,7 +1891,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)
     {
@@ -1854,7 +1922,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;
@@ -1898,14 +1966,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)
     {
@@ -1919,7 +1991,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