diff --git a/autotests/integration/scripting/screenedge_test.cpp b/autotests/integration/scripting/screenedge_test.cpp --- a/autotests/integration/scripting/screenedge_test.cpp +++ b/autotests/integration/scripting/screenedge_test.cpp @@ -50,6 +50,7 @@ void testEdge_data(); void testEdge(); void testEdgeUnregister(); + void testDeclarativeTouchEdge(); private: void triggerConfigReload(); @@ -213,5 +214,29 @@ triggerConfigReload(); } +void ScreenEdgeTest::testDeclarativeTouchEdge() +{ + const QString scriptToLoad = QFINDTESTDATA("./scripts/screenedgetouch.qml"); + QVERIFY(!scriptToLoad.isEmpty()); + QVERIFY(Scripting::self()->loadDeclarativeScript(scriptToLoad) != -1); + QVERIFY(Scripting::self()->isScriptLoaded(scriptToLoad)); + + auto s = Scripting::self()->findScript(scriptToLoad); + QSignalSpy runningChangedSpy(s, &AbstractScript::runningChanged); + s->run(); + QTRY_COMPARE(runningChangedSpy.count(), 1); + + QSignalSpy showDesktopSpy(workspace(), &Workspace::showingDesktopChanged); + QVERIFY(showDesktopSpy.isValid()); + + // Trigger the edge through touch + quint32 timestamp = 0; + kwinApp()->platform()->touchDown(0, QPointF(0, 50), timestamp++); + kwinApp()->platform()->touchMotion(0, QPointF(500, 50), timestamp++); + kwinApp()->platform()->touchUp(0, timestamp++); + + QVERIFY(showDesktopSpy.wait()); +} + WAYLANDTEST_MAIN(ScreenEdgeTest) #include "screenedge_test.moc" diff --git a/autotests/integration/scripting/scripts/screenedgetouch.qml b/autotests/integration/scripting/scripts/screenedgetouch.qml new file mode 100644 --- /dev/null +++ b/autotests/integration/scripting/scripts/screenedgetouch.qml @@ -0,0 +1,10 @@ +import QtQuick 2.0; +import org.kde.kwin 2.0; + +ScreenEdgeItem { + edge: ScreenEdgeItem.LeftEdge + mode: ScreenEdgeItem.Touch + onActivated: { + workspace.slotToggleShowDesktop(); + } +} diff --git a/scripting/screenedgeitem.h b/scripting/screenedgeitem.h --- a/scripting/screenedgeitem.h +++ b/scripting/screenedgeitem.h @@ -23,6 +23,8 @@ #include #include +class QAction; + namespace KWin { @@ -46,6 +48,7 @@ { Q_OBJECT Q_ENUMS(Edge) + Q_ENUMS(Mode) /** * @brief Whether the edge is currently enabled, that is reserved. Default value is @c true. * @@ -56,6 +59,10 @@ * */ Q_PROPERTY(Edge edge READ edge WRITE setEdge NOTIFY edgeChanged) + /** + * @brief The operation mode for this edge. Default value is @c Mode::Pointer + **/ + Q_PROPERTY(Mode mode READ mode WRITE setMode NOTIFY modeChanged) public: enum Edge { TopEdge, @@ -69,18 +76,30 @@ EDGE_COUNT, NoEdge }; + /** + * Enum describing the operation modes of the edge. + **/ + enum class Mode { + Pointer, + Touch + }; explicit ScreenEdgeItem(QObject *parent = 0); virtual ~ScreenEdgeItem(); bool isEnabled() const; Edge edge() const; + Mode mode() const { + return m_mode; + } public Q_SLOTS: void setEnabled(bool enabled); void setEdge(Edge edge); + void setMode(Mode mode); Q_SIGNALS: void enabledChanged(); void edgeChanged(); + void modeChanged(); void activated(); @@ -91,6 +110,8 @@ void disableEdge(); bool m_enabled; Edge m_edge; + Mode m_mode = Mode::Pointer; + QAction *m_action; }; inline bool ScreenEdgeItem::isEnabled() const diff --git a/scripting/screenedgeitem.cpp b/scripting/screenedgeitem.cpp --- a/scripting/screenedgeitem.cpp +++ b/scripting/screenedgeitem.cpp @@ -21,14 +21,18 @@ #include #include "screenedge.h" +#include + namespace KWin { ScreenEdgeItem::ScreenEdgeItem(QObject* parent) : QObject(parent) , m_enabled(true) , m_edge(NoEdge) + , m_action(new QAction(this)) { + connect(m_action, &QAction::triggered, this, &ScreenEdgeItem::activated); } ScreenEdgeItem::~ScreenEdgeItem() @@ -62,15 +66,33 @@ if (!m_enabled || m_edge == NoEdge) { return; } - ScreenEdges::self()->reserve(static_cast(m_edge), this, "borderActivated"); + switch (m_mode) { + case Mode::Pointer: + ScreenEdges::self()->reserve(static_cast(m_edge), this, "borderActivated"); + break; + case Mode::Touch: + ScreenEdges::self()->reserveTouch(static_cast(m_edge), m_action); + break; + default: + Q_UNREACHABLE(); + } } void ScreenEdgeItem::disableEdge() { if (!m_enabled || m_edge == NoEdge) { return; } - ScreenEdges::self()->unreserve(static_cast(m_edge), this); + switch (m_mode) { + case Mode::Pointer: + ScreenEdges::self()->unreserve(static_cast(m_edge), this); + break; + case Mode::Touch: + ScreenEdges::self()->unreserveTouch(static_cast(m_edge), m_action); + break; + default: + Q_UNREACHABLE(); + } } bool ScreenEdgeItem::borderActivated(ElectricBorder edge) @@ -82,4 +104,15 @@ return true; } +void ScreenEdgeItem::setMode(Mode mode) +{ + if (m_mode == mode) { + return; + } + disableEdge(); + m_mode = mode; + enableEdge(); + emit modeChanged(); +} + } // namespace