[FancyZones] Windows resize on switching layout. (#12792)

This commit is contained in:
Seraphima Zykova
2021-08-18 14:00:28 +03:00
committed by GitHub
parent 8639740e6c
commit ec08a1d44a
4 changed files with 41 additions and 5 deletions

View File

@@ -722,6 +722,11 @@ void FancyZones::OnDisplayChange(DisplayChangeType changeType) noexcept
{ {
Trace::VirtualDesktopChanged(); Trace::VirtualDesktopChanged();
} }
if (m_currentDesktopId == GUID_NULL)
{
Logger::warn("Couldn't retrieve virtual desktop id");
}
} }
if (changeType == DisplayChangeType::Initialization) if (changeType == DisplayChangeType::Initialization)

View File

@@ -21,7 +21,7 @@ inline ZoneIndexSet GetZoneIndexSet(HWND window)
std::array<int, 2> data; std::array<int, 2> data;
memcpy(data.data(), &handle, sizeof data); memcpy(data.data(), &handle, sizeof data);
uint64_t bitmask = ((uint64_t)data[0] << 32) + data[1]; uint64_t bitmask = ((uint64_t)data[1] << 32) + data[0];
if (bitmask != 0) if (bitmask != 0)
{ {
@@ -39,8 +39,8 @@ inline ZoneIndexSet GetZoneIndexSet(HWND window)
inline void StampWindow(HWND window, Bitmask bitmask) noexcept inline void StampWindow(HWND window, Bitmask bitmask) noexcept
{ {
std::array<int, 2> data = { (bitmask >> 32), static_cast<int>(bitmask) }; std::array<int, 2> data = { static_cast<int>(bitmask), (bitmask >> 32) };
HANDLE rawData; HANDLE rawData;
memcpy(&rawData, data.data(), sizeof data); memcpy(&rawData, data.data(), sizeof data);
SetProp(window, ZonedWindowProperties::PropertyMultipleZoneID, rawData); SetProp(window, ZonedWindowProperties::PropertyMultipleZoneID, rawData);
} }

View File

@@ -167,7 +167,9 @@ std::optional<GUID> VirtualDesktop::GetCurrentVirtualDesktopId() const
} }
} }
return std::nullopt; desktopId = GetDesktopIdByTopLevelWindows();
return desktopId;
} }
std::optional<std::vector<GUID>> VirtualDesktop::GetVirtualDesktopIds(HKEY hKey) const std::optional<std::vector<GUID>> VirtualDesktop::GetVirtualDesktopIds(HKEY hKey) const
@@ -208,6 +210,34 @@ std::optional<std::vector<GUID>> VirtualDesktop::GetVirtualDesktopIds() const
return GetVirtualDesktopIds(GetVirtualDesktopsRegKey()); return GetVirtualDesktopIds(GetVirtualDesktopsRegKey());
} }
std::optional<GUID> VirtualDesktop::GetDesktopIdByTopLevelWindows() const
{
using result_t = std::vector<HWND>;
result_t result;
auto callback = [](HWND window, LPARAM data) -> BOOL {
result_t& result = *reinterpret_cast<result_t*>(data);
result.push_back(window);
return TRUE;
};
EnumWindows(callback, reinterpret_cast<LPARAM>(&result));
GUID id;
BOOL isWindowOnCurrentDesktop = false;
for (const auto window : result)
{
if (m_vdManager->IsWindowOnCurrentVirtualDesktop(window, &isWindowOnCurrentDesktop) == ERROR_SUCCESS && isWindowOnCurrentDesktop)
{
if (m_vdManager->GetWindowDesktopId(window, &id) == ERROR_SUCCESS && id != GUID_NULL)
{
return id;
}
}
}
return std::nullopt;
}
void VirtualDesktop::HandleVirtualDesktopUpdates() void VirtualDesktop::HandleVirtualDesktopUpdates()
{ {
HKEY virtualDesktopsRegKey = GetVirtualDesktopsRegKey(); HKEY virtualDesktopsRegKey = GetVirtualDesktopsRegKey();

View File

@@ -25,6 +25,7 @@ private:
OnThreadExecutor m_virtualDesktopTrackerThread; OnThreadExecutor m_virtualDesktopTrackerThread;
wil::unique_handle m_terminateVirtualDesktopTrackerEvent; wil::unique_handle m_terminateVirtualDesktopTrackerEvent;
std::optional<std::vector<GUID>> GetVirtualDesktopIds(HKEY hKey) const; std::optional<std::vector<GUID>> GetVirtualDesktopIds(HKEY hKey) const;
std::optional<GUID> GetDesktopIdByTopLevelWindows() const;
void HandleVirtualDesktopUpdates(); void HandleVirtualDesktopUpdates();
}; };