diff --git a/autotests/integration/internal_window.cpp b/autotests/integration/internal_window.cpp index 0ec728ffab..ca4d105007 100644 --- a/autotests/integration/internal_window.cpp +++ b/autotests/integration/internal_window.cpp @@ -196,6 +196,8 @@ void InternalWindowTest::testEnterLeave() QSignalSpy clientAddedSpy(waylandServer(), &WaylandServer::shellClientAdded); QVERIFY(clientAddedSpy.isValid()); HelperWindow win; + QVERIFY(!workspace()->findToplevel(nullptr)); + QVERIFY(!workspace()->findToplevel(&win)); win.setGeometry(0, 0, 100, 100); win.show(); @@ -204,6 +206,7 @@ void InternalWindowTest::testEnterLeave() QVERIFY(!workspace()->activeClient()); ShellClient *c = clientAddedSpy.first().first().value(); QVERIFY(c->isInternal()); + QCOMPARE(workspace()->findToplevel(&win), c); QCOMPARE(c->geometry(), QRect(0, 0, 100, 100)); QSignalSpy enterSpy(&win, &HelperWindow::entered); diff --git a/workspace.cpp b/workspace.cpp index 2cc43a5718..bfcc2a8f17 100644 --- a/workspace.cpp +++ b/workspace.cpp @@ -1707,6 +1707,19 @@ Toplevel *Workspace::findToplevel(std::function func) co return nullptr; } +Toplevel *Workspace::findToplevel(QWindow *w) const +{ + if (!w) { + return nullptr; + } + if (waylandServer()) { + if (auto c = waylandServer()->findClient(w)) { + return c; + } + } + return findUnmanaged(w->winId()); +} + bool Workspace::hasClient(const AbstractClient *c) { if (auto cc = dynamic_cast(c)) { diff --git a/workspace.h b/workspace.h index 5589f7d891..e7a131d644 100644 --- a/workspace.h +++ b/workspace.h @@ -127,6 +127,11 @@ public: Unmanaged *findUnmanaged(xcb_window_t w) const; void forEachUnmanaged(std::function func); Toplevel *findToplevel(std::function func) const; + /** + * Finds the Toplevel for the KWin internal window @p w. + * On Wayland this is normally a ShellClient. For X11 an Unmanaged. + **/ + Toplevel *findToplevel(QWindow *w) const; /** * @brief Finds a Toplevel for the internal window @p w. *