Skip to content

Commit

Permalink
[FancyZones] Windows resize on switching layout. (#12792)
Browse files Browse the repository at this point in the history
  • Loading branch information
SeraphimaZykova committed Aug 18, 2021
1 parent 8639740 commit ec08a1d
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 5 deletions.
5 changes: 5 additions & 0 deletions src/modules/fancyzones/FancyZonesLib/FancyZones.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -722,6 +722,11 @@ void FancyZones::OnDisplayChange(DisplayChangeType changeType) noexcept
{
Trace::VirtualDesktopChanged();
}

if (m_currentDesktopId == GUID_NULL)
{
Logger::warn("Couldn't retrieve virtual desktop id");
}
}

if (changeType == DisplayChangeType::Initialization)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ inline ZoneIndexSet GetZoneIndexSet(HWND window)

std::array<int, 2> 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)
{
Expand All @@ -39,8 +39,8 @@ inline ZoneIndexSet GetZoneIndexSet(HWND window)

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;
memcpy(&rawData, data.data(), sizeof data);
SetProp(window, ZonedWindowProperties::PropertyMultipleZoneID, rawData);
}
}
32 changes: 31 additions & 1 deletion src/modules/fancyzones/FancyZonesLib/VirtualDesktop.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -208,6 +210,34 @@ std::optional<std::vector<GUID>> VirtualDesktop::GetVirtualDesktopIds() const
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()
{
HKEY virtualDesktopsRegKey = GetVirtualDesktopsRegKey();
Expand Down
3 changes: 2 additions & 1 deletion src/modules/fancyzones/FancyZonesLib/VirtualDesktop.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ class VirtualDesktop
OnThreadExecutor m_virtualDesktopTrackerThread;
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();
};

0 comments on commit ec08a1d

Please sign in to comment.