[FancyZones]Fix moving windows on other virtual desktops (#29059)

* clean up obsolete vd check

* clean up

* replace virtual desktop id usage

* check current vd
This commit is contained in:
Seraphima Zykova
2023-10-23 16:13:24 +02:00
committed by GitHub
parent 812b343776
commit 78a94aecb9
4 changed files with 25 additions and 166 deletions

View File

@@ -156,9 +156,9 @@ private:
void SyncVirtualDesktops() noexcept;
void UpdateHotkey(int hotkeyId, const PowerToysSettings::HotkeyObject& hotkeyObject, bool enable) noexcept;
bool MoveToAppLastZone(HWND window, HMONITOR monitor) noexcept;
bool MoveToAppLastZone(HWND window, HMONITOR monitor, GUID currentVirtualDesktop) noexcept;
void RefreshLayouts() noexcept;
bool ShouldProcessSnapHotkey(DWORD vkCode) noexcept;
void ApplyQuickLayout(int key) noexcept;
@@ -257,7 +257,6 @@ FancyZones::Run() noexcept
}
});
VirtualDesktop::instance().UpdateVirtualDesktopId();
SyncVirtualDesktops();
// id format of applied-layouts and app-zone-history was changed in 0.60
@@ -332,7 +331,7 @@ void FancyZones::MoveSizeEnd()
}
}
bool FancyZones::MoveToAppLastZone(HWND window, HMONITOR monitor) noexcept
bool FancyZones::MoveToAppLastZone(HWND window, HMONITOR monitor, GUID currentVirtualDesktop) noexcept
{
const auto& workAreas = m_workAreaConfiguration.GetAllWorkAreas();
WorkArea* workArea{ nullptr };
@@ -343,7 +342,7 @@ bool FancyZones::MoveToAppLastZone(HWND window, HMONITOR monitor) noexcept
if (workAreas.contains(monitor))
{
workArea = workAreas.at(monitor).get();
if (workArea)
if (workArea && workArea->UniqueId().virtualDesktopId == currentVirtualDesktop)
{
indexes = AppZoneHistory::instance().GetAppLastZoneIndexSet(window, workArea->UniqueId(), workArea->GetLayoutId());
}
@@ -357,7 +356,7 @@ bool FancyZones::MoveToAppLastZone(HWND window, HMONITOR monitor) noexcept
{
for (const auto& [_, secondaryWorkArea] : workAreas)
{
if (secondaryWorkArea)
if (secondaryWorkArea && secondaryWorkArea->UniqueId().virtualDesktopId == currentVirtualDesktop)
{
indexes = AppZoneHistory::instance().GetAppLastZoneIndexSet(window, secondaryWorkArea->UniqueId(), secondaryWorkArea->GetLayoutId());
workArea = secondaryWorkArea.get();
@@ -412,27 +411,28 @@ void FancyZones::WindowCreated(HWND window) noexcept
}
bool windowMovedToZone = false;
auto currentVirtualDesktop = VirtualDesktop::instance().GetCurrentVirtualDesktopIdFromRegistry();
if (moveToAppLastZone)
{
if (FancyZonesSettings::settings().spanZonesAcrossMonitors)
{
windowMovedToZone = MoveToAppLastZone(window, nullptr);
windowMovedToZone = MoveToAppLastZone(window, nullptr, currentVirtualDesktop);
}
else
{
// Search application history on currently active monitor.
windowMovedToZone = MoveToAppLastZone(window, active);
windowMovedToZone = MoveToAppLastZone(window, active, currentVirtualDesktop);
if (!windowMovedToZone && primary != active)
{
// Search application history on primary monitor.
windowMovedToZone = MoveToAppLastZone(window, primary);
windowMovedToZone = MoveToAppLastZone(window, primary, currentVirtualDesktop);
}
if (!windowMovedToZone)
{
// Search application history on remaining monitors.
windowMovedToZone = MoveToAppLastZone(window, nullptr);
windowMovedToZone = MoveToAppLastZone(window, nullptr, currentVirtualDesktop);
}
}
}
@@ -641,12 +641,10 @@ LRESULT FancyZones::WndProc(HWND window, UINT message, WPARAM wparam, LPARAM lpa
}
else if (message == WM_PRIV_INIT)
{
VirtualDesktop::instance().UpdateVirtualDesktopId();
OnDisplayChange(DisplayChangeType::Initialization);
}
else if (message == WM_PRIV_VD_SWITCH)
{
VirtualDesktop::instance().UpdateVirtualDesktopId();
OnDisplayChange(DisplayChangeType::VirtualDesktop);
}
else if (message == WM_PRIV_EDITOR)
@@ -745,10 +743,10 @@ void FancyZones::OnDisplayChange(DisplayChangeType changeType) noexcept
bool FancyZones::AddWorkArea(HMONITOR monitor, const FancyZonesDataTypes::WorkAreaId& id) noexcept
{
wil::unique_cotaskmem_string virtualDesktopIdStr;
if (!SUCCEEDED(StringFromCLSID(VirtualDesktop::instance().GetCurrentVirtualDesktopId(), &virtualDesktopIdStr)))
auto virtualDesktopIdStr = FancyZonesUtils::GuidToString(id.virtualDesktopId);
if (virtualDesktopIdStr)
{
Logger::debug(L"Add new work area on virtual desktop {}", virtualDesktopIdStr.get());
Logger::debug(L"Add new work area on virtual desktop {}", virtualDesktopIdStr.value());
}
FancyZonesUtils::Rect rect{};
@@ -794,11 +792,12 @@ void FancyZones::UpdateWorkAreas(bool updateWindowPositions) noexcept
Logger::debug(L"Update work areas, update windows positions: {}", updateWindowPositions);
m_workAreaConfiguration.Clear();
auto currentVirtualDesktop = VirtualDesktop::instance().GetCurrentVirtualDesktopIdFromRegistry();
if (FancyZonesSettings::settings().spanZonesAcrossMonitors)
{
FancyZonesDataTypes::WorkAreaId workAreaId;
workAreaId.virtualDesktopId = VirtualDesktop::instance().GetCurrentVirtualDesktopId();
workAreaId.virtualDesktopId = currentVirtualDesktop;
workAreaId.monitorId = { .deviceId = { .id = ZonedWindowProperties::MultiMonitorName, .instanceId = ZonedWindowProperties::MultiMonitorInstance } };
AddWorkArea(nullptr, workAreaId);
@@ -809,7 +808,7 @@ void FancyZones::UpdateWorkAreas(bool updateWindowPositions) noexcept
for (const auto& monitor : monitors)
{
FancyZonesDataTypes::WorkAreaId workAreaId;
workAreaId.virtualDesktopId = VirtualDesktop::instance().GetCurrentVirtualDesktopId();
workAreaId.virtualDesktopId = currentVirtualDesktop;
workAreaId.monitorId = monitor;
AddWorkArea(monitor.monitor, workAreaId);
@@ -906,7 +905,7 @@ void FancyZones::SyncVirtualDesktops() noexcept
// that case (00000000-0000-0000-0000-000000000000).
auto lastUsed = LastUsedVirtualDesktop::instance().GetId();
auto current = VirtualDesktop::instance().GetCurrentVirtualDesktopId();
auto current = VirtualDesktop::instance().GetCurrentVirtualDesktopIdFromRegistry();
auto guids = VirtualDesktop::instance().GetVirtualDesktopIdsFromRegistry();
if (current != lastUsed)