Add support for new touch screen edge actions to declarative KWin scripts

Summary:
This change introduces a new property mode in ScreenEdgeItem to switch
between Pointer and Touch mode. The touch mode interacts with the new
touch screen edge gestures through a QAction.

Test Plan: New test case added

Reviewers: #kwin, #plasma

Subscribers: plasma-devel

Tags: #plasma

Differential Revision: https://phabricator.kde.org/D5272
icc-effect-5.14.5
Martin Gräßlin 2017-04-01 22:38:58 +02:00
parent c080dca8ec
commit 63b1138307
4 changed files with 91 additions and 2 deletions

View File

@ -50,6 +50,7 @@ private Q_SLOTS:
void testEdge_data(); void testEdge_data();
void testEdge(); void testEdge();
void testEdgeUnregister(); void testEdgeUnregister();
void testDeclarativeTouchEdge();
private: private:
void triggerConfigReload(); void triggerConfigReload();
@ -213,5 +214,29 @@ void ScreenEdgeTest::testEdgeUnregister()
triggerConfigReload(); 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) WAYLANDTEST_MAIN(ScreenEdgeTest)
#include "screenedge_test.moc" #include "screenedge_test.moc"

View File

@ -0,0 +1,10 @@
import QtQuick 2.0;
import org.kde.kwin 2.0;
ScreenEdgeItem {
edge: ScreenEdgeItem.LeftEdge
mode: ScreenEdgeItem.Touch
onActivated: {
workspace.slotToggleShowDesktop();
}
}

View File

@ -21,6 +21,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include <config-kwin.h> #include <config-kwin.h>
#include "screenedge.h" #include "screenedge.h"
#include <QAction>
namespace KWin namespace KWin
{ {
@ -28,7 +30,9 @@ ScreenEdgeItem::ScreenEdgeItem(QObject* parent)
: QObject(parent) : QObject(parent)
, m_enabled(true) , m_enabled(true)
, m_edge(NoEdge) , m_edge(NoEdge)
, m_action(new QAction(this))
{ {
connect(m_action, &QAction::triggered, this, &ScreenEdgeItem::activated);
} }
ScreenEdgeItem::~ScreenEdgeItem() ScreenEdgeItem::~ScreenEdgeItem()
@ -62,7 +66,16 @@ void ScreenEdgeItem::enableEdge()
if (!m_enabled || m_edge == NoEdge) { if (!m_enabled || m_edge == NoEdge) {
return; return;
} }
ScreenEdges::self()->reserve(static_cast<ElectricBorder>(m_edge), this, "borderActivated"); switch (m_mode) {
case Mode::Pointer:
ScreenEdges::self()->reserve(static_cast<ElectricBorder>(m_edge), this, "borderActivated");
break;
case Mode::Touch:
ScreenEdges::self()->reserveTouch(static_cast<ElectricBorder>(m_edge), m_action);
break;
default:
Q_UNREACHABLE();
}
} }
void ScreenEdgeItem::disableEdge() void ScreenEdgeItem::disableEdge()
@ -70,7 +83,16 @@ void ScreenEdgeItem::disableEdge()
if (!m_enabled || m_edge == NoEdge) { if (!m_enabled || m_edge == NoEdge) {
return; return;
} }
ScreenEdges::self()->unreserve(static_cast<ElectricBorder>(m_edge), this); switch (m_mode) {
case Mode::Pointer:
ScreenEdges::self()->unreserve(static_cast<ElectricBorder>(m_edge), this);
break;
case Mode::Touch:
ScreenEdges::self()->unreserveTouch(static_cast<ElectricBorder>(m_edge), m_action);
break;
default:
Q_UNREACHABLE();
}
} }
bool ScreenEdgeItem::borderActivated(ElectricBorder edge) bool ScreenEdgeItem::borderActivated(ElectricBorder edge)
@ -82,4 +104,15 @@ bool ScreenEdgeItem::borderActivated(ElectricBorder edge)
return true; return true;
} }
void ScreenEdgeItem::setMode(Mode mode)
{
if (m_mode == mode) {
return;
}
disableEdge();
m_mode = mode;
enableEdge();
emit modeChanged();
}
} // namespace } // namespace

View File

@ -23,6 +23,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include <QObject> #include <QObject>
#include <kwinglobals.h> #include <kwinglobals.h>
class QAction;
namespace KWin namespace KWin
{ {
@ -46,6 +48,7 @@ class ScreenEdgeItem : public QObject
{ {
Q_OBJECT Q_OBJECT
Q_ENUMS(Edge) Q_ENUMS(Edge)
Q_ENUMS(Mode)
/** /**
* @brief Whether the edge is currently enabled, that is reserved. Default value is @c true. * @brief Whether the edge is currently enabled, that is reserved. Default value is @c true.
* *
@ -56,6 +59,10 @@ class ScreenEdgeItem : public QObject
* *
*/ */
Q_PROPERTY(Edge edge READ edge WRITE setEdge NOTIFY edgeChanged) 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: public:
enum Edge { enum Edge {
TopEdge, TopEdge,
@ -69,18 +76,30 @@ public:
EDGE_COUNT, EDGE_COUNT,
NoEdge NoEdge
}; };
/**
* Enum describing the operation modes of the edge.
**/
enum class Mode {
Pointer,
Touch
};
explicit ScreenEdgeItem(QObject *parent = 0); explicit ScreenEdgeItem(QObject *parent = 0);
virtual ~ScreenEdgeItem(); virtual ~ScreenEdgeItem();
bool isEnabled() const; bool isEnabled() const;
Edge edge() const; Edge edge() const;
Mode mode() const {
return m_mode;
}
public Q_SLOTS: public Q_SLOTS:
void setEnabled(bool enabled); void setEnabled(bool enabled);
void setEdge(Edge edge); void setEdge(Edge edge);
void setMode(Mode mode);
Q_SIGNALS: Q_SIGNALS:
void enabledChanged(); void enabledChanged();
void edgeChanged(); void edgeChanged();
void modeChanged();
void activated(); void activated();
@ -91,6 +110,8 @@ private:
void disableEdge(); void disableEdge();
bool m_enabled; bool m_enabled;
Edge m_edge; Edge m_edge;
Mode m_mode = Mode::Pointer;
QAction *m_action;
}; };
inline bool ScreenEdgeItem::isEnabled() const inline bool ScreenEdgeItem::isEnabled() const