Files
fedora-tools/plasma-task-group-shortcuts/taskbargeometry.cpp
T

81 lines
2.6 KiB
C++

// SPDX-License-Identifier: MIT
#include "taskbargeometry.h"
#include <QDBusConnection>
#include <QDBusInterface>
#include <QDBusReply>
#include <QDebug>
namespace {
constexpr auto scriptName = "se.ajpanton.task-group-shortcuts.geometry";
constexpr auto objectPath = "/TaskbarGeometry";
}
TaskbarGeometry::TaskbarGeometry(QObject *parent)
: QObject(parent)
{
auto bus = QDBusConnection::sessionBus();
if (!bus.registerObject(QString::fromLatin1(objectPath), this, QDBusConnection::ExportScriptableContents)) {
qFatal("Cannot register the taskbar geometry interface");
}
QDBusInterface scripting(QStringLiteral("org.kde.KWin"), QStringLiteral("/Scripting"),
QStringLiteral("org.kde.kwin.Scripting"));
// Replace any copy left behind by an earlier process that was terminated.
scripting.call(QStringLiteral("unloadScript"), QString::fromLatin1(scriptName));
const QDBusReply<int> loaded = scripting.call(QStringLiteral("loadDeclarativeScript"),
QStringLiteral(GEOMETRY_SCRIPT_PATH), QString::fromLatin1(scriptName));
if (!loaded.isValid() || loaded.value() < 0) {
qWarning() << "Cannot load taskbar geometry script:" << loaded.error().message();
return;
}
m_loaded = true;
QDBusInterface script(QStringLiteral("org.kde.KWin"),
QStringLiteral("/Scripting/Script%1").arg(loaded.value()), QStringLiteral("org.kde.kwin.Script"));
const QDBusReply<void> started = script.call(QStringLiteral("run"));
if (!started.isValid()) {
qWarning() << "Cannot start taskbar geometry script:" << started.error().message();
m_loaded = false;
}
}
TaskbarGeometry::~TaskbarGeometry()
{
QDBusInterface scripting(QStringLiteral("org.kde.KWin"), QStringLiteral("/Scripting"),
QStringLiteral("org.kde.kwin.Scripting"));
scripting.call(QStringLiteral("unloadScript"), QString::fromLatin1(scriptName));
QDBusConnection::sessionBus().unregisterObject(QString::fromLatin1(objectPath));
}
void TaskbarGeometry::request(const QString &uuid)
{
++m_serial;
m_uuid = uuid;
if (m_ready) {
Q_EMIT lookup(m_serial, uuid);
} else if (!m_loaded) {
Q_EMIT received({});
}
}
void TaskbarGeometry::cancel()
{
++m_serial;
m_uuid.clear();
}
void TaskbarGeometry::bridgeReady()
{
m_ready = true;
if (!m_uuid.isEmpty()) {
Q_EMIT lookup(m_serial, m_uuid);
}
}
void TaskbarGeometry::complete(int serial, double x, double y, double width, double height)
{
if (serial == m_serial && !m_uuid.isEmpty()) {
Q_EMIT received(QRectF(x, y, width, height));
}
}