Skip to content

Commit

Permalink
[FancyZones] Obtain device id (#8453)
Browse files Browse the repository at this point in the history
  • Loading branch information
SeraphimaZykova committed Dec 7, 2020
1 parent 9d39952 commit 1240598
Show file tree
Hide file tree
Showing 3 changed files with 67 additions and 76 deletions.
82 changes: 37 additions & 45 deletions src/modules/fancyzones/lib/FancyZones.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -638,42 +638,56 @@ void FancyZones::ToggleEditor() noexcept
std::vector<std::pair<HMONITOR, MONITORINFOEX>> allMonitors;
allMonitors = FancyZonesUtils::GetAllMonitorInfo<&MONITORINFOEX::rcWork>();

// device id map
std::unordered_map<std::wstring, DWORD> displayDeviceIdxMap;

bool showDpiWarning = false;
int prevDpiX = -1, prevDpiY = -1;
std::wstring monitorsData;
for (auto& monitor : allMonitors)
std::wstring monitorsDataStr;
for (auto& monitorData : allMonitors)
{
auto monitorId = FancyZonesUtils::GenerateMonitorId(monitor.second, monitor.first, m_currentDesktopId);
if (monitor.first == targetMonitor)
HMONITOR monitor = monitorData.first;
auto monitorInfo = monitorData.second;

std::wstring monitorId;
std::wstring deviceId = FancyZonesUtils::GetDisplayDeviceId(monitorInfo.szDevice, displayDeviceIdxMap);
wil::unique_cotaskmem_string virtualDesktopId;
if (SUCCEEDED(StringFromCLSID(m_currentDesktopId, &virtualDesktopId)))
{
monitorId = FancyZonesUtils::GenerateUniqueId(monitor, deviceId, virtualDesktopId.get());
}
else
{
params += *monitorId + divider; /* Monitor id where the Editor should be opened */
continue;
}

if (monitorId.has_value())
if (monitor == targetMonitor)
{
monitorsData += std::move(*monitorId) + divider; /* Monitor id */
params += monitorId + divider; /* Monitor id where the Editor should be opened */
}

UINT dpiX = 0;
UINT dpiY = 0;
if (GetDpiForMonitor(monitor.first, MDT_EFFECTIVE_DPI, &dpiX, &dpiY) == S_OK)
{
monitorsData += std::to_wstring(dpiX) + divider; /* DPI */
if (spanZonesAcrossMonitors && prevDpiX != -1 && (prevDpiX != dpiX || prevDpiY != dpiY))
{
showDpiWarning = true;
}
monitorsDataStr += std::move(monitorId) + divider; /* Monitor id */

prevDpiX = dpiX;
prevDpiY = dpiY;
UINT dpiX = 0;
UINT dpiY = 0;
if (GetDpiForMonitor(monitor, MDT_EFFECTIVE_DPI, &dpiX, &dpiY) == S_OK)
{
monitorsDataStr += std::to_wstring(dpiX) + divider; /* DPI */
if (spanZonesAcrossMonitors && prevDpiX != -1 && (prevDpiX != dpiX || prevDpiY != dpiY))
{
showDpiWarning = true;
}

monitorsData += std::to_wstring(monitor.second.rcMonitor.left) + divider;
monitorsData += std::to_wstring(monitor.second.rcMonitor.top) + divider;
prevDpiX = dpiX;
prevDpiY = dpiY;
}

monitorsDataStr += std::to_wstring(monitorInfo.rcMonitor.left) + divider;
monitorsDataStr += std::to_wstring(monitorInfo.rcMonitor.top) + divider;
}

params += std::to_wstring(allMonitors.size()) + divider; /* Monitors count */
params += monitorsData;
params += monitorsDataStr;

if (showDpiWarning)
{
Expand Down Expand Up @@ -951,30 +965,8 @@ void FancyZones::UpdateZoneWindows() noexcept
auto& displayDeviceIdxMap = *(params->displayDeviceIdx);
FancyZones* fancyZones = params->fancyZones;

DISPLAY_DEVICE displayDevice{ .cb = sizeof(displayDevice) };
std::wstring deviceId;
while (EnumDisplayDevicesW(mi.szDevice, displayDeviceIdxMap[mi.szDevice], &displayDevice, EDD_GET_DEVICE_INTERFACE_NAME))
{
++displayDeviceIdxMap[mi.szDevice];
// Only take active monitors (presented as being "on" by the respective GDI view) and monitors that don't
// represent a pseudo device used to mirror application drawing.
if (WI_IsFlagSet(displayDevice.StateFlags, DISPLAY_DEVICE_ACTIVE) &&
WI_IsFlagClear(displayDevice.StateFlags, DISPLAY_DEVICE_MIRRORING_DRIVER))
{
deviceId = displayDevice.DeviceID;
fancyZones->AddZoneWindow(monitor, deviceId);
break;
}
}

if (deviceId.empty())
{
deviceId = GetSystemMetrics(SM_REMOTESESSION) ?
L"\\\\?\\DISPLAY#REMOTEDISPLAY#" :
L"\\\\?\\DISPLAY#LOCALDISPLAY#";

fancyZones->AddZoneWindow(monitor, deviceId);
}
std::wstring deviceId = FancyZonesUtils::GetDisplayDeviceId(mi.szDevice, displayDeviceIdxMap);
fancyZones->AddZoneWindow(monitor, deviceId);
}
return TRUE;
};
Expand Down
58 changes: 28 additions & 30 deletions src/modules/fancyzones/lib/util.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,34 @@ namespace FancyZonesUtils
}

