dde-dock/plugins/keyboard-layout/dbusadaptors.cpp
donghualin d97ce8c67a fix: 修复从任务栏或其他应用打开控制中心卡死的问题
控制中心的接口已从com.deepin.dde.ControlCenter改成org.deepin.dde.ControlCenter,对应的任务栏的相关接口也要做相应的修改

Log: 优化任务栏打开控制中心的问题
Influence: 任务栏-任务栏设置-打开控制中心,观察打开的时间
Bug: https://pms.uniontech.com/bug-view-149189.html
Change-Id: I30f50b9b824ca819884f31ddf1671f40e813486a
2022-07-22 02:28:43 +00:00

218 lines
6.4 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* Copyright (C) 2017 ~ 2018 Deepin Technology Co., Ltd.
*
* Author: rekols <rekols@foxmail.com>
*
* 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
* 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 <http://www.gnu.org/licenses/>.
*/
#include "utils.h"
#include "dbusadaptors.h"
#include <DDBusSender>
#include <QDebug>
DBusAdaptors::DBusAdaptors(QObject *parent)
: QDBusAbstractAdaptor(parent),
m_keyboard(new Keyboard("com.deepin.daemon.InputDevices",
"/com/deepin/daemon/InputDevice/Keyboard",
QDBusConnection::sessionBus(), this)),
m_menu(new QMenu()),
m_gsettings(Utils::ModuleSettingsPtr("keyboard", QByteArray(), this))
{
m_keyboard->setSync(false);
connect(m_keyboard, &Keyboard::CurrentLayoutChanged, this, &DBusAdaptors::onCurrentLayoutChanged);
connect(m_keyboard, &Keyboard::UserLayoutListChanged, this, &DBusAdaptors::onUserLayoutListChanged);
connect(m_menu, &QMenu::triggered, this, &DBusAdaptors::handleActionTriggered);
// init data
initAllLayoutList();
onCurrentLayoutChanged(m_keyboard->currentLayout());
onUserLayoutListChanged(m_keyboard->userLayoutList());
if (m_gsettings)
connect(m_gsettings, &QGSettings::changed, this, &DBusAdaptors::onGSettingsChanged);
}
DBusAdaptors::~DBusAdaptors()
{
}
QString DBusAdaptors::layout() const
{
if (m_gsettings && m_gsettings->keys().contains("enable") && !m_gsettings->get("enable").toBool())
return QString();
if (m_userLayoutList.size() < 2) {
// do NOT show keyboard indicator
return QString();
}
if (m_currentLayout.isEmpty()) {
// refetch data
QTimer::singleShot(1000, m_keyboard, &Keyboard::currentLayout);
qDebug() << Q_FUNC_INFO << "currentLayout is Empty!!";
}
return m_currentLayout;
}
void DBusAdaptors::setLayout(const QString &str)
{
m_currentLayout = str;
emit layoutChanged(str);
}
Keyboard *DBusAdaptors::getCurrentKeyboard()
{
return m_keyboard;
}
void DBusAdaptors::onClicked(int button, int x, int y)
{
// button value means(XCB_BUTTON_INDEX):
// 0, Any of the following (or none)
// 1, The left mouse button.
// 2, The right mouse button.
// 3, The middle mouse button.
// 4, Scroll wheel. TODO: direction?
// 5, Scroll wheel. TODO: direction?
Q_UNUSED(button);
if (m_menu && m_userLayoutList.size() >= 2) {
m_menu->exec(QPoint(x, y));
}
}
void DBusAdaptors::onCurrentLayoutChanged(const QString &value)
{
m_currentLayoutRaw = value;
m_currentLayout = value.split(';').first();
refreshMenuSelection();
emit layoutChanged(layout());
}
void DBusAdaptors::onUserLayoutListChanged(const QStringList &value)
{
m_userLayoutList = value;
initAllLayoutList();
emit layoutChanged(layout());
}
void DBusAdaptors::initAllLayoutList()
{
QDBusPendingCall call = m_keyboard->LayoutList();
QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(call, this);
connect(watcher, &QDBusPendingCallWatcher::finished, this, [=] {
if (call.isError()) {
qDebug() << "failed to get all keyboard list: " << call.error().message();
} else {
QDBusReply<KeyboardLayoutList> reply = call.reply();
m_allLayoutList = reply.value();
refreshMenu();
}
watcher->deleteLater();
});
}
void DBusAdaptors::refreshMenu()
{
if (!m_menu || m_userLayoutList.size() < 2) {
return;
}
// all action object will be deleted
m_menu->clear();
for (const QString &layoutRawName : m_userLayoutList) {
const QString layoutName = duplicateCheck(layoutRawName);
const QString layoutLocalizedName = m_allLayoutList.value(layoutRawName);
const QString text = QString("%1 (%2)").arg(layoutLocalizedName).arg(layoutName);
QAction *action = new QAction(text, m_menu);
action->setObjectName(layoutRawName);
action->setCheckable(true);
action->setChecked(layoutRawName == m_currentLayoutRaw);
m_menu->addAction(action);
}
m_menu->addSeparator();
// will be deleted after QMenu->clear() above
m_addLayoutAction = new QAction(tr("Add keyboard layout"), m_menu);
m_menu->addAction(m_addLayoutAction);
}
void DBusAdaptors::refreshMenuSelection()
{
for (QAction *action : m_menu->actions()) {
action->setChecked(action->objectName() == m_currentLayoutRaw);
}
}
void DBusAdaptors::handleActionTriggered(QAction *action)
{
if (action == m_addLayoutAction) {
DDBusSender()
.service("org.deepin.dde.ControlCenter")
.interface("org.deepin.dde.ControlCenter")
.path("/org/deepin/dde/ControlCenter")
.method("ShowPage")
.arg(QString("keyboard"))
.arg(QString("Keyboard Layout/Add Keyboard Layout"))
.call();
}
const QString layout = action->objectName();
if (m_userLayoutList.contains(layout)) {
m_keyboard->setCurrentLayout(layout);
}
}
void DBusAdaptors::onGSettingsChanged(const QString &key)
{
Q_UNUSED(key);
// 键盘布局插件处显示的内容就是QLabel中的内容有文字了就显示没有文字就不显示了
if (m_gsettings && m_gsettings->keys().contains("enable")) {
const bool enable = m_gsettings->get("enable").toBool();
QString layoutStr = getCurrentKeyboard()->currentLayout().split(';').first();
setLayout(enable ? layoutStr : "");
}
}
QString DBusAdaptors::duplicateCheck(const QString &kb)
{
QStringList list;
const QString kbFirst = kb.split(";").first();
for (const QString &data : m_userLayoutList) {
if (data.split(";").first() == kbFirst) {
list << data;
}
}
const QString kblayout = kb.split(";").first().mid(0, 2);
return kblayout + (list.count() > 1 ? QString::number(list.indexOf(kb) + 1) : "");
}