summaryrefslogtreecommitdiffstats
path: root/kxkb/extension.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kxkb/extension.cpp')
-rw-r--r--kxkb/extension.cpp56
1 files changed, 48 insertions, 8 deletions
diff --git a/kxkb/extension.cpp b/kxkb/extension.cpp
index 1b6895043..df61e2fa2 100644
--- a/kxkb/extension.cpp
+++ b/kxkb/extension.cpp
@@ -15,6 +15,7 @@
#include <X11/Xlib.h>
#include <X11/XKBlib.h>
#include <X11/extensions/XKBfile.h>
+#include <X11/extensions/XKBrules.h>
#include <X11/extensions/XKBgeom.h>
#include <X11/extensions/XKM.h>
@@ -89,11 +90,17 @@ bool XKBExtension::setXkbOptions(const XkbOptions options)
TDEProcess p;
p << exe;
- p << "-layout";
- p << options.layouts;
-
- p << "-variant";
- p << options.variants;
+ if (!options.layouts.isEmpty())
+ {
+ p << "-layout";
+ p << options.layouts;
+ }
+
+ if (!options.variants.isEmpty())
+ {
+ p << "-variant";
+ p << options.variants;
+ }
if (!options.model.isEmpty()) {
p << "-model";
@@ -103,17 +110,50 @@ bool XKBExtension::setXkbOptions(const XkbOptions options)
if (options.resetOld) {
p << "-option";
}
+
if (!options.options.isEmpty()) {
- p << "-option" << options.options;
+ p << "-option";
+
+ if (options.resetOld)
+ {
+ p << options.options;
+ }
+ else
+ {
+ // Avoid duplication of options in Append mode
+ TQStringList srvOptions = TQStringList::split(",", XKBExtension::getServerOptions());
+ TQStringList kxkbOptions = TQStringList::split(",", options.options);
+ TQStringList newOptions;
+ for (TQStringList::Iterator it = kxkbOptions.begin(); it != kxkbOptions.end(); ++it)
+ {
+ TQString option(*it);
+ if (!srvOptions.contains(option))
+ {
+ newOptions << option;
+ }
+ }
+ p << newOptions.join(",");
+ }
}
- kdDebug() << "[kxkb-extension] Command: " << p.args() << endl;
+ kdDebug() << "[setXkbOptions] Command: " << p.args() << endl;
p.start(TDEProcess::Block);
return p.normalExit() && (p.exitStatus() == 0);
}
+TQString XKBExtension::getServerOptions()
+{
+ XkbRF_VarDefsRec vd;
+ if (XkbRF_GetNamesProp(tqt_xdisplay(), nullptr, &vd) && vd.options)
+ {
+ kdDebug() << "[kxkb-extension] Got server options " << vd.options << endl;
+ return TQString(vd.options);
+ }
+ return TQString::null;
+}
+
bool XKBExtension::setGroup(unsigned int group)
{
kdDebug() << "[kxkb-extension] Setting group " << group << endl;
@@ -136,4 +176,4 @@ void XKBExtension::processXEvent(XEvent *event) {
}
}
-#include "extension.moc" \ No newline at end of file
+#include "extension.moc"