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/D5272icc-effect-5.14.5
parent
c080dca8ec
commit
63b1138307
|
@ -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"
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
import QtQuick 2.0;
|
||||||
|
import org.kde.kwin 2.0;
|
||||||
|
|
||||||
|
ScreenEdgeItem {
|
||||||
|
edge: ScreenEdgeItem.LeftEdge
|
||||||
|
mode: ScreenEdgeItem.Touch
|
||||||
|
onActivated: {
|
||||||
|
workspace.slotToggleShowDesktop();
|
||||||
|
}
|
||||||
|
}
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue