inputmethod: Refactor VirtualKeyboardDBus to have its own InputMethpd

This way we can have it call methods directly instead of connecting to
its signals.
icc-effect-5.26.4
Aleix Pol 2021-02-26 16:16:45 +01:00 committed by Aleix Pol Gonzalez
parent 63a7b25801
commit 4638f2f309
8 changed files with 84 additions and 88 deletions

View File

@ -380,17 +380,6 @@ if (HAVE_GBM)
ecm_mark_as_test(testGbmSurface) ecm_mark_as_test(testGbmSurface)
endif() endif()
qt5_add_dbus_interfaces(DBUS_SRCS ${CMAKE_BINARY_DIR}/src/org.kde.kwin.VirtualKeyboard.xml)
add_executable(testVirtualKeyboardDBus test_virtualkeyboard_dbus.cpp ../src/virtualkeyboard_dbus.cpp ${DBUS_SRCS})
target_link_libraries(testVirtualKeyboardDBus
Qt::DBus
Qt::Test
)
add_test(NAME kwin-testVirtualKeyboardDBus COMMAND testVirtualKeyboardDBus)
ecm_mark_as_test(testVirtualKeyboardDBus)
######################################################## ########################################################
# Test FTrace # Test FTrace
######################################################## ########################################################

View File

@ -100,6 +100,9 @@ integrationTest(WAYLAND_ONLY NAME testInputMethod SRCS inputmethod_test.cpp)
integrationTest(WAYLAND_ONLY NAME testScreens SRCS screens_test.cpp) integrationTest(WAYLAND_ONLY NAME testScreens SRCS screens_test.cpp)
integrationTest(WAYLAND_ONLY NAME testOutputManagement SRCS outputmanagement_test.cpp) integrationTest(WAYLAND_ONLY NAME testOutputManagement SRCS outputmanagement_test.cpp)
qt5_add_dbus_interfaces(DBUS_SRCS ${CMAKE_BINARY_DIR}/src/org.kde.kwin.VirtualKeyboard.xml)
integrationTest(WAYLAND_ONLY NAME testVirtualKeyboardDBus SRCS test_virtualkeyboard_dbus.cpp ${DBUS_SRCS})
if (KWIN_BUILD_CMS) if (KWIN_BUILD_CMS)
integrationTest(WAYLAND_ONLY NAME testNightColor SRCS nightcolor_test.cpp LIBS KWinNightColorPlugin) integrationTest(WAYLAND_ONLY NAME testNightColor SRCS nightcolor_test.cpp LIBS KWinNightColorPlugin)
endif() endif()

View File

