Contents of /trunk/tigervnc/patches/tigervnc-1.0.1-r3927.patch
Parent Directory | Revision Log
Revision 1201 -
(show 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 | 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 |