From cbc690145af96e32f1b1cbdc42bc6b1e2d4c3bd2 Mon Sep 17 00:00:00 2001 From: Mikko Levonmaa Date: Fri, 28 Mar 2014 15:25:21 -0700 Subject: 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 Reviewed-by: Mikko Levonmaa --- tests/auto/compositor/compositor.pro | 10 +++- tests/auto/compositor/testcompositor.cpp | 4 ++ tests/auto/compositor/testcompositor.h | 2 + tests/auto/compositor/testkeyboardgrabber.cpp | 74 +++++++++++++++++++++++++++ tests/auto/compositor/testkeyboardgrabber.h | 66 ++++++++++++++++++++++++ tests/auto/compositor/tst_compositor.cpp | 52 +++++++++++++++++++ 6 files changed, 206 insertions(+), 2 deletions(-) create mode 100644 tests/auto/compositor/testkeyboardgrabber.cpp create mode 100644 tests/auto/compositor/testkeyboardgrabber.h (limited to 'tests') diff --git a/tests/auto/compositor/compositor.pro b/tests/auto/compositor/compositor.pro index d049b17a0..d173d2ed6 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 aa15a6ab5..420c88c0d 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 4cb77aabc..e504cd47b 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 000000000..ecd3a98dd --- /dev/null +++ b/tests/auto/compositor/testkeyboardgrabber.cpp @@ -0,0 +1,74 @@ +/**************************************************************************** +** +** Copyright (c) 2014 LG Electronics, Inc., author: +** +** 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 000000000..75ea1a18f --- /dev/null +++ b/tests/auto/compositor/testkeyboardgrabber.h @@ -0,0 +1,66 @@ +/**************************************************************************** +** +** Copyright (c) 2014 LG Electronics, Inc., author: +** +** 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 803f280bc..eae3f2943 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; -- cgit v1.2.3