From 793a0e72bf7e067943bc286dd8c4d06789151edd Mon Sep 17 00:00:00 2001 From: Vlad Zahorodnii Date: Sat, 11 Feb 2023 16:06:17 +0200 Subject: [PATCH] scripting: Add gesture handlers --- src/CMakeLists.txt | 1 + src/scripting/gesturehandler.cpp | 178 +++++++++++++++++++++++++++++++ src/scripting/gesturehandler.h | 155 +++++++++++++++++++++++++++ src/scripting/scripting.cpp | 3 + 4 files changed, 337 insertions(+) create mode 100644 src/scripting/gesturehandler.cpp create mode 100644 src/scripting/gesturehandler.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 1ffcfd414d..eff5968219 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -153,6 +153,7 @@ target_sources(kwin PRIVATE screenedge.cpp scripting/dbuscall.cpp scripting/desktopbackgrounditem.cpp + scripting/gesturehandler.cpp scripting/screenedgehandler.cpp scripting/scriptedeffect.cpp scripting/scripting.cpp diff --git a/src/scripting/gesturehandler.cpp b/src/scripting/gesturehandler.cpp new file mode 100644 index 0000000000..9346a6d195 --- /dev/null +++ b/src/scripting/gesturehandler.cpp @@ -0,0 +1,178 @@ +/* + SPDX-FileCopyrightText: 2023 Vlad Zahorodnii + + SPDX-License-Identifier: GPL-2.0-or-later +*/ + +#include "gesturehandler.h" +#include "effects.h" + +#include + +#include + +namespace KWin +{ + +SwipeGestureHandler::SwipeGestureHandler(QObject *parent) + : QObject(parent) +{ +} + +void SwipeGestureHandler::classBegin() +{ +} + +void SwipeGestureHandler::componentComplete() +{ + m_action = new QAction(this); + connect(m_action, &QAction::triggered, this, &SwipeGestureHandler::activated); + + std::function progressCallback)> registrator; + switch (m_deviceType) { + case Device::Touchpad: + registrator = std::mem_fn(&EffectsHandler::registerTouchpadSwipeShortcut); + break; + case Device::Touchscreen: + registrator = std::mem_fn(&EffectsHandler::registerTouchscreenSwipeShortcut); + break; + } + + registrator(effects, SwipeDirection(m_direction), m_fingerCount, m_action, [this](qreal progress) { + setProgress(progress); + }); +} + +SwipeGestureHandler::Direction SwipeGestureHandler::direction() const +{ + return m_direction; +} + +void SwipeGestureHandler::setDirection(Direction direction) +{ + if (m_direction != direction) { + m_direction = direction; + Q_EMIT directionChanged(); + } +} + +int SwipeGestureHandler::fingerCount() const +{ + return m_fingerCount; +} + +void SwipeGestureHandler::setFingerCount(int fingerCount) +{ + if (m_fingerCount != fingerCount) { + m_fingerCount = fingerCount; + Q_EMIT fingerCountChanged(); + } +} + +qreal SwipeGestureHandler::progress() const +{ + return m_progress; +} + +void SwipeGestureHandler::setProgress(qreal progress) +{ + if (m_progress != progress) { + m_progress = progress; + Q_EMIT progressChanged(); + } +} + +SwipeGestureHandler::Device SwipeGestureHandler::deviceType() const +{ + return m_deviceType; +} + +void SwipeGestureHandler::setDeviceType(Device device) +{ + if (m_deviceType != device) { + m_deviceType = device; + Q_EMIT deviceTypeChanged(); + } +} + +PinchGestureHandler::PinchGestureHandler(QObject *parent) + : QObject(parent) +{ +} + +void PinchGestureHandler::classBegin() +{ +} + +void PinchGestureHandler::componentComplete() +{ + m_action = new QAction(this); + connect(m_action, &QAction::triggered, this, &PinchGestureHandler::activated); + + std::function progressCallback)> registrator; + switch (m_deviceType) { + case Device::Touchpad: + registrator = std::mem_fn(&EffectsHandler::registerTouchpadPinchShortcut); + break; + } + + registrator(effects, PinchDirection(m_direction), m_fingerCount, m_action, [this](qreal progress) { + setProgress(progress); + }); +} + +PinchGestureHandler::Direction PinchGestureHandler::direction() const +{ + return m_direction; +} + +void PinchGestureHandler::setDirection(Direction direction) +{ + if (m_direction != direction) { + m_direction = direction; + Q_EMIT directionChanged(); + } +} + +int PinchGestureHandler::fingerCount() const +{ + return m_fingerCount; +} + +void PinchGestureHandler::setFingerCount(int fingerCount) +{ + if (m_fingerCount != fingerCount) { + m_fingerCount = fingerCount; + Q_EMIT fingerCountChanged(); + } +} + +qreal PinchGestureHandler::progress() const +{ + return m_progress; +} + +void PinchGestureHandler::setProgress(qreal progress) +{ + if (m_progress != progress) { + m_progress = progress; + Q_EMIT progressChanged(); + } +} + +PinchGestureHandler::Device PinchGestureHandler::deviceType() const +{ + return m_deviceType; +} + +void PinchGestureHandler::setDeviceType(Device device) +{ + if (m_deviceType != device) { + m_deviceType = device; + Q_EMIT deviceTypeChanged(); + } +} + +} // namespace KWin + +#include "moc_gesturehandler.cpp" diff --git a/src/scripting/gesturehandler.h b/src/scripting/gesturehandler.h new file mode 100644 index 0000000000..b1e39fa798 --- /dev/null +++ b/src/scripting/gesturehandler.h @@ -0,0 +1,155 @@ +/* + SPDX-FileCopyrightText: 2023 Vlad Zahorodnii + + SPDX-License-Identifier: GPL-2.0-or-later +*/ + +#pragma once + +#include + +#include + +class QAction; + +namespace KWin +{ + +/** + * The SwipeGestureHandler type provides a way to handle global swipe gestures. + * + * Example usage: + * @code + * SwipeGestureHandler { + * direction: SwipeGestureHandler.Direction.Up + * fingerCount: 3 + * onActivated: console.log("activated") + * } + * @endcode + */ +class SwipeGestureHandler : public QObject, public QQmlParserStatus +{ + Q_OBJECT + Q_INTERFACES(QQmlParserStatus) + + Q_PROPERTY(Direction direction READ direction WRITE setDirection NOTIFY directionChanged) + Q_PROPERTY(int fingerCount READ fingerCount WRITE setFingerCount NOTIFY fingerCountChanged) + Q_PROPERTY(qreal progress READ progress NOTIFY progressChanged) + Q_PROPERTY(Device deviceType READ deviceType WRITE setDeviceType NOTIFY deviceTypeChanged) + +public: + explicit SwipeGestureHandler(QObject *parent = nullptr); + + // Matches SwipeDirection. + enum class Direction { + Invalid, + Down, + Left, + Up, + Right, + }; + Q_ENUM(Direction) + + enum class Device { + Touchpad, + Touchscreen, + }; + Q_ENUM(Device) + + void classBegin() override; + void componentComplete() override; + + Direction direction() const; + void setDirection(Direction direction); + + int fingerCount() const; + void setFingerCount(int fingerCount); + + qreal progress() const; + void setProgress(qreal progress); + + Device deviceType() const; + void setDeviceType(Device device); + +Q_SIGNALS: + void activated(); + void progressChanged(); + void directionChanged(); + void fingerCountChanged(); + void deviceTypeChanged(); + +private: + QAction *m_action = nullptr; + Direction m_direction = Direction::Invalid; + Device m_deviceType = Device::Touchpad; + qreal m_progress = 0; + int m_fingerCount = 3; +}; + +/** + * The PinchGestureHandler type provides a way to handle global pinch gestures. + * + * Example usage: + * @code + * PinchGestureHandler { + * direction: PinchGestureHandler.Direction.Contracting + * fingerCount: 3 + * onActivated: console.log("activated") + * } + * @endcode + */ +class PinchGestureHandler : public QObject, public QQmlParserStatus +{ + Q_OBJECT + Q_INTERFACES(QQmlParserStatus) + + Q_PROPERTY(Direction direction READ direction WRITE setDirection NOTIFY directionChanged) + Q_PROPERTY(int fingerCount READ fingerCount WRITE setFingerCount NOTIFY fingerCountChanged) + Q_PROPERTY(qreal progress READ progress NOTIFY progressChanged) + +public: + explicit PinchGestureHandler(QObject *parent = nullptr); + + // Matches PinchDirection. + enum class Direction { + Expanding, + Contracting, + }; + Q_ENUM(Direction) + + enum class Device { + Touchpad, + }; + Q_ENUM(Device) + + void classBegin() override; + void componentComplete() override; + + Direction direction() const; + void setDirection(Direction direction); + + int fingerCount() const; + void setFingerCount(int fingerCount); + + qreal progress() const; + void setProgress(qreal progress); + + Device deviceType() const; + void setDeviceType(Device device); + +Q_SIGNALS: + void activated(); + void progressChanged(); + void directionChanged(); + void fingerCountChanged(); + void deviceTypeChanged(); + +private: + QAction *m_action = nullptr; + Direction m_direction = Direction::Contracting; + Device m_deviceType = Device::Touchpad; + qreal m_progress = 0; + int m_fingerCount = 3; +}; + +} // namespace KWin diff --git a/src/scripting/scripting.cpp b/src/scripting/scripting.cpp index c9f2b96bae..2cef5b8207 100644 --- a/src/scripting/scripting.cpp +++ b/src/scripting/scripting.cpp @@ -13,6 +13,7 @@ // own #include "dbuscall.h" #include "desktopbackgrounditem.h" +#include "gesturehandler.h" #include "libkwineffects/kwinquickeffect.h" #include "screenedgehandler.h" #include "scripting_logging.h" @@ -645,6 +646,8 @@ void KWin::Scripting::init() qmlRegisterType("org.kde.kwin", 3, 0, "DBusCall"); qmlRegisterType("org.kde.kwin", 3, 0, "ScreenEdgeHandler"); qmlRegisterType("org.kde.kwin", 3, 0, "ShortcutHandler"); + qmlRegisterType("org.kde.kwin", 3, 0, "SwipeGestureHandler"); + qmlRegisterType("org.kde.kwin", 3, 0, "PinchGestureHandler"); qmlRegisterType("org.kde.kwin", 3, 0, "WindowModel"); qmlRegisterType("org.kde.kwin", 3, 0, "WindowFilterModel"); qmlRegisterType("org.kde.kwin", 3, 0, "VirtualDesktopModel");