@ -14,8 +14,14 @@
#include <virtualkeyboardinterface.h> #include <virtualkeyboardinterface.h>
#include "virtualkeyboard_dbus.h" #include "virtualkeyboard_dbus.h"
#include "wayland_server.h"
#include "kwin_wayland_test.h"
using KWin::VirtualKeyboardDBus; using KWin::VirtualKeyboardDBus;
using namespace KWin;
using namespace KWin::Test;
static const QString s_socketName = QStringLiteral("wayland_test_kwin_virtualkeyboarddbus-0");
class VirtualKeyboardDBusTest : public QObject class VirtualKeyboardDBusTest : public QObject
{ {
@ -25,16 +31,35 @@ private Q_SLOTS:
void testEnabled(); void testEnabled();
void testRequestEnabled_data(); void testRequestEnabled_data();
void testRequestEnabled(); void testRequestEnabled();
void cleanup();
}; };
void VirtualKeyboardDBusTest::initTestCase() void VirtualKeyboardDBusTest::initTestCase()
{ {
QDBusConnection::sessionBus().registerService(QStringLiteral("org.kde.kwin.testvirtualkeyboard")); QDBusConnection::sessionBus().registerService(QStringLiteral("org.kde.kwin.testvirtualkeyboard"));
QSignalSpy applicationStartedSpy(kwinApp(), &Application::started);
QVERIFY(applicationStartedSpy.isValid());
QVERIFY(waylandServer()->init(s_socketName));
static_cast<WaylandTestApplication *>(kwinApp())->setInputMethodServerToStart("internal");
kwinApp()->start();
QVERIFY(applicationStartedSpy.wait());
waylandServer()->initWorkspace();
QVERIFY(setupWaylandConnection(AdditionalWaylandInterface::Seat |
AdditionalWaylandInterface::InputMethodV1 |
AdditionalWaylandInterface::TextInputManagerV2 |
AdditionalWaylandInterface::TextInputManagerV3));
}
void VirtualKeyboardDBusTest::cleanup()
{
Test::destroyWaylandConnection();
} }
void VirtualKeyboardDBusTest::testEnabled() void VirtualKeyboardDBusTest::testEnabled()
{ {
VirtualKeyboardDBus dbus; VirtualKeyboardDBus dbus(KWin::InputMethod::self());
OrgKdeKwinVirtualKeyboardInterface iface(QStringLiteral("org.kde.kwin.testvirtualkeyboard"), QStringLiteral("/VirtualKeyboard"), QDBusConnection::sessionBus()); OrgKdeKwinVirtualKeyboardInterface iface(QStringLiteral("org.kde.kwin.testvirtualkeyboard"), QStringLiteral("/VirtualKeyboard"), QDBusConnection::sessionBus());
QSignalSpy helperChangedSpy(&iface, &OrgKdeKwinVirtualKeyboardInterface::enabledChanged); QSignalSpy helperChangedSpy(&iface, &OrgKdeKwinVirtualKeyboardInterface::enabledChanged);
QVERIFY(helperChangedSpy.isValid()); QVERIFY(helperChangedSpy.isValid());
@ -74,8 +99,8 @@ void VirtualKeyboardDBusTest::testRequestEnabled_data()
QTest::addColumn<QString>("method"); QTest::addColumn<QString>("method");
QTest::addColumn<bool>("expectedResult"); QTest::addColumn<bool>("expectedResult");
QTest::newRow("enable") << QStringLiteral("requestEnabled") << true; QTest::newRow("enable") << QStringLiteral("setEnabled") << true;
QTest::newRow("disable") << QStringLiteral("requestEnabled") << false; QTest::newRow("disable") << QStringLiteral("setEnabled") << false;
} }
void VirtualKeyboardDBusTest::testRequestEnabled() void VirtualKeyboardDBusTest::testRequestEnabled()
@ -83,20 +108,15 @@ void VirtualKeyboardDBusTest::testRequestEnabled()
QFETCH(QString, method); QFETCH(QString, method);
QFETCH(bool, expectedResult); QFETCH(bool, expectedResult);
VirtualKeyboardDBus dbus; VirtualKeyboardDBus dbus(KWin::InputMethod::self());
dbus.setEnabled(!expectedResult);
connect(&dbus, &VirtualKeyboardDBus::enableRequested, &dbus, &VirtualKeyboardDBus::setEnabled);
QSignalSpy activateRequestedSpy(&dbus, &VirtualKeyboardDBus::enabledChanged); QSignalSpy activateRequestedSpy(&dbus, &VirtualKeyboardDBus::enabledChanged);
QVERIFY(activateRequestedSpy.isValid()); QVERIFY(activateRequestedSpy.isValid());
OrgKdeKwinVirtualKeyboardInterface iface(QStringLiteral("org.kde.kwin.testvirtualkeyboard"), QStringLiteral("/VirtualKeyboard"), QDBusConnection::sessionBus()); OrgKdeKwinVirtualKeyboardInterface iface(QStringLiteral("org.kde.kwin.testvirtualkeyboard"), QStringLiteral("/VirtualKeyboard"), QDBusConnection::sessionBus());
auto pending = iface.requestEnabled(expectedResult); iface.setEnabled(expectedResult);
QVERIFY(!pending.isError());
// activateRequestedSpy.wait();
QCOMPARE(activateRequestedSpy.count(), 1); QCOMPARE(activateRequestedSpy.count(), 1);
QCOMPARE(dbus.isEnabled(), expectedResult);
QCOMPARE(iface.enabled(), expectedResult); QCOMPARE(iface.enabled(), expectedResult);
} }
QTEST_GUILESS_MAIN(VirtualKeyboardDBusTest) WAYLANDTEST_MAIN(VirtualKeyboardDBusTest)
#include "test_virtualkeyboard_dbus.moc" #include "test_virtualkeyboard_dbus.moc"

View File

@ -264,7 +264,7 @@ if (KWIN_BUILD_TABBOX)
target_link_libraries(kwin Qt::GuiPrivate) target_link_libraries(kwin Qt::GuiPrivate)
endif() endif()
qt5_generate_dbus_interface(virtualkeyboard_dbus.h org.kde.kwin.VirtualKeyboard.xml OPTIONS -P -s -M) qt5_generate_dbus_interface(virtualkeyboard_dbus.h org.kde.kwin.VirtualKeyboard.xml OPTIONS -A)
generate_export_header(kwin EXPORT_FILE_NAME kwin_export.h) generate_export_header(kwin EXPORT_FILE_NAME kwin_export.h)

View File

