Module: wine Branch: master Commit: df8b7e0473d23a9ce8460b0eaa58e7db399159a2 URL: https://gitlab.winehq.org/wine/wine/-/commit/df8b7e0473d23a9ce8460b0eaa58e7d...
Author: Alexandros Frantzis alexandros.frantzis@collabora.com Date: Mon Apr 3 11:46:48 2023 +0300
win32u: Support setting the current mode using gdi_device_manager.
Update the gdi_device_manager API to enable drivers to set the current mode (along with the registry mode if not already set) in UpdateDisplayDevices.
Signed-off-by: Alexandros Frantzis alexandros.frantzis@collabora.com
---
dlls/win32u/sysparams.c | 32 ++++++++++++++++++++++++++++---- dlls/wineandroid.drv/init.c | 2 +- dlls/winemac.drv/display.c | 2 +- dlls/winewayland.drv/display.c | 2 +- dlls/winex11.drv/display.c | 2 +- include/wine/gdi_driver.h | 2 +- 6 files changed, 33 insertions(+), 9 deletions(-)
diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c index 60b12321953..32b20682d24 100644 --- a/dlls/win32u/sysparams.c +++ b/dlls/win32u/sysparams.c @@ -1482,9 +1482,10 @@ static void add_monitor( const struct gdi_monitor *monitor, void *param ) if (hkey) NtClose( hkey ); }
-static void add_mode( const DEVMODEW *mode, void *param ) +static void add_mode( const DEVMODEW *mode, BOOL current, void *param ) { struct device_manager_ctx *ctx = param; + DEVMODEW nopos_mode;
if (!ctx->adapter_count) { @@ -1496,10 +1497,21 @@ static void add_mode( const DEVMODEW *mode, void *param ) add_adapter( &default_adapter, ctx ); }
- if (write_adapter_mode( ctx->adapter_key, ctx->mode_count, mode )) + nopos_mode = *mode; + nopos_mode.dmPosition.x = 0; + nopos_mode.dmPosition.y = 0; + nopos_mode.dmFields &= ~DM_POSITION; + + if (write_adapter_mode( ctx->adapter_key, ctx->mode_count, &nopos_mode )) { ctx->mode_count++; set_reg_value( ctx->adapter_key, mode_countW, REG_DWORD, &ctx->mode_count, sizeof(ctx->mode_count) ); + if (current) + { + if (!read_adapter_mode( ctx->adapter_key, ENUM_REGISTRY_SETTINGS, &nopos_mode )) + write_adapter_mode( ctx->adapter_key, ENUM_REGISTRY_SETTINGS, mode ); + write_adapter_mode( ctx->adapter_key, ENUM_CURRENT_SETTINGS, mode ); + } } }
@@ -1626,6 +1638,15 @@ static BOOL update_display_cache_from_registry(void) return ret; }
+static BOOL is_same_devmode( const DEVMODEW *a, const DEVMODEW *b ) +{ + return a->dmDisplayOrientation == b->dmDisplayOrientation && + a->dmBitsPerPel == b->dmBitsPerPel && + a->dmPelsWidth == b->dmPelsWidth && + a->dmPelsHeight == b->dmPelsHeight && + a->dmDisplayFrequency == b->dmDisplayFrequency; +} + static BOOL update_display_cache( BOOL force ) { HWINSTA winstation = NtUserGetProcessWindowStation(); @@ -1682,7 +1703,6 @@ static BOOL update_display_cache( BOOL force ) { mode = modes[2]; mode.dmFields |= DM_POSITION; - write_adapter_mode( ctx.adapter_key, ENUM_CURRENT_SETTINGS, &mode ); } monitor.rc_monitor.right = mode.dmPelsWidth; monitor.rc_monitor.bottom = mode.dmPelsHeight; @@ -1690,7 +1710,11 @@ static BOOL update_display_cache( BOOL force ) monitor.rc_work.bottom = mode.dmPelsHeight;
add_monitor( &monitor, &ctx ); - for (i = 0; i < ARRAY_SIZE(modes); ++i) add_mode( modes + i, &ctx ); + for (i = 0; i < ARRAY_SIZE(modes); ++i) + { + if (is_same_devmode( modes + i, &mode )) add_mode( &mode, TRUE, &ctx ); + else add_mode( modes + i, FALSE, &ctx ); + } } release_display_manager_ctx( &ctx );
diff --git a/dlls/wineandroid.drv/init.c b/dlls/wineandroid.drv/init.c index 074aa6c6257..0ba8a0b3ebb 100644 --- a/dlls/wineandroid.drv/init.c +++ b/dlls/wineandroid.drv/init.c @@ -295,7 +295,7 @@ BOOL ANDROID_UpdateDisplayDevices( const struct gdi_device_manager *device_manag device_manager->add_gpu( &gpu, param ); device_manager->add_adapter( &adapter, param ); device_manager->add_monitor( &gdi_monitor, param ); - device_manager->add_mode( &mode, param ); + device_manager->add_mode( &mode, FALSE, param ); force_display_devices_refresh = FALSE; }
diff --git a/dlls/winemac.drv/display.c b/dlls/winemac.drv/display.c index 6a798994e47..438e2bb5390 100644 --- a/dlls/winemac.drv/display.c +++ b/dlls/winemac.drv/display.c @@ -1205,7 +1205,7 @@ BOOL macdrv_UpdateDisplayDevices( const struct gdi_device_manager *device_manage (int)mode->dmBitsPerPel, (int)mode->dmDisplayFrequency, mode->dmDisplayFixedOutput == DMDFO_STRETCH ? "" : "un", mode->dmDisplayFlags & DM_INTERLACED ? "" : "non-"); - device_manager->add_mode( mode, param ); + device_manager->add_mode( mode, FALSE, param ); }
free(modes); diff --git a/dlls/winewayland.drv/display.c b/dlls/winewayland.drv/display.c index e72b26a9da0..1d86b2fd4e3 100644 --- a/dlls/winewayland.drv/display.c +++ b/dlls/winewayland.drv/display.c @@ -126,7 +126,7 @@ static void wayland_add_device_modes(const struct gdi_device_manager *device_man { DEVMODEW mode; populate_devmode(output_mode, &mode); - device_manager->add_mode(&mode, param); + device_manager->add_mode(&mode, FALSE, param); } }
diff --git a/dlls/winex11.drv/display.c b/dlls/winex11.drv/display.c index 78de6a6f88b..e675194b9fd 100644 --- a/dlls/winex11.drv/display.c +++ b/dlls/winex11.drv/display.c @@ -599,7 +599,7 @@ BOOL X11DRV_UpdateDisplayDevices( const struct gdi_device_manager *device_manage for (mode = modes; mode_count; mode_count--) { TRACE( "mode: %p\n", mode ); - device_manager->add_mode( mode, param ); + device_manager->add_mode( mode, FALSE, param ); mode = (DEVMODEW *)((char *)mode + sizeof(*modes) + modes[0].dmDriverExtra); }
diff --git a/include/wine/gdi_driver.h b/include/wine/gdi_driver.h index c492252d4ab..0eb24fd4424 100644 --- a/include/wine/gdi_driver.h +++ b/include/wine/gdi_driver.h @@ -266,7 +266,7 @@ struct gdi_device_manager void (*add_gpu)( const struct gdi_gpu *gpu, void *param ); void (*add_adapter)( const struct gdi_adapter *adapter, void *param ); void (*add_monitor)( const struct gdi_monitor *monitor, void *param ); - void (*add_mode)( const DEVMODEW *mode, void *param ); + void (*add_mode)( const DEVMODEW *mode, BOOL current, void *param ); };
#define WINE_DM_UNSUPPORTED 0x80000000