Description: Add the ability to set GTK themes Author: P.L. Lucas Origin: upstream Applied-Upstream: https://github.com/lxqt/lxqt-config/pull/244 Last-Update: 2018-07-30 --- a/lxqt-config-appearance/CMakeLists.txt +++ b/lxqt-config-appearance/CMakeLists.txt @@ -15,6 +15,7 @@ set(MOC_FILES fontsconfig.h styleconfig.h fontconfigfile.h + configothertoolkits.h ) set(CPP_FILES @@ -25,6 +26,7 @@ set(CPP_FILES fontsconfig.cpp styleconfig.cpp fontconfigfile.cpp + configothertoolkits.cpp ) set(UI_FILES --- /dev/null +++ b/lxqt-config-appearance/configothertoolkits.cpp @@ -0,0 +1,329 @@ +/* BEGIN_COMMON_COPYRIGHT_HEADER + * (c)LGPL2+ + * + * LXQt - a lightweight, Qt based, desktop toolset + * https://lxqt.org/ + * + * Copyright: 2018 LXQt team + * + * This program or 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 2.1 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 Lesser General + * Public License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA + * + * END_COMMON_COPYRIGHT_HEADER */ + +#include "configothertoolkits.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +static const char *GTK2_CONFIG = R"GTK2_CONFIG( +# Created by lxqt-config-appearance (DO NOT EDIT!) +gtk-theme-name = "%1" +gtk-icon-theme-name = "%2" +gtk-font-name = "%3" +gtk-button-images = %4 +gtk-menu-images = %4 +gtk-toolbar-style = %5 +)GTK2_CONFIG"; + +static const char *GTK3_CONFIG = R"GTK3_CONFIG( +# Created by lxqt-config-appearance (DO NOT EDIT!) +[Settings] +gtk-theme-name = %1 +gtk-icon-theme-name = %2 +# GTK3 ignores bold or italic attributes. +gtk-font-name = %3 +gtk-menu-images = %4 +gtk-button-images = %4 +gtk-toolbar-style = %5 +)GTK3_CONFIG"; + +static const char *XSETTINGS_CONFIG = R"XSETTINGS_CONFIG( +# Created by lxqt-config-appearance (DO NOT EDIT!) +Net/IconThemeName "%2" +Net/ThemeName "%1" +Gtk/FontName "%3" +Gtk/MenuImages %4 +Gtk/ButtonImages %4 +Gtk/ToolbarStyle "%5" +)XSETTINGS_CONFIG"; + +ConfigOtherToolKits::ConfigOtherToolKits(LXQt::Settings *settings, LXQt::Settings *configAppearanceSettings, QObject *parent) : QObject(parent) +{ + mSettings = settings; + mConfigAppearanceSettings = configAppearanceSettings; + if(tempFile.open()) { + mXsettingsdProc.setProcessChannelMode(QProcess::ForwardedChannels); + mXsettingsdProc.start("xsettingsd", QStringList() << "-c" << tempFile.fileName()); + if(!mXsettingsdProc.waitForStarted()) + return; + tempFile.close(); + } +} + +ConfigOtherToolKits::~ConfigOtherToolKits() +{ + mXsettingsdProc.close(); +} + +static QString get_environment_var(const char *envvar, const char *defaultValue) +{ + QString homeDir = QStandardPaths::writableLocation(QStandardPaths::HomeLocation); + QString mDirPath = QString::fromLocal8Bit(qgetenv(envvar)); + if(mDirPath.isEmpty()) + mDirPath = homeDir + defaultValue; + else { + for(QString path : mDirPath.split(":") ) { + mDirPath = path; + break; + } + } + return mDirPath; +} + +static QString _get_config_path(QString path) +{ + QString homeDir = QStandardPaths::writableLocation(QStandardPaths::HomeLocation); + path.replace("$XDG_CONFIG_HOME", get_environment_var("XDG_CONFIG_HOME", "/.config")); + path.replace("$GTK2_RC_FILES", get_environment_var("GTK2_RC_FILES", "/.gtkrc-2.0")); // If $GTK2_RC_FILES is undefined, "~/.gtkrc-2.0" will be used. + path.replace("~", homeDir); + return path; +} + +QString ConfigOtherToolKits::getGTKConfigPath(QString version) +{ + if(version == "2.0") + return _get_config_path("$GTK2_RC_FILES"); + return _get_config_path(QString("$XDG_CONFIG_HOME/gtk-%1/settings.ini").arg(version)); +} + +static bool grep(QFile &file, QByteArray text) +{ + if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) + return false; + while (!file.atEnd()) { + QByteArray line = file.readLine().trimmed(); + if(line.startsWith(text)) { + return true; + } + } + file.close(); + return false; +} + +bool ConfigOtherToolKits::backupGTKSettings(QString version) +{ + QString gtkrcPath = getGTKConfigPath(version); + QFile file(gtkrcPath); + if(file.exists() && !grep(file, "# Created by lxqt-config-appearance (DO NOT EDIT!)")) { + QString backupPath = gtkrcPath + "-" + QString::number(QDateTime::currentSecsSinceEpoch()) + "~"; + file.copy(backupPath); + QMessageBox::warning(nullptr, tr("GTK themes"), + tr("

