Introduce AbstractBackend as base class for Wayland and X11Windowed backend

The AbstractBackend registers itself in the WaylandServer allowing
external users to easily get to the backend and not needing to test
manually which backend is used.
This commit is contained in:
Martin Gräßlin 2015-03-20 14:41:03 +01:00
parent dae8eed3a8
commit 9a0fd94013
11 changed files with 134 additions and 36 deletions

View file

@ -421,6 +421,7 @@ endif()
if(HAVE_WAYLAND)
set(kwin_KDEINIT_SRCS
${kwin_KDEINIT_SRCS}
abstract_backend.cpp
screens_wayland.cpp
screens_x11windowed.cpp
wayland_backend.cpp

46
abstract_backend.cpp Normal file
View file

@ -0,0 +1,46 @@
/********************************************************************
KWin - the KDE window manager
This file is part of the KDE project.
Copyright (C) 2015 Martin Gräßlin <mgraesslin@kde.org>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*********************************************************************/
#include "abstract_backend.h"
#include "wayland_server.h"
namespace KWin
{
AbstractBackend::AbstractBackend(QObject *parent)
: QObject(parent)
{
WaylandServer::self()->installBackend(this);
}
AbstractBackend::~AbstractBackend()
{
WaylandServer::self()->uninstallBackend(this);
}
void AbstractBackend::installCursorFromServer()
{
}
void AbstractBackend::installCursorImage(Qt::CursorShape shape)
{
Q_UNUSED(shape)
}
}

42
abstract_backend.h Normal file
View file

@ -0,0 +1,42 @@
/********************************************************************
KWin - the KDE window manager
This file is part of the KDE project.
Copyright (C) 2015 Martin Gräßlin <mgraesslin@kde.org>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*********************************************************************/
#ifndef KWIN_ABSTRACT_BACKEND_H
#define KWIN_ABSTRACT_BACKEND_H
#include <QObject>
namespace KWin
{
class AbstractBackend : public QObject
{
Q_OBJECT
public:
virtual ~AbstractBackend();
virtual void installCursorFromServer();
virtual void installCursorImage(Qt::CursorShape shape);
protected:
explicit AbstractBackend(QObject *parent = nullptr);
};
}
#endif

View file

@ -56,7 +56,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "composite.h"
#include "xcbutils.h"
#if HAVE_WAYLAND
#include "wayland_backend.h"
#include "abstract_backend.h"
#include "wayland_server.h"
#endif
#include "decorations/decorationbridge.h"
@ -673,7 +674,7 @@ void EffectsHandlerImpl::startMouseInterception(Effect *effect, Qt::CursorShape
}
if (kwinApp()->operationMode() != Application::OperationModeX11) {
#if HAVE_WAYLAND
if (Wayland::WaylandBackend *w = Wayland::WaylandBackend::self()) {
if (AbstractBackend *w = waylandServer()->backend()) {
w->installCursorImage(shape);
}
#endif
@ -1171,8 +1172,10 @@ void EffectsHandlerImpl::defineCursor(Qt::CursorShape shape)
{
if (!m_mouseInterceptionWindow.isValid()) {
#if HAVE_WAYLAND
if (Wayland::WaylandBackend *w = Wayland::WaylandBackend::self()) {
w->installCursorImage(shape);
if (waylandServer()) {
if (AbstractBackend *w = waylandServer()->backend()) {
w->installCursorImage(shape);
}
}
#endif
return;

View file

@ -33,9 +33,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "libinput/connection.h"
#endif
#if HAVE_WAYLAND
#include "wayland_backend.h"
#include "abstract_backend.h"
#include "wayland_server.h"
#include "x11windowed_backend.h"
#include <KWayland/Server/seat_interface.h>
#endif
// Qt
@ -256,25 +255,6 @@ static KWayland::Server::SeatInterface *findSeat()
}
#endif
template <typename T>
static
void disconnectSeat(KWayland::Server::SeatInterface *seat)
{
if (T *w = T::self()) {
QObject::disconnect(seat->focusedPointer()->cursor(), &KWayland::Server::Cursor::changed, w, &T::installCursorFromServer);
}
}
template <typename T>
static
void connectSeat(KWayland::Server::SeatInterface *seat)
{
if (T *w = T::self()) {
w->installCursorFromServer();
QObject::connect(seat->focusedPointer()->cursor(), &KWayland::Server::Cursor::changed, w, &T::installCursorFromServer);
}
}
void InputRedirection::updatePointerWindow()
{
// TODO: handle pointer grab aka popups
@ -288,14 +268,17 @@ void InputRedirection::updatePointerWindow()
// disconnect old surface
if (oldWindow) {
disconnect(oldWindow.data(), &Toplevel::geometryChanged, this, &InputRedirection::updateFocusedPointerPosition);
disconnectSeat<Wayland::WaylandBackend>(seat);
disconnectSeat<X11WindowedBackend>(seat);
if (AbstractBackend *b = waylandServer()->backend()) {
disconnect(seat->focusedPointer()->cursor(), &KWayland::Server::Cursor::changed, b, &AbstractBackend::installCursorFromServer);
}
}
if (t && t->surface()) {
seat->setFocusedPointerSurface(t->surface(), t->pos());
connect(t, &Toplevel::geometryChanged, this, &InputRedirection::updateFocusedPointerPosition);
connectSeat<Wayland::WaylandBackend>(seat);
connectSeat<X11WindowedBackend>(seat);
if (AbstractBackend *b = waylandServer()->backend()) {
b->installCursorFromServer();
connect(seat->focusedPointer()->cursor(), &KWayland::Server::Cursor::changed, b, &AbstractBackend::installCursorFromServer);
}
} else {
seat->setFocusedPointerSurface(nullptr);
t = nullptr;

View file

@ -354,7 +354,7 @@ WaylandBackend *WaylandBackend::create(QObject *parent)
}
WaylandBackend::WaylandBackend(QObject *parent)
: QObject(parent)
: AbstractBackend(parent)
, m_display(nullptr)
, m_eventQueue(new EventQueue(this))
, m_registry(new Registry(this))

View file

@ -20,6 +20,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#ifndef KWIN_WAYLAND_BACKEND_H
#define KWIN_WAYLAND_BACKEND_H
// KWin
#include "abstract_backend.h"
#include <kwinglobals.h>
// Qt
#include <QHash>
@ -141,7 +142,7 @@ private:
* It creates the connection to the Wayland Compositor, sets up the registry and creates
* the Wayland surface and its shell mapping.
*/
class KWIN_EXPORT WaylandBackend : public QObject
class KWIN_EXPORT WaylandBackend : public AbstractBackend
{
Q_OBJECT
public:
@ -154,8 +155,8 @@ public:
KWayland::Client::Surface *surface() const;
QSize shellSurfaceSize() const;
void installCursorImage(Qt::CursorShape shape);
void installCursorFromServer();
void installCursorImage(Qt::CursorShape shape) override;
void installCursorFromServer() override;
protected:
void connectNotify(const QMetaMethod &signal) override;

View file

@ -113,4 +113,16 @@ int WaylandServer::createQtConnection()
return sx[1];
}
void WaylandServer::installBackend(AbstractBackend *backend)
{
Q_ASSERT(!m_backend);
m_backend = backend;
}
void WaylandServer::uninstallBackend(AbstractBackend *backend)
{
Q_ASSERT(m_backend == backend);
m_backend = nullptr;
}
}

View file

@ -40,6 +40,8 @@ class OutputInterface;
namespace KWin
{
class AbstractBackend;
class KWIN_EXPORT WaylandServer : public QObject
{
Q_OBJECT
@ -61,6 +63,12 @@ public:
return m_shell;
}
AbstractBackend *backend() const {
return m_backend;
}
void installBackend(AbstractBackend *backend);
void uninstallBackend(AbstractBackend *backend);
/**
* @returns file descriptor for Xwayland to connect to.
**/
@ -78,6 +86,7 @@ private:
KWayland::Server::ShellInterface *m_shell = nullptr;
KWayland::Server::ClientConnection *m_xwaylandConnection = nullptr;
KWayland::Server::ClientConnection *m_qtConnection = nullptr;
AbstractBackend *m_backend = nullptr;
KWIN_SINGLETON(WaylandServer)
};

View file

@ -51,7 +51,7 @@ X11WindowedBackend *X11WindowedBackend::create(const QString &display, const QSi
}
X11WindowedBackend::X11WindowedBackend(const QString &display, const QSize &size, QObject *parent)
: QObject(parent)
: AbstractBackend(parent)
, m_size(size)
{
int screen = 0;

View file

@ -19,6 +19,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*********************************************************************/
#ifndef KWIN_X11WINDOWED_BACKEND_H
#define KWIN_X11WINDOWED_BACKEND_H
#include "abstract_backend.h"
#include <kwin_export.h>
@ -33,7 +34,7 @@ typedef struct _XDisplay Display;
namespace KWin
{
class KWIN_EXPORT X11WindowedBackend : public QObject
class KWIN_EXPORT X11WindowedBackend : public AbstractBackend
{
Q_OBJECT
Q_PROPERTY(QSize size READ size NOTIFY sizeChanged)
@ -62,7 +63,7 @@ public:
return m_size;
}
void installCursorFromServer();
void installCursorFromServer() override;
static X11WindowedBackend *self();
static X11WindowedBackend *create(const QString &display, const QSize &size, QObject *parent);