blob: 7731933e7f8003901bb94d41aa89fc019b6be726 [file] [log] [blame]
/****************************************************************************
**
** Copyright (C) 2017 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtWaylandCompositor module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:GPL$
** 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 https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 or (at your option) any later version
** approved by the KDE Free Qt Foundation. The licenses are as published by
** the Free Software Foundation and appearing in the file LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/
#ifndef QWAYLANDSURFACEITEM_H
#define QWAYLANDSURFACEITEM_H
#include <QtWaylandCompositor/qtwaylandcompositorglobal.h>
#include <QtQuick/QQuickItem>
#include <QtQuick/qsgtexture.h>
#include <QtQuick/qsgtextureprovider.h>
#include <QtWaylandCompositor/qwaylandview.h>
#include <QtWaylandCompositor/qwaylandquicksurface.h>
Q_DECLARE_METATYPE(QWaylandQuickSurface*)
QT_BEGIN_NAMESPACE
class QWaylandSeat;
class QWaylandQuickItemPrivate;
class Q_WAYLAND_COMPOSITOR_EXPORT QWaylandQuickItem : public QQuickItem
{
Q_OBJECT
Q_DECLARE_PRIVATE(QWaylandQuickItem)
Q_PROPERTY(QWaylandCompositor *compositor READ compositor NOTIFY compositorChanged)
Q_PROPERTY(QWaylandSurface *surface READ surface WRITE setSurface NOTIFY surfaceChanged)
Q_PROPERTY(bool paintEnabled READ paintEnabled WRITE setPaintEnabled)
Q_PROPERTY(bool touchEventsEnabled READ touchEventsEnabled WRITE setTouchEventsEnabled NOTIFY touchEventsEnabledChanged)
Q_PROPERTY(QWaylandSurface::Origin origin READ origin NOTIFY originChanged)
Q_PROPERTY(bool inputEventsEnabled READ inputEventsEnabled WRITE setInputEventsEnabled NOTIFY inputEventsEnabledChanged)
Q_PROPERTY(bool focusOnClick READ focusOnClick WRITE setFocusOnClick NOTIFY focusOnClickChanged)
Q_PROPERTY(bool sizeFollowsSurface READ sizeFollowsSurface WRITE setSizeFollowsSurface NOTIFY sizeFollowsSurfaceChanged)
Q_PROPERTY(QObject *subsurfaceHandler READ subsurfaceHandler WRITE setSubsurfaceHandler NOTIFY subsurfaceHandlerChanged)
Q_PROPERTY(QWaylandOutput *output READ output WRITE setOutput NOTIFY outputChanged)
Q_PROPERTY(bool bufferLocked READ isBufferLocked WRITE setBufferLocked NOTIFY bufferLockedChanged)
Q_PROPERTY(bool allowDiscardFrontBuffer READ allowDiscardFrontBuffer WRITE setAllowDiscardFrontBuffer NOTIFY allowDiscardFrontBufferChanged)
public:
QWaylandQuickItem(QQuickItem *parent = nullptr);
~QWaylandQuickItem() override;
QWaylandCompositor *compositor() const;
QWaylandView *view() const;
QWaylandSurface *surface() const;
void setSurface(QWaylandSurface *surface);
QWaylandSurface::Origin origin() const;
bool isTextureProvider() const override;
QSGTextureProvider *textureProvider() const override;
bool paintEnabled() const;
bool touchEventsEnabled() const;
void setTouchEventsEnabled(bool enabled);
bool inputEventsEnabled() const;
void setInputEventsEnabled(bool enabled);
bool focusOnClick() const;
void setFocusOnClick(bool focus);
bool inputRegionContains(const QPointF &localPosition) const;
bool inputRegionContains(const QPointF &localPosition);
Q_INVOKABLE QPointF mapToSurface(const QPointF &point) const;
Q_REVISION(13) Q_INVOKABLE QPointF mapFromSurface(const QPointF &point) const;
bool sizeFollowsSurface() const;
void setSizeFollowsSurface(bool sizeFollowsSurface);
#if QT_CONFIG(im)
QVariant inputMethodQuery(Qt::InputMethodQuery query) const override;
Q_INVOKABLE QVariant inputMethodQuery(Qt::InputMethodQuery query, QVariant argument) const;
#endif
QObject *subsurfaceHandler() const;
void setSubsurfaceHandler(QObject*);
QWaylandOutput *output() const;
void setOutput(QWaylandOutput *output);
bool isBufferLocked() const;
void setBufferLocked(bool locked);
bool allowDiscardFrontBuffer() const;
void setAllowDiscardFrontBuffer(bool discard);
Q_INVOKABLE void setPrimary();
protected:
void mousePressEvent(QMouseEvent *event) override;
void mouseMoveEvent(QMouseEvent *event) override;
void mouseReleaseEvent(QMouseEvent *event) override;
void hoverEnterEvent(QHoverEvent *event) override;
void hoverMoveEvent(QHoverEvent *event) override;
void hoverLeaveEvent(QHoverEvent *event) override;
#if QT_CONFIG(wheelevent)
void wheelEvent(QWheelEvent *event) override;
#endif
void keyPressEvent(QKeyEvent *event) override;
void keyReleaseEvent(QKeyEvent *event) override;
void touchEvent(QTouchEvent *event) override;
void touchUngrabEvent() override;
#if QT_CONFIG(im)
void inputMethodEvent(QInputMethodEvent *event) override;
#endif
virtual void surfaceChangedEvent(QWaylandSurface *newSurface, QWaylandSurface *oldSurface);
public Q_SLOTS:
virtual void takeFocus(QWaylandSeat *device = nullptr);
void setPaintEnabled(bool paintEnabled);
void raise();
void lower();
void sendMouseMoveEvent(const QPointF &position, QWaylandSeat *seat = nullptr);
private Q_SLOTS:
void surfaceMappedChanged();
void handleSurfaceChanged();
void parentChanged(QWaylandSurface *newParent, QWaylandSurface *oldParent);
void updateSize();
void updateBuffer(bool hasBuffer);
void updateWindow();
void updateOutput();
void beforeSync();
void handleSubsurfaceAdded(QWaylandSurface *childSurface);
void handleSubsurfacePosition(const QPoint &pos);
void handlePlaceAbove(QWaylandSurface *referenceSurface);
void handlePlaceBelow(QWaylandSurface *referenceSurface);
#if QT_CONFIG(draganddrop)
void handleDragStarted(QWaylandDrag *drag);
#endif
#if QT_CONFIG(im)
void updateInputMethod(Qt::InputMethodQueries queries);
#endif
Q_SIGNALS:
void surfaceChanged();
void compositorChanged();
void touchEventsEnabledChanged();
void originChanged();
void surfaceDestroyed();
void inputEventsEnabledChanged();
void focusOnClickChanged();
void mouseMove(const QPointF &windowPosition);
void mouseRelease();
void sizeFollowsSurfaceChanged();
void subsurfaceHandlerChanged();
void outputChanged();
void bufferLockedChanged();
void allowDiscardFrontBufferChanged();
protected:
QSGNode *updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *data) override;
QWaylandQuickItem(QWaylandQuickItemPrivate &dd, QQuickItem *parent = nullptr);
};
QT_END_NAMESPACE
#endif