From 6a75641ca9dcf5113598fdfaf69149e29761001b Mon Sep 17 00:00:00 2001 From: jules Date: Fri, 21 Feb 2014 13:16:33 +0000 Subject: [PATCH] Better detection of win32 main monitor. --- .../native/juce_win32_Windowing.cpp | 37 +++++++++++-------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/modules/juce_gui_basics/native/juce_win32_Windowing.cpp b/modules/juce_gui_basics/native/juce_win32_Windowing.cpp index 6d62c85976..1d8b9daccd 100644 --- a/modules/juce_gui_basics/native/juce_win32_Windowing.cpp +++ b/modules/juce_gui_basics/native/juce_win32_Windowing.cpp @@ -3181,10 +3181,22 @@ void Desktop::setKioskComponent (Component* kioskModeComponent, bool enableOrDis } //============================================================================== -static BOOL CALLBACK enumMonitorsProc (HMONITOR, HDC, LPRECT r, LPARAM userInfo) +struct MonitorInfo { - Array >* const monitorCoords = (Array >*) userInfo; - monitorCoords->add (rectangleFromRECT (*r)); + MonitorInfo (Rectangle rect, bool main) noexcept : isMain (main), bounds (rect) {} + + Rectangle bounds; + bool isMain; +}; + +static BOOL CALLBACK enumMonitorsProc (HMONITOR hm, HDC, LPRECT r, LPARAM userInfo) +{ + MONITORINFO info = { 0 }; + info.cbSize = sizeof (info); + GetMonitorInfo (hm, &info); + const bool isMain = (info.dwFlags & 1 /* MONITORINFOF_PRIMARY */) != 0; + ((Array*) userInfo)->add (MonitorInfo (rectangleFromRECT (*r), isMain)); + return TRUE; } @@ -3192,16 +3204,11 @@ void Desktop::Displays::findDisplays (float masterScale) { setDPIAwareness(); - Array > monitors; + Array monitors; EnumDisplayMonitors (0, 0, &enumMonitorsProc, (LPARAM) &monitors); - // make sure the first in the list is the main monitor - for (int i = 1; i < monitors.size(); ++i) - if (monitors.getReference(i).getPosition().isOrigin()) - monitors.swap (i, 0); - if (monitors.size() == 0) - monitors.add (rectangleFromRECT (getWindowRect (GetDesktopWindow()))); + monitors.add (MonitorInfo (rectangleFromRECT (getWindowRect (GetDesktopWindow())), true)); RECT workArea; SystemParametersInfo (SPI_GETWORKAREA, 0, &workArea, 0); @@ -3211,12 +3218,12 @@ void Desktop::Displays::findDisplays (float masterScale) for (int i = 0; i < monitors.size(); ++i) { Display d; - d.userArea = d.totalArea = monitors.getReference(i) / masterScale; - d.isMain = (i == 0); - d.scale = masterScale; - d.dpi = dpi; + d.userArea = d.totalArea = monitors.getReference(i).bounds / masterScale; + d.isMain = monitors.getReference(i).isMain; + d.scale = masterScale; + d.dpi = dpi; - if (i == 0) + if (d.isMain) d.userArea = d.userArea.getIntersection (rectangleFromRECT (workArea) / masterScale); displays.add (d);