From 3253ddb9308e28ded3bb08518db96f493943dea0 Mon Sep 17 00:00:00 2001 From: taj-ny <79316397+taj-ny@users.noreply.github.com> Date: Thu, 30 Jul 2026 19:07:14 +0200 Subject: [PATCH] dbus: merge DBusInterfaceBase and IntegratedDBusInterface; add ability to disable config loading --- src/CMakeLists.txt | 3 +- src/libinputactions/InputActionsMain.cpp | 3 + src/libinputactions/InputActionsMain.h | 3 - .../dbus/DBusInterfaceBase.cpp | 78 ------------------- src/libinputactions/dbus/DBusInterfaceBase.h | 38 --------- ...BusInterface.cpp => MainDBusInterface.cpp} | 68 +++++++++++++--- ...tedDBusInterface.h => MainDBusInterface.h} | 22 ++++-- src/libinputactions/helpers/QDBusConnection.h | 2 +- tests/libinputactions/Test.cpp | 5 ++ tests/libinputactions/Test.h | 2 + 10 files changed, 85 insertions(+), 139 deletions(-) delete mode 100644 src/libinputactions/dbus/DBusInterfaceBase.cpp delete mode 100644 src/libinputactions/dbus/DBusInterfaceBase.h rename src/libinputactions/dbus/{IntegratedDBusInterface.cpp => MainDBusInterface.cpp} (54%) rename src/libinputactions/dbus/{IntegratedDBusInterface.h => MainDBusInterface.h} (74%) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 43d8622..ac2c890 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -35,8 +35,7 @@ set(libinputactions_SRCS libinputactions/conditions/ConditionGroup.cpp libinputactions/conditions/CustomCondition.cpp libinputactions/conditions/VariableCondition.cpp - libinputactions/dbus/DBusInterfaceBase.cpp - libinputactions/dbus/IntegratedDBusInterface.cpp + libinputactions/dbus/MainDBusInterface.cpp libinputactions/handlers/InputTriggerHandler.cpp libinputactions/handlers/KeyboardTriggerHandler.cpp libinputactions/handlers/MotionTriggerHandler.cpp diff --git a/src/libinputactions/InputActionsMain.cpp b/src/libinputactions/InputActionsMain.cpp index c25c20e..e1267a1 100644 --- a/src/libinputactions/InputActionsMain.cpp +++ b/src/libinputactions/InputActionsMain.cpp @@ -3,6 +3,7 @@ #include "config/ConfigIssueManager.h" #include "config/ConfigLoader.h" #include "config/GlobalConfig.h" +#include "dbus/MainDBusInterface.h" #include "input/StrokeRecorder.h" #include "input/backends/InputBackend.h" #include "interfaces/ConfigProvider.h" @@ -52,6 +53,7 @@ InputActionsMain::~InputActionsMain() g_globalConfig.reset(); g_configProvider.reset(); g_inputBackend.reset(); + g_mainDbusInterface.reset(); g_scriptingEngine.reset(); g_strokeRecorder.reset(); g_variableRegistry.reset(); @@ -98,6 +100,7 @@ void InputActionsMain::setMissingImplementations() setMissingImplementation(g_configLoader); setMissingImplementation(g_globalConfig); setMissingImplementation(g_inputBackend); + setMissingImplementation(g_mainDbusInterface); setMissingImplementation(g_strokeRecorder); setMissingImplementation(g_variableRegistry); diff --git a/src/libinputactions/InputActionsMain.h b/src/libinputactions/InputActionsMain.h index 1710763..61df9ce 100644 --- a/src/libinputactions/InputActionsMain.h +++ b/src/libinputactions/InputActionsMain.h @@ -18,7 +18,6 @@ #pragma once -#include "dbus/IntegratedDBusInterface.h" #include namespace InputActions @@ -78,8 +77,6 @@ private slots: member = std::make_unique(); } } - - IntegratedDBusInterface m_dbusInterface; }; inline InputActionsMain *g_inputActions; diff --git a/src/libinputactions/dbus/DBusInterfaceBase.cpp b/src/libinputactions/dbus/DBusInterfaceBase.cpp deleted file mode 100644 index 8ead13e..0000000 --- a/src/libinputactions/dbus/DBusInterfaceBase.cpp +++ /dev/null @@ -1,78 +0,0 @@ -/* - Input Actions - Input handler that executes user-defined actions - Copyright (C) 2024-2026 Marcin Woźniak - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "DBusInterfaceBase.h" -#include -#include -#include -#include -#include -#include -#include - -namespace InputActions -{ - -QString DBusInterfaceBase::deviceList() -{ - QStringList result; - for (const auto *device : g_inputBackend->devices()) { - result.push_back(device->toString()); - } - result.sort(); - return result.join("\n\n"); -} - -QString DBusInterfaceBase::issues() -{ - return g_configIssueManager->issuesToString(); -} - -QString DBusInterfaceBase::strokeToBase64(const Stroke &stroke) -{ - QByteArray bytes; - const auto &points = stroke.points(); - for (size_t i = 0; i < points.size(); i++) { - // All values range from -1 to 1 - bytes.push_back(static_cast(points[i].x * 100)); - bytes.push_back(static_cast(points[i].y * 100)); - bytes.push_back(static_cast(points[i].t * 100)); - bytes.push_back(static_cast(points[i].alpha * 100)); - } - - return QString("'%1'").arg(bytes.toBase64()); -} - -QString DBusInterfaceBase::variableList(const VariableRegistry *variableRegistry, const QString &filter) -{ - if (!g_globalConfig->allowExternalVariableAccess()) { - return "External variable access has been disabled. Set 'external_variable_access' to 'true' to enable."; - } - - QStringList result; - const QRegularExpression filterRegex(filter); - for (const auto &[name, variable] : variableRegistry->variables()) { - if (variable->hidden() || !filterRegex.match(name).hasMatch()) { - continue; - } - result.push_back(QString("%1: %2").arg(name, variable->operations()->toString())); - } - return result.join('\n'); -} - -} \ No newline at end of file diff --git a/src/libinputactions/dbus/DBusInterfaceBase.h b/src/libinputactions/dbus/DBusInterfaceBase.h deleted file mode 100644 index 70938b7..0000000 --- a/src/libinputactions/dbus/DBusInterfaceBase.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - Input Actions - Input handler that executes user-defined actions - Copyright (C) 2024-2026 Marcin Woźniak - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#pragma once - -#include - -namespace InputActions -{ - -class Stroke; -class VariableRegistry; - -class DBusInterfaceBase : public QObject -{ -public: - QString deviceList(); - QString issues(); - QString strokeToBase64(const Stroke &stroke); - QString variableList(const VariableRegistry *variableRegistry, const QString &filter); -}; - -} \ No newline at end of file diff --git a/src/libinputactions/dbus/IntegratedDBusInterface.cpp b/src/libinputactions/dbus/MainDBusInterface.cpp similarity index 54% rename from src/libinputactions/dbus/IntegratedDBusInterface.cpp rename to src/libinputactions/dbus/MainDBusInterface.cpp index 8277ddd..addcb3f 100644 --- a/src/libinputactions/dbus/IntegratedDBusInterface.cpp +++ b/src/libinputactions/dbus/MainDBusInterface.cpp @@ -16,14 +16,16 @@ along with this program. If not, see . */ -#include "IntegratedDBusInterface.h" +#include "MainDBusInterface.h" #include #include #include #include +#include #include #include #include +#include #include #include #include @@ -31,30 +33,35 @@ namespace InputActions { -IntegratedDBusInterface::IntegratedDBusInterface() +MainDBusInterface::MainDBusInterface() : m_bus(QDBusConnectionHelpers::sessionBus()) { m_bus.registerService(INPUTACTIONS_DBUS_SERVICE); m_bus.registerObject(INPUTACTIONS_DBUS_PATH, this, QDBusConnection::ExportAllSlots); } -IntegratedDBusInterface::~IntegratedDBusInterface() +MainDBusInterface::~MainDBusInterface() { m_bus.unregisterService(INPUTACTIONS_DBUS_SERVICE); m_bus.unregisterObject(INPUTACTIONS_DBUS_PATH); } -QString IntegratedDBusInterface::deviceList() +QString MainDBusInterface::deviceList() { - return DBusInterfaceBase::deviceList(); + QStringList result; + for (const auto *device : g_inputBackend->devices()) { + result.push_back(device->toString()); + } + result.sort(); + return result.join("\n\n"); } -QString IntegratedDBusInterface::issues() +QString MainDBusInterface::issues() { - return DBusInterfaceBase::issues(); + return g_configIssueManager->issuesToString(); } -void IntegratedDBusInterface::recordStroke(const QDBusMessage &message) +void MainDBusInterface::recordStroke(const QDBusMessage &message) { if (!g_inputBackend->initialized()) { sendErrorReply(QDBusError::Failed, "Stroke recording requires a valid configuration to be active."); @@ -74,23 +81,60 @@ void IntegratedDBusInterface::recordStroke(const QDBusMessage &message) }); } -QString IntegratedDBusInterface::reloadConfig() +QString MainDBusInterface::reloadConfig() { + if (!m_allowConfigLoading) { + sendErrorReply(QDBusError::Failed, "Loading the configuration is not allowed while the client is inactive."); + return {}; + } + g_configLoader->load({ .manual = true, }); return g_configIssueManager->issuesToString(); } -QString IntegratedDBusInterface::suspend() +QString MainDBusInterface::suspend() { + if (!m_allowConfigLoading) { + sendErrorReply(QDBusError::Failed, "Suspending is not allowed while the client is inactive."); + return {}; + } + g_inputActions->suspend(); return "success"; } -QString IntegratedDBusInterface::variables(QString filter) +QString MainDBusInterface::variables(QString filter) +{ + if (!g_globalConfig->allowExternalVariableAccess()) { + return "External variable access has been disabled. Set 'external_variable_access' to 'true' to enable."; + } + + QStringList result; + const QRegularExpression filterRegex(filter); + for (const auto &[name, variable] : g_variableRegistry->variables()) { + if (variable->hidden() || !filterRegex.match(name).hasMatch()) { + continue; + } + result.push_back(QString("%1: %2").arg(name, variable->operations()->toString())); + } + return result.join('\n'); +} + +QString MainDBusInterface::strokeToBase64(const Stroke &stroke) { - return variableList(g_variableRegistry.get(), filter); + QByteArray bytes; + const auto &points = stroke.points(); + for (size_t i = 0; i < points.size(); i++) { + // All values range from -1 to 1 + bytes.push_back(static_cast(points[i].x * 100)); + bytes.push_back(static_cast(points[i].y * 100)); + bytes.push_back(static_cast(points[i].t * 100)); + bytes.push_back(static_cast(points[i].alpha * 100)); + } + + return QString("'%1'").arg(bytes.toBase64()); } } diff --git a/src/libinputactions/dbus/IntegratedDBusInterface.h b/src/libinputactions/dbus/MainDBusInterface.h similarity index 74% rename from src/libinputactions/dbus/IntegratedDBusInterface.h rename to src/libinputactions/dbus/MainDBusInterface.h index 5e60606..f33bd9e 100644 --- a/src/libinputactions/dbus/IntegratedDBusInterface.h +++ b/src/libinputactions/dbus/MainDBusInterface.h @@ -18,7 +18,6 @@ #pragma once -#include "DBusInterfaceBase.h" #include #include #include @@ -30,8 +29,10 @@ namespace InputActions static const QString INPUTACTIONS_DBUS_SERVICE = "org.inputactions"; static const QString INPUTACTIONS_DBUS_PATH = "/"; -class IntegratedDBusInterface - : public DBusInterfaceBase +class Stroke; + +class MainDBusInterface + : public QObject , protected QDBusContext { Q_OBJECT @@ -41,12 +42,17 @@ class IntegratedDBusInterface /** * Registers the interface. */ - IntegratedDBusInterface(); + MainDBusInterface(); /** * Unregisters the interface. */ - ~IntegratedDBusInterface() override; + ~MainDBusInterface() override; + + /** + * Sets whether loading the config and suspending InputActions through the DBus interface is allowed. This is only used in the standalone implementation. + */ + void setAllowConfigLoading(bool value) { m_allowConfigLoading = value; } public slots: QString deviceList(); @@ -57,8 +63,14 @@ public slots: QString variables(QString filter = ""); private: + static QString strokeToBase64(const Stroke &stroke); + QDBusConnection m_bus; QDBusMessage m_reply; + + bool m_allowConfigLoading = true; }; +inline std::shared_ptr g_mainDbusInterface; + } \ No newline at end of file diff --git a/src/libinputactions/helpers/QDBusConnection.h b/src/libinputactions/helpers/QDBusConnection.h index f8b4974..2672cf8 100644 --- a/src/libinputactions/helpers/QDBusConnection.h +++ b/src/libinputactions/helpers/QDBusConnection.h @@ -26,7 +26,7 @@ namespace InputActions::QDBusConnectionHelpers /** * Same as QDBusConnection::sessionBus, but uses QDBusConnection::connectToBus with the address specified in the DBUS_SESSION_BUS_ADDRESS environment variable * for setgid binaries. - * + * * Connection is cached. */ const QDBusConnection &sessionBus(); diff --git a/tests/libinputactions/Test.cpp b/tests/libinputactions/Test.cpp index 1f85cf9..8a82ebb 100644 --- a/tests/libinputactions/Test.cpp +++ b/tests/libinputactions/Test.cpp @@ -6,6 +6,11 @@ namespace InputActions { +Test::~Test() +{ + delete g_inputActions; +} + void Test::initMain() { int argc = 0; diff --git a/tests/libinputactions/Test.h b/tests/libinputactions/Test.h index f486a26..20345f5 100644 --- a/tests/libinputactions/Test.h +++ b/tests/libinputactions/Test.h @@ -47,6 +47,8 @@ class Test : public QObject Q_OBJECT public: + ~Test() override; + static void initMain(); };