diff --git a/abstract_client.cpp b/abstract_client.cpp index a15989a5e7..91538e27f9 100644 --- a/abstract_client.cpp +++ b/abstract_client.cpp @@ -1598,4 +1598,33 @@ void AbstractClient::leaveEvent() // 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/abstract_client.h b/abstract_client.h index 3d02289830..1a31234b5d 100644 --- a/abstract_client.h +++ b/abstract_client.h @@ -385,7 +385,7 @@ public: 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/client.cpp b/client.cpp index e52f7cca9b..dc17659534 100644 --- a/client.cpp +++ b/client.cpp @@ -737,7 +737,7 @@ QRect Client::iconGeometry() const return geom; } // No mainwindow (or their parents) with icon geometry was found - return QRect(); + return AbstractClient::iconGeometry(); } } diff --git a/shell_client.cpp b/shell_client.cpp index 98c71d57e0..5a8e5467b4 100644 --- a/shell_client.cpp +++ b/shell_client.cpp @@ -581,35 +581,6 @@ bool ShellClient::isMinimizable() const 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/shell_client.h b/shell_client.h index 86520929d1..ac3e1f62a2 100644 --- a/shell_client.h +++ b/shell_client.h @@ -69,7 +69,6 @@ public: 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/wayland_server.cpp b/wayland_server.cpp index 83709d12a4..099adcd269 100644 --- a/wayland_server.cpp +++ b/wayland_server.cpp @@ -561,6 +561,11 @@ ShellClient *WaylandServer::findClient(SurfaceInterface *surface) const return nullptr; } +AbstractClient *WaylandServer::findAbstractClient(SurfaceInterface *surface) const +{ + return findClient(surface); +} + ShellClient *WaylandServer::findClient(QWindow *w) const { if (!w) { diff --git a/wayland_server.h b/wayland_server.h index f2d13ac7e7..eabfa394c6 100644 --- a/wayland_server.h +++ b/wayland_server.h @@ -108,6 +108,7 @@ public: 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; /**