File winewayland-guess-primary-output.patch of Package wine
Try to guess the primary output on Wayland.
diff --git a/dlls/winewayland.drv/display.c b/dlls/winewayland.drv/display.c
index b2a9428..5a1946b 100644
--- a/dlls/winewayland.drv/display.c
+++ b/dlls/winewayland.drv/display.c
@@ -269,9 +269,11 @@ static void wayland_add_device_modes(const struct gdi_device_manager *device_man
UINT WAYLAND_UpdateDisplayDevices(const struct gdi_device_manager *device_manager, void *param)
{
struct wayland_output *output;
- DWORD state_flags = DISPLAY_DEVICE_ATTACHED_TO_DESKTOP | DISPLAY_DEVICE_PRIMARY_DEVICE;
+ DWORD state_flags;
struct wl_array output_info_array;
struct output_info *output_info;
+ struct output_info *primary_output_info = NULL;
+ char *primary_output_override = getenv("WAYLANDDRV_PRIMARY_MONITOR");
TRACE("\n");
@@ -292,12 +294,35 @@ UINT WAYLAND_UpdateDisplayDevices(const struct gdi_device_manager *device_manage
/* Populate GDI devices. */
wayland_add_device_gpu(device_manager, param);
+ /* Guess the primary output. */
wl_array_for_each(output_info, &output_info_array)
{
+ /* If an override is provided, use that. */
+ if (primary_output_override && strcmp(primary_output_override, output_info->output->name) == 0)
+ {
+ primary_output_info = output_info;
+ break;
+ }
+ if (primary_output_info == NULL)
+ {
+ primary_output_info = output_info;
+ continue;
+ }
+ /* Assume the output with the widest resolution is the primary. */
+ if (output_info->output->current_mode->width > primary_output_info->output->current_mode->width ||
+ (output_info->output->current_mode->width == primary_output_info->output->current_mode->width &&
+ output_info->output->current_mode->height > primary_output_info->output->current_mode->height))
+ primary_output_info = output_info;
+ }
+
+ wl_array_for_each(output_info, &output_info_array)
+ {
+ state_flags = DISPLAY_DEVICE_ATTACHED_TO_DESKTOP;
+ if (output_info == primary_output_info)
+ state_flags |= DISPLAY_DEVICE_PRIMARY_DEVICE;
wayland_add_device_source(device_manager, param, state_flags, output_info);
wayland_add_device_monitor(device_manager, param, output_info);
wayland_add_device_modes(device_manager, param, output_info);
- state_flags &= ~DISPLAY_DEVICE_PRIMARY_DEVICE;
}
wl_array_release(&output_info_array);