Changeset View
Changeset View
Standalone View
Standalone View
kded/configeditor.cpp
Show All 29 Lines | |||||
30 | #include <string> | 30 | #include <string> | ||
31 | #include <csignal> | 31 | #include <csignal> | ||
32 | #include <cstdio> | 32 | #include <cstdio> | ||
33 | 33 | | |||
34 | #include <gio/gio.h> | 34 | #include <gio/gio.h> | ||
35 | 35 | | |||
36 | #include "configeditor.h" | 36 | #include "configeditor.h" | ||
37 | 37 | | |||
38 | static void replaceValueInGtkrcContents(QString >krcContents, const QString ¶mName, const QString ¶mValue); | | |||
39 | static void replaceValueInXSettingsdContents(QString &xSettingsdContents, const QString ¶mName, const QString ¶mValue); | | |||
40 | | ||||
41 | static void reloadGtk2Apps(); | | |||
42 | static void reloadXSettingsd(); | | |||
43 | | ||||
44 | static QString readFileContents(QFile >krc); | | |||
45 | static pid_t pidOfXSettingsd(); | | |||
46 | | ||||
47 | | ||||
48 | void ConfigEditor::setGtk3ConfigValueDconf(const QString ¶mName, const QString ¶mValue, const QString &category) | 38 | void ConfigEditor::setGtk3ConfigValueDconf(const QString ¶mName, const QString ¶mValue, const QString &category) | ||
49 | { | 39 | { | ||
50 | g_autoptr(GSettings) gsettings = g_settings_new(category.toUtf8().constData()); | 40 | g_autoptr(GSettings) gsettings = g_settings_new(category.toUtf8().constData()); | ||
51 | g_settings_set_string(gsettings, paramName.toUtf8().constData(), paramValue.toUtf8().constData()); | 41 | g_settings_set_string(gsettings, paramName.toUtf8().constData(), paramValue.toUtf8().constData()); | ||
52 | } | 42 | } | ||
53 | 43 | | |||
54 | void ConfigEditor::setGtk3ConfigValueSettingsIni(const QString ¶mName, const QString ¶mValue) | 44 | void ConfigEditor::setGtk3ConfigValueSettingsIni(const QString ¶mName, const QString ¶mValue) | ||
55 | { | 45 | { | ||
Show All 35 Lines | 78 | { | |||
91 | QString gtkrcContents = readFileContents(gtkrc); | 81 | QString gtkrcContents = readFileContents(gtkrc); | ||
92 | replaceValueInGtkrcContents(gtkrcContents, paramName, paramValue); | 82 | replaceValueInGtkrcContents(gtkrcContents, paramName, paramValue); | ||
93 | gtkrc.remove(); | 83 | gtkrc.remove(); | ||
94 | gtkrc.open(QIODevice::WriteOnly | QIODevice::Text); | 84 | gtkrc.open(QIODevice::WriteOnly | QIODevice::Text); | ||
95 | gtkrc.write(gtkrcContents.toUtf8()); | 85 | gtkrc.write(gtkrcContents.toUtf8()); | ||
96 | reloadGtk2Apps(); | 86 | reloadGtk2Apps(); | ||
97 | } | 87 | } | ||
98 | 88 | | |||
99 | static QString readFileContents(QFile &file) | 89 | QString ConfigEditor::gtk2ConfigValue(const QString& paramName) | ||
90 | { | ||||
91 | QString gtkrcPath = QDir::homePath() + QStringLiteral("/.gtkrc-2.0"); | ||||
92 | QFile gtkrc(gtkrcPath); | ||||
93 | if (gtkrc.open(QIODevice::ReadWrite | QIODevice::Text)) { | ||||
94 | const QRegularExpression regExp(paramName + QStringLiteral("=[^\n]*($|\n)")); | ||||
95 | while (!gtkrc.atEnd()) { | ||||
96 | QString line = gtkrc.readLine(); | ||||
97 | if (line.contains(regExp)) { | ||||
98 | return line.split('"')[1]; | ||||
99 | } | ||||
100 | } | ||||
101 | } | ||||
102 | | ||||
103 | return QStringLiteral("Breeze"); | ||||
104 | } | ||||
105 | | ||||
106 | QString ConfigEditor::gtk3ConfigValueSettingsIni(const QString& paramName) | ||||
107 | { | ||||
108 | QString configLocation = QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation); | ||||
109 | QString gtk3ConfigPath = configLocation + QStringLiteral("/gtk-3.0/settings.ini"); | ||||
110 | | ||||
111 | KSharedConfig::Ptr gtk3Config = KSharedConfig::openConfig(gtk3ConfigPath, KConfig::NoGlobals); | ||||
112 | KConfigGroup group = gtk3Config->group(QStringLiteral("Settings")); | ||||
113 | | ||||
114 | return group.readEntry(paramName, QStringLiteral("Breeze")); | ||||
115 | } | ||||
116 | | ||||
117 | | ||||
118 | void ConfigEditor::removeLegacyGtk2Strings() | ||||
119 | { | ||||
120 | QString gtkrcPath = QDir::homePath() + QStringLiteral("/.gtkrc-2.0"); | ||||
121 | QFile gtkrc(gtkrcPath); | ||||
122 | QString gtkrcContents = readFileContents(gtkrc); | ||||
123 | | ||||
124 | // Remove "include" lines | ||||
125 | // Example: | ||||
126 | // include "/usr/share/themes/Adwaita-dark/gtk-2.0/gtkrc" | ||||
127 | static const QRegularExpression includeRegExp(QStringLiteral("include .*\n")); | ||||
128 | gtkrcContents.remove(includeRegExp); | ||||
129 | | ||||
130 | // Remove redundant font config lines | ||||
131 | // Example: | ||||
132 | // style "user-font" | ||||
133 | // { | ||||
134 | // font_name="Noto Sans Regular" | ||||
135 | // } | ||||
136 | // widget_class "*" style "user-font" | ||||
137 | static const QRegularExpression userFontStyleRegexp(QStringLiteral("style(.|\n)*{(.|\n)*}\nwidget_class.*\"user-font\"")); | ||||
138 | gtkrcContents.remove(userFontStyleRegexp); | ||||
139 | | ||||
140 | gtkrc.remove(); | ||||
141 | gtkrc.open(QIODevice::WriteOnly | QIODevice::Text); | ||||
142 | gtkrc.write(gtkrcContents.toUtf8()); | ||||
143 | reloadGtk2Apps(); | ||||
144 | } | ||||
145 | | ||||
146 | QString ConfigEditor::readFileContents(QFile &file) | ||||
100 | { | 147 | { | ||
101 | if (file.open(QIODevice::ReadWrite | QIODevice::Text)) { | 148 | if (file.open(QIODevice::ReadWrite | QIODevice::Text)) { | ||
102 | return file.readAll(); | 149 | return file.readAll(); | ||
103 | } else { | 150 | } else { | ||
104 | return QString(); | 151 | return QString(); | ||
105 | } | 152 | } | ||
106 | } | 153 | } | ||
107 | 154 | | |||
108 | static void replaceValueInGtkrcContents(QString >krcContents, const QString ¶mName, const QString ¶mValue) | 155 | void ConfigEditor::replaceValueInGtkrcContents(QString >krcContents, const QString ¶mName, const QString ¶mValue) | ||
109 | { | 156 | { | ||
110 | const QRegularExpression regExp(paramName + QStringLiteral("=[^\n]*($|\n)")); | 157 | const QRegularExpression regExp(paramName + QStringLiteral("=[^\n]*($|\n)")); | ||
111 | 158 | | |||
112 | static const QStringList nonStringProperties{ | 159 | static const QStringList nonStringProperties{ | ||
113 | QStringLiteral("gtk-toolbar-style"), | 160 | QStringLiteral("gtk-toolbar-style"), | ||
114 | QStringLiteral("gtk-menu-images"), | 161 | QStringLiteral("gtk-menu-images"), | ||
115 | QStringLiteral("gtk-button-images"), | 162 | QStringLiteral("gtk-button-images"), | ||
116 | QStringLiteral("gtk-primary-button-warps-slider"), | 163 | QStringLiteral("gtk-primary-button-warps-slider"), | ||
117 | }; | 164 | }; | ||
118 | 165 | | |||
119 | QString newConfigString; | 166 | QString newConfigString; | ||
120 | if (nonStringProperties.contains(paramName)) { | 167 | if (nonStringProperties.contains(paramName)) { | ||
121 | newConfigString = paramName + QStringLiteral("=") + paramValue + QStringLiteral("\n"); | 168 | newConfigString = paramName + QStringLiteral("=") + paramValue + QStringLiteral("\n"); | ||
122 | } else { | 169 | } else { | ||
123 | newConfigString = paramName + QStringLiteral("=\"") + paramValue + QStringLiteral("\"\n"); | 170 | newConfigString = paramName + QStringLiteral("=\"") + paramValue + QStringLiteral("\"\n"); | ||
124 | } | 171 | } | ||
125 | 172 | | |||
126 | if (gtkrcContents.contains(regExp)) { | 173 | if (gtkrcContents.contains(regExp)) { | ||
127 | gtkrcContents.replace(regExp, newConfigString); | 174 | gtkrcContents.replace(regExp, newConfigString); | ||
128 | } else { | 175 | } else { | ||
129 | gtkrcContents = newConfigString + QStringLiteral("\n") + gtkrcContents; | 176 | gtkrcContents = newConfigString + QStringLiteral("\n") + gtkrcContents; | ||
130 | } | 177 | } | ||
131 | } | 178 | } | ||
132 | 179 | | |||
133 | static void replaceValueInXSettingsdContents(QString &xSettingsdContents, const QString ¶mName, const QString ¶mValue) | 180 | void ConfigEditor::replaceValueInXSettingsdContents(QString &xSettingsdContents, const QString ¶mName, const QString ¶mValue) | ||
134 | { | 181 | { | ||
135 | const QRegularExpression regExp(paramName + QStringLiteral(" [^\n]*($|\n)")); | 182 | const QRegularExpression regExp(paramName + QStringLiteral(" [^\n]*($|\n)")); | ||
136 | 183 | | |||
137 | static const QStringList nonStringProperties{ | 184 | static const QStringList nonStringProperties{ | ||
138 | QStringLiteral("Gtk/ButtonImages"), | 185 | QStringLiteral("Gtk/ButtonImages"), | ||
139 | QStringLiteral("Gtk/MenuImages"), | 186 | QStringLiteral("Gtk/MenuImages"), | ||
140 | QStringLiteral("Gtk/ToolbarStyle"), | 187 | QStringLiteral("Gtk/ToolbarStyle"), | ||
141 | QStringLiteral("Gtk/PrimaryButtonWarpsSlider"), | 188 | QStringLiteral("Gtk/PrimaryButtonWarpsSlider"), | ||
142 | }; | 189 | }; | ||
143 | 190 | | |||
144 | QString newConfigString; | 191 | QString newConfigString; | ||
145 | if (nonStringProperties.contains(paramName)) { | 192 | if (nonStringProperties.contains(paramName)) { | ||
146 | newConfigString = paramName + QStringLiteral(" ") + paramValue + QStringLiteral("\n"); | 193 | newConfigString = paramName + QStringLiteral(" ") + paramValue + QStringLiteral("\n"); | ||
147 | } else { | 194 | } else { | ||
148 | newConfigString = paramName + QStringLiteral(" \"") + paramValue + QStringLiteral("\"\n"); | 195 | newConfigString = paramName + QStringLiteral(" \"") + paramValue + QStringLiteral("\"\n"); | ||
149 | } | 196 | } | ||
150 | 197 | | |||
151 | if (xSettingsdContents.contains(regExp)) { | 198 | if (xSettingsdContents.contains(regExp)) { | ||
152 | xSettingsdContents.replace(regExp, newConfigString); | 199 | xSettingsdContents.replace(regExp, newConfigString); | ||
153 | } else { | 200 | } else { | ||
154 | xSettingsdContents = newConfigString + QStringLiteral("\n") + xSettingsdContents; | 201 | xSettingsdContents = newConfigString + QStringLiteral("\n") + xSettingsdContents; | ||
155 | } | 202 | } | ||
156 | } | 203 | } | ||
157 | 204 | | |||
158 | static void reloadGtk2Apps() | 205 | void ConfigEditor::reloadGtk2Apps() | ||
159 | { | 206 | { | ||
160 | QProcess::startDetached(QStandardPaths::findExecutable(QStringLiteral("reload_gtk_apps"))); | 207 | QProcess::startDetached(QStandardPaths::findExecutable(QStringLiteral("reload_gtk_apps"))); | ||
161 | } | 208 | } | ||
162 | 209 | | |||
163 | static void reloadXSettingsd() | 210 | pid_t ConfigEditor::pidOfXSettingsd() | ||
211 | { | ||||
212 | QProcess pidof; | ||||
213 | pidof.start(QStringLiteral("pidof"), QStringList() << QStringLiteral("-s") << QStringLiteral("xsettingsd")); | ||||
214 | pidof.waitForFinished(); | ||||
215 | QString xsettingsdPid = QString(pidof.readAllStandardOutput()).remove('\n'); | ||||
216 | return xsettingsdPid.toInt(); | ||||
217 | } | ||||
218 | | ||||
219 | void ConfigEditor::reloadXSettingsd() | ||||
164 | { | 220 | { | ||
165 | pid_t xSettingsdPid = pidOfXSettingsd(); | 221 | pid_t xSettingsdPid = pidOfXSettingsd(); | ||
166 | if (xSettingsdPid == 0) { | 222 | if (xSettingsdPid == 0) { | ||
167 | QProcess::startDetached(QStandardPaths::findExecutable(QStringLiteral("xsettingsd"))); | 223 | QProcess::startDetached(QStandardPaths::findExecutable(QStringLiteral("xsettingsd"))); | ||
168 | } else { | 224 | } else { | ||
169 | kill(xSettingsdPid, SIGHUP); | 225 | kill(xSettingsdPid, SIGHUP); | ||
170 | } | 226 | } | ||
171 | } | 227 | } | ||
172 | | ||||
173 | static pid_t pidOfXSettingsd() | | |||
174 | { | | |||
175 | QProcess pidof; | | |||
176 | pidof.start(QStringLiteral("pidof"), QStringList() << QStringLiteral("-s") << QStringLiteral("xsettingsd")); | | |||
177 | pidof.waitForFinished(); | | |||
178 | QString xsettingsdPid = QString(pidof.readAllStandardOutput()).remove('\n'); | | |||
179 | return xsettingsdPid.toInt(); | | |||
180 | } | |