@ -7,6 +7,7 @@
SPDX-License-Identifier: GPL-2.0-or-later SPDX-License-Identifier: GPL-2.0-or-later
*/ */
#include "inputmethod.h" #include "inputmethod.h"
#include "abstract_client.h"
#include "virtualkeyboard_dbus.h" #include "virtualkeyboard_dbus.h"
#include "input.h" #include "input.h"
#include "keyboard_input.h" #include "keyboard_input.h"
@ -79,13 +80,8 @@ void InputMethod::init()
); );
connect(this, &InputMethod::enabledChanged, this, &InputMethod::updateSni); connect(this, &InputMethod::enabledChanged, this, &InputMethod::updateSni);
auto dbus = new VirtualKeyboardDBus(this); new VirtualKeyboardDBus(this);
qCDebug(KWIN_VIRTUALKEYBOARD) << "Registering the DBus interface"; qCDebug(KWIN_VIRTUALKEYBOARD) << "Registering the DBus interface";
dbus->setEnabled(m_enabled);
connect(dbus, &VirtualKeyboardDBus::enableRequested, this, &InputMethod::setEnabled);
connect(dbus, &VirtualKeyboardDBus::hideRequested, this, &InputMethod::hide);
connect(this, &InputMethod::visibleChanged, dbus, &VirtualKeyboardDBus::setActive);
connect(this, &InputMethod::enabledChanged, dbus, &VirtualKeyboardDBus::setEnabled);
connect(input(), &InputRedirection::keyStateChanged, this, &InputMethod::hide); connect(input(), &InputRedirection::keyStateChanged, this, &InputMethod::hide);
if (waylandServer()) { if (waylandServer()) {
@ -116,36 +112,36 @@ void InputMethod::init()
void InputMethod::show() void InputMethod::show()
{ {
setVisible(true); setActive(true);
} }
void InputMethod::hide() void InputMethod::hide()
{ {
setVisible(false); setActive(false);
} }
void InputMethod::setVisible(bool visible) void InputMethod::setActive(bool active)
{ {
if (m_visible) { if (m_active) {
waylandServer()->inputMethod()->sendDeactivate(); waylandServer()->inputMethod()->sendDeactivate();
} }
if (visible) { if (active) {
if (!m_enabled) { if (!m_enabled) {
return; return;
} }
waylandServer()->inputMethod()->sendActivate(); waylandServer()->inputMethod()->sendActivate();
if (m_visible) { if (m_active) {
adoptInputMethodContext(); adoptInputMethodContext();
} }
} else { } else {
updateInputPanelState(); updateInputPanelState();
} }
if (m_visible != visible) { if (m_active != active) {
m_visible = visible; m_active = active;
Q_EMIT visibleChanged(visible); Q_EMIT activeChanged(active);
} }
} }
@ -188,7 +184,7 @@ void InputMethod::handleFocusedSurfaceChanged()
} }
updateInputPanelState(); updateInputPanelState();
} else { } else {
setVisible(false); setActive(false);
} }
} }

View File

