~ubuntu-branches/ubuntu/oneiric/kdeplasma-addons/oneiric-updates

« back to all changes in this revision

Viewing changes to applets/plasmaboard/Helpers.cpp

  • Committer: Package Import Robot
  • Author(s): Scott Kitterman, Philip Muškovac
  • Date: 2011-12-08 22:07:41 UTC
  • mfrom: (0.7.12)
  • Revision ID: package-import@ubuntu.com-20111208220741-nrmjyqwqnyh4xpuj
Tags: 4:4.7.3-0ubuntu0.1
[ Philip Muškovac ]
New  upstream bugfix release (LP: #901975)

Show diffs side-by-side

added added

removed removed

Lines of Context:
20
20
 
21
21
 
22
22
#include <QChar>
 
23
#include <QHash>
23
24
#include <QMap>
24
25
#include <QString>
25
 
#include <QVarLengthArray>
 
26
#include <QVector>
26
27
#include <qx11info_x11.h>
27
28
#include <X11/Xlib.h>
28
29
#include <X11/extensions/XTest.h>
35
36
int keysymsPerKeycode;
36
37
 
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;
 
42
XkbStateRec xkbState;
 
43
bool xkbStateSetup = false;
 
44
 
39
45
/// Initialises the keysym-QChar map
40
 
void initialiseMap(QMap<unsigned int, QChar>& map);
 
46
void initialiseMap(QHash<unsigned int, QChar>& map);
41
47
 
42
48
void changeKeycodeMapping(unsigned int code, QString &sym)
43
49
{
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;
48
54
    }
49
55
 
50
 
    XChangeKeyboardMapping(QX11Info::display(), code, keysymsPerKeycode,
51
 
                           keysyms.data(), 1);
52
 
    XSync(QX11Info::display(), False);
 
56
    pendingKeycodeChanges.insert(code, keysyms);
53
57
}
54
58
 
55
 
void changeKeycodeMapping(unsigned int code, QString &sym,
56
 
                          QString &shiftedSym)
 
59
void changeKeycodeMapping(unsigned int code, QString &sym, QString &shiftedSym)
57
60
{
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;
62
65
    }
63
66
 
64
67
    keysyms[1] = XStringToKeysym(shiftedSym.toAscii());
65
 
    XChangeKeyboardMapping(QX11Info::display(), code, keysymsPerKeycode,
66
 
                           keysyms.data(), 1);
 
68
    pendingKeycodeChanges.insert(code, keysyms);
 
69
}
 
70
 
 
71
void flushPendingKeycodeMappingChanges()
 
72
{
 
73
    QVector<KeySym> keysyms;
 
74
 
 
75
    QMapIterator<unsigned int, QVector<KeySym> > it(pendingKeycodeChanges);
 
76
    unsigned int startingCode = 0;
 
77
    unsigned int lastCode = 0;
 
78
    int count = 0;
 
79
    while (it.hasNext()) {
 
80
        it.next();
 
81
        if (startingCode == 0) {
 
82
            startingCode = it.key();
 
83
        } else if (lastCode + 1 != it.key()) {
 
84
            XChangeKeyboardMapping(QX11Info::display(), startingCode, keysymsPerKeycode, keysyms.data(), count);
 
85
 
 
86
            keysyms.clear();
 
87
            startingCode = it.key();
 
88
            count = 0;
 
89
        }
 
90
 
 
91
        lastCode = it.key();
 
92
        keysyms += it.value();
 
93
        ++count;
 
94
    }
 
95
 
 
96
    pendingKeycodeChanges.clear();
 
97
    XChangeKeyboardMapping(QX11Info::display(), startingCode, keysymsPerKeycode, keysyms.data(), count);
67
98
    XSync(QX11Info::display(), False);
68
99
}
69
100
 
 
101
/*
70
102
void changeKeycodeMapping(unsigned int code, KeySym* keysyms)
71
103
{
72
104
    XChangeKeyboardMapping(QX11Info::display(), code, keysymsPerKeycode,
73
105
                           keysyms, 1);
74
106
    XSync(QX11Info::display(), False);
75
107
}
76
 
 
77
 
KeySym* getKeycodeMapping(unsigned int code)
78
 
{
79
 
    return XGetKeyboardMapping(QX11Info::display(), code, 1,
80
 
                               &keysymsPerKeycode);
 
108
*/
 
109
void saveKeycodeMapping(unsigned int code)
 
110
{
 
111
    KeySym *syms = XGetKeyboardMapping(QX11Info::display(), code, 1, &keysymsPerKeycode);
 
112
    QVector<KeySym> v(keysymsPerKeycode);
 
113
    for (int i = 0; i < keysymsPerKeycode; ++i) {
 
114
        v[i] = syms[i];
 
115
    }
 
116
    XFree(syms);
 
117
    savedMappings.insert(code, v);
 
118
}
 
119
 
 
120
void restoreKeycodeMapping(unsigned int code)
 
121
{
 
122
    if (savedMappings.contains(code)) {
 
123
        pendingKeycodeChanges.insert(code, savedMappings[code]);
 
124
    }
 
125
}
 
126
 
 
127
void refreshXkbState()
 
128
{
 
129
    XkbGetState(QX11Info::display(), XkbUseCoreKbd, &xkbState);
 
130
    xkbStateSetup = true;
81
131
}
82
132
 
83
133
unsigned int keycodeToKeysym(const unsigned int &code, int level)
84
134
{
85
135
#ifdef Q_WS_X11
86
 
    XkbStateRec xkbState;
87
 
    XkbGetState(QX11Info::display(), XkbUseCoreKbd, &xkbState);
 
136
    if (!xkbStateSetup) {
 
137
        refreshXkbState();
 
138
    }
 
139
 
88
140
    int vector = xkbState.group * 2 + level;
89
141
    return (unsigned int)XKeycodeToKeysym(QX11Info::display(), code, vector);
90
142
#else
132
184
 */
133
185
QChar mapToUnicode(const unsigned int &keysym)
134
186
{
135
 
    if (keysym < 0x100)
 
187
    if (keysym < 0x100) {
136
188
        return QChar(keysym);
137
 
    else if (keysym > 0x01000100)
 
189
    } else if (keysym > 0x01000100) {
138
190
        return QChar(keysym - 0x01000000);
139
 
    else {
 
191
    } else {
140
192
        if (symbolMap.isEmpty())
141
193
            initialiseMap(symbolMap);
142
194
        if (symbolMap.contains(keysym))
169
221
 *     # Put some order to ease manual lookup
170
222
 *    sort
171
223
 */
172
 
void initialiseMap(QMap<unsigned int, QChar>& map)
 
224
void initialiseMap(QHash<unsigned int, QChar>& map)
173
225
{
174
226
    map[0x01a1] = QChar(0x0104);
175
227
    map[0x01a2] = QChar(0x02D8);