Changeset View
Changeset View
Standalone View
Standalone View
krfb/events.cpp
- This file was copied to events/x11/x11events.cpp.
Show All 18 Lines | 1 | /* | |||
---|---|---|---|---|---|
19 | You should have received a copy of the GNU General Public License | 19 | You should have received a copy of the GNU General Public License | ||
20 | along with this program; see the file COPYING. If not, write to | 20 | along with this program; see the file COPYING. If not, write to | ||
21 | the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, | 21 | the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, | ||
22 | Boston, MA 02110-1301, USA. | 22 | Boston, MA 02110-1301, USA. | ||
23 | */ | 23 | */ | ||
24 | 24 | | |||
25 | #include "events.h" | 25 | #include "events.h" | ||
26 | 26 | | |||
27 | #include <QApplication> | 27 | EventHandler::EventHandler(QObject *parent) | ||
28 | #include <QX11Info> | 28 | : QObject(parent) | ||
29 | #include <QDesktopWidget> | | |||
30 | #include <QGlobalStatic> | | |||
31 | | ||||
32 | #include <X11/Xutil.h> | | |||
33 | #include <X11/keysym.h> | | |||
34 | #include <X11/extensions/XTest.h> | | |||
35 | | ||||
36 | enum { | | |||
37 | LEFTSHIFT = 1, | | |||
38 | RIGHTSHIFT = 2, | | |||
39 | ALTGR = 4 | | |||
40 | }; | | |||
41 | | ||||
42 | class EventData | | |||
43 | { | | |||
44 | public: | | |||
45 | EventData(); | | |||
46 | | ||||
47 | //keyboard | | |||
48 | Display *dpy; | | |||
49 | signed char modifiers[0x100]; | | |||
50 | KeyCode keycodes[0x100]; | | |||
51 | KeyCode leftShiftCode; | | |||
52 | KeyCode rightShiftCode; | | |||
53 | KeyCode altGrCode; | | |||
54 | char modifierState; | | |||
55 | | ||||
56 | //mouse | | |||
57 | int buttonMask; | | |||
58 | | ||||
59 | private: | | |||
60 | void init(); | | |||
61 | }; | | |||
62 | | ||||
63 | Q_GLOBAL_STATIC(EventData, data) | | |||
64 | | ||||
65 | EventData::EventData() | | |||
66 | { | | |||
67 | init(); | | |||
68 | } | | |||
69 | | ||||
70 | void EventData::init() | | |||
71 | { | | |||
72 | dpy = QX11Info::display(); | | |||
73 | buttonMask = 0; | | |||
74 | | ||||
75 | //initialize keycodes | | |||
76 | KeySym key, *keymap; | | |||
77 | int i, j, minkey, maxkey, syms_per_keycode; | | |||
78 | | ||||
79 | memset(modifiers, -1, sizeof(modifiers)); | | |||
80 | | ||||
81 | XDisplayKeycodes(dpy, &minkey, &maxkey); | | |||
82 | Q_ASSERT(minkey >= 8); | | |||
83 | Q_ASSERT(maxkey < 256); | | |||
84 | keymap = (KeySym *) XGetKeyboardMapping(dpy, minkey, | | |||
85 | (maxkey - minkey + 1), | | |||
86 | &syms_per_keycode); | | |||
87 | Q_ASSERT(keymap); | | |||
88 | | ||||
89 | for (i = minkey; i <= maxkey; i++) { | | |||
90 | for (j = 0; j < syms_per_keycode; j++) { | | |||
91 | key = keymap[(i-minkey)*syms_per_keycode+j]; | | |||
92 | | ||||
93 | if (key >= ' ' && key < 0x100 && i == XKeysymToKeycode(dpy, key)) { | | |||
94 | keycodes[key] = i; | | |||
95 | modifiers[key] = j; | | |||
96 | } | | |||
97 | } | | |||
98 | } | | |||
99 | | ||||
100 | leftShiftCode = XKeysymToKeycode(dpy, XK_Shift_L); | | |||
101 | rightShiftCode = XKeysymToKeycode(dpy, XK_Shift_R); | | |||
102 | altGrCode = XKeysymToKeycode(dpy, XK_Mode_switch); | | |||
103 | | ||||
104 | XFree((char *)keymap); | | |||
105 | } | | |||
106 | | ||||
107 | /* this function adjusts the modifiers according to mod (as from modifiers) and data->modifierState */ | | |||
108 | static void tweakModifiers(signed char mod, bool down) | | |||
109 | { | 29 | { | ||
110 | bool isShift = data->modifierState & (LEFTSHIFT | RIGHTSHIFT); | | |||
111 | | ||||
112 | if (mod < 0) { | | |||
113 | return; | | |||
114 | } | | |||
115 | | ||||
116 | if (isShift && mod != 1) { | | |||
117 | if (data->modifierState & LEFTSHIFT) { | | |||
118 | XTestFakeKeyEvent(data->dpy, data->leftShiftCode, | | |||
119 | down, CurrentTime); | | |||
120 | } | | |||
121 | | ||||
122 | if (data->modifierState & RIGHTSHIFT) { | | |||
123 | XTestFakeKeyEvent(data->dpy, data->rightShiftCode, | | |||
124 | down, CurrentTime); | | |||
125 | } | | |||
126 | } | | |||
127 | | ||||
128 | if (!isShift && mod == 1) { | | |||
129 | XTestFakeKeyEvent(data->dpy, data->leftShiftCode, | | |||
130 | down, CurrentTime); | | |||
131 | } | | |||
132 | | ||||
133 | if ((data->modifierState & ALTGR) && mod != 2) { | | |||
134 | XTestFakeKeyEvent(data->dpy, data->altGrCode, | | |||
135 | !down, CurrentTime); | | |||
136 | } | | |||
137 | | ||||
138 | if (!(data->modifierState & ALTGR) && mod == 2) { | | |||
139 | XTestFakeKeyEvent(data->dpy, data->altGrCode, | | |||
140 | down, CurrentTime); | | |||
141 | } | | |||
142 | } | 30 | } | ||
143 | 31 | | |||
144 | void EventHandler::handleKeyboard(bool down, rfbKeySym keySym) | 32 | void EventHandler::setFrameBufferPlugin(const QSharedPointer<FrameBuffer> &frameBuffer) | ||
145 | { | 33 | { | ||
146 | #define ADJUSTMOD(sym,state) \ | 34 | fb = frameBuffer; | ||
147 | if(keySym==sym) { if(down) data->modifierState|=state; else data->modifierState&=~state; } | | |||
148 | | ||||
149 | ADJUSTMOD(XK_Shift_L, LEFTSHIFT); | | |||
150 | ADJUSTMOD(XK_Shift_R, RIGHTSHIFT); | | |||
151 | ADJUSTMOD(XK_Mode_switch, ALTGR); | | |||
152 | | ||||
153 | if (keySym >= ' ' && keySym < 0x100) { | | |||
154 | KeyCode k; | | |||
155 | | ||||
156 | if (down) { | | |||
157 | tweakModifiers(data->modifiers[keySym], True); | | |||
158 | } | | |||
159 | | ||||
160 | k = data->keycodes[keySym]; | | |||
161 | | ||||
162 | if (k != NoSymbol) { | | |||
163 | XTestFakeKeyEvent(data->dpy, k, down, CurrentTime); | | |||
164 | } | 35 | } | ||
165 | 36 | | |||
166 | if (down) { | 37 | QSharedPointer<FrameBuffer> EventHandler::frameBuffer() | ||
167 | tweakModifiers(data->modifiers[keySym], False); | | |||
168 | } | | |||
169 | } else { | | |||
170 | KeyCode k = XKeysymToKeycode(data->dpy, keySym); | | |||
171 | | ||||
172 | if (k != NoSymbol) { | | |||
173 | XTestFakeKeyEvent(data->dpy, k, down, CurrentTime); | | |||
174 | } | | |||
175 | } | | |||
176 | } | | |||
177 | | ||||
178 | void EventHandler::handlePointer(int buttonMask, int x, int y) | | |||
179 | { | 38 | { | ||
180 | QDesktopWidget *desktopWidget = QApplication::desktop(); | 39 | return fb; | ||
181 | | ||||
182 | int screen = desktopWidget->screenNumber(); | | |||
183 | | ||||
184 | if (screen < 0) { | | |||
185 | screen = 0; | | |||
186 | } | 40 | } | ||
187 | 41 | | |||
188 | XTestFakeMotionEvent(data->dpy, screen, x, y, CurrentTime); | 42 | #include "events.moc" | ||
Kanedias: What's supposed to be here? | |||||
Keyboard support, once it's implemented . I should maybe remove this completely until there is keyboard support we can use. jgrulich: Keyboard support, once it's implemented . I should maybe remove this completely until there is… | |||||
189 | | ||||
190 | for (int i = 0; i < 5; i++) { | | |||
191 | if ((data->buttonMask&(1 << i)) != (buttonMask&(1 << i))) { | | |||
192 | XTestFakeButtonEvent(data->dpy, | | |||
193 | i + 1, | | |||
194 | (buttonMask&(1 << i)) ? True : False, | | |||
195 | CurrentTime); | | |||
196 | } | | |||
197 | } | | |||
198 | 43 | | |||
199 | data->buttonMask = buttonMask; | | |||
200 | } | |
What's supposed to be here?