From ae2282e219fa929077a3ebddf9aa79f8df023bff Mon Sep 17 00:00:00 2001 From: Simon Quigley Date: Mon, 30 Jul 2018 16:33:51 -0500 Subject: [PATCH] Add support for modifying GTK themes. --- debian/changelog | 1 + debian/patches/gtk-appearance-settings.patch | 853 +++++++++++++++++++ debian/patches/series | 1 + 3 files changed, 855 insertions(+) create mode 100644 debian/patches/gtk-appearance-settings.patch create mode 100644 debian/patches/series diff --git a/debian/changelog b/debian/changelog index ebc31bd..62296f6 100644 --- a/debian/changelog +++ b/debian/changelog @@ -2,6 +2,7 @@ lxqt-config (0.13.0-0ubuntu2) UNRELEASED; urgency=medium * Bump Standards-version to 4.1.5, no changes needed. * Change Uploaders to Ubuntu uploaders. + * Add support for modifying GTK themes. -- Simon Quigley Mon, 30 Jul 2018 16:21:58 -0500 diff --git a/debian/patches/gtk-appearance-settings.patch b/debian/patches/gtk-appearance-settings.patch new file mode 100644 index 0000000..f75324c --- /dev/null +++ b/debian/patches/gtk-appearance-settings.patch @@ -0,0 +1,853 @@ +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 ++ ++ ++ + + + diff --git a/debian/patches/series b/debian/patches/series new file mode 100644 index 0000000..be75ac7 --- /dev/null +++ b/debian/patches/series @@ -0,0 +1 @@ +gtk-appearance-settings.patch