Annotation of /trunk/tigervnc/patches/tigervnc-1.0.1-r3927.patch
Parent Directory | Revision Log
Revision 1201 -
(hide annotations)
(download)
Mon Nov 22 23:25:59 2010 UTC (13 years, 10 months ago) by niro
File size: 10361 byte(s)
Mon Nov 22 23:25:59 2010 UTC (13 years, 10 months ago) by niro
File size: 10361 byte(s)
-patches for 1.0.1 against xorg-server-1.7
1 | niro | 1201 | Index: unix/xserver/hw/vnc/xvnc.cc |
2 | =================================================================== | ||
3 | --- unix/xserver/hw/vnc/xvnc.cc (revision 3926) | ||
4 | +++ unix/xserver/hw/vnc/xvnc.cc (revision 3927) | ||
5 | @@ -81,6 +81,12 @@ | ||
6 | #endif /* RANDR */ | ||
7 | #include <X11/keysym.h> | ||
8 | extern char buildtime[]; | ||
9 | +#if XORG >= 17 | ||
10 | +#undef VENDOR_RELEASE | ||
11 | +#undef VENDOR_STRING | ||
12 | +#include "version-config.h" | ||
13 | +#include "site.h" | ||
14 | +#endif | ||
15 | #undef class | ||
16 | #undef public | ||
17 | } | ||
18 | Index: unix/xserver/hw/vnc/Input.cc | ||
19 | =================================================================== | ||
20 | --- unix/xserver/hw/vnc/Input.cc (revision 3926) | ||
21 | +++ unix/xserver/hw/vnc/Input.cc (revision 3927) | ||
22 | @@ -43,9 +43,17 @@ | ||
23 | #endif | ||
24 | #if XORG >= 16 | ||
25 | #include "exevents.h" | ||
26 | +#endif | ||
27 | +#if XORG == 16 | ||
28 | extern void | ||
29 | CopyKeyClass(DeviceIntPtr device, DeviceIntPtr master); | ||
30 | #endif | ||
31 | +#if XORG >= 17 | ||
32 | +#include "xkbsrv.h" | ||
33 | +#include "xkbstr.h" | ||
34 | +#include "xserver-properties.h" | ||
35 | +extern _X_EXPORT DevPrivateKey CoreDevicePrivateKey; | ||
36 | +#endif | ||
37 | #include <X11/keysym.h> | ||
38 | #include <X11/Xutil.h> | ||
39 | #undef public | ||
40 | @@ -99,8 +107,10 @@ | ||
41 | mieqEnqueue(dev, | ||
42 | #if XORG == 15 | ||
43 | eventq + i | ||
44 | +#elif XORG == 16 | ||
45 | + (eventq + i)->event | ||
46 | #else | ||
47 | - (eventq + i)->event | ||
48 | + (InternalEvent *) (eventq + i)->event | ||
49 | #endif | ||
50 | ); | ||
51 | } | ||
52 | @@ -169,18 +179,43 @@ | ||
53 | BYTE map[BUTTONS + 1]; | ||
54 | DevicePtr pDev = (DevicePtr)pDevice; | ||
55 | int i; | ||
56 | +#if XORG >= 17 | ||
57 | + /* | ||
58 | + * NOTE: map[] array is one element longer than btn_labels[] array. This | ||
59 | + * is not a bug. | ||
60 | + */ | ||
61 | + Atom btn_labels[BUTTONS]; | ||
62 | + Atom axes_labels[2]; | ||
63 | +#endif | ||
64 | |||
65 | switch (onoff) { | ||
66 | case DEVICE_INIT: | ||
67 | for (i = 0; i < BUTTONS + 1; i++) | ||
68 | map[i] = i; | ||
69 | |||
70 | +#if XORG >= 17 | ||
71 | + btn_labels[0] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_LEFT); | ||
72 | + btn_labels[1] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_MIDDLE); | ||
73 | + btn_labels[2] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_RIGHT); | ||
74 | + btn_labels[3] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_WHEEL_UP); | ||
75 | + btn_labels[4] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_WHEEL_DOWN); | ||
76 | + | ||
77 | + axes_labels[0] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_X); | ||
78 | + axes_labels[1] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_Y); | ||
79 | +#endif | ||
80 | + | ||
81 | InitPointerDeviceStruct(pDev, map, BUTTONS, | ||
82 | #if XORG == 15 | ||
83 | GetMotionHistory, | ||
84 | +#elif XORG >= 17 | ||
85 | + btn_labels, | ||
86 | #endif | ||
87 | (PtrCtrlProcPtr)NoopDDA, | ||
88 | - GetMotionHistorySize(), 2); | ||
89 | + GetMotionHistorySize(), 2 | ||
90 | +#if XORG >= 17 | ||
91 | + , axes_labels | ||
92 | +#endif | ||
93 | + ); | ||
94 | break; | ||
95 | case DEVICE_ON: | ||
96 | pDev->on = TRUE; | ||
97 | @@ -239,33 +274,84 @@ | ||
98 | |||
99 | void press() | ||
100 | { | ||
101 | + int state, index, maxKeysPerMod, keycode; | ||
102 | +#if XORG >= 17 | ||
103 | + int ret; | ||
104 | + KeyCode *modmap = NULL; | ||
105 | + | ||
106 | + state = XkbStateFieldFromRec(&dev->u.master->key->xkbInfo->state); | ||
107 | +#else | ||
108 | KeyClassPtr keyc = dev->key; | ||
109 | - if (!(keyc->state & (1 << modIndex))) { | ||
110 | - int index = modIndex * keyc->maxKeysPerModifier; | ||
111 | - tempKeyEvent(keyc->modifierKeyMap[index], true); | ||
112 | - pressed = true; | ||
113 | + state = keyc->state; | ||
114 | +#endif | ||
115 | + if ((state & (1 << modIndex)) != 0) | ||
116 | + return; | ||
117 | + | ||
118 | +#if XORG >= 17 | ||
119 | + if (generate_modkeymap(serverClient, dev, &modmap, | ||
120 | + &maxKeysPerMod) != Success) { | ||
121 | + vlog.error("generate_modkeymap failed"); | ||
122 | + return; | ||
123 | } | ||
124 | + | ||
125 | + keycode = modmap[modIndex * maxKeysPerMod]; | ||
126 | + xfree(modmap); | ||
127 | +#else | ||
128 | + maxKeysPerMod = keyc->maxKeysPerModifier; | ||
129 | + keycode = keyc->modifierKeyMap[modIndex * maxKeysPerMod]; | ||
130 | +#endif | ||
131 | + tempKeyEvent(keycode, true, maxKeysPerMod); | ||
132 | + pressed = true; | ||
133 | } | ||
134 | |||
135 | void release() | ||
136 | { | ||
137 | - KeyClassPtr keyc = dev->key; | ||
138 | - if ((keyc->state & (1 << modIndex)) == 0) | ||
139 | + int state, maxKeysPerMod; | ||
140 | + KeyClassPtr keyc; | ||
141 | +#if XORG >= 17 | ||
142 | + int ret; | ||
143 | + KeyCode *modmap = NULL; | ||
144 | + | ||
145 | + keyc = dev->u.master->key; | ||
146 | + state = XkbStateFieldFromRec(&keyc->xkbInfo->state); | ||
147 | +#else | ||
148 | + keyc = dev->key; | ||
149 | + state = keyc->state; | ||
150 | +#endif | ||
151 | + if ((state & (1 << modIndex)) == 0) | ||
152 | return; | ||
153 | |||
154 | - for (int k = 0; k < keyc->maxKeysPerModifier; k++) { | ||
155 | - int index = modIndex * keyc->maxKeysPerModifier + k; | ||
156 | - int keycode = keyc->modifierKeyMap[index]; | ||
157 | +#if XORG >= 17 | ||
158 | + if (generate_modkeymap(serverClient, dev, &modmap, | ||
159 | + &maxKeysPerMod) != Success) { | ||
160 | + vlog.error("generate_modkeymap failed"); | ||
161 | + return; | ||
162 | + } | ||
163 | +#else | ||
164 | + maxKeysPerMod = keyc->maxKeysPerModifier; | ||
165 | +#endif | ||
166 | + | ||
167 | + for (int k = 0; k < maxKeysPerMod; k++) { | ||
168 | + int keycode; | ||
169 | + int index = modIndex * maxKeysPerMod + k; | ||
170 | +#if XORG >= 17 | ||
171 | + keycode = modmap[index]; | ||
172 | +#else | ||
173 | + keycode = keyc->modifierKeyMap[index]; | ||
174 | +#endif | ||
175 | if (keycode && IS_PRESSED(keyc, keycode)) | ||
176 | - tempKeyEvent(keycode, false); | ||
177 | + tempKeyEvent(keycode, false, maxKeysPerMod); | ||
178 | } | ||
179 | +#if XORG >= 17 | ||
180 | + xfree(modmap); | ||
181 | +#endif | ||
182 | } | ||
183 | |||
184 | private: | ||
185 | - void tempKeyEvent(int keycode, bool down) | ||
186 | + void tempKeyEvent(int keycode, bool down, int maxKeysPerMod) | ||
187 | { | ||
188 | if (keycode) { | ||
189 | - if (!keys) keys = new int[dev->key->maxKeysPerModifier]; | ||
190 | + if (!keys) keys = new int[maxKeysPerMod]; | ||
191 | keys[nKeys++] = keycode; | ||
192 | generateXKeyEvent(keycode, down); | ||
193 | } | ||
194 | @@ -361,17 +447,28 @@ | ||
195 | * synchronized with proper master device | ||
196 | */ | ||
197 | |||
198 | +#if XORG >= 17 | ||
199 | +#define FREE_MAPS \ | ||
200 | + do { \ | ||
201 | + xfree(modmap); \ | ||
202 | + xfree(keymap->map); \ | ||
203 | + xfree(keymap); \ | ||
204 | + } while (0); | ||
205 | +#else | ||
206 | +#define FREE_MAPS | ||
207 | +#endif | ||
208 | + | ||
209 | void KeyboardDevice::keyEvent(rdr::U32 keysym, bool down) | ||
210 | { | ||
211 | DeviceIntPtr master; | ||
212 | - KeyClassPtr keyc = dev->key; | ||
213 | - KeySymsPtr keymap = &keyc->curKeySyms; | ||
214 | - KeySym *map = keymap->map; | ||
215 | - KeyCode minKeyCode = keymap->minKeyCode; | ||
216 | - KeyCode maxKeyCode = keymap->maxKeyCode; | ||
217 | - int mapWidth = keymap->mapWidth; | ||
218 | + KeyClassPtr keyc; | ||
219 | + KeySymsPtr keymap = NULL; | ||
220 | + KeySym *map = NULL; | ||
221 | + KeyCode minKeyCode, maxKeyCode; | ||
222 | + KeyCode *modmap = NULL; | ||
223 | + int mapWidth; | ||
224 | unsigned int i, n; | ||
225 | - int j, k, action; | ||
226 | + int j, k, action, state, maxKeysPerMod; | ||
227 | |||
228 | /* | ||
229 | * Since we are checking the current state to determine if we need | ||
230 | @@ -385,13 +482,43 @@ | ||
231 | vlog.debug("Ignoring caps lock"); | ||
232 | return; | ||
233 | } | ||
234 | +vlog.debug("keysym %d", keysym); | ||
235 | +#if XORG >= 17 | ||
236 | + keyc = dev->u.master->key; | ||
237 | |||
238 | + keymap = XkbGetCoreMap(dev); | ||
239 | + if (!keymap) { | ||
240 | + vlog.error("VNC keyboard device has no map"); | ||
241 | + return; | ||
242 | + } | ||
243 | + | ||
244 | + if (generate_modkeymap(serverClient, dev, &modmap, &maxKeysPerMod) | ||
245 | + != Success) { | ||
246 | + vlog.error("generate_modkeymap failed"); | ||
247 | + xfree(keymap->map); | ||
248 | + xfree(keymap); | ||
249 | + return; | ||
250 | + } | ||
251 | + | ||
252 | + state = XkbStateFieldFromRec(&keyc->xkbInfo->state); | ||
253 | +#else | ||
254 | + keyc = dev->key; | ||
255 | + state = keyc->state; | ||
256 | + maxKeysPerMod = keyc->maxKeysPerModifier; | ||
257 | + keymap = &keyc->curKeySyms; | ||
258 | + modmap = keyc->modifierKeyMap; | ||
259 | +#endif | ||
260 | + map = keymap->map; | ||
261 | + minKeyCode = keymap->minKeyCode; | ||
262 | + maxKeyCode = keymap->maxKeyCode; | ||
263 | + mapWidth = keymap->mapWidth; | ||
264 | + | ||
265 | /* find which modifier Mode_switch is on. */ | ||
266 | int modeSwitchMapIndex = 0; | ||
267 | for (i = 3; i < 8; i++) { | ||
268 | - for (k = 0; k < keyc->maxKeysPerModifier; k++) { | ||
269 | - int index = i * keyc->maxKeysPerModifier + k; | ||
270 | - int keycode = keyc->modifierKeyMap[index]; | ||
271 | + for (k = 0; k < maxKeysPerMod; k++) { | ||
272 | + int index = i * maxKeysPerMod + k; | ||
273 | + int keycode = modmap[index]; | ||
274 | |||
275 | if (keycode == 0) | ||
276 | continue; | ||
277 | @@ -408,10 +535,10 @@ | ||
278 | ModeSwitchFound: | ||
279 | |||
280 | int col = 0; | ||
281 | - if ((keyc->state & (1 << ShiftMapIndex)) != 0) | ||
282 | + if ((state & (1 << ShiftMapIndex)) != 0) | ||
283 | col |= 1; | ||
284 | if (modeSwitchMapIndex != 0 && | ||
285 | - ((keyc->state & (1 << modeSwitchMapIndex))) != 0) | ||
286 | + ((state & (1 << modeSwitchMapIndex))) != 0) | ||
287 | col |= 2; | ||
288 | |||
289 | int kc = KeysymToKeycode(keymap, keysym, &col); | ||
290 | @@ -424,7 +551,7 @@ | ||
291 | * We never get ISO_Left_Tab here because it's already been translated | ||
292 | * in VNCSConnectionST. | ||
293 | */ | ||
294 | - if (keysym == XK_Tab && ((keyc->state & (1 << ShiftMapIndex))) != 0) | ||
295 | + if (keysym == XK_Tab && ((state & (1 << ShiftMapIndex))) != 0) | ||
296 | col |= 1; | ||
297 | |||
298 | if (kc == 0) { | ||
299 | @@ -455,6 +582,8 @@ | ||
300 | |||
301 | vlog.info("Added unknown keysym 0x%x to keycode %d", | ||
302 | keysym, kc); | ||
303 | + | ||
304 | +#if XORG < 17 | ||
305 | #if XORG == 15 | ||
306 | master = inputInfo.keyboard; | ||
307 | #else | ||
308 | @@ -471,6 +600,12 @@ | ||
309 | CopyKeyClass(dev, master); | ||
310 | #endif | ||
311 | } | ||
312 | +#else /* XORG < 17 */ | ||
313 | + XkbApplyMappingChange(dev, keymap, minKeyCode, | ||
314 | + maxKeyCode - minKeyCode + 1, | ||
315 | + NULL, serverClient); | ||
316 | + XkbCopyDeviceKeymap(dev->u.master, dev); | ||
317 | +#endif /* XORG < 17 */ | ||
318 | break; | ||
319 | } | ||
320 | } | ||
321 | @@ -478,6 +613,7 @@ | ||
322 | if (kc < minKeyCode) { | ||
323 | vlog.info("Keyboard mapping full - ignoring unknown keysym " | ||
324 | "0x%x",keysym); | ||
325 | + FREE_MAPS; | ||
326 | return; | ||
327 | } | ||
328 | |||
329 | @@ -487,11 +623,12 @@ | ||
330 | * followed by a press. | ||
331 | */ | ||
332 | for (i = 0; i < 8; i++) { | ||
333 | - for (k = 0; k < keyc->maxKeysPerModifier; k++) { | ||
334 | - int index = i * keyc->maxKeysPerModifier + k; | ||
335 | - if (kc == keyc->modifierKeyMap[index] && | ||
336 | - IS_PRESSED(keyc,kc) && down) | ||
337 | + for (k = 0; k < maxKeysPerMod; k++) { | ||
338 | + int index = i * maxKeysPerMod + k; | ||
339 | + if (kc == modmap[index] && IS_PRESSED(keyc,kc) && down) { | ||
340 | + FREE_MAPS; | ||
341 | return; | ||
342 | + } | ||
343 | } | ||
344 | } | ||
345 | |||
346 | @@ -761,9 +898,16 @@ | ||
347 | |||
348 | switch (onoff) { | ||
349 | case DEVICE_INIT: | ||
350 | +#if XORG < 17 | ||
351 | GetMappings(&keySyms, modMap); | ||
352 | - InitKeyboardDeviceStruct(pDev, &keySyms, modMap, keyboardBell, | ||
353 | - (KbdCtrlProcPtr)NoopDDA); | ||
354 | +#endif | ||
355 | + InitKeyboardDeviceStruct( | ||
356 | +#if XORG >= 17 | ||
357 | + pDevice, NULL, | ||
358 | +#else | ||
359 | + pDev, &keySyms, modMap, | ||
360 | +#endif | ||
361 | + keyboardBell, (KbdCtrlProcPtr)NoopDDA); | ||
362 | break; | ||
363 | case DEVICE_ON: | ||
364 | pDev->on = TRUE; | ||
365 | Index: unix/xserver/hw/vnc/xorg-version.h | ||
366 | =================================================================== | ||
367 | --- unix/xserver/hw/vnc/xorg-version.h (revision 3926) | ||
368 | +++ unix/xserver/hw/vnc/xorg-version.h (revision 3927) | ||
369 | @@ -26,8 +26,12 @@ | ||
370 | |||
371 | #if XORG_VERSION_CURRENT < ((1 * 10000000) + (5 * 100000) + (99 * 1000)) | ||
372 | #define XORG 15 | ||
373 | +#elif XORG_VERSION_CURRENT < ((1 * 10000000) + (6 * 100000) + (99 * 1000)) | ||
374 | +#define XORG 16 | ||
375 | +#elif XORG_VERSION_CURRENT < ((1 * 10000000) + (7 * 100000) + (99 * 1000)) | ||
376 | +#define XORG 17 | ||
377 | #else | ||
378 | -#define XORG 16 | ||
379 | +#error "X.Org newer than 1.7 is not supported" | ||
380 | #endif | ||
381 | |||
382 | #endif | ||
383 | Index: unix/xserver/hw/vnc/XserverDesktop.cc | ||
384 | =================================================================== | ||
385 | --- unix/xserver/hw/vnc/XserverDesktop.cc (revision 3926) | ||
386 | +++ unix/xserver/hw/vnc/XserverDesktop.cc (revision 3927) | ||
387 | @@ -54,6 +54,10 @@ | ||
388 | #ifdef RANDR | ||
389 | #include "randrstr.h" | ||
390 | #endif | ||
391 | +#if XORG >= 17 | ||
392 | +#include "cursorstr.h" | ||
393 | +#endif | ||
394 | + | ||
395 | #undef public | ||
396 | #undef class | ||
397 | } | ||
398 | @@ -185,6 +189,9 @@ | ||
399 | int i; | ||
400 | pointer retval; | ||
401 | |||
402 | +#if XORG >= 17 | ||
403 | +#define dixLookupResource dixLookupResourceByType | ||
404 | +#endif | ||
405 | i = dixLookupResource(&retval, pScreen->defColormap, RT_COLORMAP, NullClient, | ||
406 | DixReadAccess); | ||
407 |