As well as a few other fixes for https://gitlab.winehq.org/wine/wine/-/merge_requests/551.
From: R��mi Bernon rbernon@codeweavers.com
--- dlls/wineandroid.drv/init.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dlls/wineandroid.drv/init.c b/dlls/wineandroid.drv/init.c index aba642d1c5d..2cd01bd3f50 100644 --- a/dlls/wineandroid.drv/init.c +++ b/dlls/wineandroid.drv/init.c @@ -289,7 +289,7 @@ BOOL ANDROID_UpdateDisplayDevices( const struct gdi_device_manager *device_manag }; const DEVMODEW mode = { - .dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL | DM_DISPLAYFLAGS | DM_DISPLAYFREQUENCY, + .dmFields = DM_DISPLAYORIENTATION | DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL | DM_DISPLAYFLAGS | DM_DISPLAYFREQUENCY, .dmBitsPerPel = screen_bpp, .dmPelsWidth = screen_width, .dmPelsHeight = screen_height, .dmDisplayFrequency = 60, }; device_manager->add_gpu( &gpu, param );
From: R��mi Bernon rbernon@codeweavers.com
--- dlls/win32u/sysparams.c | 39 ++++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 19 deletions(-)
diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c index 981a11ab05f..4b6a2316c56 100644 --- a/dlls/win32u/sysparams.c +++ b/dlls/win32u/sysparams.c @@ -2140,9 +2140,11 @@ static DEVMODEW *find_display_mode( DEVMODEW *modes, DEVMODEW *devmode ) return NULL; }
-static DEVMODEW *get_full_mode( const WCHAR *adapter_path, const WCHAR *device_name, DEVMODEW *modes, - DEVMODEW *devmode, DEVMODEW *temp_mode ) +static DEVMODEW *get_full_mode( const WCHAR *adapter_path, const WCHAR *device_name, DEVMODEW *adapter_modes, + DEVMODEW *devmode, DEVMODEW *full_mode ) { + DEVMODEW *adapter_mode; + if (devmode) { trace_devmode( devmode ); @@ -2156,40 +2158,39 @@ static DEVMODEW *get_full_mode( const WCHAR *adapter_path, const WCHAR *device_n devmode = NULL; }
- if (devmode) memcpy( temp_mode, devmode, devmode->dmSize ); + if (devmode) memcpy( full_mode, devmode, devmode->dmSize ); else { - if (!read_registry_settings( adapter_path, temp_mode )) return NULL; + if (!read_registry_settings( adapter_path, full_mode )) return NULL; TRACE( "Return to original display mode\n" ); } - devmode = temp_mode;
- if ((devmode->dmFields & (DM_PELSWIDTH | DM_PELSHEIGHT)) != (DM_PELSWIDTH | DM_PELSHEIGHT)) + if ((full_mode->dmFields & (DM_PELSWIDTH | DM_PELSHEIGHT)) != (DM_PELSWIDTH | DM_PELSHEIGHT)) { - WARN( "devmode doesn't specify the resolution: %#x\n", devmode->dmFields ); + WARN( "devmode doesn't specify the resolution: %#x\n", full_mode->dmFields ); return NULL; }
- if (!is_detached_mode( devmode ) && (!devmode->dmPelsWidth || !devmode->dmPelsHeight || !(devmode->dmFields & DM_POSITION))) + if (!is_detached_mode( full_mode ) && (!full_mode->dmPelsWidth || !full_mode->dmPelsHeight || !(full_mode->dmFields & DM_POSITION))) { DEVMODEW current_mode = {.dmSize = sizeof(DEVMODEW)}; if (!user_driver->pGetCurrentDisplaySettings( device_name, ¤t_mode )) return NULL; - if (!devmode->dmPelsWidth) devmode->dmPelsWidth = current_mode.dmPelsWidth; - if (!devmode->dmPelsHeight) devmode->dmPelsHeight = current_mode.dmPelsHeight; - if (!(devmode->dmFields & DM_POSITION)) + if (!full_mode->dmPelsWidth) full_mode->dmPelsWidth = current_mode.dmPelsWidth; + if (!full_mode->dmPelsHeight) full_mode->dmPelsHeight = current_mode.dmPelsHeight; + if (!(full_mode->dmFields & DM_POSITION)) { - devmode->dmPosition = current_mode.dmPosition; - devmode->dmFields |= DM_POSITION; + full_mode->dmPosition = current_mode.dmPosition; + full_mode->dmFields |= DM_POSITION; } }
- if ((devmode = find_display_mode( modes, devmode )) && devmode != temp_mode) + if ((adapter_mode = find_display_mode( adapter_modes, full_mode )) && adapter_mode != full_mode) { - devmode->dmFields |= DM_POSITION; - devmode->dmPosition = temp_mode->dmPosition; + adapter_mode->dmFields |= DM_POSITION; + adapter_mode->dmPosition = full_mode->dmPosition; }
- return devmode; + return adapter_mode; }
static DEVMODEW *get_display_settings( const WCHAR *devname, const DEVMODEW *devmode ) @@ -2446,7 +2447,7 @@ static LONG apply_display_settings( const WCHAR *devname, const DEVMODEW *devmod LONG WINAPI NtUserChangeDisplaySettings( UNICODE_STRING *devname, DEVMODEW *devmode, HWND hwnd, DWORD flags, void *lparam ) { - DEVMODEW *modes, temp_mode = {.dmSize = sizeof(DEVMODEW)}; + DEVMODEW *modes, full_mode = {.dmSize = sizeof(DEVMODEW)}; WCHAR device_name[CCHDEVICENAME], adapter_path[MAX_PATH]; LONG ret = DISP_CHANGE_SUCCESSFUL; struct adapter *adapter; @@ -2472,7 +2473,7 @@ LONG WINAPI NtUserChangeDisplaySettings( UNICODE_STRING *devname, DEVMODEW *devm return DISP_CHANGE_BADPARAM; }
- if (!(devmode = get_full_mode( adapter_path, device_name, modes, devmode, &temp_mode ))) ret = DISP_CHANGE_BADMODE; + if (!(devmode = get_full_mode( adapter_path, device_name, modes, devmode, &full_mode ))) ret = DISP_CHANGE_BADMODE; else if ((flags & CDS_UPDATEREGISTRY) && !write_registry_settings( adapter_path, devmode )) ret = DISP_CHANGE_NOTUPDATED; else if (flags & (CDS_TEST | CDS_NORESET)) ret = DISP_CHANGE_SUCCESSFUL; else ret = apply_display_settings( device_name, devmode, hwnd, flags, lparam );
From: R��mi Bernon rbernon@codeweavers.com
--- dlls/win32u/sysparams.c | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-)
diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c index 4b6a2316c56..020d0989157 100644 --- a/dlls/win32u/sysparams.c +++ b/dlls/win32u/sysparams.c @@ -2108,9 +2108,9 @@ static BOOL is_detached_mode( const DEVMODEW *mode ) mode->dmPelsHeight == 0; }
-static DEVMODEW *find_display_mode( DEVMODEW *modes, DEVMODEW *devmode ) +static const DEVMODEW *find_display_mode( const DEVMODEW *modes, DEVMODEW *devmode ) { - DEVMODEW *mode; + const DEVMODEW *mode;
if (is_detached_mode( devmode )) return devmode;
@@ -2140,16 +2140,16 @@ static DEVMODEW *find_display_mode( DEVMODEW *modes, DEVMODEW *devmode ) return NULL; }
-static DEVMODEW *get_full_mode( const WCHAR *adapter_path, const WCHAR *device_name, DEVMODEW *adapter_modes, - DEVMODEW *devmode, DEVMODEW *full_mode ) +static BOOL get_full_mode( const WCHAR *adapter_path, const WCHAR *device_name, const DEVMODEW *adapter_modes, + const DEVMODEW *devmode, DEVMODEW *full_mode ) { - DEVMODEW *adapter_mode; + const DEVMODEW *adapter_mode;
if (devmode) { trace_devmode( devmode );
- if (devmode->dmSize < offsetof(DEVMODEW, dmICMMethod)) return NULL; + if (devmode->dmSize < offsetof(DEVMODEW, dmICMMethod)) return FALSE; if (!is_detached_mode( devmode ) && (!(devmode->dmFields & DM_BITSPERPEL) || !devmode->dmBitsPerPel) && (!(devmode->dmFields & DM_PELSWIDTH) || !devmode->dmPelsWidth) && @@ -2161,20 +2161,20 @@ static DEVMODEW *get_full_mode( const WCHAR *adapter_path, const WCHAR *device_n if (devmode) memcpy( full_mode, devmode, devmode->dmSize ); else { - if (!read_registry_settings( adapter_path, full_mode )) return NULL; + if (!read_registry_settings( adapter_path, full_mode )) return FALSE; TRACE( "Return to original display mode\n" ); }
if ((full_mode->dmFields & (DM_PELSWIDTH | DM_PELSHEIGHT)) != (DM_PELSWIDTH | DM_PELSHEIGHT)) { WARN( "devmode doesn't specify the resolution: %#x\n", full_mode->dmFields ); - return NULL; + return FALSE; }
if (!is_detached_mode( full_mode ) && (!full_mode->dmPelsWidth || !full_mode->dmPelsHeight || !(full_mode->dmFields & DM_POSITION))) { DEVMODEW current_mode = {.dmSize = sizeof(DEVMODEW)}; - if (!user_driver->pGetCurrentDisplaySettings( device_name, ¤t_mode )) return NULL; + if (!user_driver->pGetCurrentDisplaySettings( device_name, ¤t_mode )) return FALSE; if (!full_mode->dmPelsWidth) full_mode->dmPelsWidth = current_mode.dmPelsWidth; if (!full_mode->dmPelsHeight) full_mode->dmPelsHeight = current_mode.dmPelsHeight; if (!(full_mode->dmFields & DM_POSITION)) @@ -2186,11 +2186,13 @@ static DEVMODEW *get_full_mode( const WCHAR *adapter_path, const WCHAR *device_n
if ((adapter_mode = find_display_mode( adapter_modes, full_mode )) && adapter_mode != full_mode) { - adapter_mode->dmFields |= DM_POSITION; - adapter_mode->dmPosition = full_mode->dmPosition; + POINTL position = full_mode->dmPosition; + *full_mode = *adapter_mode; + full_mode->dmFields |= DM_POSITION; + full_mode->dmPosition = position; }
- return adapter_mode; + return adapter_mode != NULL; }
static DEVMODEW *get_display_settings( const WCHAR *devname, const DEVMODEW *devmode ) @@ -2473,7 +2475,7 @@ LONG WINAPI NtUserChangeDisplaySettings( UNICODE_STRING *devname, DEVMODEW *devm return DISP_CHANGE_BADPARAM; }
- if (!(devmode = get_full_mode( adapter_path, device_name, modes, devmode, &full_mode ))) ret = DISP_CHANGE_BADMODE; + if (!get_full_mode( adapter_path, device_name, modes, devmode, &full_mode )) ret = DISP_CHANGE_BADMODE; else if ((flags & CDS_UPDATEREGISTRY) && !write_registry_settings( adapter_path, devmode )) ret = DISP_CHANGE_NOTUPDATED; else if (flags & (CDS_TEST | CDS_NORESET)) ret = DISP_CHANGE_SUCCESSFUL; else ret = apply_display_settings( device_name, devmode, hwnd, flags, lparam );
From: R��mi Bernon rbernon@codeweavers.com
--- dlls/win32u/sysparams.c | 38 +++++++++++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 9 deletions(-)
diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c index 020d0989157..c725a188706 100644 --- a/dlls/win32u/sysparams.c +++ b/dlls/win32u/sysparams.c @@ -217,6 +217,7 @@ struct display_device
struct adapter { + LONG refcount; struct list entry; struct display_device dev; unsigned int id; @@ -425,6 +426,21 @@ static void release_display_device_init_mutex( HANDLE mutex ) NtClose( mutex ); }
+static struct adapter *adapter_acquire( struct adapter *adapter ) +{ + InterlockedIncrement( &adapter->refcount ); + return adapter; +} + +static void adapter_release( struct adapter *adapter ) +{ + if (!InterlockedDecrement( &adapter->refcount )) + { + free( adapter->modes ); + free( adapter ); + } +} + static BOOL write_adapter_mode( HKEY adapter_key, DWORD index, const DEVMODEW *mode ) { WCHAR bufferW[MAX_PATH]; @@ -1450,6 +1466,7 @@ static void clear_display_devices(void) while (!list_empty( &monitors )) { monitor = LIST_ENTRY( list_head( &monitors ), struct monitor, entry ); + adapter_release( monitor->adapter ); list_remove( &monitor->entry ); free( monitor ); } @@ -1458,8 +1475,7 @@ static void clear_display_devices(void) { adapter = LIST_ENTRY( list_head( &adapters ), struct adapter, entry ); list_remove( &adapter->entry ); - free( adapter->modes ); - free( adapter ); + adapter_release( adapter ); } }
@@ -1493,12 +1509,12 @@ static BOOL update_display_cache_from_registry(void) for (adapter_id = 0;; adapter_id++) { if (!(adapter = calloc( 1, sizeof(*adapter) ))) break; + adapter->refcount = 1; adapter->id = adapter_id;
if (!read_display_adapter_settings( adapter_id, adapter )) { - free( adapter->modes ); - free( adapter ); + adapter_release( adapter ); break; }
@@ -1506,15 +1522,15 @@ static BOOL update_display_cache_from_registry(void) for (monitor_id = 0;; monitor_id++) { if (!(monitor = calloc( 1, sizeof(*monitor) ))) break; - monitor->id = monitor_id; - monitor->adapter = adapter; - if (!read_monitor_settings( adapter, monitor_id, monitor )) { free( monitor ); break; }
+ monitor->id = monitor_id; + monitor->adapter = adapter_acquire( adapter ); + LIST_FOR_EACH_ENTRY(monitor2, &monitors, struct monitor, entry) { if (EqualRect(&monitor2->rc_monitor, &monitor->rc_monitor)) @@ -1963,10 +1979,10 @@ static struct adapter *find_adapter( UNICODE_STRING *name )
LIST_FOR_EACH_ENTRY(adapter, &adapters, struct adapter, entry) { - if (!name || !name->Length) return adapter; /* use primary adapter */ + if (!name || !name->Length) return adapter_acquire( adapter ); /* use primary adapter */ if (!wcsnicmp( name->Buffer, adapter->dev.device_name, name->Length / sizeof(WCHAR) ) && !adapter->dev.device_name[name->Length / sizeof(WCHAR)]) - return adapter; + return adapter_acquire( adapter ); } return NULL; } @@ -2010,6 +2026,7 @@ NTSTATUS WINAPI NtUserEnumDisplayDevices( UNICODE_STRING *device, DWORD index, break; } } + adapter_release( adapter ); }
if (found) @@ -2472,6 +2489,7 @@ LONG WINAPI NtUserChangeDisplaySettings( UNICODE_STRING *devname, DEVMODEW *devm if (!adapter || !modes) { WARN( "Invalid device name %s.\n", debugstr_us(devname) ); + if (adapter) adapter_release( adapter ); return DISP_CHANGE_BADPARAM; }
@@ -2480,6 +2498,7 @@ LONG WINAPI NtUserChangeDisplaySettings( UNICODE_STRING *devname, DEVMODEW *devm else if (flags & (CDS_TEST | CDS_NORESET)) ret = DISP_CHANGE_SUCCESSFUL; else ret = apply_display_settings( device_name, devmode, hwnd, flags, lparam ); free( modes ); + adapter_release( adapter );
if (ret) ERR( "Changing %s display settings returned %d.\n", debugstr_us(devname), ret ); return ret; @@ -2519,6 +2538,7 @@ BOOL WINAPI NtUserEnumDisplaySettings( UNICODE_STRING *device, DWORD index, DEVM if (index == ENUM_REGISTRY_SETTINGS) ret = read_registry_settings( adapter_path, devmode ); else if (index != ENUM_CURRENT_SETTINGS) ret = user_driver->pEnumDisplaySettingsEx( device_name, index, devmode, flags ); else ret = user_driver->pGetCurrentDisplaySettings( device_name, devmode ); + adapter_release( adapter );
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",
From: R��mi Bernon rbernon@codeweavers.com
--- dlls/win32u/sysparams.c | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-)
diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c index c725a188706..b048f33bcb5 100644 --- a/dlls/win32u/sysparams.c +++ b/dlls/win32u/sysparams.c @@ -2157,8 +2157,7 @@ static const DEVMODEW *find_display_mode( const DEVMODEW *modes, DEVMODEW *devmo return NULL; }
-static BOOL get_full_mode( const WCHAR *adapter_path, const WCHAR *device_name, const DEVMODEW *adapter_modes, - const DEVMODEW *devmode, DEVMODEW *full_mode ) +static BOOL adapter_get_full_mode( const struct adapter *adapter, const DEVMODEW *devmode, DEVMODEW *full_mode ) { const DEVMODEW *adapter_mode;
@@ -2178,7 +2177,7 @@ static BOOL get_full_mode( const WCHAR *adapter_path, const WCHAR *device_name, if (devmode) memcpy( full_mode, devmode, devmode->dmSize ); else { - if (!read_registry_settings( adapter_path, full_mode )) return FALSE; + if (!read_registry_settings( adapter->config_key, full_mode )) return FALSE; TRACE( "Return to original display mode\n" ); }
@@ -2191,7 +2190,7 @@ static BOOL get_full_mode( const WCHAR *adapter_path, const WCHAR *device_name, if (!is_detached_mode( full_mode ) && (!full_mode->dmPelsWidth || !full_mode->dmPelsHeight || !(full_mode->dmFields & DM_POSITION))) { DEVMODEW current_mode = {.dmSize = sizeof(DEVMODEW)}; - if (!user_driver->pGetCurrentDisplaySettings( device_name, ¤t_mode )) return FALSE; + if (!user_driver->pGetCurrentDisplaySettings( adapter->dev.device_name, ¤t_mode )) return FALSE; if (!full_mode->dmPelsWidth) full_mode->dmPelsWidth = current_mode.dmPelsWidth; if (!full_mode->dmPelsHeight) full_mode->dmPelsHeight = current_mode.dmPelsHeight; if (!(full_mode->dmFields & DM_POSITION)) @@ -2201,7 +2200,7 @@ static BOOL get_full_mode( const WCHAR *adapter_path, const WCHAR *device_name, } }
- if ((adapter_mode = find_display_mode( adapter_modes, full_mode )) && adapter_mode != full_mode) + if ((adapter_mode = find_display_mode( adapter->modes, full_mode )) && adapter_mode != full_mode) { POINTL position = full_mode->dmPosition; *full_mode = *adapter_mode; @@ -2466,8 +2465,8 @@ static LONG apply_display_settings( const WCHAR *devname, const DEVMODEW *devmod LONG WINAPI NtUserChangeDisplaySettings( UNICODE_STRING *devname, DEVMODEW *devmode, HWND hwnd, DWORD flags, void *lparam ) { - DEVMODEW *modes, full_mode = {.dmSize = sizeof(DEVMODEW)}; WCHAR device_name[CCHDEVICENAME], adapter_path[MAX_PATH]; + DEVMODEW full_mode = {.dmSize = sizeof(DEVMODEW)}; LONG ret = DISP_CHANGE_SUCCESSFUL; struct adapter *adapter;
@@ -2481,23 +2480,18 @@ LONG WINAPI NtUserChangeDisplaySettings( UNICODE_STRING *devname, DEVMODEW *devm { lstrcpyW( device_name, adapter->dev.device_name ); lstrcpyW( adapter_path, adapter->config_key ); - /* allocate an extra mode to make iteration easier */ - modes = calloc( adapter->mode_count + 1, sizeof(DEVMODEW) ); - if (modes) memcpy( modes, adapter->modes, adapter->mode_count * sizeof(DEVMODEW) ); } unlock_display_devices(); - if (!adapter || !modes) + if (!adapter) { WARN( "Invalid device name %s.\n", debugstr_us(devname) ); - if (adapter) adapter_release( adapter ); return DISP_CHANGE_BADPARAM; }
- if (!get_full_mode( adapter_path, device_name, modes, devmode, &full_mode )) ret = DISP_CHANGE_BADMODE; + if (!adapter_get_full_mode( adapter, devmode, &full_mode )) ret = DISP_CHANGE_BADMODE; else if ((flags & CDS_UPDATEREGISTRY) && !write_registry_settings( adapter_path, devmode )) ret = DISP_CHANGE_NOTUPDATED; else if (flags & (CDS_TEST | CDS_NORESET)) ret = DISP_CHANGE_SUCCESSFUL; else ret = apply_display_settings( device_name, devmode, hwnd, flags, lparam ); - free( modes ); adapter_release( adapter );
if (ret) ERR( "Changing %s display settings returned %d.\n", debugstr_us(devname), ret );
From: R��mi Bernon rbernon@codeweavers.com
--- dlls/win32u/sysparams.c | 26 ++++++++------------------ 1 file changed, 8 insertions(+), 18 deletions(-)
diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c index b048f33bcb5..631e7d36860 100644 --- a/dlls/win32u/sysparams.c +++ b/dlls/win32u/sysparams.c @@ -2465,7 +2465,6 @@ static LONG apply_display_settings( const WCHAR *devname, const DEVMODEW *devmod LONG WINAPI NtUserChangeDisplaySettings( UNICODE_STRING *devname, DEVMODEW *devmode, HWND hwnd, DWORD flags, void *lparam ) { - WCHAR device_name[CCHDEVICENAME], adapter_path[MAX_PATH]; DEVMODEW full_mode = {.dmSize = sizeof(DEVMODEW)}; LONG ret = DISP_CHANGE_SUCCESSFUL; struct adapter *adapter; @@ -2476,11 +2475,7 @@ LONG WINAPI NtUserChangeDisplaySettings( UNICODE_STRING *devname, DEVMODEW *devm if ((!devname || !devname->Length) && !devmode) return apply_display_settings( NULL, NULL, hwnd, flags, lparam );
if (!lock_display_devices()) return DISP_CHANGE_FAILED; - if ((adapter = find_adapter( devname ))) - { - lstrcpyW( device_name, adapter->dev.device_name ); - lstrcpyW( adapter_path, adapter->config_key ); - } + adapter = find_adapter( devname ); unlock_display_devices(); if (!adapter) { @@ -2489,9 +2484,9 @@ LONG WINAPI NtUserChangeDisplaySettings( UNICODE_STRING *devname, DEVMODEW *devm }
if (!adapter_get_full_mode( adapter, devmode, &full_mode )) ret = DISP_CHANGE_BADMODE; - else if ((flags & CDS_UPDATEREGISTRY) && !write_registry_settings( adapter_path, devmode )) ret = DISP_CHANGE_NOTUPDATED; + else if ((flags & CDS_UPDATEREGISTRY) && !write_registry_settings( adapter->config_key, devmode )) ret = DISP_CHANGE_NOTUPDATED; else if (flags & (CDS_TEST | CDS_NORESET)) ret = DISP_CHANGE_SUCCESSFUL; - else ret = apply_display_settings( device_name, devmode, hwnd, flags, lparam ); + else ret = apply_display_settings( adapter->dev.device_name, devmode, hwnd, flags, lparam ); adapter_release( adapter );
if (ret) ERR( "Changing %s display settings returned %d.\n", debugstr_us(devname), ret ); @@ -2504,18 +2499,13 @@ 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], 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 ); - lstrcpyW( adapter_path, adapter->config_key ); - } + adapter = find_adapter( device ); unlock_display_devices(); if (!adapter) { @@ -2529,12 +2519,12 @@ BOOL WINAPI NtUserEnumDisplaySettings( UNICODE_STRING *device, DWORD index, DEVM devmode->dmSize = offsetof(DEVMODEW, dmICMMethod); memset( &devmode->dmDriverExtra, 0, devmode->dmSize - offsetof(DEVMODEW, dmDriverExtra) );
- if (index == ENUM_REGISTRY_SETTINGS) ret = read_registry_settings( adapter_path, devmode ); - else if (index != ENUM_CURRENT_SETTINGS) ret = user_driver->pEnumDisplaySettingsEx( device_name, index, devmode, flags ); - else ret = user_driver->pGetCurrentDisplaySettings( device_name, devmode ); + if (index == ENUM_REGISTRY_SETTINGS) ret = read_registry_settings( adapter->config_key, devmode ); + else if (index != ENUM_CURRENT_SETTINGS) ret = user_driver->pEnumDisplaySettingsEx( adapter->dev.device_name, index, devmode, flags ); + else ret = user_driver->pGetCurrentDisplaySettings( adapter->dev.device_name, devmode ); adapter_release( adapter );
- if (!ret) WARN( "Failed to query %s display settings.\n", debugstr_w(device_name) ); + if (!ret) WARN( "Failed to query %s display settings.\n", debugstr_us(device) ); else TRACE( "position %dx%d, resolution %ux%u, frequency %u, depth %u, orientation %#x.\n", devmode->dmPosition.x, devmode->dmPosition.y, devmode->dmPelsWidth, devmode->dmPelsHeight, devmode->dmDisplayFrequency, devmode->dmBitsPerPel, devmode->dmDisplayOrientation );
From: R��mi Bernon rbernon@codeweavers.com
And use a struct adapter pointer parameter. --- dlls/win32u/sysparams.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c index 631e7d36860..c44a6e4e98e 100644 --- a/dlls/win32u/sysparams.c +++ b/dlls/win32u/sysparams.c @@ -522,7 +522,7 @@ static BOOL read_adapter_mode( HKEY adapter_key, DWORD index, DEVMODEW *mode ) return TRUE; }
-static BOOL read_registry_settings( const WCHAR *adapter_path, DEVMODEW *mode ) +static BOOL adapter_get_default_mode( const struct adapter *adapter, DEVMODEW *mode ) { BOOL ret = FALSE; HANDLE mutex; @@ -531,7 +531,7 @@ static BOOL read_registry_settings( const WCHAR *adapter_path, DEVMODEW *mode ) 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 if (!(hkey = reg_open_key( config_key, adapter->config_key, lstrlenW( adapter->config_key ) * sizeof(WCHAR) ))) ret = FALSE; else { ret = read_adapter_mode( hkey, ENUM_REGISTRY_SETTINGS, mode ); @@ -542,7 +542,7 @@ static BOOL read_registry_settings( const WCHAR *adapter_path, DEVMODEW *mode ) return ret; }
-static BOOL write_registry_settings( const WCHAR *adapter_path, const DEVMODEW *mode ) +static BOOL adapter_set_default_mode( const struct adapter *adapter, const DEVMODEW *mode ) { HANDLE mutex; HKEY hkey; @@ -551,7 +551,7 @@ static BOOL write_registry_settings( const WCHAR *adapter_path, const DEVMODEW * mutex = get_display_device_init_mutex();
if (!config_key && !(config_key = reg_open_key( NULL, config_keyW, sizeof(config_keyW) ))) ret = FALSE; - if (!(hkey = reg_open_key( config_key, adapter_path, lstrlenW( adapter_path ) * sizeof(WCHAR) ))) ret = FALSE; + if (!(hkey = reg_open_key( config_key, adapter->config_key, lstrlenW( adapter->config_key ) * sizeof(WCHAR) ))) ret = FALSE; else { ret = write_adapter_mode( hkey, ENUM_REGISTRY_SETTINGS, mode ); @@ -2177,7 +2177,7 @@ static BOOL adapter_get_full_mode( const struct adapter *adapter, const DEVMODEW if (devmode) memcpy( full_mode, devmode, devmode->dmSize ); else { - if (!read_registry_settings( adapter->config_key, full_mode )) return FALSE; + if (!adapter_get_default_mode( adapter, full_mode )) return FALSE; TRACE( "Return to original display mode\n" ); }
@@ -2230,7 +2230,7 @@ static DEVMODEW *get_display_settings( const WCHAR *devname, const DEVMODEW *dev memcpy( &mode->dmFields, &devmode->dmFields, devmode->dmSize - offsetof(DEVMODEW, dmFields) ); else { - if (!devname) ret = read_registry_settings( adapter->config_key, mode ); + if (!devname) ret = adapter_get_default_mode( adapter, mode ); else ret = user_driver->pGetCurrentDisplaySettings( adapter->dev.device_name, mode ); if (!ret) goto done; } @@ -2484,7 +2484,7 @@ LONG WINAPI NtUserChangeDisplaySettings( UNICODE_STRING *devname, DEVMODEW *devm }
if (!adapter_get_full_mode( adapter, devmode, &full_mode )) ret = DISP_CHANGE_BADMODE; - else if ((flags & CDS_UPDATEREGISTRY) && !write_registry_settings( adapter->config_key, devmode )) ret = DISP_CHANGE_NOTUPDATED; + else if ((flags & CDS_UPDATEREGISTRY) && !adapter_set_default_mode( adapter, devmode )) ret = DISP_CHANGE_NOTUPDATED; else if (flags & (CDS_TEST | CDS_NORESET)) ret = DISP_CHANGE_SUCCESSFUL; else ret = apply_display_settings( adapter->dev.device_name, devmode, hwnd, flags, lparam ); adapter_release( adapter ); @@ -2519,7 +2519,7 @@ BOOL WINAPI NtUserEnumDisplaySettings( UNICODE_STRING *device, DWORD index, DEVM devmode->dmSize = offsetof(DEVMODEW, dmICMMethod); memset( &devmode->dmDriverExtra, 0, devmode->dmSize - offsetof(DEVMODEW, dmDriverExtra) );
- if (index == ENUM_REGISTRY_SETTINGS) ret = read_registry_settings( adapter->config_key, devmode ); + if (index == ENUM_REGISTRY_SETTINGS) ret = adapter_get_default_mode( adapter, devmode ); else if (index != ENUM_CURRENT_SETTINGS) ret = user_driver->pEnumDisplaySettingsEx( adapter->dev.device_name, index, devmode, flags ); else ret = user_driver->pGetCurrentDisplaySettings( adapter->dev.device_name, devmode ); adapter_release( adapter );
From: R��mi Bernon rbernon@codeweavers.com
--- dlls/win32u/sysparams.c | 4 ++++ dlls/winemac.drv/display.c | 16 +++++++++------- include/wine/gdi_driver.h | 2 ++ 3 files changed, 15 insertions(+), 7 deletions(-)
diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c index c44a6e4e98e..8416dc0ebcc 100644 --- a/dlls/win32u/sysparams.c +++ b/dlls/win32u/sysparams.c @@ -2133,6 +2133,8 @@ static const DEVMODEW *find_display_mode( const DEVMODEW *modes, DEVMODEW *devmo
for (mode = modes; mode && mode->dmSize; mode = NEXT_DEVMODEW(mode)) { + if ((mode->dmFields & DM_DISPLAYFLAGS) && (mode->dmDisplayFlags & WINE_DM_UNSUPPORTED)) + continue; if ((devmode->dmFields & DM_BITSPERPEL) && devmode->dmBitsPerPel && devmode->dmBitsPerPel != mode->dmBitsPerPel) continue; if ((devmode->dmFields & DM_PELSWIDTH) && devmode->dmPelsWidth != mode->dmPelsWidth) @@ -2524,6 +2526,8 @@ BOOL WINAPI NtUserEnumDisplaySettings( UNICODE_STRING *device, DWORD index, DEVM else ret = user_driver->pGetCurrentDisplaySettings( adapter->dev.device_name, devmode ); adapter_release( adapter );
+ devmode->dmDisplayFlags &= ~WINE_DM_UNSUPPORTED; + if (!ret) WARN( "Failed to query %s display settings.\n", debugstr_us(device) ); else TRACE( "position %dx%d, resolution %ux%u, frequency %u, depth %u, orientation %#x.\n", devmode->dmPosition.x, devmode->dmPosition.y, devmode->dmPelsWidth, devmode->dmPelsHeight, diff --git a/dlls/winemac.drv/display.c b/dlls/winemac.drv/display.c index 1cebcdfce2f..def291508be 100644 --- a/dlls/winemac.drv/display.c +++ b/dlls/winemac.drv/display.c @@ -97,6 +97,13 @@ static int display_mode_bits_per_pixel(CGDisplayModeRef display_mode) }
+static BOOL display_mode_is_supported(CGDisplayModeRef display_mode) +{ + uint32_t io_flags = CGDisplayModeGetIOFlags(display_mode); + return (io_flags & kDisplayModeValidFlag) && (io_flags & kDisplayModeSafeFlag); +} + + static void display_mode_to_devmode(CGDirectDisplayID display_id, CGDisplayModeRef display_mode, DEVMODEW *devmode) { uint32_t io_flags; @@ -124,6 +131,8 @@ static void display_mode_to_devmode(CGDirectDisplayID display_id, CGDisplayModeR devmode->dmDisplayFlags = 0; if (io_flags & kDisplayModeInterlacedFlag) devmode->dmDisplayFlags |= DM_INTERLACED; + if (!display_mode_is_supported(display_mode)) + devmode->dmDisplayFlags |= WINE_DM_UNSUPPORTED; devmode->dmFields |= DM_DISPLAYFLAGS;
devmode->dmDisplayFrequency = CGDisplayModeGetRefreshRate(display_mode); @@ -417,13 +426,6 @@ static int get_default_bpp(void) }
-static BOOL display_mode_is_supported(CGDisplayModeRef display_mode) -{ - uint32_t io_flags = CGDisplayModeGetIOFlags(display_mode); - return (io_flags & kDisplayModeValidFlag) && (io_flags & kDisplayModeSafeFlag); -} - - #if defined(MAC_OS_X_VERSION_10_8) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_8 static CFDictionaryRef create_mode_dict(CGDisplayModeRef display_mode, BOOL is_original) { diff --git a/include/wine/gdi_driver.h b/include/wine/gdi_driver.h index e1d8998d812..9863a4a36ea 100644 --- a/include/wine/gdi_driver.h +++ b/include/wine/gdi_driver.h @@ -269,6 +269,8 @@ struct gdi_device_manager void (*add_mode)( const DEVMODEW *mode, void *param ); };
+#define WINE_DM_UNSUPPORTED 0x80000000 + struct tagUPDATELAYEREDWINDOWINFO;
struct user_driver_funcs
Looks like it breaks the user32:monitor tests, I'll fix it.