From 013de158b720c4bcb7f01b4f0bbe836d4262f82e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Gr=C3=A4=C3=9Flin?= Date: Mon, 18 Apr 2016 11:55:40 +0200 Subject: [PATCH] Move ShellClient initialization code into a dedicated init method Summary: Preparation for also supporting XdgShell. There will be different ctors for ShellSurface and XdgShell, but most code needs to be shared. Thus a dedicated init method is needed. There is some restructuring in the init. All code depending on ShellSurface being set is grouped and in an if block. Reviewers: #plasma Subscribers: plasma-devel Projects: #plasma Differential Revision: https://phabricator.kde.org/D1440 --- shell_client.cpp | 145 +++++++++++++++++++++++++---------------------- shell_client.h | 1 + 2 files changed, 78 insertions(+), 68 deletions(-) diff --git a/shell_client.cpp b/shell_client.cpp index fed1d88c23..d6b8c21972 100644 --- a/shell_client.cpp +++ b/shell_client.cpp @@ -58,14 +58,23 @@ ShellClient::ShellClient(ShellSurfaceInterface *surface) , m_internal(surface->client() == waylandServer()->internalConnection()) { setSurface(surface->surface()); + init(); +} + +ShellClient::~ShellClient() = default; + +void ShellClient::init() +{ findInternalWindow(); createWindowId(); setupCompositing(); - if (surface->surface()->buffer()) { + SurfaceInterface *s = surface(); + Q_ASSERT(s); + if (s->buffer()) { setReadyForPainting(); setupWindowManagementInterface(); m_unmapped = false; - m_clientSize = surface->surface()->buffer()->size(); + m_clientSize = s->buffer()->size(); } else { ready_for_painting = false; } @@ -76,94 +85,94 @@ ShellClient::ShellClient(ShellSurfaceInterface *surface) doSetGeometry(QRect(QPoint(0, 0), m_clientSize)); setDesktop(VirtualDesktopManager::self()->current()); } - if (waylandServer()->inputMethodConnection() == m_shellSurface->client()) { + if (waylandServer()->inputMethodConnection() == s->client()) { m_windowType = NET::OnScreenDisplay; } - connect(surface->surface(), &SurfaceInterface::sizeChanged, this, + connect(s, &SurfaceInterface::sizeChanged, this, [this] { - m_clientSize = m_shellSurface->surface()->buffer()->size(); + m_clientSize = surface()->buffer()->size(); doSetGeometry(QRect(geom.topLeft(), m_clientSize + QSize(borderLeft() + borderRight(), borderTop() + borderBottom()))); discardWindowPixmap(); } ); - connect(surface, &ShellSurfaceInterface::destroyed, this, &ShellClient::destroyClient); - connect(surface->surface(), &SurfaceInterface::unmapped, this, &ShellClient::unmap); - connect(surface, &ShellSurfaceInterface::titleChanged, this, &ShellClient::captionChanged); + connect(s, &SurfaceInterface::unmapped, this, &ShellClient::unmap); + if (m_shellSurface) { + connect(m_shellSurface, &ShellSurfaceInterface::destroyed, this, &ShellClient::destroyClient); + connect(m_shellSurface, &ShellSurfaceInterface::titleChanged, this, &ShellClient::captionChanged); - connect(surface, &ShellSurfaceInterface::fullscreenChanged, this, &ShellClient::clientFullScreenChanged); - connect(surface, &ShellSurfaceInterface::maximizedChanged, this, - [this] (bool maximized) { - maximize(maximized ? MaximizeFull : MaximizeRestore); - } - ); - connect(surface, &ShellSurfaceInterface::windowClassChanged, this, &ShellClient::updateIcon); + connect(m_shellSurface, &ShellSurfaceInterface::fullscreenChanged, this, &ShellClient::clientFullScreenChanged); + connect(m_shellSurface, &ShellSurfaceInterface::maximizedChanged, this, + [this] (bool maximized) { + maximize(maximized ? MaximizeFull : MaximizeRestore); + } + ); + connect(m_shellSurface, &ShellSurfaceInterface::windowClassChanged, this, &ShellClient::updateIcon); + + setResourceClass(m_shellSurface->windowClass()); + connect(m_shellSurface, &ShellSurfaceInterface::windowClassChanged, this, + [this] { + setResourceClass(m_shellSurface->windowClass()); + } + ); + connect(m_shellSurface, &ShellSurfaceInterface::transientForChanged, this, &ShellClient::setTransient); + connect(m_shellSurface, &ShellSurfaceInterface::moveRequested, this, + [this] { + // TODO: check the seat and serial + performMouseCommand(Options::MouseMove, Cursor::pos()); + } + ); + connect(m_shellSurface, &ShellSurfaceInterface::resizeRequested, this, + [this] (SeatInterface *seat, quint32 serial, Qt::Edges edges) { + // TODO: check the seat and serial + Q_UNUSED(seat) + Q_UNUSED(serial) + if (!isResizable() || isShade()) { + return; + } + if (isMoveResize()) { + finishMoveResize(false); + } + setMoveResizePointerButtonDown(true); + setMoveOffset(Cursor::pos() - pos()); // map from global + setInvertedMoveOffset(rect().bottomRight() - moveOffset()); + setUnrestrictedMoveResize(false); + auto toPosition = [edges] { + Position pos = PositionCenter; + if (edges.testFlag(Qt::TopEdge)) { + pos = PositionTop; + } else if (edges.testFlag(Qt::BottomEdge)) { + pos = PositionBottom; + } + if (edges.testFlag(Qt::LeftEdge)) { + pos = Position(pos | PositionLeft); + } else if (edges.testFlag(Qt::RightEdge)) { + pos = Position(pos | PositionRight); + } + return pos; + }; + setMoveResizePointerMode(toPosition()); + if (!startMoveResize()) + setMoveResizePointerButtonDown(false); + updateCursor(); + } + ); + } updateIcon(); // setup shadow integration getShadow(); - connect(surface->surface(), &SurfaceInterface::shadowChanged, this, &Toplevel::getShadow); - - setResourceClass(surface->windowClass()); - connect(surface, &ShellSurfaceInterface::windowClassChanged, this, - [this] { - setResourceClass(m_shellSurface->windowClass()); - } - ); + connect(s, &SurfaceInterface::shadowChanged, this, &Toplevel::getShadow); setTransient(); - connect(surface, &ShellSurfaceInterface::transientForChanged, this, &ShellClient::setTransient); - connect(surface, &ShellSurfaceInterface::moveRequested, this, - [this] { - // TODO: check the seat and serial - performMouseCommand(Options::MouseMove, Cursor::pos()); - } - ); - connect(surface, &ShellSurfaceInterface::resizeRequested, this, - [this] (SeatInterface *seat, quint32 serial, Qt::Edges edges) { - // TODO: check the seat and serial - Q_UNUSED(seat) - Q_UNUSED(serial) - if (!isResizable() || isShade()) { - return; - } - if (isMoveResize()) { - finishMoveResize(false); - } - setMoveResizePointerButtonDown(true); - setMoveOffset(Cursor::pos() - pos()); // map from global - setInvertedMoveOffset(rect().bottomRight() - moveOffset()); - setUnrestrictedMoveResize(false); - auto toPosition = [edges] { - Position pos = PositionCenter; - if (edges.testFlag(Qt::TopEdge)) { - pos = PositionTop; - } else if (edges.testFlag(Qt::BottomEdge)) { - pos = PositionBottom; - } - if (edges.testFlag(Qt::LeftEdge)) { - pos = Position(pos | PositionLeft); - } else if (edges.testFlag(Qt::RightEdge)) { - pos = Position(pos | PositionRight); - } - return pos; - }; - setMoveResizePointerMode(toPosition()); - if (!startMoveResize()) - setMoveResizePointerButtonDown(false); - updateCursor(); - } - ); // check whether we have a ServerSideDecoration - if (ServerSideDecorationInterface *deco = ServerSideDecorationInterface::get(surface->surface())) { + if (ServerSideDecorationInterface *deco = ServerSideDecorationInterface::get(s)) { installServerSideDecoration(deco); } updateColorScheme(QString()); } -ShellClient::~ShellClient() = default; - void ShellClient::destroyClient() { m_closing = true; diff --git a/shell_client.h b/shell_client.h index 45025f3b5e..0eadb581de 100644 --- a/shell_client.h +++ b/shell_client.h @@ -138,6 +138,7 @@ private Q_SLOTS: void clientFullScreenChanged(bool fullScreen); private: + void init(); void requestGeometry(const QRect &rect); void doSetGeometry(const QRect &rect); void createDecoration(const QRect &oldgeom);