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