File indexing completed on 2024-05-05 17:36:01

0001 /*
0002     KWin - the KDE window manager
0003     This file is part of the KDE project.
0004 
0005     SPDX-FileCopyrightText: 2017 Martin Flöser <mgraesslin@kde.org>
0006 
0007     SPDX-License-Identifier: GPL-2.0-or-later
0008 */
0009 
0010 #include "kwin_wayland_test.h"
0011 
0012 #include "core/outputbackend.h"
0013 #include "main.h"
0014 #include "virtualkeyboard_dbus.h"
0015 #include "wayland_server.h"
0016 
0017 #include <QDBusConnection>
0018 #include <QDBusMessage>
0019 #include <QDBusPendingReply>
0020 #include <QSignalSpy>
0021 #include <QTest>
0022 
0023 #include <virtualkeyboardinterface.h>
0024 
0025 using KWin::VirtualKeyboardDBus;
0026 using namespace KWin;
0027 using namespace KWin::Test;
0028 
0029 static const QString s_socketName = QStringLiteral("wayland_test_kwin_virtualkeyboarddbus-0");
0030 
0031 class VirtualKeyboardDBusTest : public QObject
0032 {
0033     Q_OBJECT
0034 private Q_SLOTS:
0035     void initTestCase();
0036     void testEnabled();
0037     void testRequestEnabled_data();
0038     void testRequestEnabled();
0039     void init();
0040     void cleanup();
0041 };
0042 
0043 void VirtualKeyboardDBusTest::initTestCase()
0044 {
0045     QDBusConnection::sessionBus().registerService(QStringLiteral("org.kde.kwin.testvirtualkeyboard"));
0046     QSignalSpy applicationStartedSpy(kwinApp(), &Application::started);
0047     QVERIFY(waylandServer()->init(s_socketName));
0048     QMetaObject::invokeMethod(kwinApp()->outputBackend(), "setVirtualOutputs", Qt::DirectConnection, Q_ARG(QVector<QRect>, QVector<QRect>() << QRect(0, 0, 1280, 1024) << QRect(1280, 0, 1280, 1024)));
0049 
0050     static_cast<WaylandTestApplication *>(kwinApp())->setInputMethodServerToStart("internal");
0051     kwinApp()->start();
0052     QVERIFY(applicationStartedSpy.wait());
0053 
0054     QVERIFY(setupWaylandConnection(AdditionalWaylandInterface::Seat | AdditionalWaylandInterface::InputMethodV1 | AdditionalWaylandInterface::TextInputManagerV2 | AdditionalWaylandInterface::TextInputManagerV3));
0055 }
0056 
0057 void VirtualKeyboardDBusTest::init()
0058 {
0059     kwinApp()->inputMethod()->setEnabled(false);
0060 }
0061 
0062 void VirtualKeyboardDBusTest::cleanup()
0063 {
0064     Test::destroyWaylandConnection();
0065 }
0066 
0067 void VirtualKeyboardDBusTest::testEnabled()
0068 {
0069     VirtualKeyboardDBus dbus(KWin::kwinApp()->inputMethod());
0070     OrgKdeKwinVirtualKeyboardInterface iface(QStringLiteral("org.kde.kwin.testvirtualkeyboard"), QStringLiteral("/VirtualKeyboard"), QDBusConnection::sessionBus());
0071     QSignalSpy helperChangedSpy(&iface, &OrgKdeKwinVirtualKeyboardInterface::enabledChanged);
0072 
0073     QCOMPARE(dbus.isEnabled(), false);
0074     QCOMPARE(dbus.property("enabled").toBool(), false);
0075     QSignalSpy enabledChangedSpy(&dbus, &VirtualKeyboardDBus::enabledChanged);
0076 
0077     QVERIFY(iface.isValid());
0078     QCOMPARE(iface.enabled(), false);
0079 
0080     dbus.setEnabled(true);
0081     QCOMPARE(enabledChangedSpy.count(), 1);
0082     QVERIFY(helperChangedSpy.wait());
0083     QCOMPARE(helperChangedSpy.count(), 1);
0084     QCOMPARE(dbus.isEnabled(), true);
0085     QCOMPARE(dbus.property("enabled").toBool(), true);
0086     QCOMPARE(iface.enabled(), true);
0087 
0088     // setting again to enabled should not change anything
0089     dbus.setEnabled(true);
0090     QCOMPARE(enabledChangedSpy.count(), 1);
0091 
0092     // back to false
0093     dbus.setEnabled(false);
0094     QCOMPARE(enabledChangedSpy.count(), 2);
0095     QVERIFY(helperChangedSpy.wait());
0096     QCOMPARE(helperChangedSpy.count(), 2);
0097     QCOMPARE(dbus.isEnabled(), false);
0098     QCOMPARE(dbus.property("enabled").toBool(), false);
0099     QCOMPARE(iface.enabled(), false);
0100 }
0101 
0102 void VirtualKeyboardDBusTest::testRequestEnabled_data()
0103 {
0104     QTest::addColumn<QString>("method");
0105     QTest::addColumn<bool>("expectedResult");
0106 
0107     QTest::newRow("enable") << QStringLiteral("setEnabled") << true;
0108     QTest::newRow("disable") << QStringLiteral("setEnabled") << false;
0109 }
0110 
0111 void VirtualKeyboardDBusTest::testRequestEnabled()
0112 {
0113     QFETCH(QString, method);
0114     QFETCH(bool, expectedResult);
0115 
0116     VirtualKeyboardDBus dbus(KWin::kwinApp()->inputMethod());
0117     OrgKdeKwinVirtualKeyboardInterface iface(QStringLiteral("org.kde.kwin.testvirtualkeyboard"), QStringLiteral("/VirtualKeyboard"), QDBusConnection::sessionBus());
0118 
0119     iface.setEnabled(expectedResult);
0120     QTRY_COMPARE(iface.enabled(), expectedResult);
0121 }
0122 
0123 WAYLANDTEST_MAIN(VirtualKeyboardDBusTest)
0124 #include "test_virtualkeyboard_dbus.moc"