From ca39b1c22dfa2dd79cde700163c6b04c1caf8146 Mon Sep 17 00:00:00 2001 From: Zhiyi Zhang Date: Thu, 12 Sep 2019 21:39:24 +0800 Subject: [PATCH] user32: Don't report mirrored slave monitors in EnumDisplayMonitors. Mirrored slave monitors don't get enumerated by EnumDisplayMonitors. For example, if two monitors are in mirrored mode, only one of them is reported by EnumDisplayMonitors. Signed-off-by: Zhiyi Zhang Signed-off-by: Alexandre Julliard --- dlls/user32/sysparams.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/dlls/user32/sysparams.c b/dlls/user32/sysparams.c index 09cebc2f620..b407b518117 100644 --- a/dlls/user32/sysparams.c +++ b/dlls/user32/sysparams.c @@ -3750,7 +3750,8 @@ static BOOL update_monitor_cache(void) HANDLE mutex = NULL; DWORD state_flags; BOOL ret = FALSE; - DWORD i = 0; + BOOL mirrored_slave; + DWORD i = 0, j; DWORD type; /* Update monitor cache from SetupAPI if it's outdated */ @@ -3794,6 +3795,20 @@ static BOOL update_monitor_cache(void) if (!SetupDiGetDevicePropertyW( devinfo, &device_data, &WINE_DEVPROPKEY_MONITOR_RCMONITOR, &type, (BYTE *)&monitors[monitor_count].rcMonitor, sizeof(RECT), NULL, 0 )) goto fail; + + /* Mirrored slave monitors also don't get enumerated */ + mirrored_slave = FALSE; + for (j = 0; j < monitor_count; j++) + { + if (EqualRect(&monitors[j].rcMonitor, &monitors[monitor_count].rcMonitor)) + { + mirrored_slave = TRUE; + break; + } + } + if (mirrored_slave) + continue; + if (!SetupDiGetDevicePropertyW( devinfo, &device_data, &WINE_DEVPROPKEY_MONITOR_RCWORK, &type, (BYTE *)&monitors[monitor_count].rcWork, sizeof(RECT), NULL, 0 )) goto fail;