diff --git a/XKeyboard.cpp b/XKeyboard.cpp index ea8f625..c514980 100644 --- a/XKeyboard.cpp +++ b/XKeyboard.cpp @@ -8,6 +8,8 @@ // any later version. // // $Id: XKeyboard.cpp 53 2008-07-18 08:38:47Z jay $ +// +// 2010-01-02 Kristian Setälä added code to retrieve layout variant information #include "XKeyboard.h" #include "X11Exception.h" @@ -70,7 +72,7 @@ Bool XKeyboard::initializeXkb() int major = XkbMajorVersion; int minor = XkbMinorVersion; int opCode; - Bool status = XkbQueryExtension(_display, &opCode, &_baseEventCode, &_baseErrorCode, &major, &minor); + /*Bool status =*/ XkbQueryExtension(_display, &opCode, &_baseEventCode, &_baseErrorCode, &major, &minor); XkbDescRec* kbdDescPtr = XkbAllocKeyboard(); if (kbdDescPtr == NULL) { @@ -145,7 +147,7 @@ Bool XKeyboard::initializeXkb() } XkbSymbolParser symParser; - symParser.parse(symName, _symbolNames); + symParser.parse(symName, _symbolNames, _variantNames); int count = _symbolNames.size(); if (count == 1 && _groupNames[0].empty() && _symbolNames[0] == "jp") { _groupCount = 2; @@ -245,6 +247,11 @@ StringVector XKeyboard::groupSymbols() const return _symbolNames; } +StringVector XKeyboard::groupVariants() const +{ + return _variantNames; +} + int XKeyboard::currentGroupNum() const { XkbStateRec xkbState; @@ -262,6 +269,11 @@ std::string XKeyboard::currentGroupSymbol() const return _symbolNames[currentGroupNum()]; } +std::string XKeyboard::currentGroupVariant() const +{ + return _variantNames[currentGroupNum()]; +} + bool XKeyboard::setGroupByNum(int groupNum) { if (_groupCount <= 1) { @@ -302,30 +314,48 @@ XkbSymbolParser::~XkbSymbolParser() _nonSymbols.clear(); } -void XkbSymbolParser::parse(const std::string& symbols, StringVector& symbolList) +void XkbSymbolParser::parse(const std::string& symbols, StringVector& symbolList, + StringVector& variantList) { bool inSymbol = false; std::string curSymbol; + std::string curVariant; - for (int i = 0; i < symbols.size(); i++) { + //std::cout << symbols << std::endl; + // A sample line: + // pc+fi(dvorak)+fi:2+ru:3+inet(evdev)+group(menu_toggle) + + for (size_t i = 0; i < symbols.size(); i++) { char ch = symbols[i]; if (ch == '+') { if (inSymbol) { if (isXkbLayoutSymbol(curSymbol)) { symbolList.push_back(curSymbol); + variantList.push_back(curVariant); } curSymbol.clear(); + curVariant.clear(); } else { inSymbol = true; } } else if (inSymbol && (isalpha(static_cast(ch)) || ch == '_')) { curSymbol.append(1, ch); + } else if (inSymbol && ch == '(') { + while (++i < symbols.size()) { + ch = symbols[i]; + if (ch == ')') + break; + else + curVariant.append(1, ch); + } } else { if (inSymbol) { if (isXkbLayoutSymbol(curSymbol)) { symbolList.push_back(curSymbol); + variantList.push_back(curVariant); } curSymbol.clear(); + curVariant.clear(); inSymbol = false; } } @@ -333,6 +363,7 @@ void XkbSymbolParser::parse(const std::string& symbols, StringVector& symbolList if (inSymbol && !curSymbol.empty() && isXkbLayoutSymbol(curSymbol)) { symbolList.push_back(curSymbol); + variantList.push_back(curVariant); } } diff --git a/XKeyboard.h b/XKeyboard.h index 9509a37..3c7e728 100644 --- a/XKeyboard.h +++ b/XKeyboard.h @@ -8,6 +8,8 @@ // any later version. // // $Id: XKeyboard.h 29 2008-04-09 21:37:44Z jay $ +// +// 2010-01-02 Kristian Setälä added code to retrieve layout variant information #ifndef XKEYBOARD_H_1C79861A_49B3_4A95_88D6_455C22FEB222 #define XKEYBOARD_H_1C79861A_49B3_4A95_88D6_455C22FEB222 @@ -31,9 +33,11 @@ public: int groupCount() const; StringVector groupNames() const; StringVector groupSymbols() const; + StringVector groupVariants() const; int currentGroupNum() const; std::string currentGroupName() const; std::string currentGroupSymbol() const; + std::string currentGroupVariant() const; bool setGroupByNum(int groupNum); bool changeGroup(int increment); @@ -51,6 +55,7 @@ private: int _groupCount; StringVector _groupNames; StringVector _symbolNames; + StringVector _variantNames; int _currentGroupNum; int _deviceId; @@ -68,7 +73,8 @@ public: XkbSymbolParser(); ~XkbSymbolParser(); - void parse(const std::string& symbols, std::vector& symbolList); + void parse(const std::string& symbols, std::vector& symbolList, + std::vector& variantList); private: bool isXkbLayoutSymbol(const std::string& symbol);