dtkgui/tools/deepin-gui-settings/main.cpp

195 lines
6.0 KiB
C++

// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd.
//
// SPDX-License-Identifier: LGPL-3.0-or-later
#include <DNativeSettings>
#include <QGuiApplication>
#include <QCommandLineParser>
#include <QCommandLineOption>
#include <QDebug>
#include <QColor>
#include <QProcess>
DGUI_USE_NAMESPACE
int main(int argc, char *argv[])
{
// 禁用输入法,防止输入法插件乱输出内容
qunsetenv("QT_IM_MODULE");
qputenv("QT_QPA_PLATFORM", "dxcb");
QGuiApplication app(argc, argv);
qunsetenv("QT_QPA_PLATFORM");
QCommandLineParser parser;
QCommandLineOption option_window({"w", "window"}, "resource id of window to examine");
QCommandLineOption option_window_leader("window-leader", "use leader window of the window");
QCommandLineOption option_select_window("select", "auto select a window on screen");
QCommandLineOption option_domain({"p", "domain"}, "domain of settings property");
QCommandLineOption option_set("set", "set a settings item to a given value. Can only and must specify a value(eg: [-s|-i|-c])");
QCommandLineOption option_string({"s", "string"}, "set a string value of a settings item");
QCommandLineOption option_int({"i", "int"}, "set a int value of a settings item");
QCommandLineOption option_color({"c", "color"}, "set a color value of a settings item");
QCommandLineOption option_remove({"r", "remove"}, "remove a settings item");
option_window.setValueName("id");
option_window.setDefaultValue("0");
option_domain.setValueName("domain");
option_domain.setDefaultValue(QString());
option_set.setValueName("key");
option_string.setValueName("value");
option_int.setValueName("value");
option_color.setValueName("value");
option_remove.setValueName("key");
parser.addOption(option_window);
parser.addOption(option_window_leader);
parser.addOption(option_select_window);
parser.addOption(option_domain);
parser.addOption(option_set);
parser.addOption(option_string);
parser.addOption(option_int);
parser.addOption(option_color);
parser.addOption(option_remove);
parser.addPositionalArgument("keys", "key of get settings value", "[keys...]");
parser.addHelpOption();
parser.addVersionOption();
parser.process(app);
quint32 window_id = 0;
if (parser.isSet(option_select_window)) {
QProcess xdotool;
xdotool.start("xdotool", {"selectwindow"}, QIODevice::ReadOnly);
if (!xdotool.waitForFinished()) {
parser.showHelp(1);
}
bool ok = false;
window_id = xdotool.readAllStandardOutput().trimmed().toInt(&ok);
if (!ok) {
parser.showHelp(1);
}
} else {
const QString &window_id_value = parser.value(option_window);
bool ok = false;
if (window_id_value.startsWith("0x")) {
window_id = window_id_value.toInt(&ok, 16);
} else {
window_id = window_id_value.toInt(&ok);
}
if (!ok) {
parser.showHelp(-1);
}
}
if (parser.isSet(option_window_leader)) {
QProcess xprop;
xprop.start("xprop", {"-id", QString::number(window_id), "WM_CLIENT_LEADER"}, QIODevice::ReadOnly);
if (!xprop.waitForFinished()) {
qFatal("%s\n", xprop.errorString().toLocal8Bit().constData());
return -1;
}
const QByteArrayList &list = xprop.readAllStandardOutput().split(' ');
bool ok = false;
if (!list.isEmpty()) {
quint32 id = list.last().trimmed().toInt(&ok, 16);
if (ok) {
window_id = id;
}
}
if (!ok) {
qFatal("%s\n", "not found WM_CLIENT_LEADER");
return -1;
}
}
DNativeSettings settings(window_id, parser.value(option_domain).toLatin1());
if (!settings.isValid()) {
qWarning() << "Settings is invalid, platform plugin is:" << qApp->platformName();
return -1;
}
if (parser.isSet(option_set)) {
QVariant value;
if (parser.isSet(option_string)) { // string
if (parser.isSet(option_int) || parser.isSet(option_color)) {
parser.showHelp(-1);
}
value = parser.value(option_string).toLocal8Bit();
} else if (parser.isSet(option_int)) { // int
if (parser.isSet(option_string) || parser.isSet(option_color)) {
parser.showHelp(-1);
}
bool ok = false;
int integer = parser.value(option_int).toInt(&ok);
if (!ok) {
parser.showHelp(-1);
}
value = QVariant(integer);
} else if (parser.isSet(option_color)) { // color
if (parser.isSet(option_string) || parser.isSet(option_int)) {
parser.showHelp(-1);
}
QColor color(parser.value(option_color));
if (!color.isValid()) {
parser.showHelp(-1);
}
value = QVariant(color);
} else {
parser.showHelp(-1);
}
// 设置一个属性的值
const QByteArray &name = parser.value(option_set).toLatin1();
if (name.isEmpty()) {
parser.showHelp(-1);
}
settings.setSetting(name, value);
qDebug() << name << settings.getSetting(name);
} else if (parser.isSet(option_remove)) {
const QByteArray &name = parser.value(option_remove).toLatin1();
if (name.isEmpty()) {
parser.showHelp(-1);
}
settings.setSetting(name, QVariant());
qDebug() << name << settings.getSetting(name);
} else {
const QStringList &keys = parser.positionalArguments();
if (keys.isEmpty()) {
// 打印所有设置项
qDebug() << settings;
} else {
for (const QString &key : keys) {
qDebug() << key << settings.getSetting(key.toLatin1());
}
}
}
return 0;
}