@ -14,7 +14,7 @@
#include <kwinglobals.h> #include <kwinglobals.h>
#include <kwin_export.h> #include <kwin_export.h>
#include <abstract_client.h> #include <QPointer>
#include <KWaylandServer/textinput_v2_interface.h> #include <KWaylandServer/textinput_v2_interface.h>
class KStatusNotifierItem; class KStatusNotifierItem;
@ -22,6 +22,8 @@ class KStatusNotifierItem;
namespace KWin namespace KWin
{ {
class AbstractClient;
/** /**
* This class implements the zwp_input_method_unstable_v1, which is currently used to provide * This class implements the zwp_input_method_unstable_v1, which is currently used to provide
* the Virtual Keyboard using supported input method client (maliit-keyboard e.g.) * the Virtual Keyboard using supported input method client (maliit-keyboard e.g.)
@ -33,11 +35,19 @@ public:
~InputMethod() override; ~InputMethod() override;
void init(); void init();
void setEnabled(bool enable);
bool isEnabled() const {
return m_enabled;
}
bool isActive() const {
return m_active;
}
void setActive(bool active);
void hide(); void hide();
void show(); void show();
Q_SIGNALS: Q_SIGNALS:
void visibleChanged(bool shown); void activeChanged(bool active);
void enabledChanged(bool enabled); void enabledChanged(bool enabled);
private Q_SLOTS: private Q_SLOTS:
@ -57,8 +67,6 @@ private Q_SLOTS:
void setPreeditCursor(qint32 index); void setPreeditCursor(qint32 index);
private: private:
void setVisible(bool shown);
void setEnabled(bool enable);
void updateSni(); void updateSni();
void updateInputPanelState(); void updateInputPanelState();
void adoptInputMethodContext(); void adoptInputMethodContext();
@ -70,7 +78,7 @@ private:
} preedit; } preedit;
bool m_enabled = false; bool m_enabled = false;
bool m_visible = false; bool m_active = false;
KStatusNotifierItem *m_sni = nullptr; KStatusNotifierItem *m_sni = nullptr;
QPointer<AbstractClient> m_inputClient; QPointer<AbstractClient> m_inputClient;
QPointer<AbstractClient> m_trackedClient; QPointer<AbstractClient> m_trackedClient;

View File

@ -12,52 +12,38 @@
namespace KWin namespace KWin
{ {
VirtualKeyboardDBus::VirtualKeyboardDBus(QObject *parent) VirtualKeyboardDBus::VirtualKeyboardDBus(InputMethod *parent)
: QObject(parent) : QObject(parent)
, m_inputMethod(parent)
{ {
QDBusConnection::sessionBus().registerObject(QStringLiteral("/VirtualKeyboard"), this, QDBusConnection::sessionBus().registerObject(QStringLiteral("/VirtualKeyboard"), this,
QDBusConnection::ExportAllProperties | QDBusConnection::ExportAllProperties |
QDBusConnection::ExportScriptableSignals | //qdbuscpp2xml doesn't support yet properties with NOTIFY QDBusConnection::ExportScriptableSignals | //qdbuscpp2xml doesn't support yet properties with NOTIFY
QDBusConnection::ExportAllSlots); QDBusConnection::ExportAllSlots);
connect(parent, &InputMethod::activeChanged, this, &VirtualKeyboardDBus::activeChanged);
connect(parent, &InputMethod::enabledChanged, this, &VirtualKeyboardDBus::enabledChanged);
} }
VirtualKeyboardDBus::~VirtualKeyboardDBus() = default; VirtualKeyboardDBus::~VirtualKeyboardDBus() = default;
bool VirtualKeyboardDBus::isActive() const bool VirtualKeyboardDBus::isActive() const
{ {
return m_active; return m_inputMethod->isActive();
}
void VirtualKeyboardDBus::requestEnabled(bool enabled)
{
emit enableRequested(enabled);
}
void VirtualKeyboardDBus::setActive(bool active)
{
if (m_active != active) {
m_active = active;
Q_EMIT activeChanged();
}
}
void VirtualKeyboardDBus::hide()
{
Q_EMIT hideRequested();
}
bool VirtualKeyboardDBus::isEnabled() const
{
return m_enabled;
} }
void VirtualKeyboardDBus::setEnabled(bool enabled) void VirtualKeyboardDBus::setEnabled(bool enabled)
{ {
if (m_enabled == enabled) { m_inputMethod->setEnabled(enabled);
return; }
}
m_enabled = enabled; void VirtualKeyboardDBus::setActive(bool active)
emit enabledChanged(); {
m_inputMethod->setActive(active);
}
bool VirtualKeyboardDBus::isEnabled() const
{
return m_inputMethod->isEnabled();
} }
} }

View File

@ -9,38 +9,32 @@
#pragma once #pragma once
#include <QObject> #include <QObject>
#include "inputmethod.h"
namespace KWin namespace KWin
{ {
class VirtualKeyboardDBus : public QObject class KWIN_EXPORT VirtualKeyboardDBus : public QObject
{ {
Q_OBJECT Q_OBJECT
Q_CLASSINFO("D-Bus Interface", "org.kde.kwin.VirtualKeyboard") Q_CLASSINFO("D-Bus Interface", "org.kde.kwin.VirtualKeyboard")
Q_PROPERTY(bool enabled READ isEnabled NOTIFY enabledChanged) Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled NOTIFY enabledChanged)
Q_PROPERTY(bool active READ isActive NOTIFY activeChanged) Q_PROPERTY(bool active READ isActive WRITE setActive NOTIFY activeChanged)
public: public:
explicit VirtualKeyboardDBus(QObject *parent = nullptr); explicit VirtualKeyboardDBus(InputMethod *inputMethod);
~VirtualKeyboardDBus() override; ~VirtualKeyboardDBus() override;
bool isEnabled() const; bool isEnabled() const;
void setEnabled(bool enabled);
void setActive(bool active);
bool isActive() const; bool isActive() const;
void setEnabled(bool enabled);
public Q_SLOTS: void setActive(bool active);
void requestEnabled(bool enabled);
void hide();
Q_SIGNALS: Q_SIGNALS:
Q_SCRIPTABLE void enabledChanged(); Q_SCRIPTABLE void enabledChanged();
Q_SCRIPTABLE void activeChanged(); Q_SCRIPTABLE void activeChanged();
void hideRequested();
void enableRequested(bool requested);
private: private:
bool m_enabled = false; InputMethod *const m_inputMethod;
bool m_active = false;
}; };
} }