diff options
author | Jørgen Lind <jorgen.lind@theqtcompany.com> | 2015-01-20 14:49:24 +0100 |
---|---|---|
committer | Jørgen Lind <jorgen.lind@theqtcompany.com> | 2015-08-28 13:09:41 +0200 |
commit | 6edb553d443abf5eff1428a2a7398ac1ff826fad (patch) | |
tree | 11d06970b40b196b9c239a836440af42164eb2da | |
parent | 1e8f603c055444dc91e9d068ebb53d3a518aebe3 (diff) |
WaylandCursorItem
Change-Id: Ic6edf6d6e723b8f62e61855958a455096f094c5e
-rw-r--r-- | src/imports/compositor/WaylandCursorItem.qml | 19 | ||||
-rw-r--r-- | src/imports/compositor/compositor.pro | 9 | ||||
-rw-r--r-- | src/imports/compositor/qwaylandmousetracker.cpp | 137 | ||||
-rw-r--r-- | src/imports/compositor/qwaylandmousetracker_p.h | 77 | ||||
-rw-r--r-- | src/imports/compositor/qwaylandquickcompositorplugin.cpp | 6 |
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")); |