From d1a91aeff183e166fc604065aa79a8a4f2f9a418 Mon Sep 17 00:00:00 2001 From: xibowen Date: Thu, 30 Nov 2023 16:38:12 +0800 Subject: [PATCH] Task185114, add kysdk-conf2 config to replace gsettings --- debian/control | 1 + debian/libqt5-ukui-style1.install | 1 + debian/qt5-ukui-platformtheme.install | 2 +- libqt5-ukui-style/libqt5-ukui-style.pro | 6 +- .../settings/org.ukui.style.yaml | 26 +- libqt5-ukui-style/settings/settings.pri | 4 +- .../settings/ukui-style-conf-settings.cpp | 231 ++++++++++++++++++ .../settings/ukui-style-conf-settings.h | 87 +++++++ .../settings/ukui-style-settings.h | 3 + qt5-ukui-filedialog/qt5-ukui-filedialog.pro | 2 +- .../qt5-ukui-platformtheme.pro | 2 +- .../mps-style-application.pro | 2 +- ukui-styles/ukui-styles.pro | 2 +- 13 files changed, 349 insertions(+), 20 deletions(-) create mode 100644 libqt5-ukui-style/settings/ukui-style-conf-settings.cpp create mode 100644 libqt5-ukui-style/settings/ukui-style-conf-settings.h diff --git a/debian/control b/debian/control index 81ba81d..00ab43f 100644 --- a/debian/control +++ b/debian/control @@ -14,6 +14,7 @@ Build-Depends: dbus-x11, libkf5iconthemes-dev, libkf5wayland-dev, libkf5windowsystem-dev, + libkysdk-conf2-dev, libkysdk-waylandhelper-dev, libpeony-dev, libqt5svg5-dev, diff --git a/debian/libqt5-ukui-style1.install b/debian/libqt5-ukui-style1.install index c1e1e61..79206e5 100644 --- a/debian/libqt5-ukui-style1.install +++ b/debian/libqt5-ukui-style1.install @@ -1,2 +1,3 @@ +etc/kylin-config/basic/org.ukui.style.yaml usr/lib/*/*.so.* usr/share/glib-2.0/schemas/org.ukui.style.gschema.xml diff --git a/debian/qt5-ukui-platformtheme.install b/debian/qt5-ukui-platformtheme.install index 7d4771e..d655c8e 100644 --- a/debian/qt5-ukui-platformtheme.install +++ b/debian/qt5-ukui-platformtheme.install @@ -1,3 +1,3 @@ -usr/lib/*/qt5/plugins/platformthemes/*.so qt5-ukui-filedialog/.qm/* /usr/share/qt5-ukui-platformtheme qt5-ukui-platformtheme/.qm/* /usr/share/qt5-ukui-platformtheme +usr/lib/*/qt5/plugins/platformthemes/*.so diff --git a/libqt5-ukui-style/libqt5-ukui-style.pro b/libqt5-ukui-style/libqt5-ukui-style.pro index 07454e0..1d7a950 100644 --- a/libqt5-ukui-style/libqt5-ukui-style.pro +++ b/libqt5-ukui-style/libqt5-ukui-style.pro @@ -27,7 +27,7 @@ DEFINES += QT_MESSAGELOGCONTEXT include(libqt5-ukui-style.pri) CONFIG += c++11 link_pkgconfig -PKGCONFIG += gsettings-qt +PKGCONFIG += gsettings-qt gio-2.0 kysdk-conf2 DISTFILES += \ org.ukui.style.gschema.xml @@ -40,6 +40,10 @@ unix { gschema.files += $$PWD/settings/org.ukui.style.gschema.xml INSTALLS += gschema + kconf2.path = /etc/kylin-config/basic/ + kconf2.files += $$PWD/settings/org.ukui.style.yaml + INSTALLS += kconf2 + pkgconfig.path = $$[QT_INSTALL_LIBS]/pkgconfig pkgconfig.files += development-files/qt5-ukui.pc INSTALLS += pkgconfig diff --git a/libqt5-ukui-style/settings/org.ukui.style.yaml b/libqt5-ukui-style/settings/org.ukui.style.yaml index 8aafc9f..68b62ca 100644 --- a/libqt5-ukui-style/settings/org.ukui.style.yaml +++ b/libqt5-ukui-style/settings/org.ukui.style.yaml @@ -1,30 +1,30 @@ style: - 4.1.0.0-0k12: + 4.3.1.2: keys: blur-exception-classes: _type: s - default: [] + default: '[]' description: 'Example: [QWidget, QWidget1, QWidget2]' summary: a list of QWidget based classes do not blur. cursor-blink: _type: b - default: true + default: 'true' description: Globally enable or disable blinking text cursor. summary: Blink text cursor. cursor-blink-time: _type: i - default: 1200 + default: '1200' description: The interval of text cursor blink. summary: Blink text cursor interval. custom-highlight-color: _type: s - default: #3D6BE5 + default: '#3D6BE5' description: Set custom highlight color for UKUI desktop environment.Now is to compatible with third party application summary: Custom highlight color enabled-global-blur: _type: b - default: true + default: 'true' description: "Globally enable or disable the window blur effects for transparent\ \ window.\n Setting it to \"false\" will disable the effects." summary: Enable Window Blur Effects. @@ -35,12 +35,12 @@ style: summary: Icon Theme for Qt Applications. menu-transparency: _type: i - default: 72 + default: '72' description: The default transparency of menu. summary: Menu's transparency. peony-side-bar-transparency: _type: i - default: 72 + default: '72' description: The default transparency of the peony side bar. summary: Peony::SideBar's transparency. style-name: @@ -56,7 +56,7 @@ style: summary: System Font for Qt Applications. system-font-size: _type: s - default: 11 + default: '11' description: System Font Size for Qt Applications. Use point size. summary: System Font Size for Qt Applications. system-palette: @@ -66,19 +66,19 @@ style: summary: System Palette theme-color: _type: s - default: #3790FA + default: '#3790FA' description: "Set theme color for UKUI desktop environment.include default,daybreakBlue,jamPurple,magenta,sunRed,sunsetOrange,dustGold,polarGreen,\n\ \ and using rgba for example \"(125,125,125) or #3790FA" summary: theme color use-custom-highlight-color: _type: b - default: false + default: 'false' description: Globally enable or disable custom highlight color.Now is to compatible with third party application summary: Use custom highlight color. use-system-palette: _type: b - default: false + default: 'false' description: Globally enable or disable system palette provided by ukui platform. summary: Use system palette. widget-theme-name: @@ -88,7 +88,7 @@ style: summary: Current widget theme name window-radius: _type: i - default: 12 + default: '12' description: Set the rounded corner size of the window range: 0,12 summary: Window Radius diff --git a/libqt5-ukui-style/settings/settings.pri b/libqt5-ukui-style/settings/settings.pri index 9a83014..736a6f3 100644 --- a/libqt5-ukui-style/settings/settings.pri +++ b/libqt5-ukui-style/settings/settings.pri @@ -1,10 +1,12 @@ HEADERS += $$PWD/libqt5-ukui-style_global.h \ + $$PWD/ukui-style-conf-settings.h \ $$PWD/ukui-style-settings.h \ $$PWD/black-list.h \ $$PWD/application-style-settings.h SOURCES += $$PWD/ukui-style-settings.cpp \ - $$PWD/application-style-settings.cpp + $$PWD/application-style-settings.cpp \ + $$PWD/ukui-style-conf-settings.cpp INCLUDEPATH += $$PWD/.. INCLUDEPATH += $$PWD diff --git a/libqt5-ukui-style/settings/ukui-style-conf-settings.cpp b/libqt5-ukui-style/settings/ukui-style-conf-settings.cpp new file mode 100644 index 0000000..a125e9b --- /dev/null +++ b/libqt5-ukui-style/settings/ukui-style-conf-settings.cpp @@ -0,0 +1,231 @@ +/* + * Qt5-UKUI's Library + * + * Copyright (C) 2023, KylinSoft Co., Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this library. If not, see . + * + * Authors: xibowen + * + */ + +#include "ukui-style-conf-settings.h" +#include "libkysettings.h" +#include +#include + +//char to QString +QString qtify_name(const char *name) +{ + bool next_cap = false; + QString result; + + while (*name) { + if (*name == '-') { + next_cap = true; + } else if (next_cap) { + result.append(QChar(*name).toUpper().toLatin1()); + next_cap = false; + } else { + result.append(*name); + } + + name++; + } + + return result; +} + +//QString to char +char * unqtify_name(const QString &name) +{ + const char *p; + QByteArray bytes; + GString *str; + + bytes = name.toUtf8(); + str = g_string_new (NULL); + + for (p = bytes.constData(); *p; p++) { + const QChar c(*p); + if (c.isUpper()) { + g_string_append_c (str, '-'); + g_string_append_c (str, c.toLower().toLatin1()); + } + else { + g_string_append_c (str, *p); + } + } + + return g_string_free(str, FALSE); +} + + +static void settingChanged(KSettings *ukuistyle_settings, const char *key, void *user_data) +{ + ukuiStyleConfSettings *self = (ukuiStyleConfSettings *)user_data; + + QMetaObject::invokeMethod(self, "changed", Qt::QueuedConnection, Q_ARG(QString, qtify_name(key))); +} + +ukuiStyleConfSettings::ukuiStyleConfSettings(const QByteArray &schema_id) +{ + if (!ukuistyle_settings) + ukuistyle_settings = kdk_conf2_new(schema_id, NULL); + + signal_handler_id = kdk_conf2_connect_signal(ukuistyle_settings, "changed", + (KCallBack)settingChanged, this); +} + +ukuiStyleConfSettings::~ukuiStyleConfSettings() +{ + if (ukuistyle_settings) { + kdk_conf2_ksettings_destroy(ukuistyle_settings); + ukuistyle_settings = NULL; + } +} + +QVariant ukuiStyleConfSettings::types_to_qvariant(const char *key,const char* value) const +{ + char *type = kdk_conf2_get_type(this->ukuistyle_settings, key); + switch (*type) { + case VARIANT_CLASS_BOOLEAN: + return QVariant(value); + + case VARIANT_CLASS_BYTE: + return QVariant(QString(value)); + + case VARIANT_CLASS_INT16: + return QVariant(QString(value).toShort()); + + case VARIANT_CLASS_UINT16: + return QVariant(QString(value).toUShort()); + + case VARIANT_CLASS_INT32: + return QVariant(QString(value).toInt()); + + case VARIANT_CLASS_UINT32: + return QVariant(QString(value).toUInt()); + + case VARIANT_CLASS_INT64: + return QVariant(QString(value).toLongLong()); + + case VARIANT_CLASS_UINT64: + return QVariant(QString(value).toULongLong()); + + case VARIANT_CLASS_DOUBLE: + return QVariant(QString(value).toDouble()); + + case VARIANT_CLASS_STRING: + return QVariant(QString(value)); + + case VARIANT_CLASS_ARRAY: +// if (g_variant_is_of_type(value, G_VARIANT_TYPE_STRING_ARRAY)) { +// GVariantIter iter; +// QStringList list; +// const gchar *str; + +// g_variant_iter_init (&iter, value); +// while (g_variant_iter_next (&iter, "&s", &str)) +// list.append (str); + +// return QVariant(list); +// } else if (g_variant_is_of_type(value, G_VARIANT_TYPE_BYTESTRING)) { +// return QVariant(QByteArray(g_variant_get_bytestring(value))); +// } else if (g_variant_is_of_type(value, G_VARIANT_TYPE("a{ss}"))) { +// GVariantIter iter; +// QMap map; +// const gchar *key; +// const gchar *val; + +// g_variant_iter_init (&iter, value); +// while (g_variant_iter_next (&iter, "{&s&s}", &key, &val)) +// map.insert(key, QVariant(val)); + +// return map; +// } + + // fall through + default: + g_assert_not_reached(); + } +} + +QVariant ukuiStyleConfSettings::get(const QString &key) const +{ + char *ckey = unqtify_name(key); + char *value = kdk_conf2_get_value(ukuistyle_settings, ckey); + + QVariant qvalue = types_to_qvariant(ckey, value); + + g_free(value); + g_free(ckey); + return qvalue; +} + +void ukuiStyleConfSettings::set(const QString &key, const QVariant &value) +{ + if (!this->trySet(key, value)) + qWarning("unable to set key '%s' to value '%s'", key.toUtf8().constData(), value.toString().toUtf8().constData()); +} + +bool ukuiStyleConfSettings::trySet(const QString &key, const QVariant &value) +{ + if (!ukuistyle_settings) + return false; + + char *ckey = unqtify_name(key); + char *cvalue = unqtify_name(value.value()); + bool success = false; + + success = kdk_conf2_set_value(ukuistyle_settings, ckey, cvalue); + g_free(ckey); + g_free(cvalue); + return success; +} + +QStringList ukuiStyleConfSettings::keys() const +{ + QStringList list; + + char **keys = kdk_conf2_list_keys(ukuistyle_settings); + for (int i = 0; keys[i]; i++) + list.append(qtify_name(keys[i])); + + g_strfreev(keys); + + return list; +} + +void ukuiStyleConfSettings::reset(const QString &qkey) +{ + if (!ukuistyle_settings) + return; + + char *key = unqtify_name(qkey); + kdk_conf2_reset(ukuistyle_settings, key); + g_free(key); +} + +bool ukuiStyleConfSettings::isSettingsAvailable(const QString &schema_id) +{ + char *schema = unqtify_name(schema_id); + bool result = false; + if (kdk_conf2_new(schema, NULL)) { + result = true; + } + + g_free(schema); + return result; +} diff --git a/libqt5-ukui-style/settings/ukui-style-conf-settings.h b/libqt5-ukui-style/settings/ukui-style-conf-settings.h new file mode 100644 index 0000000..6a1db53 --- /dev/null +++ b/libqt5-ukui-style/settings/ukui-style-conf-settings.h @@ -0,0 +1,87 @@ +/* + * Qt5-UKUI's Library + * + * Copyright (C) 2023, KylinSoft Co., Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this library. If not, see . + * + * Authors: xibowen + * + */ + +#ifndef UKUISTYLECONFSETTINGS_H +#define UKUISTYLECONFSETTINGS_H + + +#include +#include + +typedef struct _KSettings KSettings; + +class ukuiStyleConfSettings : public QObject +{ + Q_OBJECT +public: + + enum VariantClass { + VARIANT_CLASS_BOOLEAN = 'b', + VARIANT_CLASS_BYTE = 'y', + VARIANT_CLASS_INT16 = 'n', + VARIANT_CLASS_UINT16 = 'q', + VARIANT_CLASS_INT32 = 'i', + VARIANT_CLASS_UINT32 = 'u', + VARIANT_CLASS_INT64 = 'x', + VARIANT_CLASS_UINT64 = 't', + VARIANT_CLASS_HANDLE = 'h', + VARIANT_CLASS_DOUBLE = 'd', + VARIANT_CLASS_STRING = 's', + VARIANT_CLASS_OBJECT_PATH = 'o', + VARIANT_CLASS_SIGNATURE = 'g', + VARIANT_CLASS_VARIANT = 'v', + VARIANT_CLASS_MAYBE = 'm', + VARIANT_CLASS_ARRAY = 'a', + VARIANT_CLASS_TUPLE = '(', + VARIANT_CLASS_DICT_ENTRY = '{' + }; + + + ukuiStyleConfSettings(const QByteArray &schema_id); + + ~ukuiStyleConfSettings(); + + QVariant types_to_qvariant(const char *key, const char *value) const; + + static ukuiStyleConfSettings *globalInstance(); + + QVariant get(const QString &key) const; + + void set(const QString &key, const QVariant &value); + + bool trySet(const QString &key, const QVariant &value); + + QStringList keys() const; + + void reset(const QString &key); + + static bool isSettingsAvailable(const QString &schema_id); + +Q_SIGNALS: + void changed(const QString &key); + +private: + KSettings *ukuistyle_settings = NULL; + long signal_handler_id; +}; + +#endif // UKUISTYLECONFSETTINGS_H diff --git a/libqt5-ukui-style/settings/ukui-style-settings.h b/libqt5-ukui-style/settings/ukui-style-settings.h index 861c855..a11f075 100644 --- a/libqt5-ukui-style/settings/ukui-style-settings.h +++ b/libqt5-ukui-style/settings/ukui-style-settings.h @@ -26,6 +26,9 @@ #include "libqt5-ukui-style_global.h" #include +//Fix me:after so +//#include "ukui-style-conf-settings.h" + /*! * \brief The UKUIStyleSettings class * \details diff --git a/qt5-ukui-filedialog/qt5-ukui-filedialog.pro b/qt5-ukui-filedialog/qt5-ukui-filedialog.pro index 65da40b..4ece318 100644 --- a/qt5-ukui-filedialog/qt5-ukui-filedialog.pro +++ b/qt5-ukui-filedialog/qt5-ukui-filedialog.pro @@ -15,7 +15,7 @@ TARGET = qt5-ukui-filedialog TEMPLATE = lib CONFIG += plugin CONFIG += c++11 link_pkgconfig lrelease -PKGCONFIG += gsettings-qt peony kysdk-waylandhelper +PKGCONFIG += gsettings-qt peony kysdk-waylandhelper kysdk-conf2 LIBS += -lX11 include(../libqt5-ukui-style/libqt5-ukui-style.pri) diff --git a/qt5-ukui-platformtheme/qt5-ukui-platformtheme.pro b/qt5-ukui-platformtheme/qt5-ukui-platformtheme.pro index c47c5cd..9e597ee 100644 --- a/qt5-ukui-platformtheme/qt5-ukui-platformtheme.pro +++ b/qt5-ukui-platformtheme/qt5-ukui-platformtheme.pro @@ -15,7 +15,7 @@ TARGET = qt5-ukui-platformtheme TEMPLATE = lib CONFIG += plugin CONFIG += c++11 link_pkgconfig lrelease -PKGCONFIG += gsettings-qt Qt5XdgIconLoader kysdk-waylandhelper fontconfig freetype2 gio-2.0 +PKGCONFIG += gsettings-qt Qt5XdgIconLoader kysdk-waylandhelper fontconfig freetype2 gio-2.0 kysdk-conf2 LIBS += -lX11 -lfontconfig -lfreetype include(../libqt5-ukui-style/libqt5-ukui-style.pri) diff --git a/test/mps-style-application/mps-style-application.pro b/test/mps-style-application/mps-style-application.pro index ccce17a..2eef99d 100644 --- a/test/mps-style-application/mps-style-application.pro +++ b/test/mps-style-application/mps-style-application.pro @@ -23,7 +23,7 @@ DEFINES += QT_DEPRECATED_WARNINGS #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 CONFIG += plugin c++11 link_pkgconfig -PKGCONFIG += gsettings-qt +PKGCONFIG += gsettings-qt gio-2.0 kysdk-conf2 include(../../libqt5-ukui-style/libqt5-ukui-style.pri) diff --git a/ukui-styles/ukui-styles.pro b/ukui-styles/ukui-styles.pro index 2275336..b8a1a49 100644 --- a/ukui-styles/ukui-styles.pro +++ b/ukui-styles/ukui-styles.pro @@ -9,7 +9,7 @@ QT += widgets widgets-private KWindowSystem gui gui-private x11extras dbus TARGET = qt5-style-ukui TEMPLATE = lib CONFIG += plugin c++11 link_pkgconfig -PKGCONFIG += gsettings-qt +PKGCONFIG += gsettings-qt gio-2.0 kysdk-conf2 LIBS += -lxcb include(../libqt5-ukui-style/libqt5-ukui-style.pri)