typedef BOOL(WINAPI* GetDpiForMonitorInternalFunc)(HMONITOR, UINT, UINT*, UINT*);
std::wstring GetDisplayDeviceId(const std::wstring& device, std::unordered_map<std::wstring, DWORD>& displayDeviceIdxMap)
{
DISPLAY_DEVICE displayDevice{ .cb = sizeof(displayDevice) };
std::wstring deviceId;
while (EnumDisplayDevicesW(device.c_str(), displayDeviceIdxMap[device], &displayDevice, EDD_GET_DEVICE_INTERFACE_NAME))
{
++displayDeviceIdxMap[device];

// Only take active monitors (presented as being "on" by the respective GDI view) and monitors that don't
// represent a pseudo device used to mirror application drawing.
if (WI_IsFlagSet(displayDevice.StateFlags, DISPLAY_DEVICE_ACTIVE) &&
WI_IsFlagClear(displayDevice.StateFlags, DISPLAY_DEVICE_MIRRORING_DRIVER))
{
deviceId = displayDevice.DeviceID;
break;
}
}

if (deviceId.empty())
{
deviceId = GetSystemMetrics(SM_REMOTESESSION) ?
L"\\\\?\\DISPLAY#REMOTEDISPLAY#" :
L"\\\\?\\DISPLAY#LOCALDISPLAY#";
}

return deviceId;
}

UINT GetDpiForMonitor(HMONITOR monitor) noexcept
{
UINT dpi{};
Expand Down Expand Up @@ -582,36 +610,6 @@ namespace FancyZonesUtils
return result;
}

std::optional<std::wstring> GenerateMonitorId(MONITORINFOEX mi, HMONITOR monitor, const GUID& virtualDesktopId)
{
DISPLAY_DEVICE displayDevice = { sizeof(displayDevice) };
PCWSTR deviceId = nullptr;

bool validMonitor = true;
if (EnumDisplayDevices(mi.szDevice, 0, &displayDevice, 1))
{
if (displayDevice.DeviceID[0] != L'\0')
{
deviceId = displayDevice.DeviceID;
}
}

if (!deviceId)
{
deviceId = GetSystemMetrics(SM_REMOTESESSION) ?
L"\\\\?\\DISPLAY#REMOTEDISPLAY#" :
L"\\\\?\\DISPLAY#LOCALDISPLAY#";
}

wil::unique_cotaskmem_string vdId;
if (SUCCEEDED(StringFromCLSID(virtualDesktopId, &vdId)))
{
return GenerateUniqueId(monitor, deviceId, vdId.get());
}

return std::nullopt;
}

size_t ChooseNextZoneByPosition(DWORD vkCode, RECT windowRect, const std::vector<RECT>& zoneRects) noexcept
{
using complex = std::complex<double>;
Expand Down
3 changes: 2 additions & 1 deletion src/modules/fancyzones/lib/util.h
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,8 @@ namespace FancyZonesUtils
return result;
}

std::wstring GetDisplayDeviceId(const std::wstring& device, std::unordered_map<std::wstring, DWORD>& displayDeviceIdxMap);

UINT GetDpiForMonitor(HMONITOR monitor) noexcept;
void OrderMonitors(std::vector<std::pair<HMONITOR, RECT>>& monitorInfo);
void SizeWindowToRect(HWND window, RECT rect) noexcept;
Expand All @@ -202,7 +204,6 @@ namespace FancyZonesUtils

std::wstring GenerateUniqueId(HMONITOR monitor, const std::wstring& devideId, const std::wstring& virtualDesktopId);
std::wstring GenerateUniqueIdAllMonitorsArea(const std::wstring& virtualDesktopId);
std::optional<std::wstring> GenerateMonitorId(MONITORINFOEX mi, HMONITOR monitor, const GUID& virtualDesktopId);

std::wstring TrimDeviceId(const std::wstring& deviceId);
std::optional<FancyZonesDataTypes::DeviceIdData> ParseDeviceId(const std::wstring& deviceId);
Expand Down

0 comments on commit 1240598

Please sign in to comment.