summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJørgen Lind <jorgen.lind@theqtcompany.com>2015-01-20 14:49:24 +0100
committerJørgen Lind <jorgen.lind@theqtcompany.com>2015-08-28 13:09:41 +0200
commit6edb553d443abf5eff1428a2a7398ac1ff826fad (patch)
tree11d06970b40b196b9c239a836440af42164eb2da
parent1e8f603c055444dc91e9d068ebb53d3a518aebe3 (diff)
WaylandCursorItem
-rw-r--r--src/imports/compositor/WaylandCursorItem.qml19
-rw-r--r--src/imports/compositor/compositor.pro9
-rw-r--r--src/imports/compositor/qwaylandmousetracker.cpp137
-rw-r--r--src/imports/compositor/qwaylandmousetracker_p.h77
-rw-r--r--src/imports/compositor/qwaylandquickcompositorplugin.cpp6
5 files changed, 232 insertions, 16 deletions
diff --git a/src/imports/compositor/WaylandCursorItem.qml b/src/imports/compositor/WaylandCursorItem.qml
index 4a3a26220..609cad7ad 100644
--- a/src/imports/compositor/WaylandCursorItem.qml
+++ b/src/imports/compositor/WaylandCursorItem.qml
@@ -32,35 +32,28 @@
****************************************************************************/
import QtQuick 2.0
+import QtWayland.Compositor 1.0
-Item {
+WaylandSurfaceView {
id: cursorItem
property QtObject compositor
- property QtObject surface
- property Item view
property int hotspotX: 0
property int hotspotY: 0
- visible: surface != null
+ visible: cursorItem.surface != null
+ inputEventsEnabled: false
Component.onCompleted: {
if (!compositor) {
console.warn("WaylandCursorItem initiated without compositor. This leads to undefined behavior");
return;
}
- compositor.currentCurserSurfaceRequest.connect(setSurface);
+ compositor.currentCurserSurfaceRequest.connect(setCursorSurface);
}
- function setSurface(surface, hotspotX, hotspotY) {
+ function setCursorSurface(surface, hotspotX, hotspotY) {
cursorItem.surface = surface;
cursorItem.hotspotX = hotspotX;
cursorItem.hotspotY = hotspotY;
}
- onSurfaceChanged: {
- if (view)
- view.destroy();
- if (surface) {
- view = Qt.createQmlObject("WaylandSurfaceItem { }", cursorItem);
- }
- }
}
diff --git a/src/imports/compositor/compositor.pro b/src/imports/compositor/compositor.pro
index 248545dfe..1f930d870 100644
--- a/src/imports/compositor/compositor.pro
+++ b/src/imports/compositor/compositor.pro
@@ -3,12 +3,17 @@ TARGET = qwaylandcompositorplugin
TARGETPATH = QtWayland/Compositor
IMPORT_VERSION = 1.0
+HEADERS += \
+ qwaylandmousetracker_p.h
+
SOURCES += \
- qwaylandquickcompositorplugin.cpp
+ qwaylandquickcompositorplugin.cpp \
+ qwaylandmousetracker.cpp
COMPOSITOR_QML_FILES += \
WaylandSurfaceChrome.qml \
WaylandOutputWindow.qml \
+ WaylandCursorItem.qml \
qmldir
# Create the resource file
@@ -37,6 +42,6 @@ RESOURCES += $$GENERATED_RESOURCE_FILE
CONFIG(debug, debug|release): QML_FILES += $$COMPOSITOR_QML_FILES
DEFINES += QT_COMPOSITOR_QUICK
-QT += quick-private qml-private compositor compositor-private
+QT += quick-private qml-private gui-private core-private compositor compositor-private
load(qml_plugin)
diff --git a/src/imports/compositor/qwaylandmousetracker.cpp b/src/imports/compositor/qwaylandmousetracker.cpp
new file mode 100644
index 000000000..7fd7ba5a5
--- /dev/null
+++ b/src/imports/compositor/qwaylandmousetracker.cpp
@@ -0,0 +1,137 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the QtWaylandCompositor module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qwaylandmousetracker_p.h"
+
+#include <QtQuick/private/qquickitem_p.h>
+
+class QWaylandMouseTrackerPrivate : public QQuickItemPrivate
+{
+ Q_DECLARE_PUBLIC(QWaylandMouseTracker)
+public:
+ QWaylandMouseTrackerPrivate()
+ : enableWSCursor(false)
+ {
+ QImage cursorImage(64,64,QImage::Format_ARGB32);
+ cursorImage.fill(Qt::transparent);
+ cursorPixmap = QPixmap::fromImage(cursorImage);
+ }
+ void handleMousePos(const QPointF &mousePos)
+ {
+ Q_Q(QWaylandMouseTracker);
+ bool xChanged = mousePos.x() != this->mousePos.x();
+ bool yChanged = mousePos.y() != this->mousePos.y();
+ if (xChanged || yChanged) {
+ this->mousePos = mousePos;
+ if (xChanged)
+ emit q->mouseXChanged();
+ if (yChanged)
+ emit q->mouseYChanged();
+ }
+ }
+
+ QPointF mousePos;
+ bool enableWSCursor;
+ QPixmap cursorPixmap;
+};
+
+QWaylandMouseTracker::QWaylandMouseTracker(QQuickItem *parent)
+ : QQuickItem(*(new QWaylandMouseTrackerPrivate), parent)
+{
+ Q_D(QWaylandMouseTracker);
+ setFiltersChildMouseEvents(true);
+ setAcceptHoverEvents(true);
+ setCursor(QCursor(d->cursorPixmap));
+}
+
+qreal QWaylandMouseTracker::mouseX() const
+{
+ Q_D(const QWaylandMouseTracker);
+ return d->mousePos.x();
+}
+qreal QWaylandMouseTracker::mouseY() const
+{
+ Q_D(const QWaylandMouseTracker);
+ return d->mousePos.y();
+}
+
+void QWaylandMouseTracker::setEnableWSCursor(bool enable)
+{
+ Q_D(QWaylandMouseTracker);
+ if (d->enableWSCursor != enable) {
+ d->enableWSCursor = enable;
+ if (enable) {
+ unsetCursor();
+ } else {
+ setCursor(QCursor(d->cursorPixmap));
+ }
+ emit enableWSCursorChanged();
+ }
+}
+
+bool QWaylandMouseTracker::enableWSCursor() const
+{
+ Q_D(const QWaylandMouseTracker);
+ return d->enableWSCursor;
+}
+
+bool QWaylandMouseTracker::childMouseEventFilter(QQuickItem *item, QEvent *event)
+{
+ Q_D(QWaylandMouseTracker);
+ if (event->type() == QEvent::MouseMove) {
+ QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);
+ d->handleMousePos(mapFromItem(item, mouseEvent->localPos()));
+ } else if (event->type() == QEvent::HoverMove) {
+ QHoverEvent *hoverEvent = static_cast<QHoverEvent *>(event);
+ d->handleMousePos(mapFromItem(item, hoverEvent->posF()));
+ }
+ return false;
+}
+
+void QWaylandMouseTracker::mouseMoveEvent(QMouseEvent *event)
+{
+ Q_D(QWaylandMouseTracker);
+ QQuickItem::mouseMoveEvent(event);
+ d->handleMousePos(event->localPos());
+}
+
+void QWaylandMouseTracker::hoverMoveEvent(QHoverEvent *event)
+{
+ Q_D(QWaylandMouseTracker);
+ QQuickItem::hoverMoveEvent(event);
+ d->handleMousePos(event->posF());
+}
+
diff --git a/src/imports/compositor/qwaylandmousetracker_p.h b/src/imports/compositor/qwaylandmousetracker_p.h
new file mode 100644
index 000000000..4270151ca
--- /dev/null
+++ b/src/imports/compositor/qwaylandmousetracker_p.h
@@ -0,0 +1,77 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the QtWaylandCompositor module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QWAYLANDMOUSETRACKER_P_H
+#define QWAYLANDMOUSETRACKER_P_H
+
+#include <QtQuick/private/qquickmousearea_p.h>
+
+#include <QtCompositor/qwaylandexport.h>
+
+QT_BEGIN_NAMESPACE
+
+class QWaylandMouseTrackerPrivate;
+
+class Q_COMPOSITOR_EXPORT QWaylandMouseTracker : public QQuickItem
+{
+ Q_OBJECT
+ Q_DECLARE_PRIVATE(QWaylandMouseTracker)
+ Q_PROPERTY(qreal mouseX READ mouseX NOTIFY mouseXChanged)
+ Q_PROPERTY(qreal mouseY READ mouseY NOTIFY mouseYChanged)
+
+ Q_PROPERTY(bool enableWSCursor READ enableWSCursor WRITE setEnableWSCursor NOTIFY enableWSCursorChanged)
+public:
+ QWaylandMouseTracker(QQuickItem *parent = 0);
+
+ qreal mouseX() const;
+ qreal mouseY() const;
+
+ void setEnableWSCursor(bool enable);
+ bool enableWSCursor() const;
+signals:
+ void mouseXChanged();
+ void mouseYChanged();
+ void enableWSCursorChanged();
+
+protected:
+ bool childMouseEventFilter(QQuickItem *item, QEvent *event) Q_DECL_OVERRIDE;
+ void mouseMoveEvent(QMouseEvent *event) Q_DECL_OVERRIDE;
+ void hoverMoveEvent(QHoverEvent *event) Q_DECL_OVERRIDE;
+};
+
+QT_END_NAMESPACE
+
+#endif /*QWAYLANDMOUSETRACKER_P_H*/
diff --git a/src/imports/compositor/qwaylandquickcompositorplugin.cpp b/src/imports/compositor/qwaylandquickcompositorplugin.cpp
index f06642a5f..c73f9a1e0 100644
--- a/src/imports/compositor/qwaylandquickcompositorplugin.cpp
+++ b/src/imports/compositor/qwaylandquickcompositorplugin.cpp
@@ -47,9 +47,12 @@
#include <QtCompositor/private/qwlcompositor_p.h>
+#include <QtCompositor/qwaylandexport.h>
+#include "qwaylandmousetracker_p.h"
+
QT_BEGIN_NAMESPACE
-class QWaylandQuickCompositorImpl : public QWaylandQuickCompositor
+class Q_COMPOSITOR_EXPORT QWaylandQuickCompositorImpl : public QWaylandQuickCompositor
{
Q_OBJECT
Q_PROPERTY(QQmlListProperty<QObject> data READ data DESIGNABLE false)
@@ -146,6 +149,7 @@ public:
{
qmlRegisterType<QWaylandQuickCompositorImpl>(uri, 1, 0, "WaylandCompositor");
qmlRegisterType<QWaylandSurfaceItem>(uri, 1, 0, "WaylandSurfaceView");
+ qmlRegisterType<QWaylandMouseTracker>(uri, 1, 0, "WaylandMouseTracker");
qmlRegisterUncreatableType<QWaylandQuickSurface>(uri, 1, 0, "WaylandQuickSurface", QObject::tr("Cannot create instance of WaylandQuickSurface"));
qmlRegisterUncreatableType<QWaylandClient>(uri, 1, 0, "WaylandClient", QObject::tr("Cannot create instance of WaylandClient"));
qmlRegisterUncreatableType<QWaylandOutput>(uri, 1, 0, "WaylandOutput", QObject::tr("Cannot create instance of WaylandOutput"));