KWin
Loading...
Searching...
No Matches
pointergesturestest.cpp
Go to the documentation of this file.
1/*
2 SPDX-FileCopyrightText: 2016 Martin Gräßlin <mgraesslin@kde.org>
3
4 SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
5*/
6
7#include <QGuiApplication>
8#include <QQuickItem>
9#include <QQuickView>
10
11#include <KWayland/Client/connection_thread.h>
12#include <KWayland/Client/pointer.h>
13#include <KWayland/Client/pointergestures.h>
14#include <KWayland/Client/registry.h>
15#include <KWayland/Client/seat.h>
16
17using namespace KWayland::Client;
18
19class PinchGesture : public QQuickItem
20{
21 Q_OBJECT
22 Q_PROPERTY(qreal scale READ scale NOTIFY scaleChanged)
23 Q_PROPERTY(qreal progressScale READ progressScale NOTIFY progressScaleChanged)
24
25public:
26 explicit PinchGesture(QQuickItem *parent = nullptr);
27 ~PinchGesture() override;
28
29 qreal scale() const
30 {
31 return m_scale;
32 }
33
34 qreal progressScale() const
35 {
36 return m_progressScale;
37 }
38
39protected:
40 void componentComplete() override;
41
42Q_SIGNALS:
44
45private:
46 void initWayland();
47 void setupGesture();
48
49 Pointer *m_pointer = nullptr;
50 PointerGestures *m_pointerGestures = nullptr;
51 PointerPinchGesture *m_gesture = nullptr;
52
53 qreal m_scale = 1.0;
54 qreal m_progressScale = 1.0;
55};
56
57PinchGesture::PinchGesture(QQuickItem *parent)
58 : QQuickItem(parent)
59{
60}
61
63
65{
66 QQuickItem::componentComplete();
67 initWayland();
68}
69
70void PinchGesture::initWayland()
71{
72 auto c = ConnectionThread::fromApplication(this);
73 Registry *r = new Registry(c);
74 r->create(c);
75
76 connect(r, &Registry::interfacesAnnounced, this,
77 [this, r] {
78 const auto gi = r->interface(Registry::Interface::PointerGesturesUnstableV1);
79 if (gi.name == 0) {
80 return;
81 }
82 m_pointerGestures = r->createPointerGestures(gi.name, gi.version, this);
83
84 // now create seat
85 const auto si = r->interface(Registry::Interface::Seat);
86 if (si.name == 0) {
87 return;
88 }
89 auto seat = r->createSeat(si.name, si.version, this);
90 connect(seat, &Seat::hasKeyboardChanged, this,
91 [this, seat](bool hasPointer) {
92 if (hasPointer) {
93 m_pointer = seat->createPointer(this);
94 setupGesture();
95 } else {
96 delete m_pointer;
97 delete m_gesture;
98 m_pointer = nullptr;
99 m_gesture = nullptr;
100 }
101 });
102 });
103
104 r->setup();
105 c->roundtrip();
106}
107
108void PinchGesture::setupGesture()
109{
110 if (m_gesture || !m_pointerGestures || !m_pointer) {
111 return;
112 }
113 m_gesture = m_pointerGestures->createPinchGesture(m_pointer, this);
114 connect(m_gesture, &PointerPinchGesture::updated, this,
115 [this](const QSizeF &delta, qreal scale) {
116 m_progressScale = scale;
117 Q_EMIT progressScaleChanged();
118 });
119 connect(m_gesture, &PointerPinchGesture::ended, this,
120 [this] {
121 m_scale = m_scale * m_progressScale;
122 m_progressScale = 1.0;
123 Q_EMIT scaleChanged();
124 Q_EMIT progressScaleChanged();
125 });
126 connect(m_gesture, &PointerPinchGesture::cancelled, this,
127 [this] {
128 m_progressScale = 1.0;
129 Q_EMIT progressScaleChanged();
130 });
131}
132
133int main(int argc, char *argv[])
134{
135 qputenv("QT_QPA_PLATFORM", QByteArrayLiteral("wayland"));
136 QGuiApplication app(argc, argv);
137
138 qmlRegisterType<PinchGesture>("org.kde.kwin.tests", 1, 0, "PinchGesture");
139
140 QQuickView view;
141 view.setSource(QUrl::fromLocalFile(QStringLiteral(DIR) + QStringLiteral("/pointergesturestest.qml")));
142
143 view.show();
144
145 return app.exec();
146}
147
148#include "pointergesturestest.moc"
qreal progressScale() const
void progressScaleChanged()
~PinchGesture() override
void componentComplete() override
PinchGesture(QQuickItem *parent=nullptr)
KWayland::Client::Seat * seat
#define explicit