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();
void testEdgeUnregister();
void testDeclarativeTouchEdge();
private:
void triggerConfigReload();
@ -213,5 +214,29 @@ void ScreenEdgeTest::testEdgeUnregister()
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"

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 "screenedge.h"
#include <QAction>
namespace KWin
{
@ -28,7 +30,9 @@ 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,7 +66,16 @@ void ScreenEdgeItem::enableEdge()
if (!m_enabled || m_edge == NoEdge) {
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()
@ -70,7 +83,16 @@ void ScreenEdgeItem::disableEdge()
if (!m_enabled || m_edge == NoEdge) {
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)
@ -82,4 +104,15 @@ bool ScreenEdgeItem::borderActivated(ElectricBorder edge)
return true;
}
void ScreenEdgeItem::setMode(Mode mode)
{
if (m_mode == mode) {
return;
}
disableEdge();
m_mode = mode;
enableEdge();
emit modeChanged();
}
} // namespace

View File

@ -23,6 +23,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include <QObject>
#include <kwinglobals.h>
class QAction;
namespace KWin
{
@ -46,6 +48,7 @@ class ScreenEdgeItem : public QObject
{
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 @@ class ScreenEdgeItem : public QObject
*
*/
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 @@ public:
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 @@ private:
void disableEdge();
bool m_enabled;
Edge m_edge;
Mode m_mode = Mode::Pointer;
QAction *m_action;
};
inline bool ScreenEdgeItem::isEnabled() const