KWin
Loading...
Searching...
No Matches
gestures.h
Go to the documentation of this file.
1/*
2 KWin - the KDE window manager
3 This file is part of the KDE project.
4
5 SPDX-FileCopyrightText: 2017 Martin Gräßlin <mgraesslin@kde.org>
6
7 SPDX-License-Identifier: GPL-2.0-or-later
8*/
9#pragma once
10
11#include "effect/globals.h"
12#include <kwin_export.h>
13
14#include <QList>
15#include <QMap>
16#include <QObject>
17#include <QPointF>
18
19namespace KWin
20{
21/*
22 * Everytime the scale of the gesture changes by this much, the callback changes by 1.
23 * This is the amount of change for 1 unit of change, like switch by 1 desktop.
24 * */
25static const qreal DEFAULT_UNIT_SCALE_DELTA = .2; // 20%
26
27class Gesture : public QObject
28{
29 Q_OBJECT
30public:
31 ~Gesture() override;
32
33protected:
34 explicit Gesture(QObject *parent);
35
36Q_SIGNALS:
42 void started();
46 void triggered();
50 void cancelled();
51};
52
53class SwipeGesture : public Gesture
54{
55 Q_OBJECT
56public:
57 explicit SwipeGesture(QObject *parent = nullptr);
58 ~SwipeGesture() override;
59
61 void setMinimumFingerCount(uint count);
62 uint minimumFingerCount() const;
63
65 void setMaximumFingerCount(uint count);
66 uint maximumFingerCount() const;
67
70
71 void setMinimumX(int x);
72 int minimumX() const;
73 bool minimumXIsRelevant() const;
74 void setMinimumY(int y);
75 int minimumY() const;
76 bool minimumYIsRelevant() const;
77
78 void setMaximumX(int x);
79 int maximumX() const;
80 bool maximumXIsRelevant() const;
81 void setMaximumY(int y);
82 int maximumY() const;
83 bool maximumYIsRelevant() const;
84 void setStartGeometry(const QRect &geometry);
85
86 QPointF minimumDelta() const;
87 void setMinimumDelta(const QPointF &delta);
88 bool isMinimumDeltaRelevant() const;
89
90 qreal deltaToProgress(const QPointF &delta) const;
91 bool minimumDeltaReached(const QPointF &delta) const;
92
93Q_SIGNALS:
98 void progress(qreal);
99
103 void deltaProgress(const QPointF &delta);
104
105private:
106 bool m_minimumFingerCountRelevant = false;
107 uint m_minimumFingerCount = 0;
108 bool m_maximumFingerCountRelevant = false;
109 uint m_maximumFingerCount = 0;
111 bool m_minimumXRelevant = false;
112 int m_minimumX = 0;
113 bool m_minimumYRelevant = false;
114 int m_minimumY = 0;
115 bool m_maximumXRelevant = false;
116 int m_maximumX = 0;
117 bool m_maximumYRelevant = false;
118 int m_maximumY = 0;
119 bool m_minimumDeltaRelevant = false;
120 QPointF m_minimumDelta;
121};
122
123class PinchGesture : public Gesture
124{
125 Q_OBJECT
126public:
127 explicit PinchGesture(QObject *parent = nullptr);
128 ~PinchGesture() override;
129
130 bool minimumFingerCountIsRelevant() const;
131 void setMinimumFingerCount(uint count);
132 uint minimumFingerCount() const;
133
134 bool maximumFingerCountIsRelevant() const;
135 void setMaximumFingerCount(uint count);
136 uint maximumFingerCount() const;
137
140
141 qreal minimumScaleDelta() const;
142
147 void setMinimumScaleDelta(const qreal &scaleDelta);
148 bool isMinimumScaleDeltaRelevant() const;
149
150 qreal scaleDeltaToProgress(const qreal &scaleDelta) const;
151 bool minimumScaleDeltaReached(const qreal &scaleDelta) const;
152
153Q_SIGNALS:
158 void progress(qreal);
159
160private:
161 bool m_minimumFingerCountRelevant = false;
162 uint m_minimumFingerCount = 0;
163 bool m_maximumFingerCountRelevant = false;
164 uint m_maximumFingerCount = 0;
166 bool m_minimumScaleDeltaRelevant = false;
167 qreal m_minimumScaleDelta = DEFAULT_UNIT_SCALE_DELTA;
168};
169
170class KWIN_EXPORT GestureRecognizer : public QObject
171{
172 Q_OBJECT
173public:
174 GestureRecognizer(QObject *parent = nullptr);
176
177 void registerSwipeGesture(SwipeGesture *gesture);
178 void unregisterSwipeGesture(SwipeGesture *gesture);
179 void registerPinchGesture(PinchGesture *gesture);
180 void unregisterPinchGesture(PinchGesture *gesture);
181
182 int startSwipeGesture(uint fingerCount);
183 int startSwipeGesture(const QPointF &startPos);
184
185 void updateSwipeGesture(const QPointF &delta);
186 void cancelSwipeGesture();
187 void endSwipeGesture();
188
189 int startPinchGesture(uint fingerCount);
190 void updatePinchGesture(qreal scale, qreal angleDelta, const QPointF &posDelta);
191 void cancelPinchGesture();
192 void endPinchGesture();
193
194private:
195 void cancelActiveGestures();
196 enum class StartPositionBehavior {
197 Relevant,
198 Irrelevant,
199 };
200 enum class Axis {
202 Vertical,
203 None,
204 };
205 int startSwipeGesture(uint fingerCount, const QPointF &startPos, StartPositionBehavior startPosBehavior);
206 QList<SwipeGesture *> m_swipeGestures;
207 QList<PinchGesture *> m_pinchGestures;
208 QList<SwipeGesture *> m_activeSwipeGestures;
209 QList<PinchGesture *> m_activePinchGestures;
210 QMap<Gesture *, QMetaObject::Connection> m_destroyConnections;
211
212 QPointF m_currentDelta = QPointF(0, 0);
213 qreal m_currentScale = 1; // For Pinch Gesture recognition
214 uint m_currentFingerCount = 0;
215 Axis m_currentSwipeAxis = Axis::None;
216};
217
218}
Gesture(QObject *parent)
Definition gestures.cpp:19
~Gesture() override
void cancelled()
void triggered()
~GestureRecognizer() override
void setMinimumScaleDelta(const qreal &scaleDelta)
Definition gestures.cpp:560
void setDirection(PinchDirection direction)
Definition gestures.cpp:550
uint minimumFingerCount() const
Definition gestures.cpp:524
PinchGesture(QObject *parent=nullptr)
Definition gestures.cpp:67
bool minimumScaleDeltaReached(const qreal &scaleDelta) const
Definition gestures.cpp:79
bool minimumFingerCountIsRelevant() const
Definition gestures.cpp:513
bool isMinimumScaleDeltaRelevant() const
Definition gestures.cpp:566
~PinchGesture() override
PinchDirection direction() const
Definition gestures.cpp:545
void setMinimumFingerCount(uint count)
Definition gestures.cpp:518
bool maximumFingerCountIsRelevant() const
Definition gestures.cpp:529
void progress(qreal)
qreal scaleDeltaToProgress(const qreal &scaleDelta) const
Definition gestures.cpp:74
void setMaximumFingerCount(uint count)
Definition gestures.cpp:534
uint maximumFingerCount() const
Definition gestures.cpp:540
qreal minimumScaleDelta() const
Definition gestures.cpp:555
void setDirection(SwipeDirection direction)
Definition gestures.cpp:428
void setMaximumY(int y)
Definition gestures.cpp:481
SwipeDirection direction() const
Definition gestures.cpp:423
qreal deltaToProgress(const QPointF &delta) const
Definition gestures.cpp:44
bool maximumFingerCountIsRelevant() const
Definition gestures.cpp:391
bool isMinimumDeltaRelevant() const
Definition gestures.cpp:508
void setMinimumX(int x)
Definition gestures.cpp:433
bool maximumYIsRelevant() const
Definition gestures.cpp:492
void progress(qreal)
uint minimumFingerCount() const
Definition gestures.cpp:396
QPointF minimumDelta() const
Definition gestures.cpp:497
~SwipeGesture() override
bool maximumXIsRelevant() const
Definition gestures.cpp:476
uint maximumFingerCount() const
Definition gestures.cpp:418
SwipeGesture(QObject *parent=nullptr)
Definition gestures.cpp:26
void setMaximumX(int x)
Definition gestures.cpp:465
void setMinimumFingerCount(uint count)
Definition gestures.cpp:401
int maximumY() const
Definition gestures.cpp:487
void setMinimumY(int y)
Definition gestures.cpp:449
void setMinimumDelta(const QPointF &delta)
Definition gestures.cpp:502
bool minimumDeltaReached(const QPointF &delta) const
Definition gestures.cpp:62
int minimumX() const
Definition gestures.cpp:439
void setMaximumFingerCount(uint count)
Definition gestures.cpp:412
bool minimumYIsRelevant() const
Definition gestures.cpp:460
void setStartGeometry(const QRect &geometry)
Definition gestures.cpp:33
bool minimumFingerCountIsRelevant() const
Definition gestures.cpp:407
bool minimumXIsRelevant() const
Definition gestures.cpp:444
int minimumY() const
Definition gestures.cpp:455
void deltaProgress(const QPointF &delta)
int maximumX() const
Definition gestures.cpp:471
PinchDirection
Definition globals.h:123
SwipeDirection
Directions for swipe gestures.
Definition globals.h:115