workspace: Update focus when a window is moved away from the current desktop

If a focussed window is to a new virtual desktop we need to update focus. It
does not make sense for focus to remain on a now-invisible window. This patch
re-uses the same path as when virtual desktop is changed.

BUG: 481574


(cherry picked from commit b96e6cf0b3)

Co-authored-by: David Edmundson <kde@davidedmundson.co.uk>
wilder/Plasma/6.2
David Edmundson 2 years ago committed by Vlad Zahorodnii
parent 46357b60a3
commit 8e20932d3f
  1. 7
      autotests/integration/kwinbindings_test.cpp
  2. 11
      src/workspace.cpp
  3. 2
      src/workspace.h

@ -238,10 +238,17 @@ void KWinBindingsTest::testWindowToDesktop()
invokeShortcut(desktop);
QVERIFY(desktopsChangedSpy.wait());
QCOMPARE(window->desktops(), QList<VirtualDesktop *>{desktops.at(desktop - 1)});
// window to Desktop does not change the current desktop, change it manually
VirtualDesktopManager::self()->setCurrent(desktops.at(desktop - 1));
// back to desktop 1
invokeShortcut(1);
QVERIFY(desktopsChangedSpy.wait());
QCOMPARE(window->desktops(), QList<VirtualDesktop *>{desktops.at(0)});
VirtualDesktopManager::self()->setCurrent(desktops.at(0));
// invoke with one desktop too many
invokeShortcut(desktop + 1);
// that should fail

@ -932,7 +932,7 @@ void Workspace::slotCurrentDesktopChanged(VirtualDesktop *oldDesktop, VirtualDes
// Restore the focus on this desktop
--block_focus;
activateWindowOnNewDesktop(newDesktop);
activateWindowOnDesktop(newDesktop);
Q_EMIT currentDesktopChanged(oldDesktop, m_moveResizeWindow);
}
@ -985,7 +985,7 @@ void Workspace::updateWindowVisibilityOnDesktopChange(VirtualDesktop *newDesktop
}
}
void Workspace::activateWindowOnNewDesktop(VirtualDesktop *desktop)
void Workspace::activateWindowOnDesktop(VirtualDesktop *desktop)
{
Window *window = nullptr;
if (options->focusPolicyIsReasonable()) {
@ -1476,6 +1476,7 @@ void Workspace::sendWindowToDesktops(Window *window, const QList<VirtualDesktop
{
const QList<VirtualDesktop *> oldDesktops = window->desktops();
const bool wasOnCurrent = window->isOnCurrentDesktop();
const bool wasActive = window->isActive();
window->setDesktops(desktops);
if (window->desktops() != desktops) { // No change or desktop forced
return;
@ -1489,7 +1490,13 @@ void Workspace::sendWindowToDesktops(Window *window, const QList<VirtualDesktop
restackWindowUnderActive(window);
}
} else {
// raise the window on the desktop it has been added to
raiseWindow(window);
// but set a new active window on the current desktop
if (wasActive) {
activateWindowOnDesktop(VirtualDesktopManager::self()->currentDesktop());
}
}
window->checkWorkspacePosition(QRect(), oldDesktops.isEmpty() ? nullptr : oldDesktops.last());

@ -637,7 +637,7 @@ private:
void closeActivePopup();
void updateWindowVisibilityOnDesktopChange(VirtualDesktop *newDesktop);
void activateWindowOnNewDesktop(VirtualDesktop *desktop);
void activateWindowOnDesktop(VirtualDesktop *desktop);
Window *findWindowToActivateOnDesktop(VirtualDesktop *desktop);
void removeWindow(Window *window);
QString getPlacementTrackerHash();

Loading…
Cancel
Save