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.