summaryrefslogtreecommitdiff
path: root/src/client
diff options
context:
space:
mode:
authorElvis Lee <kwangwoong.lee@lge.com>2020-12-28 16:08:24 +0900
committerElvis Lee <kwangwoong.lee@lge.com>2021-02-17 19:47:51 +0900
commit595b4d3428dbf9107c5e6bd62ef3c401d4ef2a18 (patch)
treea9ab9f83466dd6779ed5ad86a8fcbb62404ab706 /src/client
parent23ebb5fc41a94918e01d97872491724280c4b1c2 (diff)
downloadqtwayland-595b4d3428dbf9107c5e6bd62ef3c401d4ef2a18.tar.gz
Support platform specific implementation
QtWaylandClient can be inherited to support platform specific implementaton. Change-Id: Ie0f4aa28dbb2dcd6b1245cb14e23f3b45e687400 Reviewed-by: Elvis Lee <kwangwoong.lee@lge.com> Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
Diffstat (limited to 'src/client')
-rw-r--r--src/client/qwaylandcursor_p.h4
-rw-r--r--src/client/qwaylanddisplay.cpp4
-rw-r--r--src/client/qwaylandinputdevice_p.h2
-rw-r--r--src/client/qwaylandintegration.cpp45
-rw-r--r--src/client/qwaylandintegration_p.h14
-rw-r--r--src/client/qwaylandscreen_p.h6
-rw-r--r--src/client/qwaylandwindow_p.h3
7 files changed, 53 insertions, 25 deletions
diff --git a/src/client/qwaylandcursor_p.h b/src/client/qwaylandcursor_p.h
index de96c22b..7ccdd71c 100644
--- a/src/client/qwaylandcursor_p.h
+++ b/src/client/qwaylandcursor_p.h
@@ -79,7 +79,7 @@ public:
~QWaylandCursorTheme();
::wl_cursor *cursor(Qt::CursorShape shape);
-private:
+protected:
enum WaylandCursor {
ArrowCursor = Qt::ArrowCursor,
UpArrowCursor,
@@ -134,7 +134,7 @@ public:
static QSharedPointer<QWaylandBuffer> cursorBitmapBuffer(QWaylandDisplay *display, const QCursor *cursor);
-private:
+protected:
QWaylandDisplay *mDisplay = nullptr;
QPoint mLastPos;
};
diff --git a/src/client/qwaylanddisplay.cpp b/src/client/qwaylanddisplay.cpp
index 82dcc63e..a3bd27ff 100644
--- a/src/client/qwaylanddisplay.cpp
+++ b/src/client/qwaylanddisplay.cpp
@@ -327,7 +327,7 @@ void QWaylandDisplay::registry_global(uint32_t id, const QString &interface, uin
struct ::wl_registry *registry = object();
if (interface == QStringLiteral("wl_output")) {
- mWaitingScreens << new QWaylandScreen(this, version, id);
+ mWaitingScreens << mWaylandIntegration->createPlatformScreen(this, version, id);
} else if (interface == QStringLiteral("wl_compositor")) {
mCompositorVersion = qMin((int)version, 4);
mCompositor.init(registry, id, mCompositorVersion);
@@ -627,7 +627,7 @@ QWaylandInputDevice *QWaylandDisplay::defaultInputDevice() const
QWaylandCursor *QWaylandDisplay::waylandCursor()
{
if (!mCursor)
- mCursor.reset(new QWaylandCursor(this));
+ mCursor.reset(mWaylandIntegration->createPlatformCursor(this));
return mCursor.data();
}
diff --git a/src/client/qwaylandinputdevice_p.h b/src/client/qwaylandinputdevice_p.h
index 53691e68..303c9bb3 100644
--- a/src/client/qwaylandinputdevice_p.h
+++ b/src/client/qwaylandinputdevice_p.h
@@ -160,7 +160,7 @@ public:
Pointer *pointer() const;
Touch *touch() const;
-private:
+protected:
QWaylandDisplay *mQDisplay = nullptr;
struct wl_display *mDisplay = nullptr;
diff --git a/src/client/qwaylandintegration.cpp b/src/client/qwaylandintegration.cpp
index 868cdd61..f2f9174f 100644
--- a/src/client/qwaylandintegration.cpp
+++ b/src/client/qwaylandintegration.cpp
@@ -52,6 +52,7 @@
#include "qwaylanddnd_p.h"
#include "qwaylandwindowmanagerintegration_p.h"
#include "qwaylandscreen_p.h"
+#include "qwaylandcursor_p.h"
#if defined(Q_OS_MACOS)
# include <QtGui/private/qcoretextfontdatabase_p.h>
@@ -112,22 +113,12 @@ QWaylandIntegration::QWaylandIntegration()
#else
: mFontDb(new QGenericUnixFontDatabase())
#endif
- , mNativeInterface(new QWaylandNativeInterface(this))
{
- initializeInputDeviceIntegration();
mDisplay.reset(new QWaylandDisplay(this));
if (!mDisplay->isInitialized()) {
mFailed = true;
return;
}
-#if QT_CONFIG(clipboard)
- mClipboard.reset(new QWaylandClipboard(mDisplay.data()));
-#endif
-#if QT_CONFIG(draganddrop)
- mDrag.reset(new QWaylandDrag(mDisplay.data()));
-#endif
-
- reconfigureInputContext();
}
QWaylandIntegration::~QWaylandIntegration()
@@ -193,8 +184,30 @@ QAbstractEventDispatcher *QWaylandIntegration::createEventDispatcher() const
return createUnixEventDispatcher();
}
+QPlatformNativeInterface *QWaylandIntegration::createPlatformNativeInterface()
+{
+ return new QWaylandNativeInterface(this);
+}
+
+void QWaylandIntegration::initializePlatform()
+{
+ mNativeInterface.reset(createPlatformNativeInterface());
+ initializeInputDeviceIntegration();
+#if QT_CONFIG(clipboard)
+ mClipboard.reset(new QWaylandClipboard(mDisplay.data()));
+#endif
+#if QT_CONFIG(draganddrop)
+ mDrag.reset(new QWaylandDrag(mDisplay.data()));
+#endif
+
+ reconfigureInputContext();
+}
+
void QWaylandIntegration::initialize()
{
+ // Support platform specicif initialization
+ initializePlatform();
+
QAbstractEventDispatcher *dispatcher = QGuiApplicationPrivate::eventDispatcher;
QObject::connect(dispatcher, SIGNAL(aboutToBlock()), mDisplay.data(), SLOT(flushRequests()));
QObject::connect(dispatcher, SIGNAL(awake()), mDisplay.data(), SLOT(flushRequests()));
@@ -282,6 +295,16 @@ QPlatformTheme *QWaylandIntegration::createPlatformTheme(const QString &name) co
return QGenericUnixTheme::createUnixTheme(name);
}
+QWaylandScreen *QWaylandIntegration::createPlatformScreen(QWaylandDisplay *waylandDisplay, int version, uint32_t id) const
+{
+ return new QWaylandScreen(waylandDisplay, version, id);
+}
+
+QWaylandCursor *QWaylandIntegration::createPlatformCursor(QWaylandDisplay *display) const
+{
+ return new QWaylandCursor(display);
+}
+
#if QT_CONFIG(vulkan)
QPlatformVulkanInstance *QWaylandIntegration::createPlatformVulkanInstance(QVulkanInstance *instance) const
{
@@ -418,7 +441,7 @@ void QWaylandIntegration::initializeShellIntegration()
QWindowSystemInterfacePrivate::TabletEvent::setPlatformSynthesizesMouse(false);
}
-QWaylandInputDevice *QWaylandIntegration::createInputDevice(QWaylandDisplay *display, int version, uint32_t id)
+QWaylandInputDevice *QWaylandIntegration::createInputDevice(QWaylandDisplay *display, int version, uint32_t id) const
{
if (mInputDeviceIntegration) {
return mInputDeviceIntegration->createInputDevice(display, version, id);
diff --git a/src/client/qwaylandintegration_p.h b/src/client/qwaylandintegration_p.h
index ff70ae25..e687e0c6 100644
--- a/src/client/qwaylandintegration_p.h
+++ b/src/client/qwaylandintegration_p.h
@@ -67,6 +67,8 @@ class QWaylandServerBufferIntegration;
class QWaylandShellIntegration;
class QWaylandInputDeviceIntegration;
class QWaylandInputDevice;
+class QWaylandScreen;
+class QWaylandCursor;
class Q_WAYLAND_CLIENT_EXPORT QWaylandIntegration : public QPlatformIntegration
{
@@ -117,7 +119,9 @@ public:
QPlatformVulkanInstance *createPlatformVulkanInstance(QVulkanInstance *instance) const override;
#endif
- QWaylandInputDevice *createInputDevice(QWaylandDisplay *display, int version, uint32_t id);
+ virtual QWaylandInputDevice *createInputDevice(QWaylandDisplay *display, int version, uint32_t id) const;
+ virtual QWaylandScreen *createPlatformScreen(QWaylandDisplay *waylandDisplay, int version, uint32_t id) const;
+ virtual QWaylandCursor *createPlatformCursor(QWaylandDisplay *display) const;
virtual QWaylandClientBufferIntegration *clientBufferIntegration() const;
virtual QWaylandServerBufferIntegration *serverBufferIntegration() const;
@@ -125,19 +129,24 @@ public:
void reconfigureInputContext();
-private:
+protected:
// NOTE: mDisplay *must* be destructed after mDrag and mClientBufferIntegration
// and mShellIntegration.
// Do not move this definition into the private section at the bottom.
QScopedPointer<QWaylandDisplay> mDisplay;
protected:
+ virtual QPlatformNativeInterface *createPlatformNativeInterface();
+
QScopedPointer<QWaylandClientBufferIntegration> mClientBufferIntegration;
QScopedPointer<QWaylandServerBufferIntegration> mServerBufferIntegration;
QScopedPointer<QWaylandShellIntegration> mShellIntegration;
QScopedPointer<QWaylandInputDeviceIntegration> mInputDeviceIntegration;
+ QScopedPointer<QPlatformInputContext> mInputContext;
+
private:
+ void initializePlatform();
void initializeClientBufferIntegration();
void initializeServerBufferIntegration();
void initializeShellIntegration();
@@ -152,7 +161,6 @@ private:
QScopedPointer<QPlatformDrag> mDrag;
#endif
QScopedPointer<QPlatformNativeInterface> mNativeInterface;
- QScopedPointer<QPlatformInputContext> mInputContext;
#if QT_CONFIG(accessibility)
mutable QScopedPointer<QPlatformAccessibility> mAccessibility;
#endif
diff --git a/src/client/qwaylandscreen_p.h b/src/client/qwaylandscreen_p.h
index 404d0f1e..5553208e 100644
--- a/src/client/qwaylandscreen_p.h
+++ b/src/client/qwaylandscreen_p.h
@@ -113,7 +113,7 @@ public:
static QWaylandScreen *waylandScreenFromWindow(QWindow *window);
static QWaylandScreen *fromWlOutput(::wl_output *output);
-private:
+protected:
void output_mode(uint32_t flags, int width, int height, int refresh) override;
void output_geometry(int32_t x, int32_t y,
int32_t width, int32_t height,
@@ -149,10 +149,6 @@ private:
bool mOutputDone = false;
bool mXdgOutputDone = false;
bool mInitialized = false;
-
-#if QT_CONFIG(cursor)
- QScopedPointer<QWaylandCursor> mWaylandCursor;
-#endif
};
}
diff --git a/src/client/qwaylandwindow_p.h b/src/client/qwaylandwindow_p.h
index 93e92458..35850b88 100644
--- a/src/client/qwaylandwindow_p.h
+++ b/src/client/qwaylandwindow_p.h
@@ -214,6 +214,8 @@ signals:
void wlSurfaceDestroyed();
protected:
+ void sendExposeEvent(const QRect &rect);
+
QWaylandDisplay *mDisplay = nullptr;
QScopedPointer<QWaylandSurface> mSurface;
QWaylandShellSurface *mShellSurface = nullptr;
@@ -268,7 +270,6 @@ private:
bool shouldCreateShellSurface() const;
bool shouldCreateSubSurface() const;
void reset();
- void sendExposeEvent(const QRect &rect);
static void closePopups(QWaylandWindow *parent);
QPlatformScreen *calculateScreenFromSurfaceEvents() const;
void setOpaqueArea(const QRegion &opaqueArea);