mirror of
https://github.com/microsoft/PowerToys.git
synced 2025-12-16 11:48:06 +01:00
[FancyZones] Windows resize on switching layout. (#12792)
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
@@ -39,7 +39,7 @@ 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);
|
||||
|
||||
@@ -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
|
||||
@@ -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();
|
||||
|
||||
@@ -26,5 +26,6 @@ private:
|
||||
wil::unique_handle m_terminateVirtualDesktopTrackerEvent;
|
||||
|
||||
std::optional<std::vector<GUID>> GetVirtualDesktopIds(HKEY hKey) const;
|
||||
std::optional<GUID> GetDesktopIdByTopLevelWindows() const;
|
||||
void HandleVirtualDesktopUpdates();
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user