summaryrefslogtreecommitdiffstats
path: root/kxkb/kxkbconfig.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kxkb/kxkbconfig.cpp')
-rw-r--r--kxkb/kxkbconfig.cpp97
1 files changed, 94 insertions, 3 deletions
diff --git a/kxkb/kxkbconfig.cpp b/kxkb/kxkbconfig.cpp
index 166dab174..4083a8a5c 100644
--- a/kxkb/kxkbconfig.cpp
+++ b/kxkb/kxkbconfig.cpp
@@ -33,9 +33,12 @@ const char* DEFAULT_MODEL = "pc104";
void KxkbConfig::load(int loadMode)
{
// INITIAL OPTIONS (loaded regardless of whether KXkb is enabled)
+
TDEConfig *config = new TDEConfig("kxkbrc", true, false);
config->setGroup("Layout");
+ m_tainted = TAINTED_NONE;
+
m_useKxkb = config->readBoolEntry("Use", false);
m_resetOldOptions = config->readBoolEntry("ResetOldOptions", true);
@@ -46,7 +49,8 @@ void KxkbConfig::load(int loadMode)
return;
}
- // ALL OTHER OPTIONS (loaded only when KXkb is enabled)
+ // BASIC OPTIONS (passed to setxkbmap, can be tainted)
+
m_model = config->readEntry("Model", DEFAULT_MODEL);
// Layouts
@@ -93,6 +97,13 @@ void KxkbConfig::load(int loadMode)
}
}
+ if (loadMode == LOAD_BASIC_OPTIONS)
+ {
+ return;
+ }
+
+ // ALL OTHER OPTIONS (of interest only to KXkb itself)
+
// Tray indicator
m_showSingle = config->readBoolEntry("ShowSingle", false);
@@ -169,6 +180,8 @@ void KxkbConfig::load(int loadMode)
void KxkbConfig::save()
{
+ m_tainted = TAINTED_NONE;
+
TDEConfig *config = new TDEConfig("kxkbrc", false, false);
config->setGroup("Layout");
@@ -245,6 +258,8 @@ void KxkbConfig::save()
void KxkbConfig::setDefaults()
{
+ m_tainted = TAINTED_NONE;
+
m_model = DEFAULT_MODEL;
m_resetOldOptions = true;
@@ -267,6 +282,77 @@ void KxkbConfig::setDefaults()
m_stickySwitchingDepth = 2;
}
+bool KxkbConfig::setFromXkbOptions(XkbOptions options)
+{
+ XkbOptions curOptions = getKXkbOptions();
+ uint tainted = TAINTED_NONE;
+
+ // We need to fix the variants string if it is empty, otherwise the
+ // comparison below will often wrongly assume that the variants have
+ // changed
+ if (options.variants.isEmpty())
+ {
+ options.variants = ""; // ensure the string is empty but not null
+ for (int i = 0; i < options.layouts.contains(","); ++i)
+ {
+ options.variants += ",";
+ }
+ }
+
+ // Check if keyboard layout options have changed
+ if ((options.model != curOptions.model && !options.model.isNull())
+ || (options.layouts != curOptions.layouts)
+ || (options.variants != curOptions.variants))
+ {
+ tainted |= TAINTED_LAYOUTS;
+ kdWarning() << "Keyboard layouts modified by external application!" << endl;
+
+ m_model = options.model;
+
+ m_layouts.clear();
+
+ TQStringList layouts = TQStringList::split(",", options.layouts, true);
+ TQStringList variants = TQStringList::split(",", options.variants, true);
+ TQStringList::Iterator lit = layouts.begin();
+ TQStringList::Iterator vit = variants.begin();
+
+ if (layouts.empty())
+ {
+ layouts << "us";
+ }
+
+ while (lit != layouts.end())
+ {
+ TQString layout = *lit;
+ TQString variant = vit != variants.end() ? *vit : TQString::null;
+ m_layouts.append(LayoutUnit(layout, variant));
+
+ ++lit;
+ if (vit != variants.end())
+ {
+ ++vit;
+ }
+ }
+ }
+
+ // Check if Xkb options have changed
+ if (options.options != curOptions.options)
+ {
+ tainted |= TAINTED_XKB_OPTS;
+ kdWarning() << "Xkb options modified by external application!" << endl;
+ m_options = options.options;
+ }
+
+ if (tainted != TAINTED_NONE)
+ {
+ kdDebug() << "Loaded tainted config with " << m_layouts.count()
+ << " layouts" << endl;
+ m_tainted = tainted;
+ }
+
+ return (tainted != TAINTED_NONE);
+}
+
TQStringList KxkbConfig::getLayoutStringList(/*bool compact*/)
{
TQStringList layoutList;
@@ -323,10 +409,15 @@ const XkbOptions KxkbConfig::getKXkbOptions() {
}
options.layouts = layouts.join(",");
options.variants = variants.join(",");
- options.model = m_model;
options.options = m_options;
- kdDebug() << "[getKXkbOptions] options: " << m_options << endl;
options.resetOld = m_resetOldOptions;
+ options.model = m_model;
+
+ if (options.model.isEmpty())
+ {
+ options.model = DEFAULT_MODEL;
+ }
+
return options;
}