xkblayout-state/XKeyboard.h

97 lines
2.7 KiB
C++

// xkeyboard.h
// Interface for a class to get keyboard layout information and change layouts
// Copyright (C) 2008 by Jay Bromley <jbromley@gmail.com>
//
// This program is free software; you can redistribute it and/or modify it
// under the terms of the GNU General Public License as published by the Free
// Software Foundation; either version 2 of the License, or (at your option)
// 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
#include <vector>
#include <string>
#include <iostream>
#include <X11/Xlib.h>
typedef std::vector<std::string> StringVector;
// XKeyboard -----------------------------------------------------------
class XKeyboard
{
public:
XKeyboard();
~XKeyboard();
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);
//friend std::ostream& operator<<(std::ostream& os, const XKeyboard& xkb);
private:
Bool initializeXkb();
std::string getSymbolNameByResNum(int groupResNum);
int groupNumResToXkb(int groupNumRes);
std::string getGroupNameByResNum(int groupResNum);
int groupLookup(int srcValue, StringVector fromText, StringVector toText, int count);
void accomodateGroupXkb();
Display* _display;
int _groupCount;
StringVector _groupNames;
StringVector _symbolNames;
StringVector _variantNames;
int _currentGroupNum;
int _deviceId;
int _baseEventCode;
int _baseErrorCode;
};
// XkbSymbolParser -----------------------------------------------------
class XkbSymbolParser
{
public:
typedef std::vector<std::string>::iterator StringVectorIter;
XkbSymbolParser();
~XkbSymbolParser();
void parse(const std::string& symbols, std::vector<std::string>& symbolList,
std::vector<std::string>& variantList);
private:
bool isXkbLayoutSymbol(const std::string& symbol);
StringVector _nonSymbols;
};
// Helper functions ----------------------------------------------------
int compareNoCase(const std::string& s1, const std::string& s2);
// std::ostream& operator<<(std::ostream& os, const XKeyboard& xkb);
// std::ostream& operator<<(std::ostream& os, const StringVector& v);
#endif // XKEYBOARD_H_1C79861A_49B3_4A95_88D6_455C22FEB222
// Local Variables:
// mode: c++
// End: