Commit 5400db15 authored by Piotr Caban's avatar Piotr Caban Committed by Alexandre Julliard

winemac.drv: Don't filter non active displays out.

On Windows 10 the DISPLAY_DEVICE_ACTIVE flag is set even if monitor is in power saving mode or switched off. Monitors without DISPLAY_DEVICE_ACTIVE are only reported when display is disabled. This doesn't match with CGDisplayIsActive function. Current code causes rendering problems when native .NET is used. When monitors are updated when in power saving mode (e.g. due to race on machine wake-up) we might end up with no monitors being enumerated by EnumDisplayMonitors. Signed-off-by: 's avatarPiotr Caban <piotr@codeweavers.com> Signed-off-by: 's avatarAlexandre Julliard <julliard@winehq.org>
parent 129e5660
......@@ -646,65 +646,54 @@ int macdrv_get_monitors(uint32_t adapter_id, struct macdrv_monitor** new_monitor
if (!monitors)
return -1;
/* Report an inactive monitor */
if (!CGDisplayIsActive(adapter_id) && !CGDisplayIsInMirrorSet(adapter_id))
{
strcpy(monitors[monitor_count].name, "Generic Non-PnP Monitor");
monitors[monitor_count].state_flags = DISPLAY_DEVICE_ATTACHED;
monitor_count++;
}
/* Report active and mirrored monitors in the same mirroring set */
else
{
if (CGGetOnlineDisplayList(sizeof(display_ids) / sizeof(display_ids[0]), display_ids, &display_id_count)
!= kCGErrorSuccess)
goto done;
if (CGGetOnlineDisplayList(sizeof(display_ids) / sizeof(display_ids[0]), display_ids, &display_id_count)
!= kCGErrorSuccess)
goto done;
if (macdrv_get_displays(&displays, &display_count))
goto done;
if (macdrv_get_displays(&displays, &display_count))
goto done;
for (i = 0; i < display_id_count; i++)
{
if (display_ids[i] != adapter_id && CGDisplayMirrorsDisplay(display_ids[i]) != adapter_id)
continue;
for (i = 0; i < display_id_count; i++)
{
if (display_ids[i] != adapter_id && CGDisplayMirrorsDisplay(display_ids[i]) != adapter_id)
continue;
/* Find and fill in monitor info */
for (j = 0; j < display_count; j++)
/* Find and fill in monitor info */
for (j = 0; j < display_count; j++)
{
if (displays[j].displayID == display_ids[i]
|| CGDisplayMirrorsDisplay(display_ids[i]) == displays[j].displayID)
{
if (displays[j].displayID == display_ids[i]
|| CGDisplayMirrorsDisplay(display_ids[i]) == displays[j].displayID)
/* Allocate more space if needed */
if (monitor_count >= capacity)
{
/* Allocate more space if needed */
if (monitor_count >= capacity)
{
capacity *= 2;
realloc_monitors = realloc(monitors, sizeof(*monitors) * capacity);
if (!realloc_monitors)
goto done;
monitors = realloc_monitors;
}
if (j == 0)
primary_index = monitor_count;
strcpy(monitors[monitor_count].name, "Generic Non-PnP Monitor");
monitors[monitor_count].state_flags = DISPLAY_DEVICE_ATTACHED | DISPLAY_DEVICE_ACTIVE;
monitors[monitor_count].rc_monitor = displays[j].frame;
monitors[monitor_count].rc_work = displays[j].work_frame;
monitor_count++;
break;
capacity *= 2;
realloc_monitors = realloc(monitors, sizeof(*monitors) * capacity);
if (!realloc_monitors)
goto done;
monitors = realloc_monitors;
}
if (j == 0)
primary_index = monitor_count;
strcpy(monitors[monitor_count].name, "Generic Non-PnP Monitor");
monitors[monitor_count].state_flags = DISPLAY_DEVICE_ATTACHED | DISPLAY_DEVICE_ACTIVE;
monitors[monitor_count].rc_monitor = displays[j].frame;
monitors[monitor_count].rc_work = displays[j].work_frame;
monitor_count++;
break;
}
}
}
/* Make sure the first monitor on primary adapter is primary */
if (primary_index)
{
struct macdrv_monitor tmp;
tmp = monitors[0];
monitors[0] = monitors[primary_index];
monitors[primary_index] = tmp;
}
/* Make sure the first monitor on primary adapter is primary */
if (primary_index)
{
struct macdrv_monitor tmp;
tmp = monitors[0];
monitors[0] = monitors[primary_index];
monitors[primary_index] = tmp;
}
*new_monitors = monitors;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment