diff options
Diffstat (limited to 'kxkb/kxkbconfig.cpp')
-rw-r--r-- | kxkb/kxkbconfig.cpp | 97 |
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; } |