diff --git a/abstract_client.h b/abstract_client.h --- a/abstract_client.h +++ b/abstract_client.h @@ -385,7 +385,7 @@ virtual bool isShadeable() const; virtual bool isMaximizable() const = 0; virtual bool isMinimizable() const = 0; - virtual QRect iconGeometry() const = 0; + virtual QRect iconGeometry() const; virtual bool userCanSetFullScreen() const = 0; virtual bool userCanSetNoBorder() const = 0; virtual void setOnAllActivities(bool set) = 0; diff --git a/abstract_client.cpp b/abstract_client.cpp --- a/abstract_client.cpp +++ b/abstract_client.cpp @@ -1598,4 +1598,33 @@ // TODO: handle Options::FocusStrictlyUnderMouse } +QRect AbstractClient::iconGeometry() const +{ + if (!windowManagementInterface() || !waylandServer()) { + // window management interface is only available if the surface is mapped + return QRect(); + } + + int minDistance = INT_MAX; + AbstractClient *candidatePanel = nullptr; + QRect candidateGeom; + + for (auto i = windowManagementInterface()->minimizedGeometries().constBegin(), end = windowManagementInterface()->minimizedGeometries().constEnd(); i != end; ++i) { + AbstractClient *client = waylandServer()->findAbstractClient(i.key()); + if (!client) { + continue; + } + const int distance = QPoint(client->pos() - pos()).manhattanLength(); + if (distance < minDistance) { + minDistance = distance; + candidatePanel = client; + candidateGeom = i.value(); + } + } + if (!candidatePanel) { + return QRect(); + } + return candidateGeom.translated(candidatePanel->pos()); +} + } diff --git a/client.cpp b/client.cpp --- a/client.cpp +++ b/client.cpp @@ -737,7 +737,7 @@ return geom; } // No mainwindow (or their parents) with icon geometry was found - return QRect(); + return AbstractClient::iconGeometry(); } } diff --git a/shell_client.h b/shell_client.h --- a/shell_client.h +++ b/shell_client.h @@ -69,7 +69,6 @@ bool isFullScreen() const override; bool isMaximizable() const override; bool isMinimizable() const override; - QRect iconGeometry() const override; bool isMovable() const override; bool isMovableAcrossScreens() const override; bool isResizable() const override; diff --git a/shell_client.cpp b/shell_client.cpp --- a/shell_client.cpp +++ b/shell_client.cpp @@ -581,35 +581,6 @@ return (!m_plasmaShellSurface || m_plasmaShellSurface->role() == PlasmaShellSurfaceInterface::Role::Normal); } -QRect ShellClient::iconGeometry() const -{ - if (!windowManagementInterface()) { - // window management interface is only available if the surface is mapped - return QRect(); - } - - int minDistance = INT_MAX; - ShellClient *candidatePanel = nullptr; - QRect candidateGeom; - - for (auto i = windowManagementInterface()->minimizedGeometries().constBegin(), end = windowManagementInterface()->minimizedGeometries().constEnd(); i != end; ++i) { - ShellClient *client = waylandServer()->findClient(i.key()); - if (!client) { - continue; - } - const int distance = QPoint(client->pos() - pos()).manhattanLength(); - if (distance < minDistance) { - minDistance = distance; - candidatePanel = client; - candidateGeom = i.value(); - } - } - if (!candidatePanel) { - return QRect(); - } - return candidateGeom.translated(candidatePanel->pos()); -} - bool ShellClient::isMovable() const { if (m_plasmaShellSurface) { diff --git a/wayland_server.h b/wayland_server.h --- a/wayland_server.h +++ b/wayland_server.h @@ -108,6 +108,7 @@ void removeClient(ShellClient *c); ShellClient *findClient(quint32 id) const; ShellClient *findClient(KWayland::Server::SurfaceInterface *surface) const; + AbstractClient *findAbstractClient(KWayland::Server::SurfaceInterface *surface) const; ShellClient *findClient(QWindow *w) const; /** diff --git a/wayland_server.cpp b/wayland_server.cpp --- a/wayland_server.cpp +++ b/wayland_server.cpp @@ -561,6 +561,11 @@ return nullptr; } +AbstractClient *WaylandServer::findAbstractClient(SurfaceInterface *surface) const +{ + return findClient(surface); +} + ShellClient *WaylandServer::findClient(QWindow *w) const { if (!w) {