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>
This commit is contained in:
Alexandros Frantzis 2023-04-03 11:46:48 +03:00 committed by Alexandre Julliard
parent b7225671fd
commit df8b7e0473
6 changed files with 33 additions and 9 deletions

View file

@ -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 );

View file

@ -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;
}

View file

@ -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);

View file

@ -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);
}
}

View file

@ -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);
}

View file

@ -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