From 455c5c07a03ccf12be8b771361bc0733d57b2c52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Gr=C3=A4=C3=9Flin?= Date: Mon, 22 Aug 2016 16:55:48 +0200 Subject: [PATCH] Move implementation of iconGeometry from ShellClient to AbstractClient Summary: This allows Client to use the Wayland-specific implementation if there is no icon geometry set through the X11 way. That way Xwayland windows have an icon geometry even if Plasma is using Wayland and setting the icon geometry in the Wayland way. Which is expected as Plasma is ignorant about the windowing system a PlasmaWindow uses. In order to move the code from ShellClient to AbstractClient WaylandServer gained a new findAbstractClient(Surface*) method which is just like findClient(Surface*) with the difference that it returns an AbstractClient instead of a ShellClient*. Test Plan: minimized/unminimized an X client on Wayland, verified animation is correct (though broken in general for minimize) Reviewers: #kwin, #plasma_on_wayland Subscribers: plasma-devel, kwin Tags: #plasma_on_wayland, #kwin Differential Revision: https://phabricator.kde.org/D2530 --- abstract_client.cpp | 29 +++++++++++++++++++++++++++++ abstract_client.h | 2 +- client.cpp | 2 +- shell_client.cpp | 29 ----------------------------- shell_client.h | 1 - wayland_server.cpp | 5 +++++ wayland_server.h | 1 + 7 files changed, 37 insertions(+), 32 deletions(-) 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; /**