From 29a49f865631013dd10093dc4a75fab930a15dc7 Mon Sep 17 00:00:00 2001 From: David Edmundson Date: Sun, 7 Oct 2018 17:51:42 +0100 Subject: [PATCH] [wayland] Use pending maximize mode in decoration updates Summary: The change to make maximize mode asynchronous featured the comment >Things are a bit complex with borders. Technically we >shouldn't update them till we get a response, but we also need to have >the correct geometry of the full size window in our request. For now >they behave as before, updating when we request the change. We call setNoBorder when we request the geometry but decoratedClient also checks the maximise mode, in order to follow the scheme above we need this to operate on the requested state not current state. X is unaffected. This fixes the borders being restored correct after maximize/restore. Test Plan: Chose a theme with visible borders Maximised a window and back They restored Reviewers: #kwin, zzag Reviewed By: #kwin, zzag Subscribers: zzag, kwin Tags: #kwin Differential Revision: https://phabricator.kde.org/D15991 --- abstract_client.cpp | 5 +++++ abstract_client.h | 9 +++++++++ decorations/decoratedclient.cpp | 4 ++-- shell_client.cpp | 5 +++++ shell_client.h | 2 ++ 5 files changed, 23 insertions(+), 2 deletions(-) diff --git a/abstract_client.cpp b/abstract_client.cpp index b4628f28df..9e5d7f3138 100644 --- a/abstract_client.cpp +++ b/abstract_client.cpp @@ -204,6 +204,11 @@ bool AbstractClient::isCurrentTab() const return !tab_group || tab_group->current() == this; } +MaximizeMode AbstractClient::requestedMaximizeMode() const +{ + return maximizeMode(); +} + xcb_timestamp_t AbstractClient::userTime() const { return XCB_TIME_CURRENT_TIME; diff --git a/abstract_client.h b/abstract_client.h index f65cf309f6..1dc2432cda 100644 --- a/abstract_client.h +++ b/abstract_client.h @@ -456,7 +456,16 @@ public: */ bool isCurrentTab() const; virtual QRect geometryRestore() const = 0; + /** + * The currently applied maximize mode + */ virtual MaximizeMode maximizeMode() const = 0; + /** + * The maximise mode requested by the server. + * For X this always matches maximizeMode, for wayland clients it + * is asyncronous + */ + virtual MaximizeMode requestedMaximizeMode() const; void maximize(MaximizeMode); void setMaximize(bool vertically, bool horizontally); virtual bool noBorder() const = 0; diff --git a/decorations/decoratedclient.cpp b/decorations/decoratedclient.cpp index 2664c44d5a..c574edd655 100644 --- a/decorations/decoratedclient.cpp +++ b/decorations/decoratedclient.cpp @@ -271,7 +271,7 @@ int DecoratedClientImpl::height() const bool DecoratedClientImpl::isMaximizedVertically() const { - return m_client->maximizeMode() & MaximizeVertical; + return m_client->requestedMaximizeMode() & MaximizeVertical; } bool DecoratedClientImpl::isMaximized() const @@ -281,7 +281,7 @@ bool DecoratedClientImpl::isMaximized() const bool DecoratedClientImpl::isMaximizedHorizontally() const { - return m_client->maximizeMode() & MaximizeHorizontal; + return m_client->requestedMaximizeMode() & MaximizeHorizontal; } Qt::Edges DecoratedClientImpl::adjacentScreenEdges() const diff --git a/shell_client.cpp b/shell_client.cpp index 12f53d57a9..ace5697520 100644 --- a/shell_client.cpp +++ b/shell_client.cpp @@ -914,6 +914,11 @@ MaximizeMode ShellClient::maximizeMode() const return m_maximizeMode; } +MaximizeMode ShellClient::requestedMaximizeMode() const +{ + return m_requestedMaximizeMode; +} + bool ShellClient::noBorder() const { if (isInternal()) { diff --git a/shell_client.h b/shell_client.h index 0232770a9a..f9ea0e65e8 100644 --- a/shell_client.h +++ b/shell_client.h @@ -95,6 +95,8 @@ public: } void hideClient(bool hide) override; MaximizeMode maximizeMode() const override; + MaximizeMode requestedMaximizeMode() const override; + QRect geometryRestore() const override { return m_geomMaximizeRestore; }