From 1aa4f823d2ffb532b1c7b7c7070693bd585de017 Mon Sep 17 00:00:00 2001 From: Pier Luigi Fiorini Date: Thu, 7 Apr 2016 20:20:25 +0200 Subject: Make window manager extension QML friendly Change-Id: Ie6564144e72a9e5e30222a8d2b30f2ff6c8c961c Reviewed-by: Giulio Camuffo --- .../extensions/qwaylandwindowmanagerextension.cpp | 62 +++++++++++++++++----- .../extensions/qwaylandwindowmanagerextension.h | 14 +++-- .../extensions/qwaylandwindowmanagerextension_p.h | 12 +++-- src/imports/compositor/plugins.qmltypes | 18 +++++++ .../compositor/qwaylandquickcompositorplugin.cpp | 3 ++ 5 files changed, 85 insertions(+), 24 deletions(-) diff --git a/src/compositor/extensions/qwaylandwindowmanagerextension.cpp b/src/compositor/extensions/qwaylandwindowmanagerextension.cpp index 9050610d8..3dcca4277 100644 --- a/src/compositor/extensions/qwaylandwindowmanagerextension.cpp +++ b/src/compositor/extensions/qwaylandwindowmanagerextension.cpp @@ -44,26 +44,41 @@ QT_BEGIN_NAMESPACE +QWaylandWindowManagerExtension::QWaylandWindowManagerExtension() + : QWaylandExtensionTemplate(*new QWaylandWindowManagerExtensionPrivate) +{ +} + QWaylandWindowManagerExtension::QWaylandWindowManagerExtension(QWaylandCompositor *compositor) - : QWaylandExtensionTemplate(compositor, *new QWaylandWindowManagerExtensionPrivate(compositor)) + : QWaylandExtensionTemplate(compositor, *new QWaylandWindowManagerExtensionPrivate) { } -QWaylandWindowManagerExtensionPrivate::QWaylandWindowManagerExtensionPrivate(QWaylandCompositor *compositor) +QWaylandWindowManagerExtensionPrivate::QWaylandWindowManagerExtensionPrivate() : QWaylandExtensionTemplatePrivate() - , m_showIsFullScreen(false) - , m_compositor(compositor) + , QtWaylandServer::qt_windowmanager() + , showIsFullScreen(false) { - init(compositor->display(), 1); +} + +bool QWaylandWindowManagerExtension::showIsFullScreen() const +{ + Q_D(const QWaylandWindowManagerExtension); + return d->showIsFullScreen; } void QWaylandWindowManagerExtension::setShowIsFullScreen(bool value) { Q_D(QWaylandWindowManagerExtension); - d->m_showIsFullScreen = value; + + if (d->showIsFullScreen == value) + return; + + d->showIsFullScreen = value; Q_FOREACH (QWaylandWindowManagerExtensionPrivate::Resource *resource, d->resourceMap().values()) { - d->send_hints(resource->handle, static_cast(d->m_showIsFullScreen)); + d->send_hints(resource->handle, static_cast(d->showIsFullScreen)); } + Q_EMIT showIsFullScreenChanged(); } void QWaylandWindowManagerExtension::sendQuitMessage(wl_client *client) @@ -75,28 +90,48 @@ void QWaylandWindowManagerExtension::sendQuitMessage(wl_client *client) d->send_quit(resource->handle); } +void QWaylandWindowManagerExtension::initialize() +{ + Q_D(QWaylandWindowManagerExtension); + + QWaylandExtensionTemplate::initialize(); + QWaylandCompositor *compositor = static_cast(extensionContainer()); + if (!compositor) { + qWarning() << "Failed to find QWaylandCompositor when initializing QWaylandWindowManagerExtension"; + return; + } + d->init(compositor->display(), 1); +} + void QWaylandWindowManagerExtensionPrivate::windowmanager_bind_resource(Resource *resource) { - send_hints(resource->handle, static_cast(m_showIsFullScreen)); + send_hints(resource->handle, static_cast(showIsFullScreen)); } void QWaylandWindowManagerExtensionPrivate::windowmanager_destroy_resource(Resource *resource) { - m_urls.remove(resource); + urls.remove(resource); } void QWaylandWindowManagerExtensionPrivate::windowmanager_open_url(Resource *resource, uint32_t remaining, const QString &newUrl) { Q_Q(QWaylandWindowManagerExtension); - QString url = m_urls.value(resource, QString()); + + QWaylandCompositor *compositor = static_cast(q->extensionContainer()); + if (!compositor) { + qWarning() << "Failed to find QWaylandCompositor from QWaylandWindowManagerExtension::windowmanager_open_url()"; + return; + } + + QString url = urls.value(resource, QString()); url.append(newUrl); if (remaining) - m_urls.insert(resource, url); + urls.insert(resource, url); else { - m_urls.remove(resource); - q->openUrl(QWaylandClient::fromWlClient(m_compositor, resource->client()), QUrl(url)); + urls.remove(resource); + q->openUrl(QWaylandClient::fromWlClient(compositor, resource->client()), QUrl(url)); } } @@ -110,5 +145,4 @@ QByteArray QWaylandWindowManagerExtension::interfaceName() return QWaylandWindowManagerExtensionPrivate::interfaceName(); } - QT_END_NAMESPACE diff --git a/src/compositor/extensions/qwaylandwindowmanagerextension.h b/src/compositor/extensions/qwaylandwindowmanagerextension.h index 8c222d4d8..b365ff20f 100644 --- a/src/compositor/extensions/qwaylandwindowmanagerextension.h +++ b/src/compositor/extensions/qwaylandwindowmanagerextension.h @@ -37,17 +37,13 @@ #ifndef WAYLANDWINDOWMANAGERINTEGRATION_H #define WAYLANDWINDOWMANAGERINTEGRATION_H -#include +#include #include #include QT_BEGIN_NAMESPACE -namespace QtWayland { - class Display; -} - class QWaylandCompositor; class QWaylandWindowManagerExtensionPrivate; @@ -55,16 +51,24 @@ class QWaylandWindowManagerExtensionPrivate; class Q_WAYLAND_COMPOSITOR_EXPORT QWaylandWindowManagerExtension : public QWaylandExtensionTemplate { Q_OBJECT + Q_PROPERTY(bool showIsFullScreen READ showIsFullScreen WRITE setShowIsFullScreen NOTIFY showIsFullScreenChanged) Q_DECLARE_PRIVATE(QWaylandWindowManagerExtension) public: + QWaylandWindowManagerExtension(); explicit QWaylandWindowManagerExtension(QWaylandCompositor *compositor); + bool showIsFullScreen() const; void setShowIsFullScreen(bool value); + void sendQuitMessage(wl_client *client); + void initialize() Q_DECL_OVERRIDE; + static const struct wl_interface *interface(); static QByteArray interfaceName(); + Q_SIGNALS: + void showIsFullScreenChanged(); void openUrl(QWaylandClient *client, const QUrl &url); }; diff --git a/src/compositor/extensions/qwaylandwindowmanagerextension_p.h b/src/compositor/extensions/qwaylandwindowmanagerextension_p.h index 4beaaf466..79e2256e0 100644 --- a/src/compositor/extensions/qwaylandwindowmanagerextension_p.h +++ b/src/compositor/extensions/qwaylandwindowmanagerextension_p.h @@ -56,20 +56,22 @@ QT_BEGIN_NAMESPACE -class Q_WAYLAND_COMPOSITOR_EXPORT QWaylandWindowManagerExtensionPrivate : public QWaylandExtensionTemplatePrivate, public QtWaylandServer::qt_windowmanager +class Q_WAYLAND_COMPOSITOR_EXPORT QWaylandWindowManagerExtensionPrivate + : public QWaylandExtensionTemplatePrivate + , public QtWaylandServer::qt_windowmanager { Q_DECLARE_PUBLIC(QWaylandWindowManagerExtension) public: - QWaylandWindowManagerExtensionPrivate(QWaylandCompositor *compositor); + QWaylandWindowManagerExtensionPrivate(); protected: void windowmanager_bind_resource(Resource *resource) Q_DECL_OVERRIDE; void windowmanager_destroy_resource(Resource *resource) Q_DECL_OVERRIDE; void windowmanager_open_url(Resource *resource, uint32_t remaining, const QString &url) Q_DECL_OVERRIDE; + private: - bool m_showIsFullScreen; - QWaylandCompositor *m_compositor; - QMap m_urls; + bool showIsFullScreen; + QMap urls; }; QT_END_NAMESPACE diff --git a/src/imports/compositor/plugins.qmltypes b/src/imports/compositor/plugins.qmltypes index 2c83eb2f8..d284aaf19 100644 --- a/src/imports/compositor/plugins.qmltypes +++ b/src/imports/compositor/plugins.qmltypes @@ -327,6 +327,24 @@ Module { Property { name: "discardFrontBuffers"; type: "bool" } Signal { name: "surfaceDestroyed" } } + Component { + name: "QWaylandWindowManagerExtension" + prototype: "QWaylandExtension" + Property { name: "showIsFullScreen"; type: "bool" } + Signal { + name: "openUrl" + Parameter { name: "client"; type: "QWaylandClient"; isPointer: true } + Parameter { name: "url"; type: "QUrl" } + } + } + Component { + name: "QWaylandWindowManagerExtensionQuickData" + defaultProperty: "data" + prototype: "QWaylandWindowManagerExtension" + exports: ["QtWayland.Compositor/WindowManager 1.0"] + exportMetaObjectRevisions: [0] + Property { name: "data"; type: "QObject"; isList: true; isReadonly: true } + } Component { name: "QWaylandWlShell" prototype: "QWaylandExtension" diff --git a/src/imports/compositor/qwaylandquickcompositorplugin.cpp b/src/imports/compositor/qwaylandquickcompositorplugin.cpp index 1fa28123d..6b42a2e0a 100644 --- a/src/imports/compositor/qwaylandquickcompositorplugin.cpp +++ b/src/imports/compositor/qwaylandquickcompositorplugin.cpp @@ -50,6 +50,7 @@ #include #include +#include #include #include @@ -59,6 +60,7 @@ QT_BEGIN_NAMESPACE Q_COMPOSITOR_DECLARE_QUICK_EXTENSION_CLASS(QWaylandQuickCompositor) +Q_COMPOSITOR_DECLARE_QUICK_DATA_CLASS(QWaylandWindowManagerExtension) Q_COMPOSITOR_DECLARE_QUICK_DATA_CLASS(QWaylandWlShell) Q_COMPOSITOR_DECLARE_QUICK_DATA_CLASS(QWaylandWlShellSurface) @@ -131,6 +133,7 @@ public: qmlRegisterType(uri, 1, 0, "WaylandMouseTracker"); qmlRegisterType(uri, 1, 0, "WaylandOutput"); qmlRegisterType(uri, 1, 0, "WaylandSurface"); + qmlRegisterType(uri, 1, 0, "WindowManager"); qmlRegisterUncreatableType(uri, 1, 0, "WaylandExtension", QObject::tr("Cannot create instance of WaylandExtension")); qmlRegisterUncreatableType(uri, 1, 0, "WaylandClient", QObject::tr("Cannot create instance of WaylandClient")); -- cgit v1.2.3