diff --git a/autotests/mock_effectshandler.h b/autotests/mock_effectshandler.h index 39119ce3df..b6229979b3 100644 --- a/autotests/mock_effectshandler.h +++ b/autotests/mock_effectshandler.h @@ -174,6 +174,7 @@ public: void registerGlobalShortcut(const QKeySequence &, QAction *) override {} void registerPointerShortcut(Qt::KeyboardModifiers, Qt::MouseButton, QAction *) override {} void registerTouchpadSwipeShortcut(KWin::SwipeDirection, QAction *) override {} + void registerRealtimeTouchpadSwipeShortcut(KWin::SwipeDirection, QAction*, std::function) override {} void reloadEffect(KWin::Effect *) override {} void removeSupportProperty(const QByteArray &, KWin::Effect *) override {} void reserveElectricBorder(KWin::ElectricBorder, KWin::Effect *) override {} diff --git a/src/effects.cpp b/src/effects.cpp index 09c623cd9a..7a0328d355 100644 --- a/src/effects.cpp +++ b/src/effects.cpp @@ -750,6 +750,11 @@ void EffectsHandlerImpl::registerAxisShortcut(Qt::KeyboardModifiers modifiers, P input()->registerAxisShortcut(modifiers, axis, action); } +void EffectsHandlerImpl::registerRealtimeTouchpadSwipeShortcut(SwipeDirection dir, QAction* onUp, std::function progressCallback) +{ + input()->registerRealtimeTouchpadSwipeShortcut(dir, onUp, progressCallback); +} + void EffectsHandlerImpl::registerTouchpadSwipeShortcut(SwipeDirection direction, QAction *action) { input()->registerTouchpadSwipeShortcut(direction, action); diff --git a/src/effects.h b/src/effects.h index 683da8a74b..1c1aa79780 100644 --- a/src/effects.h +++ b/src/effects.h @@ -110,6 +110,7 @@ public: void registerGlobalShortcut(const QKeySequence &shortcut, QAction *action) override; void registerPointerShortcut(Qt::KeyboardModifiers modifiers, Qt::MouseButton pointerButtons, QAction *action) override; void registerAxisShortcut(Qt::KeyboardModifiers modifiers, PointerAxisDirection axis, QAction *action) override; + void registerRealtimeTouchpadSwipeShortcut(SwipeDirection dir, QAction* onUp, std::function progressCallback) override; void registerTouchpadSwipeShortcut(SwipeDirection direction, QAction *action) override; void* getProxy(QString name) override; void startMousePolling() override; diff --git a/src/globalshortcuts.cpp b/src/globalshortcuts.cpp index c90c2d6da2..773f93c15b 100644 --- a/src/globalshortcuts.cpp +++ b/src/globalshortcuts.cpp @@ -20,6 +20,7 @@ // Qt #include #include +#include namespace KWin { @@ -39,6 +40,17 @@ GlobalShortcut::GlobalShortcut(Shortcut &&sc, QAction *action) m_gesture->setMaximumFingerCount(4); m_gesture->setMinimumFingerCount(4); QObject::connect(m_gesture.get(), &SwipeGesture::triggered, m_action, &QAction::trigger, Qt::QueuedConnection); + } else if (auto rtSwipeGesture = std::get_if(&sc)) { + m_gesture.reset(new SwipeGesture); + m_gesture->setDirection(dirs[rtSwipeGesture->swipeDirection]); + m_gesture->setMinimumDelta(QSizeF(200, 200)); + m_gesture->setMaximumFingerCount(4); + m_gesture->setMinimumFingerCount(4); + QObject::connect(m_gesture.get(), &SwipeGesture::triggered, m_action, &QAction::trigger, Qt::QueuedConnection); + QObject::connect(m_gesture.get(), &SwipeGesture::cancelled, m_action, &QAction::trigger, Qt::QueuedConnection); + QObject::connect(m_gesture.get(), &SwipeGesture::progress, [cb = rtSwipeGesture->progressCallback](qreal v) { + cb(v); + }); } } @@ -111,7 +123,7 @@ bool GlobalShortcutsManager::addIfNotExists(GlobalShortcut sc) } } - if (std::holds_alternative(sc.shortcut())) { + if (std::holds_alternative(sc.shortcut()) || std::holds_alternative(sc.shortcut())) { m_gestureRecognizer->registerGesture(sc.swipeGesture()); } connect(sc.action(), &QAction::destroyed, this, &GlobalShortcutsManager::objectDeleted); @@ -134,6 +146,11 @@ void GlobalShortcutsManager::registerTouchpadSwipe(QAction *action, SwipeDirecti addIfNotExists(GlobalShortcut(FourFingerSwipeShortcut{direction}, action)); } +void GlobalShortcutsManager::registerRealtimeTouchpadSwipe(QAction *action, std::function progressCallback, SwipeDirection direction) +{ + addIfNotExists(GlobalShortcut(FourFingerRealtimeFeedbackSwipeShortcut{direction, progressCallback}, action)); +} + bool GlobalShortcutsManager::processKey(Qt::KeyboardModifiers mods, int keyQt) { if (m_kglobalAccelInterface) { diff --git a/src/globalshortcuts.h b/src/globalshortcuts.h index fd3cdcf69d..6882f2aca4 100644 --- a/src/globalshortcuts.h +++ b/src/globalshortcuts.h @@ -60,6 +60,8 @@ public: void registerTouchpadSwipe(QAction *action, SwipeDirection direction); + void registerRealtimeTouchpadSwipe(QAction *onUp, std::function progressCallback, SwipeDirection direction); + /** * @brief Processes a key event to decide whether a shortcut needs to be triggered. * @@ -141,8 +143,19 @@ struct FourFingerSwipeShortcut return swipeDirection == rhs.swipeDirection; } }; +struct FourFingerRealtimeFeedbackSwipeShortcut +{ + SwipeDirection swipeDirection; + std::function progressCallback; -using Shortcut = std::variant; + template + bool operator==(const T& rhs) const + { + return swipeDirection == rhs.swipeDirection; + } +}; + +using Shortcut = std::variant; class GlobalShortcut { diff --git a/src/input.cpp b/src/input.cpp index 66c48fa327..dfc5ed14f9 100644 --- a/src/input.cpp +++ b/src/input.cpp @@ -2701,6 +2701,11 @@ void InputRedirection::registerAxisShortcut(Qt::KeyboardModifiers modifiers, Poi m_shortcuts->registerAxisShortcut(action, modifiers, axis); } +void InputRedirection::registerRealtimeTouchpadSwipeShortcut(SwipeDirection direction, QAction *action, std::function cb) +{ + m_shortcuts->registerRealtimeTouchpadSwipe(action, cb, direction); +} + void InputRedirection::registerTouchpadSwipeShortcut(SwipeDirection direction, QAction *action) { m_shortcuts->registerTouchpadSwipe(action, direction); diff --git a/src/input.h b/src/input.h index 8d9d40ce46..cea98b0e83 100644 --- a/src/input.h +++ b/src/input.h @@ -139,6 +139,7 @@ public: void registerPointerShortcut(Qt::KeyboardModifiers modifiers, Qt::MouseButton pointerButtons, QAction *action); void registerAxisShortcut(Qt::KeyboardModifiers modifiers, PointerAxisDirection axis, QAction *action); void registerTouchpadSwipeShortcut(SwipeDirection direction, QAction *action); + void registerRealtimeTouchpadSwipeShortcut(SwipeDirection direction, QAction *onUp, std::function progressCallback); void registerGlobalAccel(KGlobalAccelInterface *interface); /** diff --git a/src/libkwineffects/kwineffects.h b/src/libkwineffects/kwineffects.h index 14225b4a09..6fc240d805 100644 --- a/src/libkwineffects/kwineffects.h +++ b/src/libkwineffects/kwineffects.h @@ -886,6 +886,8 @@ public: */ virtual void registerTouchpadSwipeShortcut(SwipeDirection direction, QAction *action) = 0; + virtual void registerRealtimeTouchpadSwipeShortcut(SwipeDirection dir, QAction* onUp, std::function progressCallback) = 0; + /** * Retrieve the proxy class for an effect if it has one. Will return NULL if * the effect isn't loaded or doesn't have a proxy class.