3
0
mirror of https://github.com/Qortal/Brooklyn.git synced 2025-02-12 02:05:54 +00:00
Brooklyn/plasma/applets/kimpanel/plugin/kimpanelagent.cpp
Scare Crowe d2ebfd0519 QortalOS Titan 5.60.12
Screw the description like that inbred T3Q
2022-03-05 21:17:59 +05:00

306 lines
9.8 KiB
C++

/*
SPDX-FileCopyrightText: 2009 Wang Hoi <zealot.hoi@gmail.com>
SPDX-FileCopyrightText: 2011 Weng Xuetian <wengxt@gmail.com>
SPDX-License-Identifier: GPL-2.0-or-later
*/
#include "kimpanelagent.h"
#include "impaneladaptor.h"
// Qt
#include <QByteArray>
#include <QDBusServiceWatcher>
#include <QList>
#include <QMap>
#include <QString>
#include <QVariant>
int PanelAgent::m_connectionIndex = 0;
PanelAgent::PanelAgent(QObject *parent)
: QObject(parent)
, m_adaptor(new ImpanelAdaptor(this))
, m_adaptor2(new Impanel2Adaptor(this))
, m_watcher(new QDBusServiceWatcher(this))
, m_connection(QDBusConnection::connectToBus(QDBusConnection::SessionBus, QStringLiteral("kimpanel_bus_%0").arg(++m_connectionIndex)))
{
m_watcher->setConnection(QDBusConnection::sessionBus());
m_watcher->setWatchMode(QDBusServiceWatcher::WatchForUnregistration);
m_connection.registerObject(QStringLiteral("/org/kde/impanel"), this);
m_connection.registerService(QStringLiteral("org.kde.impanel"));
// directly connect to corresponding signal
m_connection.connect(QString(), QString(), QStringLiteral("org.kde.kimpanel.inputmethod"), QStringLiteral("Enable"), this, SIGNAL(enable(bool)));
m_connection.connect(QString(), QString(), QStringLiteral("org.kde.kimpanel.inputmethod"), QStringLiteral("ShowPreedit"), this, SIGNAL(showPreedit(bool)));
m_connection.connect(QString(), QString(), QStringLiteral("org.kde.kimpanel.inputmethod"), QStringLiteral("ShowAux"), this, SIGNAL(showAux(bool)));
m_connection
.connect(QString(), QString(), QStringLiteral("org.kde.kimpanel.inputmethod"), QStringLiteral("ShowLookupTable"), this, SIGNAL(showLookupTable(bool)));
m_connection.connect(QString(),
QString(),
QStringLiteral("org.kde.kimpanel.inputmethod"),
QStringLiteral("UpdateLookupTableCursor"),
this,
SIGNAL(updateLookupTableCursor(int)));
// do some serialization
m_connection.connect(QString(),
QString(),
QStringLiteral("org.kde.kimpanel.inputmethod"),
QStringLiteral("UpdateLookupTable"),
this,
SLOT(UpdateLookupTable(QStringList, QStringList, QStringList, bool, bool)));
m_connection.connect(QString(),
QString(),
QStringLiteral("org.kde.kimpanel.inputmethod"),
QStringLiteral("UpdatePreeditCaret"),
this,
SIGNAL(updatePreeditCaret(int)));
m_connection.connect(QString(),
QString(),
QStringLiteral("org.kde.kimpanel.inputmethod"),
QStringLiteral("UpdatePreeditText"),
this,
SLOT(UpdatePreeditText(QString, QString)));
m_connection
.connect(QString(), QString(), QStringLiteral("org.kde.kimpanel.inputmethod"), QStringLiteral("UpdateAux"), this, SLOT(UpdateAux(QString, QString)));
m_connection.connect(QString(),
QString(),
QStringLiteral("org.kde.kimpanel.inputmethod"),
QStringLiteral("UpdateSpotLocation"),
this,
SIGNAL(updateSpotLocation(int, int)));
m_connection.connect(QString(), QString(), QStringLiteral("org.kde.kimpanel.inputmethod"), QStringLiteral("UpdateScreen"), this, SLOT(UpdateScreen(int)));
m_connection
.connect(QString(), QString(), QStringLiteral("org.kde.kimpanel.inputmethod"), QStringLiteral("UpdateProperty"), this, SLOT(UpdateProperty(QString)));
m_connection.connect(QString(),
QString(),
QStringLiteral("org.kde.kimpanel.inputmethod"),
QStringLiteral("RegisterProperties"),
this,
SLOT(RegisterProperties(QStringList)));
m_connection.connect(QString(), QString(), QStringLiteral("org.kde.kimpanel.inputmethod"), QStringLiteral("ExecDialog"), this, SLOT(ExecDialog(QString)));
m_connection.connect(QString(), QString(), QStringLiteral("org.kde.kimpanel.inputmethod"), QStringLiteral("ExecMenu"), this, SLOT(ExecMenu(QStringList)));
connect(m_watcher, &QDBusServiceWatcher::serviceUnregistered, this, &PanelAgent::serviceUnregistered);
}
PanelAgent::~PanelAgent()
{
// destructor
QDBusConnection::disconnectFromBus(m_connection.name());
}
void PanelAgent::serviceUnregistered(const QString &service)
{
if (service == m_currentService) {
m_watcher->setWatchedServices(QStringList());
m_cachedProps.clear();
m_currentService = QString();
Q_EMIT showAux(false);
Q_EMIT showPreedit(false);
Q_EMIT showLookupTable(false);
Q_EMIT registerProperties(QList<KimpanelProperty>());
}
}
void PanelAgent::configure()
{
Q_EMIT Configure();
}
void PanelAgent::lookupTablePageDown()
{
Q_EMIT LookupTablePageDown();
}
void PanelAgent::lookupTablePageUp()
{
Q_EMIT LookupTablePageUp();
}
void PanelAgent::movePreeditCaret(int pos)
{
Q_EMIT MovePreeditCaret(pos);
}
void PanelAgent::triggerProperty(const QString &key)
{
Q_EMIT TriggerProperty(key);
}
void PanelAgent::selectCandidate(int idx)
{
Q_EMIT SelectCandidate(idx);
}
static QList<TextAttribute> String2AttrList(const QString &str)
{
QList<TextAttribute> result;
if (str.isEmpty()) {
return result;
}
const QStringList semicolons = str.split(QLatin1Char(';'));
for (const QString &s : semicolons) {
TextAttribute attr;
const QStringList colons = s.split(QLatin1Char(':'));
if (colons.size() < 4)
continue;
switch (colons.at(0).toInt()) {
case 0:
attr.type = TextAttribute::None;
break;
case 1:
attr.type = TextAttribute::Decorate;
break;
case 2:
attr.type = TextAttribute::Foreground;
break;
case 3:
attr.type = TextAttribute::Background;
break;
default:
attr.type = TextAttribute::None;
}
attr.start = colons.at(1).toInt();
attr.length = colons.at(2).toInt();
attr.value = colons.at(3).toInt();
result << attr;
}
return result;
}
static KimpanelProperty String2Property(const QString &str)
{
KimpanelProperty result;
QStringList list = str.split(QLatin1Char(':'));
if (list.size() < 4)
return result;
result.key = list.at(0);
result.label = list.at(1);
result.icon = list.at(2);
result.tip = list.at(3);
result.hint = list.size() > 4 ? list.at(4) : QString();
return result;
}
static KimpanelLookupTable Args2LookupTable(const QStringList &labels, const QStringList &candis, const QStringList &attrs, bool has_prev, bool has_next)
{
Q_ASSERT(labels.size() == candis.size());
Q_ASSERT(labels.size() == attrs.size());
KimpanelLookupTable result;
for (int i = 0; i < labels.size(); i++) {
KimpanelLookupTable::Entry entry;
entry.label = labels.at(i);
entry.text = candis.at(i);
entry.attr = String2AttrList(attrs.at(i));
result.entries << entry;
}
result.has_prev = has_prev;
result.has_next = has_next;
return result;
}
void PanelAgent::created()
{
Q_EMIT PanelCreated();
Q_EMIT PanelCreated2();
}
void PanelAgent::exit()
{
Q_EMIT Exit();
}
void PanelAgent::reloadConfig()
{
Q_EMIT ReloadConfig();
}
void PanelAgent::UpdateLookupTable(const QStringList &labels, const QStringList &candis, const QStringList &attrlists, bool has_prev, bool has_next)
{
Q_EMIT updateLookupTable(Args2LookupTable(labels, candis, attrlists, has_prev, has_next));
}
void PanelAgent::UpdatePreeditText(const QString &text, const QString &attr)
{
Q_EMIT updatePreeditText(text, String2AttrList(attr));
}
void PanelAgent::UpdateAux(const QString &text, const QString &attr)
{
Q_EMIT updateAux(text, String2AttrList(attr));
}
void PanelAgent::UpdateScreen(int screen_id)
{
Q_UNUSED(screen_id);
}
void PanelAgent::UpdateProperty(const QString &prop)
{
Q_EMIT updateProperty(String2Property(prop));
}
void PanelAgent::RegisterProperties(const QStringList &props)
{
const QDBusMessage &msg = message();
if (msg.service() != m_currentService) {
m_watcher->removeWatchedService(m_currentService);
if (m_currentService.isEmpty()) {
Q_EMIT PanelRegistered();
}
m_currentService = msg.service();
m_watcher->addWatchedService(m_currentService);
}
if (m_cachedProps != props) {
m_cachedProps = props;
QList<KimpanelProperty> list;
for (const QString &prop : props) {
list << String2Property(prop);
}
Q_EMIT registerProperties(list);
}
}
void PanelAgent::ExecDialog(const QString &prop)
{
Q_EMIT execDialog(String2Property(prop));
}
void PanelAgent::ExecMenu(const QStringList &entries)
{
QList<KimpanelProperty> list;
for (const QString &entry : entries) {
list << String2Property(entry);
}
Q_EMIT execMenu(list);
}
void PanelAgent::SetSpotRect(int x, int y, int w, int h)
{
Q_EMIT updateSpotRect(x, y, w, h);
}
void PanelAgent::SetLookupTable(const QStringList &labels,
const QStringList &candis,
const QStringList &attrlists,
bool hasPrev,
bool hasNext,
int cursor,
int layout)
{
Q_EMIT updateLookupTableFull(Args2LookupTable(labels, candis, attrlists, hasPrev, hasNext), cursor, layout);
}