summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorMikko Levonmaa <mikko.levonmaa@lge.com>2014-03-28 15:25:21 -0700
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-05-06 18:05:01 +0200
commitcbc690145af96e32f1b1cbdc42bc6b1e2d4c3bd2 (patch)
tree2365b123034becbe52d54d83b767746f24edc2f1 /tests
parent9fbaf51eccf668a938f4c9a466cc4595195920f3 (diff)
downloadqtwayland-cbc690145af96e32f1b1cbdc42bc6b1e2d4c3bd2.tar.gz
Add grab support for QtWayland::Keyboard
Adds the possibility to grab the wl_keyboard interface, similar to pointer and touch grabs. Also includes basic unit tests Change-Id: I665df2ab5adfe16abd6b55f2d00cd9e6dc89d039 Reviewed-by: Giulio Camuffo <giulio.camuffo@jollamobile.com> Reviewed-by: Mikko Levonmaa <mikko.levonmaa@lge.com>
Diffstat (limited to 'tests')
-rw-r--r--tests/auto/compositor/compositor.pro10
-rw-r--r--tests/auto/compositor/testcompositor.cpp4
-rw-r--r--tests/auto/compositor/testcompositor.h2
-rw-r--r--tests/auto/compositor/testkeyboardgrabber.cpp74
-rw-r--r--tests/auto/compositor/testkeyboardgrabber.h66
-rw-r--r--tests/auto/compositor/tst_compositor.cpp52
6 files changed, 206 insertions, 2 deletions
diff --git a/tests/auto/compositor/compositor.pro b/tests/auto/compositor/compositor.pro
index d049b17a..d173d2ed 100644
--- a/tests/auto/compositor/compositor.pro
+++ b/tests/auto/compositor/compositor.pro
@@ -20,5 +20,11 @@ config_xkbcommon {
DEFINES += QT_NO_WAYLAND_XKB
}
-SOURCES += tst_compositor.cpp testcompositor.cpp mockclient.cpp
-HEADERS += testcompositor.h mockclient.h
+SOURCES += tst_compositor.cpp \
+ testcompositor.cpp \
+ testkeyboardgrabber.cpp \
+ mockclient.cpp \
+
+HEADERS += testcompositor.h \
+ testkeyboardgrabber.h \
+ mockclient.h \
diff --git a/tests/auto/compositor/testcompositor.cpp b/tests/auto/compositor/testcompositor.cpp
index aa15a6ab..420c88c0 100644
--- a/tests/auto/compositor/testcompositor.cpp
+++ b/tests/auto/compositor/testcompositor.cpp
@@ -41,6 +41,10 @@
#include "testcompositor.h"
+TestCompositor::TestCompositor(QWaylandCompositor::ExtensionFlag flags) : QWaylandCompositor(0, 0, flags)
+{
+}
+
void TestCompositor::surfaceCreated(QWaylandSurface *surface)
{
surfaces << surface;
diff --git a/tests/auto/compositor/testcompositor.h b/tests/auto/compositor/testcompositor.h
index 4cb77aab..e504cd47 100644
--- a/tests/auto/compositor/testcompositor.h
+++ b/tests/auto/compositor/testcompositor.h
@@ -45,6 +45,8 @@
class TestCompositor : public QWaylandCompositor
{
public:
+ TestCompositor(QWaylandCompositor::ExtensionFlag flags = QWaylandCompositor::DefaultExtensions);
+
void surfaceCreated(QWaylandSurface *surface);
void surfaceAboutToBeDestroyed(QWaylandSurface *surface);
diff --git a/tests/auto/compositor/testkeyboardgrabber.cpp b/tests/auto/compositor/testkeyboardgrabber.cpp
new file mode 100644
index 00000000..ecd3a98d
--- /dev/null
+++ b/tests/auto/compositor/testkeyboardgrabber.cpp
@@ -0,0 +1,74 @@
+/****************************************************************************
+**
+** Copyright (c) 2014 LG Electronics, Inc., author: <mikko.levonmaa@lge.com>
+**
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "testkeyboardgrabber.h"
+
+namespace QtWayland {
+ KeyboardGrabber::~KeyboardGrabber() {}
+}
+
+void TestKeyboardGrabber::focused(QtWayland::Surface *surface)
+{
+ Q_UNUSED(surface);
+ Q_EMIT focusedCalled();
+}
+
+void TestKeyboardGrabber::key(uint32_t serial, uint32_t time, uint32_t key, uint32_t state)
+{
+ Q_UNUSED(serial);
+ Q_UNUSED(time);
+ Q_UNUSED(key);
+ Q_UNUSED(state);
+ Q_EMIT keyCalled();
+}
+
+void TestKeyboardGrabber::modifiers(uint32_t serial, uint32_t mods_depressed,
+ uint32_t mods_latched, uint32_t mods_locked, uint32_t group)
+{
+ Q_UNUSED(serial);
+ Q_UNUSED(mods_depressed);
+ Q_UNUSED(mods_latched);
+ Q_UNUSED(mods_locked);
+ Q_UNUSED(group);
+ Q_EMIT modifiersCalled();
+}
+
diff --git a/tests/auto/compositor/testkeyboardgrabber.h b/tests/auto/compositor/testkeyboardgrabber.h
new file mode 100644
index 00000000..75ea1a18
--- /dev/null
+++ b/tests/auto/compositor/testkeyboardgrabber.h
@@ -0,0 +1,66 @@
+/****************************************************************************
+**
+** Copyright (c) 2014 LG Electronics, Inc., author: <mikko.levonmaa@lge.com>
+**
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "QtCompositor/private/qwlkeyboard_p.h"
+#include "QtCompositor/private/qwlsurface_p.h"
+
+class TestKeyboardGrabber : public QObject, public QtWayland::KeyboardGrabber
+{
+ Q_OBJECT
+
+public:
+
+ TestKeyboardGrabber() {}
+ ~TestKeyboardGrabber() {}
+
+ void focused(QtWayland::Surface *surface);
+ void key(uint32_t serial, uint32_t time, uint32_t key, uint32_t state);
+ void modifiers(uint32_t serial, uint32_t mods_depressed,
+ uint32_t mods_latched, uint32_t mods_locked, uint32_t group);
+
+signals:
+ void focusedCalled();
+ void keyCalled();
+ void modifiersCalled();
+};
+
+
diff --git a/tests/auto/compositor/tst_compositor.cpp b/tests/auto/compositor/tst_compositor.cpp
index 803f280b..eae3f294 100644
--- a/tests/auto/compositor/tst_compositor.cpp
+++ b/tests/auto/compositor/tst_compositor.cpp
@@ -41,6 +41,10 @@
#include "mockclient.h"
#include "testcompositor.h"
+#include "testkeyboardgrabber.h"
+
+#include "QtCompositor/private/qwlkeyboard_p.h"
+#include "QtCompositor/private/qwlinputdevice_p.h"
#include "qwaylandbufferref.h"
@@ -59,6 +63,7 @@ public:
private slots:
void inputDeviceCapabilities();
+ void keyboardGrab();
void singleClient();
void multipleClients();
void geometry();
@@ -133,6 +138,53 @@ void tst_WaylandCompositor::multipleClients()
QTRY_COMPARE(compositor.surfaces.size(), 0);
}
+void tst_WaylandCompositor::keyboardGrab()
+{
+ TestCompositor compositor((QWaylandCompositor::ExtensionFlag)0);
+ MockClient mc;
+
+ mc.createSurface();
+ // This is needed for timing purposes, otherwise the query for the
+ // compositor surfaces will return null
+ QTRY_COMPARE(compositor.surfaces.size(), 1);
+
+ // Set the focused surface so that key event will flow through
+ QWaylandSurface *waylandSurface = compositor.surfaces.at(0);
+ QWaylandInputDevice* inputDevice = compositor.defaultInputDevice();
+ inputDevice->handle()->keyboardDevice()->setFocus(waylandSurface->handle());
+
+ TestKeyboardGrabber grab;
+ QSignalSpy grabFocusSpy(&grab, SIGNAL(focusedCalled()));
+ QSignalSpy grabKeySpy(&grab, SIGNAL(keyCalled()));
+ QSignalSpy grabModifierSpy(&grab, SIGNAL(modifiersCalled()));
+
+ QtWayland::Keyboard *keyboard = inputDevice->handle()->keyboardDevice();
+ keyboard->startGrab(&grab);
+
+ QTRY_COMPARE(grabFocusSpy.count(), 1);
+ QCOMPARE(grab.m_keyboard, inputDevice->handle()->keyboardDevice());
+
+ QKeyEvent ke(QEvent::KeyPress, Qt::Key_A, Qt::NoModifier, 30, 0, 0);
+ QKeyEvent ke1(QEvent::KeyRelease, Qt::Key_A, Qt::NoModifier, 30, 0, 0);
+ inputDevice->sendFullKeyEvent(&ke);
+ inputDevice->sendFullKeyEvent(&ke1);
+ QTRY_COMPARE(grabKeySpy.count(), 2);
+
+ QKeyEvent ke2(QEvent::KeyPress, Qt::Key_Shift, Qt::NoModifier, 50, 0, 0);
+ QKeyEvent ke3(QEvent::KeyRelease, Qt::Key_Shift, Qt::NoModifier, 50, 0, 0);
+ inputDevice->sendFullKeyEvent(&ke2);
+ inputDevice->sendFullKeyEvent(&ke3);
+ QTRY_COMPARE(grabModifierSpy.count(), 2);
+ // Modifiers are also keys
+ QTRY_COMPARE(grabKeySpy.count(), 4);
+
+ // Stop grabbing
+ keyboard->endGrab();
+ inputDevice->sendFullKeyEvent(&ke);
+ inputDevice->sendFullKeyEvent(&ke1);
+ QTRY_COMPARE(grabKeySpy.count(), 4);
+}
+
void tst_WaylandCompositor::geometry()
{
TestCompositor compositor;