40 Q_ASSERT(m_maximumX >= m_minimumX);
41 Q_ASSERT(m_maximumY >= m_minimumY);
46 if (!m_minimumDeltaRelevant || m_minimumDelta.isNull()) {
50 switch (m_direction) {
53 return std::min(std::abs(delta.y()) / std::abs(m_minimumDelta.y()), 1.0);
56 return std::min(std::abs(delta.x()) / std::abs(m_minimumDelta.x()), 1.0);
93 Q_ASSERT(!m_swipeGestures.contains(gesture));
95 m_destroyConnections.insert(gesture,
connection);
96 m_swipeGestures << gesture;
101 auto it = m_destroyConnections.find(gesture);
102 if (it != m_destroyConnections.end()) {
103 disconnect(it.value());
104 m_destroyConnections.erase(it);
106 m_swipeGestures.removeAll(gesture);
107 if (m_activeSwipeGestures.removeOne(gesture)) {
114 Q_ASSERT(!m_pinchGestures.contains(gesture));
116 m_destroyConnections.insert(gesture,
connection);
117 m_pinchGestures << gesture;
122 auto it = m_destroyConnections.find(gesture);
123 if (it != m_destroyConnections.end()) {
124 disconnect(it.value());
125 m_destroyConnections.erase(it);
127 m_pinchGestures.removeAll(gesture);
128 if (m_activePinchGestures.removeOne(gesture)) {
135 m_currentFingerCount = fingerCount;
136 if (!m_activeSwipeGestures.isEmpty() || !m_activePinchGestures.isEmpty()) {
140 for (SwipeGesture *gesture : std::as_const(m_swipeGestures)) {
141 if (gesture->minimumFingerCountIsRelevant()) {
142 if (gesture->minimumFingerCount() > fingerCount) {
146 if (gesture->maximumFingerCountIsRelevant()) {
147 if (gesture->maximumFingerCount() < fingerCount) {
151 if (startPosBehavior == StartPositionBehavior::Relevant) {
152 if (gesture->minimumXIsRelevant()) {
153 if (gesture->minimumX() > startPos.x()) {
157 if (gesture->maximumXIsRelevant()) {
158 if (gesture->maximumX() < startPos.x()) {
162 if (gesture->minimumYIsRelevant()) {
163 if (gesture->minimumY() > startPos.y()) {
167 if (gesture->maximumYIsRelevant()) {
168 if (gesture->maximumY() < startPos.y()) {
175 switch (gesture->direction()) {
178 if (m_currentSwipeAxis == Axis::Horizontal) {
184 if (m_currentSwipeAxis == Axis::Vertical) {
192 m_activeSwipeGestures << gesture;
194 Q_EMIT gesture->started();
201 m_currentDelta += delta;
207 if (m_currentSwipeAxis == Axis::None) {
208 if (std::abs(m_currentDelta.x()) >= std::abs(m_currentDelta.y())) {
209 swipeAxis = Axis::Horizontal;
212 swipeAxis = Axis::Vertical;
215 if (std::abs(m_currentDelta.x()) >= 5 || std::abs(m_currentDelta.y()) >= 5) {
218 m_currentSwipeAxis = swipeAxis;
221 swipeAxis = m_currentSwipeAxis;
229 case Axis::Horizontal:
237 for (
int i = 0; i < 2; i++) {
239 if (m_activeSwipeGestures.isEmpty()) {
243 for (
auto it = m_activeSwipeGestures.begin(); it != m_activeSwipeGestures.end();) {
246 if (g->direction() != direction) {
248 if (!g->minimumXIsRelevant() || !g->maximumXIsRelevant() || !g->minimumYIsRelevant() || !g->maximumYIsRelevant()) {
250 it = m_activeSwipeGestures.erase(it);
260 for (
SwipeGesture *g : std::as_const(m_activeSwipeGestures)) {
261 Q_EMIT g->progress(g->deltaToProgress(m_currentDelta));
262 Q_EMIT g->deltaProgress(m_currentDelta);
266void GestureRecognizer::cancelActiveGestures()
268 for (
auto g : std::as_const(m_activeSwipeGestures)) {
269 Q_EMIT g->cancelled();
271 for (
auto g : std::as_const(m_activePinchGestures)) {
272 Q_EMIT g->cancelled();
274 m_activeSwipeGestures.clear();
275 m_activePinchGestures.clear();
277 m_currentDelta = QPointF(0, 0);
278 m_currentSwipeAxis = Axis::None;
283 cancelActiveGestures();
284 m_currentFingerCount = 0;
285 m_currentDelta = QPointF(0, 0);
286 m_currentSwipeAxis = Axis::None;
291 const QPointF delta = m_currentDelta;
292 for (
auto g : std::as_const(m_activeSwipeGestures)) {
294 Q_EMIT g->triggered();
296 Q_EMIT g->cancelled();
299 m_activeSwipeGestures.clear();
300 m_currentFingerCount = 0;
301 m_currentDelta = QPointF(0, 0);
302 m_currentSwipeAxis = Axis::None;
307 m_currentFingerCount = fingerCount;
309 if (!m_activeSwipeGestures.isEmpty() || !m_activePinchGestures.isEmpty()) {
312 for (
PinchGesture *gesture : std::as_const(m_pinchGestures)) {
313 if (gesture->minimumFingerCountIsRelevant()) {
314 if (gesture->minimumFingerCount() > fingerCount) {
318 if (gesture->maximumFingerCountIsRelevant()) {
319 if (gesture->maximumFingerCount() < fingerCount) {
325 m_activePinchGestures << gesture;
327 Q_EMIT gesture->started();
334 m_currentScale = scale;
345 for (
int i = 0; i < 2; i++) {
346 if (m_activePinchGestures.isEmpty()) {
350 for (
auto it = m_activePinchGestures.begin(); it != m_activePinchGestures.end();) {
353 if (g->direction() != direction) {
355 it = m_activePinchGestures.erase(it);
362 for (
PinchGesture *g : std::as_const(m_activePinchGestures)) {
363 Q_EMIT g->progress(g->scaleDeltaToProgress(scale));
369 cancelActiveGestures();
371 m_currentFingerCount = 0;
372 m_currentSwipeAxis = Axis::None;
377 for (
auto g : std::as_const(m_activePinchGestures)) {
378 if (g->minimumScaleDeltaReached(m_currentScale)) {
379 Q_EMIT g->triggered();
381 Q_EMIT g->cancelled();
384 m_activeSwipeGestures.clear();
385 m_activePinchGestures.clear();
387 m_currentFingerCount = 0;
388 m_currentSwipeAxis = Axis::None;
393 return m_maximumFingerCountRelevant;
398 return m_minimumFingerCount;
403 m_minimumFingerCount = count;
404 m_minimumFingerCountRelevant =
true;
409 return m_minimumFingerCountRelevant;
414 m_maximumFingerCount = count;
415 m_maximumFingerCountRelevant =
true;
420 return m_maximumFingerCount;
436 m_minimumXRelevant =
true;
446 return m_minimumXRelevant;
452 m_minimumYRelevant =
true;
462 return m_minimumYRelevant;
468 m_maximumXRelevant =
true;
478 return m_maximumXRelevant;
484 m_maximumYRelevant =
true;
494 return m_maximumYRelevant;
499 return m_minimumDelta;
504 m_minimumDelta = delta;
505 m_minimumDeltaRelevant =
true;
510 return m_minimumDeltaRelevant;
515 return m_minimumFingerCountRelevant;
520 m_minimumFingerCount = count;
521 m_minimumFingerCountRelevant =
true;
526 return m_minimumFingerCount;
531 return m_maximumFingerCountRelevant;
536 m_maximumFingerCount = count;
537 m_maximumFingerCountRelevant =
true;
542 return m_maximumFingerCount;
557 return m_minimumScaleDelta;
562 m_minimumScaleDelta = scaleDelta;
563 m_minimumScaleDeltaRelevant =
true;
568 return m_minimumScaleDeltaRelevant;
573 return startSwipeGesture(fingerCount, QPointF(), StartPositionBehavior::Irrelevant);
583#include "moc_gestures.cpp"
int startPinchGesture(uint fingerCount)
void updateSwipeGesture(const QPointF &delta)
void unregisterSwipeGesture(SwipeGesture *gesture)
void cancelPinchGesture()
~GestureRecognizer() override
void registerSwipeGesture(SwipeGesture *gesture)
GestureRecognizer(QObject *parent=nullptr)
void updatePinchGesture(qreal scale, qreal angleDelta, const QPointF &posDelta)
void registerPinchGesture(PinchGesture *gesture)
void cancelSwipeGesture()
int startSwipeGesture(uint fingerCount)
void unregisterPinchGesture(PinchGesture *gesture)
void setMinimumScaleDelta(const qreal &scaleDelta)
void setDirection(PinchDirection direction)
uint minimumFingerCount() const
PinchGesture(QObject *parent=nullptr)
bool minimumScaleDeltaReached(const qreal &scaleDelta) const
bool minimumFingerCountIsRelevant() const
bool isMinimumScaleDeltaRelevant() const
PinchDirection direction() const
void setMinimumFingerCount(uint count)
bool maximumFingerCountIsRelevant() const
qreal scaleDeltaToProgress(const qreal &scaleDelta) const
void setMaximumFingerCount(uint count)
uint maximumFingerCount() const
qreal minimumScaleDelta() const
void setDirection(SwipeDirection direction)
SwipeDirection direction() const
qreal deltaToProgress(const QPointF &delta) const
bool maximumFingerCountIsRelevant() const
bool isMinimumDeltaRelevant() const
bool maximumYIsRelevant() const
uint minimumFingerCount() const
QPointF minimumDelta() const
bool maximumXIsRelevant() const
uint maximumFingerCount() const
SwipeGesture(QObject *parent=nullptr)
void setMinimumFingerCount(uint count)
void setMinimumDelta(const QPointF &delta)
bool minimumDeltaReached(const QPointF &delta) const
void setMaximumFingerCount(uint count)
bool minimumYIsRelevant() const
void setStartGeometry(const QRect &geometry)
bool minimumFingerCountIsRelevant() const
bool minimumXIsRelevant() const
KWIN_EXPORT xcb_connection_t * connection()
SwipeDirection
Directions for swipe gestures.