'%1' has been overwritten.

You can find a copy of your old settings in '%2'

") + .arg(getGTKConfigPath(version)) + .arg(backupPath) + , QMessageBox::Ok); + return true; + } + return false; +} + +void ConfigOtherToolKits::setConfig() +{ + if(!mConfigAppearanceSettings->contains("ControlGTKThemeEnabled")) + mConfigAppearanceSettings->setValue("ControlGTKThemeEnabled", false); + bool controlGTKThemeEnabled = mConfigAppearanceSettings->value("ControlGTKThemeEnabled").toBool(); + if(! controlGTKThemeEnabled) + return; + updateConfigFromSettings(); + mConfig.styleTheme = getGTKThemeFromRCFile("3.0"); + setGTKConfig("3.0"); + mConfig.styleTheme = getGTKThemeFromRCFile("2.0"); + setGTKConfig("2.0"); + setXSettingsConfig(); +} + +void ConfigOtherToolKits::setXSettingsConfig() +{ + // setGTKConfig is called before calling setXSettingsConfig, + // then updateConfigFromSettings is not required. + //updateConfigFromSettings(); + //mConfig.styleTheme = getGTKThemeFromRCFile(version); + + // Reload settings. xsettingsd must be installed. + // xsettingsd settings are written to stdin. + if(QProcess::Running == mXsettingsdProc.state()) { + QFile file(tempFile.fileName()); + if(file.open(QIODevice::WriteOnly)) { + file.write( getConfig(XSETTINGS_CONFIG).toLocal8Bit() ); + file.flush(); + file.close(); + } + int pid = mXsettingsdProc.processId(); + kill(pid, SIGHUP); + } +} + +void ConfigOtherToolKits::setGTKConfig(QString version, QString theme) +{ + updateConfigFromSettings(); + if(!theme.isEmpty()) + mConfig.styleTheme = theme; + backupGTKSettings(version); + QString gtkrcPath = getGTKConfigPath(version); + if(version == "2.0") + writeConfig(gtkrcPath, GTK2_CONFIG); + else + writeConfig(gtkrcPath, GTK3_CONFIG); +} + +QString ConfigOtherToolKits::getConfig(const char *configString) +{ + return QString(configString).arg(mConfig.styleTheme, mConfig.iconTheme, + mConfig.fontName, mConfig.buttonStyle==0 ? "0":"1", + mConfig.toolButtonStyle + ); +} + +void ConfigOtherToolKits::writeConfig(QString path, const char *configString) +{ + path = _get_config_path(path); + + QFile file(path); + if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { + return; + } + QTextStream out(&file); + out << getConfig(configString); + out.flush(); + file.close(); +} + +QStringList ConfigOtherToolKits::getGTKThemes(QString version) +{ + QStringList themeList; + QString configFile = version=="2.0" ? "gtk-2.0/gtkrc" : QString("gtk-%1/gtk.css").arg(version); + + QStringList dataPaths = QStandardPaths::standardLocations(QStandardPaths::GenericDataLocation); + for(QString dataPath : dataPaths) { + QDir themesPath(dataPath + "/themes"); + QStringList themes = themesPath.entryList(QDir::Dirs); + for(QString theme : themes) { + QFileInfo themePath(QString("%1/themes/%2/%3").arg(dataPath, theme, configFile)); + if(themePath.exists()) + themeList.append(theme); + } + } + return themeList; +} + +QString ConfigOtherToolKits::getGTKThemeFromRCFile(QString version) +{ + if(version == "2.0") { + QString gtkrcPath = _get_config_path("$GTK2_RC_FILES"); + QFile file(gtkrcPath); + if(file.exists()) { + if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) + return QString(); + while (!file.atEnd()) { + QByteArray line = file.readLine().trimmed(); + if(line.startsWith("gtk-theme-name")) { + QList parts = line.split('='); + if(parts.size()>=2) { + file.close(); + return parts[1].replace('"', "").trimmed(); + } + } + } + file.close(); + } + } else { + QString gtkrcPath = _get_config_path(QString("$XDG_CONFIG_HOME/gtk-%1/settings.ini").arg(version)); + QFile file(gtkrcPath); + if(file.exists()) { + if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) + return QString(); + bool settingsFound = false; + while (!file.atEnd()) { + QByteArray line = file.readLine().trimmed(); + if(line.startsWith("[Settings]")) + settingsFound = true; + else if(line.startsWith("[") && line.endsWith("]")) + settingsFound = false; + else if(settingsFound && line.startsWith("gtk-theme-name")) { + QList parts = line.split('='); + if(parts.size()>=2) { + file.close(); + return parts[1].trimmed(); + } + } + } + file.close(); + } + } + return QString(); +} + +void ConfigOtherToolKits::updateConfigFromSettings() +{ + mSettings->beginGroup(QLatin1String("Qt")); + QFont font; + font.fromString(mSettings->value("font").toString()); + // Font name from: https://developer.gnome.org/pango/stable/pango-Fonts.html#pango-font-description-from-string + // FAMILY-LIST [SIZE]", where FAMILY-LIST is a comma separated list of families optionally terminated by a comma, + // STYLE_OPTIONS is a whitespace separated list of words where each word describes one of style, variant, weight, stretch, or gravity, and + // SIZE is a decimal number (size in points) or optionally followed by the unit modifier "px" for absolute size. + mConfig.fontName = QString("%1%2%3 %4") + .arg(font.family()) //%1 + .arg(font.style()==QFont::StyleNormal?"":" Italic") //%2 + .arg(font.weight()==QFont::Normal?"":" Bold") //%3 + .arg(font.pointSize()); //%4 + mSettings->endGroup(); + + mConfig.iconTheme = mSettings->value("icon_theme").toString(); + { + // Tool button style + QByteArray tb_style = mSettings->value("tool_button_style").toByteArray(); + // convert toolbar style name to value + QMetaEnum me = QToolBar::staticMetaObject.property(QToolBar::staticMetaObject.indexOfProperty("toolButtonStyle")).enumerator(); + int val = me.keyToValue(tb_style.constData()); + mConfig.buttonStyle = 1; + switch(val) { + case Qt::ToolButtonIconOnly: + mConfig.toolButtonStyle = "GTK_TOOLBAR_ICONS"; + break; + case Qt::ToolButtonTextOnly: + mConfig.toolButtonStyle = "GTK_TOOLBAR_TEXT"; + mConfig.buttonStyle = 0; + break; + case Qt::ToolButtonTextUnderIcon: + mConfig.toolButtonStyle = "GTK_TOOLBAR_BOTH"; + break; + default: + mConfig.toolButtonStyle = "GTK_TOOLBAR_BOTH_HORIZ"; + } + } +} + --- /dev/null +++ b/lxqt-config-appearance/configothertoolkits.h @@ -0,0 +1,70 @@ +/* BEGIN_COMMON_COPYRIGHT_HEADER + * (c)LGPL2+ + * + * LXQt - a lightweight, Qt based, desktop toolset + * https://lxqt.org + * + * Copyright: 2018 LXQt team + * + * This program or 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 2.1 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 Lesser General + * Public License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA + * + * END_COMMON_COPYRIGHT_HEADER */ + +#ifndef CONFIGOTHERTOOLKITS_H +#define CONFIGOTHERTOOLKITS_H + +#include +#include +#include +#include + +class ConfigOtherToolKits : public QObject +{ + Q_OBJECT + +public: + ConfigOtherToolKits(LXQt::Settings *settings, LXQt::Settings *configAppearanceSettings, QObject *parent = 0); + ~ConfigOtherToolKits(); + QStringList getGTKThemes(QString version); + QString getGTKThemeFromRCFile(QString version); + QString getGTKConfigPath(QString version); + bool backupGTKSettings(QString version); + +public slots: + void setConfig(); + void setXSettingsConfig(); + void setGTKConfig(QString version, QString theme = QString()); + +private: + struct Config { + QString iconTheme; + QString styleTheme; + QString fontName; + QString toolButtonStyle; + int buttonStyle; + } mConfig; + void writeConfig(QString path, const char *configString); + QString getConfig(const char *configString); + void updateConfigFromSettings(); + + LXQt::Settings *mSettings; + LXQt::Settings *mConfigAppearanceSettings; + + QProcess mXsettingsdProc; + QTemporaryFile tempFile; +}; + +#endif // CONFIGOTHERTOOLKITS_H --- a/lxqt-config-appearance/fontconfigfile.h +++ b/lxqt-config-appearance/fontconfigfile.h @@ -64,6 +64,7 @@ public: } void setAutohint(bool value); + private Q_SLOTS: void save(); --- a/lxqt-config-appearance/fontsconfig.cpp +++ b/lxqt-config-appearance/fontsconfig.cpp @@ -188,6 +188,8 @@ void FontsConfig::updateQtFont() mQtSettings->endGroup(); mQtSettings->sync(); + emit updateSettings(); + #ifdef Q_WS_X11 qt_x11_apply_settings_in_all_apps(); #endif --- a/lxqt-config-appearance/fontsconfig.h +++ b/lxqt-config-appearance/fontsconfig.h @@ -51,6 +51,9 @@ public: public Q_SLOTS: void initControls(); +signals: + void updateSettings(); + private Q_SLOTS: void updateQtFont(); void antialiasToggled(bool toggled); --- a/lxqt-config-appearance/iconthemeconfig.cpp +++ b/lxqt-config-appearance/iconthemeconfig.cpp @@ -151,5 +151,7 @@ void IconThemeConfig::iconThemeSelected( m_settings->setValue("icon_theme", theme); m_settings->sync(); + + emit updateSettings(); } } --- a/lxqt-config-appearance/iconthemeconfig.h +++ b/lxqt-config-appearance/iconthemeconfig.h @@ -51,6 +51,9 @@ private: public slots: void initControls(); +signals: + void updateSettings(); + private slots: void iconThemeSelected(QTreeWidgetItem *item, int column); }; --- a/lxqt-config-appearance/main.cpp +++ b/lxqt-config-appearance/main.cpp @@ -34,6 +34,7 @@ #include "lxqtthemeconfig.h" #include "styleconfig.h" #include "fontsconfig.h" +#include "configothertoolkits.h" #include "../liblxqt-config-cursor/selectwnd.h" @@ -58,14 +59,19 @@ int main (int argc, char **argv) app.setActivationWindow(dialog); + LXQt::Settings mConfigAppearanceSettings("lxqt-config-appearance"); + ConfigOtherToolKits *configOtherToolKits = new ConfigOtherToolKits(settings, &mConfigAppearanceSettings, dialog); + QSettings& qtSettings = *settings; // use lxqt config file for Qt settings in Qt5. - StyleConfig* stylePage = new StyleConfig(settings, &qtSettings, dialog); + StyleConfig* stylePage = new StyleConfig(settings, &qtSettings, &mConfigAppearanceSettings, configOtherToolKits, dialog); dialog->addPage(stylePage, QObject::tr("Widget Style"), QStringList() << "preferences-desktop-theme" << "preferences-desktop"); QObject::connect(dialog, SIGNAL(reset()), stylePage, SLOT(initControls())); + QObject::connect(stylePage, SIGNAL(updateSettings()), configOtherToolKits, SLOT(setConfig())); IconThemeConfig* iconPage = new IconThemeConfig(settings, dialog); dialog->addPage(iconPage, QObject::tr("Icons Theme"), QStringList() << "preferences-desktop-icons" << "preferences-desktop"); QObject::connect(dialog, SIGNAL(reset()), iconPage, SLOT(initControls())); + QObject::connect(iconPage, SIGNAL(updateSettings()), configOtherToolKits, SLOT(setConfig())); LXQtThemeConfig* themePage = new LXQtThemeConfig(settings, dialog); dialog->addPage(themePage, QObject::tr("LXQt Theme"), QStringList() << "preferences-desktop-color" << "preferences-desktop"); @@ -74,6 +80,7 @@ int main (int argc, char **argv) FontsConfig* fontsPage = new FontsConfig(settings, &qtSettings, dialog); dialog->addPage(fontsPage, QObject::tr("Font"), QStringList() << "preferences-desktop-font" << "preferences-desktop"); QObject::connect(dialog, SIGNAL(reset()), fontsPage, SLOT(initControls())); + QObject::connect(fontsPage, SIGNAL(updateSettings()), configOtherToolKits, SLOT(setConfig())); SelectWnd* cursorPage = new SelectWnd(sessionSettings, dialog); cursorPage->setCurrent(); --- a/lxqt-config-appearance/styleconfig.cpp +++ b/lxqt-config-appearance/styleconfig.cpp @@ -41,25 +41,23 @@ extern void qt_x11_apply_settings_in_all_apps(); #endif -StyleConfig::StyleConfig(LXQt::Settings* settings, QSettings* qtSettings, QWidget* parent) : +StyleConfig::StyleConfig(LXQt::Settings* settings, QSettings* qtSettings, LXQt::Settings *configAppearanceSettings, ConfigOtherToolKits *configOtherToolKits, QWidget* parent) : QWidget(parent), ui(new Ui::StyleConfig), mQtSettings(qtSettings), mSettings(settings) { + mConfigAppearanceSettings = configAppearanceSettings; + mConfigOtherToolKits = configOtherToolKits; ui->setupUi(this); - connect(ui->styleList, SIGNAL(itemClicked(QTreeWidgetItem*,int)), - this, SLOT(styleSelected(QTreeWidgetItem*,int))); + initControls(); - const auto keys = QStyleFactory::keys(); - for(const QString& name : keys) - { - QTreeWidgetItem *item = new QTreeWidgetItem(QStringList(name)); - ui->styleList->addTopLevelItem(item); - } + connect(ui->gtk2ComboBox, SIGNAL(activated(const QString &)), this, SLOT(gtk2StyleSelected(const QString &))); + connect(ui->gtk3ComboBox, SIGNAL(activated(const QString &)), this, SLOT(gtk3StyleSelected(const QString &))); + connect(ui->qtComboBox, SIGNAL(activated(const QString &)), this, SLOT(qtStyleSelected(const QString &))); - initControls(); + connect(ui->advancedOptionsGroupBox, SIGNAL(toggled(bool)), this, SLOT(showAdvancedOptions(bool))); connect(ui->toolButtonStyle, SIGNAL(currentIndexChanged(int)), SLOT(toolButtonStyleSelected(int))); connect(ui->singleClickActivate, SIGNAL(toggled(bool)), SLOT(singleClickActivateToggled(bool))); @@ -74,22 +72,20 @@ StyleConfig::~StyleConfig() void StyleConfig::initControls() { - // read Qt style settings from Qt Trolltech.conf config - mQtSettings->beginGroup(QLatin1String("Qt")); - QString currentTheme = mQtSettings->value("style").toString(); - mQtSettings->endGroup(); - QTreeWidgetItemIterator it(ui->styleList); - while (*it) { - if ((*it)->data(0, Qt::DisplayRole).toString() == currentTheme) - { - ui->styleList->setCurrentItem((*it)); - break; - } - ++it; - } + // Fill global themes + QStringList qtThemes = QStyleFactory::keys(); + QStringList gtk2Themes = mConfigOtherToolKits->getGTKThemes("2.0"); + QStringList gtk3Themes = mConfigOtherToolKits->getGTKThemes("3.0"); + + if(!mConfigAppearanceSettings->contains("ControlGTKThemeEnabled")) + mConfigAppearanceSettings->setValue("ControlGTKThemeEnabled", false); + bool controlGTKThemeEnabled = mConfigAppearanceSettings->value("ControlGTKThemeEnabled").toBool(); + + showAdvancedOptions(controlGTKThemeEnabled); + ui->advancedOptionsGroupBox->setChecked(controlGTKThemeEnabled); - // read other widget related settings form LXQt settings. + // read other widget related settings from LXQt settings. QByteArray tb_style = mSettings->value("tool_button_style").toByteArray(); // convert toolbar style name to value QMetaEnum me = QToolBar::staticMetaObject.property(QToolBar::staticMetaObject.indexOfProperty("toolButtonStyle")).enumerator(); @@ -101,24 +97,21 @@ void StyleConfig::initControls() // activate item views with single click ui->singleClickActivate->setChecked( mSettings->value("single_click_activate", false).toBool()); - update(); -} + // Fill Qt themes + ui->qtComboBox->addItems(qtThemes); -void StyleConfig::styleSelected(QTreeWidgetItem* item, int column) -{ - Q_UNUSED(column); - if (!item) - return; - QVariant themeName = item->data(0, Qt::DisplayRole); - mQtSettings->beginGroup(QLatin1String("Qt")); - mQtSettings->setValue("style", themeName); - mQtSettings->endGroup(); - mQtSettings->sync(); + // Fill GTK themes + ui->gtk2ComboBox->addItems(gtk2Themes); + ui->gtk3ComboBox->addItems(gtk3Themes); + + ui->gtk2ComboBox->setCurrentText(mConfigOtherToolKits->getGTKThemeFromRCFile("2.0")); + ui->gtk3ComboBox->setCurrentText(mConfigOtherToolKits->getGTKThemeFromRCFile("3.0")); + mSettings->beginGroup(QLatin1String("Qt")); + ui->qtComboBox->setCurrentText(mSettings->value("style").toString()); + mSettings->endGroup(); -#ifdef Q_WS_X11 - qt_x11_apply_settings_in_all_apps(); -#endif + update(); } void StyleConfig::toolButtonStyleSelected(int index) @@ -131,7 +124,8 @@ void StyleConfig::toolButtonStyleSelecte if(str) { mSettings->setValue("tool_button_style", str); - mSettings->sync(); + mSettings->sync(); + emit updateSettings(); } } @@ -141,3 +135,28 @@ void StyleConfig::singleClickActivateTog mSettings->sync(); } +void StyleConfig::qtStyleSelected(const QString &themeName) +{ + mQtSettings->beginGroup(QLatin1String("Qt")); + mQtSettings->setValue("style", themeName); + mQtSettings->endGroup(); + mQtSettings->sync(); +} + +void StyleConfig::gtk3StyleSelected(const QString &themeName) +{ + mConfigOtherToolKits->setGTKConfig("3.0", themeName); + mConfigOtherToolKits->setXSettingsConfig(); +} + +void StyleConfig::gtk2StyleSelected(const QString &themeName) +{ + mConfigOtherToolKits->setGTKConfig("2.0", themeName); + mConfigOtherToolKits->setXSettingsConfig(); +} + +void StyleConfig::showAdvancedOptions(bool on) +{ + ui->uniformThemeLabel->setVisible(on); + mConfigAppearanceSettings->setValue("ControlGTKThemeEnabled", on); +} --- a/lxqt-config-appearance/styleconfig.h +++ b/lxqt-config-appearance/styleconfig.h @@ -30,6 +30,7 @@ #include #include +#include "configothertoolkits.h" class QTreeWidgetItem; class QSettings; @@ -43,14 +44,24 @@ class StyleConfig : public QWidget Q_OBJECT public: - explicit StyleConfig(LXQt::Settings *settings, QSettings *qtSettings, QWidget *parent = 0); + explicit StyleConfig(LXQt::Settings *settings, + QSettings *qtSettings, LXQt::Settings *configAppearanceSettings, + ConfigOtherToolKits *configOtherToolKits, QWidget *parent = 0); ~StyleConfig(); public slots: void initControls(); +signals: + void updateSettings(); + private slots: - void styleSelected(QTreeWidgetItem* item, int column); + void gtk2StyleSelected(const QString &themeName); + void gtk3StyleSelected(const QString &themeName); + void qtStyleSelected(const QString &themeName); + + void showAdvancedOptions(bool on); + void toolButtonStyleSelected(int index); void singleClickActivateToggled(bool toggled); @@ -58,6 +69,8 @@ private: Ui::StyleConfig *ui; QSettings *mQtSettings; LXQt::Settings *mSettings; + LXQt::Settings *mConfigAppearanceSettings; + ConfigOtherToolKits *mConfigOtherToolKits; }; #endif // STYLECONFIG_H --- a/lxqt-config-appearance/styleconfig.ui +++ b/lxqt-config-appearance/styleconfig.ui @@ -6,8 +6,8 @@ 0 0 - 490 - 363 + 609 + 344 @@ -24,38 +24,83 @@ - - + + - + 0 - 1 + 0 - + + + 16777215 + 16777215 + + + + Set GTK themes (GTK configuration files will be overwritten!) + + true - + false - - false - - - - 1 - - + + + + + + + + 0 + 0 + + + + GTK 3 Theme + + + + + + + + + + GTK 2 Theme + + + + + + + + + + To attempt uniform theming, either select similar style/theme +(if available) across all lists, or select 'gtk2' Qt style (if available) + to mimic GTK themes. + +Make sure 'xsettingsd' is installed to help GTK applications apply +themes on the fly. + + + + + + - + Toolbar button style: - + @@ -84,13 +129,23 @@ - + Activate item on single click + + + + + + + Qt Style + + +