[FancyZones] Retry monitor identification attempt (#27005)

* retry monitor identification

* check displays after retries

* reduce waiting time

* 30ms waiting time

* keep fallback values
This commit is contained in:
Seraphima Zykova
2023-06-23 22:02:36 +02:00
committed by GitHub
parent 9511d17063
commit 8dcdcbaa37
2 changed files with 24 additions and 11 deletions

View File

@@ -219,11 +219,12 @@ namespace MonitorUtils
return result; return result;
} }
std::vector<FancyZonesDataTypes::MonitorId> GetDisplays() std::pair<bool, std::vector<FancyZonesDataTypes::MonitorId>> GetDisplays()
{ {
auto allMonitors = FancyZonesUtils::GetAllMonitorInfo<&MONITORINFOEX::rcWork>(); bool success = true;
std::vector<FancyZonesDataTypes::MonitorId> result{}; std::vector<FancyZonesDataTypes::MonitorId> result{};
auto allMonitors = FancyZonesUtils::GetAllMonitorInfo<&MONITORINFOEX::rcWork>();
for (auto& monitorData : allMonitors) for (auto& monitorData : allMonitors)
{ {
auto monitorInfo = monitorData.second; auto monitorInfo = monitorData.second;
@@ -269,10 +270,12 @@ namespace MonitorUtils
} }
else else
{ {
// Use the display name when no proper device was found. success = false;
// Use the display name as a fallback value when no proper device was found.
monitorId.deviceId.id = monitorInfo.szDevice; monitorId.deviceId.id = monitorInfo.szDevice;
monitorId.deviceId.instanceId = L""; monitorId.deviceId.instanceId = L"";
Logger::info(L"No active monitor found for {} : {}", monitorInfo.szDevice, get_last_error_or_default(GetLastError()));
try try
{ {
std::wstring numberStr = monitorInfo.szDevice; // \\.\DISPLAY1 std::wstring numberStr = monitorInfo.szDevice; // \\.\DISPLAY1
@@ -289,7 +292,7 @@ namespace MonitorUtils
result.push_back(std::move(monitorId)); result.push_back(std::move(monitorId));
} }
return result; return {success, result};
} }
} }
@@ -367,12 +370,22 @@ namespace MonitorUtils
{ {
Logger::info(L"Identifying monitors"); Logger::info(L"Identifying monitors");
auto displays = Display::GetDisplays(); auto displaysResult = Display::GetDisplays();
auto monitors = WMI::GetHardwareMonitorIds(); auto monitors = WMI::GetHardwareMonitorIds();
// retry
int retryCounter = 0;
while (!displaysResult.first && retryCounter < 100)
{
Logger::info("Retry display identification");
std::this_thread::sleep_for(std::chrono::milliseconds(30));
displaysResult = Display::GetDisplays();
retryCounter++;
}
for (const auto& monitor : monitors) for (const auto& monitor : monitors)
{ {
for (auto& display : displays) for (auto& display : displaysResult.second)
{ {
if (monitor.deviceId.id == display.deviceId.id) if (monitor.deviceId.id == display.deviceId.id)
{ {
@@ -381,7 +394,7 @@ namespace MonitorUtils
} }
} }
return displays; return displaysResult.second;
} }
FancyZonesUtils::Rect GetWorkAreaRect(HMONITOR monitor) FancyZonesUtils::Rect GetWorkAreaRect(HMONITOR monitor)

View File

@@ -7,7 +7,7 @@ namespace MonitorUtils
{ {
namespace Display namespace Display
{ {
std::vector<FancyZonesDataTypes::MonitorId> GetDisplays(); std::pair<bool, std::vector<FancyZonesDataTypes::MonitorId>> GetDisplays();
FancyZonesDataTypes::DeviceId SplitDisplayDeviceId(const std::wstring& str) noexcept; FancyZonesDataTypes::DeviceId SplitDisplayDeviceId(const std::wstring& str) noexcept;
FancyZonesDataTypes::DeviceId ConvertObsoleteDeviceId(const std::wstring& str) noexcept; FancyZonesDataTypes::DeviceId ConvertObsoleteDeviceId(const std::wstring& str) noexcept;
} }