From bc34736534d3e288f985551ee16f3aace9675389 Mon Sep 17 00:00:00 2001 From: Vlad Zahorodnii Date: Wed, 23 Sep 2020 16:24:10 +0300 Subject: [PATCH] Use better window placement heuristics for internal clients Currently, we do some sort of window placement only for decorated internal windows, which feels hacky. With this change, all internal clients will go through the window placement code, unless it's a popup or the BypassWindowManagerHint flag is set. If the BypassWindowManagerHint flag is set, the window must have valid position. CCBUG: 400675 --- internal_client.cpp | 5 +++++ internal_client.h | 1 + workspace.cpp | 5 +++-- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/internal_client.cpp b/internal_client.cpp index bfecdd8c7..29335871e 100644 --- a/internal_client.cpp +++ b/internal_client.cpp @@ -211,6 +211,11 @@ bool InternalClient::isResizable() const return true; } +bool InternalClient::isPlaceable() const +{ + return !(m_internalWindowFlags & Qt::BypassWindowManagerHint) && !(m_internalWindowFlags & Qt::Popup); +} + bool InternalClient::noBorder() const { return m_userNoBorder || m_internalWindowFlags.testFlag(Qt::FramelessWindowHint) || m_internalWindowFlags.testFlag(Qt::Popup); diff --git a/internal_client.h b/internal_client.h index f718a27df..7433c70b0 100644 --- a/internal_client.h +++ b/internal_client.h @@ -45,6 +45,7 @@ public: bool isMovable() const override; bool isMovableAcrossScreens() const override; bool isResizable() const override; + bool isPlaceable() const override; bool noBorder() const override; bool userCanSetNoBorder() const override; bool wantsInput() const override; diff --git a/workspace.cpp b/workspace.cpp index a87a622e9..f8018f186 100644 --- a/workspace.cpp +++ b/workspace.cpp @@ -1810,8 +1810,9 @@ void Workspace::addInternalClient(InternalClient *client) setupClientConnections(client); client->updateLayer(); - if (client->isDecorated()) { - client->keepInArea(clientArea(FullScreenArea, client)); + if (client->isPlaceable()) { + const QRect area = clientArea(PlacementArea, screens()->current(), client->desktop()); + client->placeIn(area); } markXStackingOrderAsDirty();