summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPier Luigi Fiorini <pierluigi.fiorini@gmail.com>2016-04-07 20:20:25 +0200
committerPier Luigi Fiorini <pierluigi.fiorini@gmail.com>2016-04-25 10:51:32 +0000
commit1aa4f823d2ffb532b1c7b7c7070693bd585de017 (patch)
tree4bce7d504aab561a4b9019771a48b8d337bb413f
parentbfa66ccb29f747e2cb07a4f2e561b165be9f211d (diff)
Make window manager extension QML friendly
Change-Id: Ie6564144e72a9e5e30222a8d2b30f2ff6c8c961c Reviewed-by: Giulio Camuffo <giulio.camuffo@kdab.com>
-rw-r--r--src/compositor/extensions/qwaylandwindowmanagerextension.cpp62
-rw-r--r--src/compositor/extensions/qwaylandwindowmanagerextension.h14
-rw-r--r--src/compositor/extensions/qwaylandwindowmanagerextension_p.h12
-rw-r--r--src/imports/compositor/plugins.qmltypes18
-rw-r--r--src/imports/compositor/qwaylandquickcompositorplugin.cpp3
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<QWaylandWindowManagerExtension>(*new QWaylandWindowManagerExtensionPrivate)
+{
+}
+
QWaylandWindowManagerExtension::QWaylandWindowManagerExtension(QWaylandCompositor *compositor)
- : QWaylandExtensionTemplate(compositor, *new QWaylandWindowManagerExtensionPrivate(compositor))
+ : QWaylandExtensionTemplate<QWaylandWindowManagerExtension>(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<int32_t>(d->m_showIsFullScreen));
+ d->send_hints(resource->handle, static_cast<int32_t>(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<QWaylandCompositor *>(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<int32_t>(m_showIsFullScreen));
+ send_hints(resource->handle, static_cast<int32_t>(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<QWaylandCompositor *>(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 <QtWaylandCompositor/qwaylandextension.h>
+#include <QtWaylandCompositor/QWaylandExtension>
#include <QtWaylandCompositor/QWaylandClient>
#include <QtCore/QUrl>
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<QWaylandWindowManagerExtension>
{
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<Resource*, QString> m_urls;
+ bool showIsFullScreen;
+ QMap<Resource*, QString> 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
@@ -328,6 +328,24 @@ Module {
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"
Signal {
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 <QtWaylandCompositor/QWaylandQuickWlShellSurfaceItem>
#include <QtWaylandCompositor/QWaylandResource>
+#include <QtWaylandCompositor/QWaylandWindowManagerExtension>
#include <QtWaylandCompositor/QWaylandWlShell>
#include <QtWaylandCompositor/QWaylandTextInputManager>
@@ -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<QWaylandMouseTracker>(uri, 1, 0, "WaylandMouseTracker");
qmlRegisterType<QWaylandQuickOutput>(uri, 1, 0, "WaylandOutput");
qmlRegisterType<QWaylandQuickSurface>(uri, 1, 0, "WaylandSurface");
+ qmlRegisterType<QWaylandWindowManagerExtensionQuickData>(uri, 1, 0, "WindowManager");
qmlRegisterUncreatableType<QWaylandExtension>(uri, 1, 0, "WaylandExtension", QObject::tr("Cannot create instance of WaylandExtension"));
qmlRegisterUncreatableType<QWaylandClient>(uri, 1, 0, "WaylandClient", QObject::tr("Cannot create instance of WaylandClient"));