From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/sysparams.c | 13 ++++++++----- dlls/wineandroid.drv/init.c | 1 + dlls/winemac.drv/display.c | 7 ++----- dlls/winewayland.drv/display.c | 5 ++--- dlls/winex11.drv/display.c | 6 +++--- dlls/winex11.drv/x11drv.h | 2 +- dlls/winex11.drv/xinerama.c | 11 +++++------ dlls/winex11.drv/xrandr.c | 13 ++++++++----- include/wine/gdi_driver.h | 2 +- 9 files changed, 31 insertions(+), 29 deletions(-)
diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c index b969cab90ee..3f4d2821d33 100644 --- a/dlls/win32u/sysparams.c +++ b/dlls/win32u/sysparams.c @@ -1396,7 +1396,7 @@ static void add_gpu( const struct gdi_gpu *gpu, void *param ) static void add_adapter( const struct gdi_adapter *adapter, void *param ) { struct device_manager_ctx *ctx = param; - unsigned int adapter_name, adapter_index, len; + unsigned int adapter_index, len; char name[64], buffer[MAX_PATH]; WCHAR nameW[64], bufferW[MAX_PATH]; HKEY hkey; @@ -1409,13 +1409,13 @@ static void add_adapter( const struct gdi_adapter *adapter, void *param ) ctx->adapter_key = NULL; }
- adapter_name = ctx->gpu_adapter_count++; + ctx->gpu_adapter_count++; adapter_index = ctx->adapter_count++; ctx->monitor_count = 0; ctx->mode_count = 0;
- snprintf( buffer, ARRAY_SIZE(buffer), "\Registry\Machine\System\CurrentControlSet\Control\Video\%s\%04x", - ctx->gpu_guid, adapter_name ); + snprintf( buffer, ARRAY_SIZE(buffer), "\Registry\Machine\System\CurrentControlSet\Control\Video\%s\%s", + ctx->gpu_guid, adapter->name ); len = asciiz_to_unicode( bufferW, buffer ) - sizeof(WCHAR);
hkey = reg_create_key( NULL, bufferW, len, REG_OPTION_VOLATILE | REG_OPTION_CREATE_LINK, NULL ); @@ -1436,7 +1436,7 @@ static void add_adapter( const struct gdi_adapter *adapter, void *param ) else ERR( "failed to create link key\n" );
/* Following information is Wine specific, it doesn't really exist on Windows. */ - snprintf( buffer, ARRAY_SIZE(buffer), "System\CurrentControlSet\Control\Video\%s\%04x", ctx->gpu_guid, adapter_name ); + snprintf( buffer, ARRAY_SIZE(buffer), "System\CurrentControlSet\Control\Video\%s\%s", ctx->gpu_guid, adapter->name ); ctx->adapter_key = reg_create_key( config_key, bufferW, asciiz_to_unicode( bufferW, buffer ) - sizeof(WCHAR), REG_OPTION_VOLATILE, NULL );
@@ -1566,6 +1566,7 @@ static void add_mode( const DEVMODEW *mode, BOOL current, void *param ) static const struct gdi_adapter default_adapter = { .state_flags = DISPLAY_DEVICE_ATTACHED_TO_DESKTOP | DISPLAY_DEVICE_PRIMARY_DEVICE | DISPLAY_DEVICE_VGA_COMPATIBLE, + .name = "Default Adapter", }; TRACE( "adding default fake adapter\n" ); add_adapter( &default_adapter, ctx ); @@ -1831,6 +1832,7 @@ static BOOL default_update_display_devices( const struct gdi_device_manager *man static const struct gdi_adapter adapter = { .state_flags = DISPLAY_DEVICE_ATTACHED_TO_DESKTOP | DISPLAY_DEVICE_PRIMARY_DEVICE | DISPLAY_DEVICE_VGA_COMPATIBLE, + .name = "Default Adapter", }; struct gdi_monitor monitor = {0}; DEVMODEW mode = {{0}}; @@ -1940,6 +1942,7 @@ static BOOL desktop_update_display_devices( BOOL force, struct device_manager_ct static const struct gdi_adapter adapter = { .state_flags = DISPLAY_DEVICE_ATTACHED_TO_DESKTOP | DISPLAY_DEVICE_PRIMARY_DEVICE | DISPLAY_DEVICE_VGA_COMPATIBLE, + .name = "Virtual Adapter", }; struct gdi_monitor monitor = {0}; static struct screen_size diff --git a/dlls/wineandroid.drv/init.c b/dlls/wineandroid.drv/init.c index c39bf690a06..f65e28662d7 100644 --- a/dlls/wineandroid.drv/init.c +++ b/dlls/wineandroid.drv/init.c @@ -277,6 +277,7 @@ BOOL ANDROID_UpdateDisplayDevices( const struct gdi_device_manager *device_manag static const struct gdi_adapter adapter = { .state_flags = DISPLAY_DEVICE_ATTACHED_TO_DESKTOP | DISPLAY_DEVICE_PRIMARY_DEVICE | DISPLAY_DEVICE_VGA_COMPATIBLE, + .name = "Default Adapter", }; struct gdi_monitor gdi_monitor = { diff --git a/dlls/winemac.drv/display.c b/dlls/winemac.drv/display.c index 6d6e76da1ee..8c0442174c0 100644 --- a/dlls/winemac.drv/display.c +++ b/dlls/winemac.drv/display.c @@ -1178,11 +1178,8 @@ BOOL macdrv_UpdateDisplayDevices( const struct gdi_device_manager *device_manage for (adapter = adapters; adapter < adapters + adapter_count; adapter++) { DEVMODEW current_mode = { .dmSize = sizeof(current_mode) }; - struct gdi_adapter gdi_adapter = - { - .id = adapter->id, - .state_flags = adapter->state_flags, - }; + struct gdi_adapter gdi_adapter = { .state_flags = adapter->state_flags }; + sprintf( gdi_adapter.name, "%04x", adapter->id ); device_manager->add_adapter( &gdi_adapter, param );
if (macdrv_get_monitors(adapter->id, &monitors, &monitor_count)) break; diff --git a/dlls/winewayland.drv/display.c b/dlls/winewayland.drv/display.c index 6c399cbf321..e95fade0016 100644 --- a/dlls/winewayland.drv/display.c +++ b/dlls/winewayland.drv/display.c @@ -214,13 +214,12 @@ static void wayland_add_device_adapter(const struct gdi_device_manager *device_m void *param, INT output_id) { struct gdi_adapter adapter; - adapter.id = output_id; + sprintf( adapter.name, "%04x", output_id ); adapter.state_flags = DISPLAY_DEVICE_ATTACHED_TO_DESKTOP; if (output_id == 0) adapter.state_flags |= DISPLAY_DEVICE_PRIMARY_DEVICE;
- TRACE("id=0x%s state_flags=0x%x\n", - wine_dbgstr_longlong(adapter.id), (UINT)adapter.state_flags); + TRACE("id=0x%s state_flags=0x%x\n", adapter.name, (UINT)adapter.state_flags);
device_manager->add_adapter(&adapter, param); } diff --git a/dlls/winex11.drv/display.c b/dlls/winex11.drv/display.c index 49475571f71..142f581c6ce 100644 --- a/dlls/winex11.drv/display.c +++ b/dlls/winex11.drv/display.c @@ -404,7 +404,7 @@ RECT get_host_primary_monitor_rect(void) /* The first monitor is always primary */ if (host_handler.get_gpus(&gpus, &gpu_count, FALSE) && gpu_count && host_handler.get_adapters(gpus[0].id, &adapters, &adapter_count) && adapter_count && - host_handler.get_monitors(adapters[0].id, &monitors, &monitor_count) && monitor_count) + host_handler.get_monitors(adapters[0].name, &monitors, &monitor_count) && monitor_count) rect = monitors[0].rc_monitor;
if (gpus) host_handler.free_gpus(gpus); @@ -550,8 +550,8 @@ BOOL X11DRV_UpdateDisplayDevices( const struct gdi_device_manager *device_manage
device_manager->add_adapter( &adapters[adapter], param );
- if (!host_handler.get_monitors( adapters[adapter].id, &monitors, &monitor_count )) break; - TRACE("adapter: %#lx, monitor count: %d\n", adapters[adapter].id, monitor_count); + if (!host_handler.get_monitors( adapters[adapter].name, &monitors, &monitor_count )) break; + TRACE("adapter: %s, monitor count: %d\n", adapters[adapter].name, monitor_count);
/* Initialize monitors */ for (monitor = 0; monitor < monitor_count; monitor++) diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h index 9c1b8012466..0a6b45d76e3 100644 --- a/dlls/winex11.drv/x11drv.h +++ b/dlls/winex11.drv/x11drv.h @@ -788,7 +788,7 @@ struct x11drv_display_device_handler * The first monitor has to be primary if adapter is primary. * * Return FALSE on failure with parameters unchanged */ - BOOL (*get_monitors)(ULONG_PTR adapter_id, struct gdi_monitor **monitors, int *count); + BOOL (*get_monitors)(const char *adapter_id, struct gdi_monitor **monitors, int *count);
/* free_gpus will be called to free a GPU list from get_gpus */ void (*free_gpus)(struct gdi_gpu *gpus); diff --git a/dlls/winex11.drv/xinerama.c b/dlls/winex11.drv/xinerama.c index 43b25c02b86..17414e6d06e 100644 --- a/dlls/winex11.drv/xinerama.c +++ b/dlls/winex11.drv/xinerama.c @@ -254,7 +254,7 @@ static BOOL xinerama_get_adapters( ULONG_PTR gpu_id, struct gdi_adapter **new_ad continue;
/* Use monitor index as id */ - adapters[index].id = (ULONG_PTR)i; + sprintf( adapters[index].name, "%04x", i );
if (i == primary_index) adapters[index].state_flags |= DISPLAY_DEVICE_PRIMARY_DEVICE; @@ -285,13 +285,12 @@ static void xinerama_free_adapters( struct gdi_adapter *adapters ) free( adapters ); }
-static BOOL xinerama_get_monitors( ULONG_PTR adapter_id, struct gdi_monitor **new_monitors, int *count ) +static BOOL xinerama_get_monitors( const char *adapter_id, struct gdi_monitor **new_monitors, int *count ) { + int i, first, index = 0, monitor_count = 0; struct gdi_monitor *monitor; - INT first = (INT)adapter_id; - INT monitor_count = 0; - INT index = 0; - INT i; + + if (!sscanf( adapter_id, "%04x", &first )) return FALSE;
pthread_mutex_lock( &xinerama_mutex );
diff --git a/dlls/winex11.drv/xrandr.c b/dlls/winex11.drv/xrandr.c index 5c0269f3550..3df34ad7004 100644 --- a/dlls/winex11.drv/xrandr.c +++ b/dlls/winex11.drv/xrandr.c @@ -977,7 +977,7 @@ static BOOL xrandr14_get_adapters( ULONG_PTR gpu_id, struct gdi_adapter **new_ad { /* Use RROutput as adapter id. The reason of not using RRCrtc is that we need to detect inactive but * attached monitors */ - adapters[adapter_count].id = outputs[i]; + sprintf( adapters[adapter_count].name, "%04lx", outputs[i] ); if (!detached) adapters[adapter_count].state_flags |= DISPLAY_DEVICE_ATTACHED_TO_DESKTOP; if (is_crtc_primary( primary_rect, crtc_info )) @@ -1031,7 +1031,7 @@ static void xrandr14_free_adapters( struct gdi_adapter *adapters ) free( adapters ); }
-static BOOL xrandr14_get_monitors( ULONG_PTR adapter_id, struct gdi_monitor **new_monitors, int *count ) +static BOOL xrandr14_get_monitors( const char *adapter_id, struct gdi_monitor **new_monitors, int *count ) { struct gdi_monitor *realloc_monitors, *monitors = NULL; XRRScreenResources *screen_resources = NULL; @@ -1040,8 +1040,11 @@ static BOOL xrandr14_get_monitors( ULONG_PTR adapter_id, struct gdi_monitor **ne INT primary_index = 0, monitor_count = 0, capacity; RECT primary_rect; BOOL ret = FALSE; + RROutput output; INT i;
+ if (!sscanf( adapter_id, "%04lx", &output )) return FALSE; + screen_resources = xrandr_get_screen_resources(); if (!screen_resources) goto done; @@ -1052,7 +1055,7 @@ static BOOL xrandr14_get_monitors( ULONG_PTR adapter_id, struct gdi_monitor **ne if (!monitors) goto done;
- output_info = pXRRGetOutputInfo( gdi_display, screen_resources, adapter_id ); + output_info = pXRRGetOutputInfo( gdi_display, screen_resources, output ); if (!output_info) goto done;
@@ -1066,7 +1069,7 @@ static BOOL xrandr14_get_monitors( ULONG_PTR adapter_id, struct gdi_monitor **ne /* Inactive but attached monitor, no need to check for mirrored/replica monitors */ if (!output_info->crtc || !crtc_info->mode) { - monitors[monitor_count].edid_len = get_edid( adapter_id, &monitors[monitor_count].edid ); + monitors[monitor_count].edid_len = get_edid( output, &monitors[monitor_count].edid ); monitor_count = 1; } /* Active monitors, need to find other monitors with the same coordinates as mirrored */ @@ -1255,7 +1258,7 @@ static BOOL xrandr14_get_id( const WCHAR *device_name, BOOL is_primary, x11drv_s
for (adapter_idx = 0; adapter_idx < adapter_count; ++adapter_idx) { - new_current_modes[new_current_mode_count + adapter_idx].id = adapters[adapter_idx].id; + sscanf( adapters[adapter_idx].name, "%04lx", &new_current_modes[new_current_mode_count + adapter_idx].id ); new_current_modes[new_current_mode_count + adapter_idx].loaded = FALSE; } new_current_mode_count += adapter_count; diff --git a/include/wine/gdi_driver.h b/include/wine/gdi_driver.h index 4acf23df1d4..becfc533d66 100644 --- a/include/wine/gdi_driver.h +++ b/include/wine/gdi_driver.h @@ -256,7 +256,7 @@ struct gdi_gpu
struct gdi_adapter { - ULONG_PTR id; + char name[128]; DWORD state_flags; };