diff options
Diffstat (limited to 'kxkb/kxkbconfig.cpp')
-rw-r--r-- | kxkb/kxkbconfig.cpp | 88 |
1 files changed, 85 insertions, 3 deletions
diff --git a/kxkb/kxkbconfig.cpp b/kxkb/kxkbconfig.cpp index 166dab174..5409f8270 100644 --- a/kxkb/kxkbconfig.cpp +++ b/kxkb/kxkbconfig.cpp @@ -33,6 +33,7 @@ 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"); @@ -46,7 +47,8 @@ void KxkbConfig::load(int loadMode) return; } - // ALL OTHER OPTIONS (loaded only when KXkb is enabled) + // BASIC OPTIONS (passed to setxkbmap) + m_model = config->readEntry("Model", DEFAULT_MODEL); // Layouts @@ -93,6 +95,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); @@ -267,6 +276,74 @@ void KxkbConfig::setDefaults() m_stickySwitchingDepth = 2; } +bool KxkbConfig::setFromXkbOptions(XkbOptions options) +{ + XkbOptions curOptions = getKXkbOptions(); + + bool modified = false; + + // 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())) + { + modified = true; + m_model = options.model; + } + + if ((options.layouts != curOptions.layouts) || (options.variants != curOptions.variants)) + { + modified = true; + 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; + } + } + } + + TQStringList serverOpts = TQStringList::split(",", options.options); + TQStringList kxkbOpts = TQStringList::split(",", curOptions.options); + serverOpts.sort(); + kxkbOpts.sort(); + + if (serverOpts != kxkbOpts) + { + modified = true; + m_options = options.options; + } + + return modified; +} + TQStringList KxkbConfig::getLayoutStringList(/*bool compact*/) { TQStringList layoutList; @@ -323,10 +400,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; } |