35
36
int keysymsPerKeycode;
37
38
/// Contains the non-predictable keysyms and their corresponding QChar's
38
QMap<unsigned int, QChar> symbolMap;
39
QHash<unsigned int, QChar> symbolMap;
40
QHash<unsigned int, QVector<KeySym> > savedMappings;
41
QMap<unsigned int, QVector<KeySym> > pendingKeycodeChanges;
43
bool xkbStateSetup = false;
39
45
/// Initialises the keysym-QChar map
40
void initialiseMap(QMap<unsigned int, QChar>& map);
46
void initialiseMap(QHash<unsigned int, QChar>& map);
42
48
void changeKeycodeMapping(unsigned int code, QString &sym)
44
50
KeySym keysym = XStringToKeysym(sym.toAscii());
45
QVarLengthArray<KeySym> keysyms(keysymsPerKeycode);
51
QVector<KeySym> keysyms(keysymsPerKeycode);
46
52
for (int i = 0; i < keysymsPerKeycode; ++i) {
47
53
keysyms[i] = keysym;
50
XChangeKeyboardMapping(QX11Info::display(), code, keysymsPerKeycode,
52
XSync(QX11Info::display(), False);
56
pendingKeycodeChanges.insert(code, keysyms);
55
void changeKeycodeMapping(unsigned int code, QString &sym,
59
void changeKeycodeMapping(unsigned int code, QString &sym, QString &shiftedSym)
58
61
KeySym keysym = XStringToKeysym(sym.toAscii());
59
QVarLengthArray<KeySym> keysyms(keysymsPerKeycode);
62
QVector<KeySym> keysyms(keysymsPerKeycode);
60
63
for (int i = 0; i < keysymsPerKeycode; ++i) {
61
64
keysyms[i] = keysym;
64
67
keysyms[1] = XStringToKeysym(shiftedSym.toAscii());
65
XChangeKeyboardMapping(QX11Info::display(), code, keysymsPerKeycode,
68
pendingKeycodeChanges.insert(code, keysyms);
71
void flushPendingKeycodeMappingChanges()
73
QVector<KeySym> keysyms;
75
QMapIterator<unsigned int, QVector<KeySym> > it(pendingKeycodeChanges);
76
unsigned int startingCode = 0;
77
unsigned int lastCode = 0;
79
while (it.hasNext()) {
81
if (startingCode == 0) {
82
startingCode = it.key();
83
} else if (lastCode + 1 != it.key()) {
84
XChangeKeyboardMapping(QX11Info::display(), startingCode, keysymsPerKeycode, keysyms.data(), count);
87
startingCode = it.key();
92
keysyms += it.value();
96
pendingKeycodeChanges.clear();
97
XChangeKeyboardMapping(QX11Info::display(), startingCode, keysymsPerKeycode, keysyms.data(), count);
67
98
XSync(QX11Info::display(), False);
70
102
void changeKeycodeMapping(unsigned int code, KeySym* keysyms)
72
104
XChangeKeyboardMapping(QX11Info::display(), code, keysymsPerKeycode,
74
106
XSync(QX11Info::display(), False);
77
KeySym* getKeycodeMapping(unsigned int code)
79
return XGetKeyboardMapping(QX11Info::display(), code, 1,
109
void saveKeycodeMapping(unsigned int code)
111
KeySym *syms = XGetKeyboardMapping(QX11Info::display(), code, 1, &keysymsPerKeycode);
112
QVector<KeySym> v(keysymsPerKeycode);
113
for (int i = 0; i < keysymsPerKeycode; ++i) {
117
savedMappings.insert(code, v);
120
void restoreKeycodeMapping(unsigned int code)
122
if (savedMappings.contains(code)) {
123
pendingKeycodeChanges.insert(code, savedMappings[code]);
127
void refreshXkbState()
129
XkbGetState(QX11Info::display(), XkbUseCoreKbd, &xkbState);
130
xkbStateSetup = true;
83
133
unsigned int keycodeToKeysym(const unsigned int &code, int level)
87
XkbGetState(QX11Info::display(), XkbUseCoreKbd, &xkbState);
136
if (!xkbStateSetup) {
88
140
int vector = xkbState.group * 2 + level;
89
141
return (unsigned int)XKeycodeToKeysym(QX11Info::display(), code, vector);