Annotation of /trunk/tigervnc/patches/tigervnc-1.0.1-r3886.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: 12742 byte(s)
Mon Nov 22 23:25:59 2010 UTC (13 years, 10 months ago) by niro
File size: 12742 byte(s)
-patches for 1.0.1 against xorg-server-1.7
1 | niro | 1201 | Index: unix/xserver/hw/vnc/Input.cc |
2 | =================================================================== | ||
3 | --- unix/xserver/hw/vnc/Input.cc (revision 0) | ||
4 | +++ unix/xserver/hw/vnc/Input.cc (revision 3886) | ||
5 | @@ -0,0 +1,167 @@ | ||
6 | +/* Copyright (C) 2009 TightVNC Team | ||
7 | + * Copyright (C) 2009 Red Hat, Inc. | ||
8 | + * | ||
9 | + * This is free software; you can redistribute it and/or modify | ||
10 | + * it under the terms of the GNU General Public License as published by | ||
11 | + * the Free Software Foundation; either version 2 of the License, or | ||
12 | + * (at your option) any later version. | ||
13 | + * | ||
14 | + * This software is distributed in the hope that it will be useful, | ||
15 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
16 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
17 | + * GNU General Public License for more details. | ||
18 | + * | ||
19 | + * You should have received a copy of the GNU General Public License | ||
20 | + * along with this software; if not, write to the Free Software | ||
21 | + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, | ||
22 | + * USA. | ||
23 | + */ | ||
24 | + | ||
25 | +#ifdef HAVE_DIX_CONFIG_H | ||
26 | +#include <dix-config.h> | ||
27 | +#endif | ||
28 | + | ||
29 | +#include "Input.h" | ||
30 | +#include "xorg-version.h" | ||
31 | + | ||
32 | +extern "C" { | ||
33 | +#include "mi.h" | ||
34 | +} | ||
35 | + | ||
36 | +/* Event queue is shared between all devices. */ | ||
37 | +#if XORG == 15 | ||
38 | +static xEvent *eventq = NULL; | ||
39 | +#else | ||
40 | +static EventList *eventq = NULL; | ||
41 | +#endif | ||
42 | + | ||
43 | +static void initEventq(void) | ||
44 | +{ | ||
45 | + /* eventq is never free()-ed because it exists during server life. */ | ||
46 | + if (eventq == NULL) { | ||
47 | +#if XORG == 15 | ||
48 | + eventq = (xEvent *)xcalloc(sizeof(xEvent), | ||
49 | + GetMaximumEventsNum()); | ||
50 | + if (!eventq) | ||
51 | + FatalError("Couldn't allocate eventq\n"); | ||
52 | +#else | ||
53 | + GetEventList(&eventq); | ||
54 | +#endif | ||
55 | + } | ||
56 | +} | ||
57 | + | ||
58 | +static void enqueueEvents(DeviceIntPtr dev, int n) | ||
59 | +{ | ||
60 | + int i; | ||
61 | + | ||
62 | + for (i = 0; i < n; i++) { | ||
63 | + /* | ||
64 | + * Passing arguments in global variable eventq is probably not | ||
65 | + * good programming practise but in this case it is safe and | ||
66 | + * clear. | ||
67 | + */ | ||
68 | + mieqEnqueue(dev, | ||
69 | +#if XORG == 15 | ||
70 | + eventq + i | ||
71 | +#else | ||
72 | + (eventq + i)->event | ||
73 | +#endif | ||
74 | + ); | ||
75 | + } | ||
76 | +} | ||
77 | + | ||
78 | +/* Pointer device pre-declarations */ | ||
79 | +#define BUTTONS 5 | ||
80 | +static int pointerProc(DeviceIntPtr pDevice, int onoff); | ||
81 | + | ||
82 | +/* Pointer device methods */ | ||
83 | + | ||
84 | +PointerDevice::PointerDevice(rfb::VNCServerST *_server) | ||
85 | + : server(_server), oldButtonMask(0) | ||
86 | +{ | ||
87 | + dev = AddInputDevice( | ||
88 | +#if XORG >= 16 | ||
89 | + serverClient, | ||
90 | +#endif | ||
91 | + pointerProc, TRUE); | ||
92 | + RegisterPointerDevice(dev); | ||
93 | + initEventq(); | ||
94 | +} | ||
95 | + | ||
96 | +void PointerDevice::ButtonAction(int buttonMask) | ||
97 | +{ | ||
98 | + int i, n; | ||
99 | + | ||
100 | + for (i = 0; i < BUTTONS; i++) { | ||
101 | + if ((buttonMask ^ oldButtonMask) & (1 << i)) { | ||
102 | + int action = (buttonMask & (1<<i)) ? | ||
103 | + ButtonPress : ButtonRelease; | ||
104 | + n = GetPointerEvents(eventq, dev, action, i + 1, | ||
105 | + POINTER_RELATIVE, 0, 0, NULL); | ||
106 | + enqueueEvents(dev, n); | ||
107 | + | ||
108 | + } | ||
109 | + } | ||
110 | + | ||
111 | + oldButtonMask = buttonMask; | ||
112 | +} | ||
113 | + | ||
114 | +void PointerDevice::Move(const rfb::Point &pos) | ||
115 | +{ | ||
116 | + int n, valuators[2]; | ||
117 | + | ||
118 | + if (pos.equals(cursorPos)) | ||
119 | + return; | ||
120 | + | ||
121 | + valuators[0] = pos.x; | ||
122 | + valuators[1] = pos.y; | ||
123 | + n = GetPointerEvents(eventq, dev, MotionNotify, 0, POINTER_ABSOLUTE, 0, | ||
124 | + 2, valuators); | ||
125 | + enqueueEvents(dev, n); | ||
126 | + | ||
127 | + cursorPos = pos; | ||
128 | +} | ||
129 | + | ||
130 | +void PointerDevice::Sync(void) | ||
131 | +{ | ||
132 | + if (cursorPos.equals(oldCursorPos)) | ||
133 | + return; | ||
134 | + | ||
135 | + oldCursorPos = cursorPos; | ||
136 | + server->setCursorPos(cursorPos); | ||
137 | + server->tryUpdate(); | ||
138 | +} | ||
139 | + | ||
140 | +static int pointerProc(DeviceIntPtr pDevice, int onoff) | ||
141 | +{ | ||
142 | + BYTE map[BUTTONS + 1]; | ||
143 | + DevicePtr pDev = (DevicePtr)pDevice; | ||
144 | + int i; | ||
145 | + | ||
146 | + switch (onoff) { | ||
147 | + case DEVICE_INIT: | ||
148 | + for (i = 0; i < BUTTONS + 1; i++) | ||
149 | + map[i] = i; | ||
150 | + | ||
151 | + InitPointerDeviceStruct(pDev, map, BUTTONS, | ||
152 | +#if XORG == 15 | ||
153 | + GetMotionHistory, | ||
154 | +#endif | ||
155 | + (PtrCtrlProcPtr)NoopDDA, | ||
156 | + GetMotionHistorySize(), 2); | ||
157 | + break; | ||
158 | + case DEVICE_ON: | ||
159 | + pDev->on = TRUE; | ||
160 | + break; | ||
161 | + case DEVICE_OFF: | ||
162 | + pDev->on = FALSE; | ||
163 | + break; | ||
164 | +#if 0 | ||
165 | + case DEVICE_CLOSE: | ||
166 | + break; | ||
167 | +#endif | ||
168 | + } | ||
169 | + | ||
170 | + return Success; | ||
171 | +} | ||
172 | + | ||
173 | Index: unix/xserver/hw/vnc/Input.h | ||
174 | =================================================================== | ||
175 | --- unix/xserver/hw/vnc/Input.h (revision 0) | ||
176 | +++ unix/xserver/hw/vnc/Input.h (revision 3886) | ||
177 | @@ -0,0 +1,61 @@ | ||
178 | +/* Copyright (C) 2009 TightVNC Team | ||
179 | + * Copyright (C) 2009 Red Hat, Inc. | ||
180 | + * | ||
181 | + * This is free software; you can redistribute it and/or modify | ||
182 | + * it under the terms of the GNU General Public License as published by | ||
183 | + * the Free Software Foundation; either version 2 of the License, or | ||
184 | + * (at your option) any later version. | ||
185 | + * | ||
186 | + * This software is distributed in the hope that it will be useful, | ||
187 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
188 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
189 | + * GNU General Public License for more details. | ||
190 | + * | ||
191 | + * You should have received a copy of the GNU General Public License | ||
192 | + * along with this software; if not, write to the Free Software | ||
193 | + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, | ||
194 | + * USA. | ||
195 | + */ | ||
196 | + | ||
197 | +/* Make sure macro doesn't conflict with macro in include/input.h. */ | ||
198 | +#ifndef INPUT_H_ | ||
199 | +#define INPUT_H_ | ||
200 | + | ||
201 | +#ifdef HAVE_DIX_CONFIG_H | ||
202 | +#include <dix-config.h> | ||
203 | +#endif | ||
204 | + | ||
205 | +#include <rfb/VNCServerST.h> | ||
206 | + | ||
207 | +extern "C" { | ||
208 | +#include "input.h" | ||
209 | +}; | ||
210 | + | ||
211 | +/* Represents pointer device. */ | ||
212 | +class PointerDevice { | ||
213 | +public: | ||
214 | + /* Create new PointerDevice instance. */ | ||
215 | + PointerDevice(rfb::VNCServerST *_server); | ||
216 | + | ||
217 | + /* | ||
218 | + * Press or release buttons. Relationship between buttonMask and | ||
219 | + * buttons is specified in RFB protocol. | ||
220 | + */ | ||
221 | + void ButtonAction(int buttonMask); | ||
222 | + | ||
223 | + /* Move pointer to target location (point coords are absolute). */ | ||
224 | + void Move(const rfb::Point &point); | ||
225 | + | ||
226 | + /* | ||
227 | + * Send pointer position to clients. If not called then Move() calls | ||
228 | + * won't be visible to clients. | ||
229 | + */ | ||
230 | + void Sync(void); | ||
231 | +private: | ||
232 | + rfb::VNCServerST *server; | ||
233 | + DeviceIntPtr dev; | ||
234 | + int oldButtonMask; | ||
235 | + rfb::Point cursorPos, oldCursorPos; | ||
236 | +}; | ||
237 | + | ||
238 | +#endif | ||
239 | Index: unix/xserver/hw/vnc/Makefile.am | ||
240 | =================================================================== | ||
241 | --- unix/xserver/hw/vnc/Makefile.am (revision 3885) | ||
242 | +++ unix/xserver/hw/vnc/Makefile.am (revision 3886) | ||
243 | @@ -9,9 +9,11 @@ | ||
244 | |||
245 | noinst_LTLIBRARIES = libvnccommon.la | ||
246 | |||
247 | -HDRS = RegionHelper.h vncExtInit.h vncHooks.h XserverDesktop.h xorg-version.h | ||
248 | +HDRS = RegionHelper.h vncExtInit.h vncHooks.h XserverDesktop.h xorg-version.h \ | ||
249 | + Input.h | ||
250 | |||
251 | -libvnccommon_la_SOURCES = $(HDRS) vncExtInit.cc vncHooks.cc XserverDesktop.cc | ||
252 | +libvnccommon_la_SOURCES = $(HDRS) vncExtInit.cc vncHooks.cc XserverDesktop.cc \ | ||
253 | + Input.cc | ||
254 | |||
255 | libvnccommon_la_CPPFLAGS = -DVENDOR_RELEASE="$(VENDOR_RELEASE)" \ | ||
256 | -DVENDOR_STRING="\"$(VENDOR_STRING)\"" -I$(LIB_DIR) \ | ||
257 | Index: unix/xserver/hw/vnc/XserverDesktop.cc | ||
258 | =================================================================== | ||
259 | --- unix/xserver/hw/vnc/XserverDesktop.cc (revision 3885) | ||
260 | +++ unix/xserver/hw/vnc/XserverDesktop.cc (revision 3886) | ||
261 | @@ -42,6 +42,7 @@ | ||
262 | #include "XserverDesktop.h" | ||
263 | #include "vncExtInit.h" | ||
264 | #include "xorg-version.h" | ||
265 | +#include "Input.h" | ||
266 | |||
267 | extern "C" { | ||
268 | #define public c_public | ||
269 | @@ -77,7 +78,6 @@ | ||
270 | } | ||
271 | |||
272 | static DeviceIntPtr vncKeyboardDevice = NULL; | ||
273 | -static DeviceIntPtr vncPointerDevice = NULL; | ||
274 | #if XORG == 15 | ||
275 | static xEvent *eventq = NULL; | ||
276 | #else | ||
277 | @@ -85,7 +85,6 @@ | ||
278 | #endif | ||
279 | |||
280 | static int vfbKeybdProc(DeviceIntPtr pDevice, int onoff); | ||
281 | -static int vfbMouseProc(DeviceIntPtr pDevice, int onoff); | ||
282 | |||
283 | using namespace rfb; | ||
284 | using namespace network; | ||
285 | @@ -180,7 +179,6 @@ | ||
286 | listener(listener_), httpListener(httpListener_), | ||
287 | cmap(0), deferredUpdateTimerSet(false), | ||
288 | grabbing(false), ignoreHooks_(false), directFbptr(true), | ||
289 | - oldButtonMask(0), | ||
290 | queryConnectId(0) | ||
291 | { | ||
292 | format = pf; | ||
293 | @@ -221,14 +219,7 @@ | ||
294 | RegisterKeyboardDevice(vncKeyboardDevice); | ||
295 | } | ||
296 | |||
297 | - if (vncPointerDevice == NULL) { | ||
298 | - vncPointerDevice = AddInputDevice( | ||
299 | -#if XORG >= 16 | ||
300 | - serverClient, | ||
301 | -#endif | ||
302 | - vfbMouseProc, TRUE); | ||
303 | - RegisterPointerDevice(vncPointerDevice); | ||
304 | - } | ||
305 | + pointerDevice = new PointerDevice(server); | ||
306 | } | ||
307 | |||
308 | XserverDesktop::~XserverDesktop() | ||
309 | @@ -237,6 +228,7 @@ | ||
310 | delete [] data; | ||
311 | TimerFree(deferredUpdateTimer); | ||
312 | TimerFree(dummyTimer); | ||
313 | + delete pointerDevice; | ||
314 | delete httpServer; | ||
315 | delete server; | ||
316 | } | ||
317 | @@ -555,43 +547,9 @@ | ||
318 | } | ||
319 | } | ||
320 | |||
321 | -void XserverDesktop::positionCursor() | ||
322 | -{ | ||
323 | - if (!cursorPos.equals(oldCursorPos)) { | ||
324 | - oldCursorPos = cursorPos; | ||
325 | - (*pScreen->SetCursorPosition) ( | ||
326 | -#if XORG >= 16 | ||
327 | - vncPointerDevice, | ||
328 | -#endif | ||
329 | - pScreen, cursorPos.x, cursorPos.y, FALSE); | ||
330 | - server->setCursorPos(cursorPos); | ||
331 | - server->tryUpdate(); | ||
332 | - } | ||
333 | -} | ||
334 | - | ||
335 | void XserverDesktop::blockHandler(fd_set* fds) | ||
336 | { | ||
337 | try { | ||
338 | -#if XORG == 15 | ||
339 | - ScreenPtr screenWithCursor = GetCurrentRootWindow()->drawable.pScreen; | ||
340 | -#else | ||
341 | - ScreenPtr screenWithCursor = | ||
342 | - GetCurrentRootWindow(vncPointerDevice)->drawable.pScreen; | ||
343 | -#endif | ||
344 | - if (screenWithCursor == pScreen) { | ||
345 | - int x, y; | ||
346 | - GetSpritePosition( | ||
347 | -#if XORG >= 16 | ||
348 | - vncPointerDevice, | ||
349 | -#endif | ||
350 | - &x, &y); | ||
351 | - if (x != cursorPos.x || y != cursorPos.y) { | ||
352 | - cursorPos = oldCursorPos = Point(x, y); | ||
353 | - server->setCursorPos(cursorPos); | ||
354 | - server->tryUpdate(); | ||
355 | - } | ||
356 | - } | ||
357 | - | ||
358 | if (listener) | ||
359 | FD_SET(listener->getFd(), fds); | ||
360 | if (httpListener) | ||
361 | @@ -678,7 +636,7 @@ | ||
362 | } | ||
363 | } | ||
364 | |||
365 | - positionCursor(); | ||
366 | + pointerDevice->Sync(); | ||
367 | } | ||
368 | |||
369 | int timeout = server->checkTimeouts(); | ||
370 | @@ -737,63 +695,8 @@ | ||
371 | |||
372 | void XserverDesktop::pointerEvent(const Point& pos, int buttonMask) | ||
373 | { | ||
374 | - int i, j, n, valuators[2]; | ||
375 | - | ||
376 | - // SetCursorPosition seems to be very expensive (at least on XFree86 3.3.6 | ||
377 | - // for S3), so we delay calling it until positionCursor() is called at the | ||
378 | - // end of processing a load of RFB. | ||
379 | - //(*pScreen->SetCursorPosition) (pScreen, pos.x, pos.y, FALSE); | ||
380 | - | ||
381 | - NewCurrentScreen( | ||
382 | -#if XORG >= 16 | ||
383 | - vncPointerDevice, | ||
384 | -#endif | ||
385 | - pScreen, pos.x, pos.y); | ||
386 | - | ||
387 | - if (!pos.equals(cursorPos)) { | ||
388 | - valuators[0] = pos.x; | ||
389 | - valuators[1] = pos.y; | ||
390 | - | ||
391 | -#if XORG >= 16 | ||
392 | - GetEventList(&eventq); | ||
393 | -#endif | ||
394 | - n = GetPointerEvents (eventq, vncPointerDevice, MotionNotify, 0, | ||
395 | - POINTER_ABSOLUTE, 0, 2, valuators); | ||
396 | - | ||
397 | - for (i = 0; i < n; i++) { | ||
398 | - mieqEnqueue (vncPointerDevice, | ||
399 | -#if XORG == 15 | ||
400 | - eventq + i | ||
401 | -#else | ||
402 | - (eventq + i)->event | ||
403 | -#endif | ||
404 | - ); | ||
405 | - } | ||
406 | - } | ||
407 | - | ||
408 | - for (i = 0; i < 5; i++) { | ||
409 | - if ((buttonMask ^ oldButtonMask) & (1<<i)) { | ||
410 | - // Do not use the pointer mapping. Treat VNC buttons as logical | ||
411 | - // buttons. | ||
412 | - n = GetPointerEvents (eventq, vncPointerDevice, | ||
413 | - (buttonMask & (1<<i)) ? | ||
414 | - ButtonPress : ButtonRelease, | ||
415 | - i + 1, POINTER_RELATIVE, 0, 0, NULL); | ||
416 | - | ||
417 | - for (j = 0; j < n; j++) { | ||
418 | - mieqEnqueue (vncPointerDevice, | ||
419 | -#if XORG == 15 | ||
420 | - eventq + j | ||
421 | -#else | ||
422 | - (eventq + j)->event | ||
423 | -#endif | ||
424 | - ); | ||
425 | - } | ||
426 | - } | ||
427 | - } | ||
428 | - | ||
429 | - cursorPos = pos; | ||
430 | - oldButtonMask = buttonMask; | ||
431 | + pointerDevice->Move(pos); | ||
432 | + pointerDevice->ButtonAction(buttonMask); | ||
433 | } | ||
434 | |||
435 | void XserverDesktop::clientCutText(const char* str, int len) | ||
436 | @@ -1481,36 +1384,3 @@ | ||
437 | return Success; | ||
438 | } | ||
439 | |||
440 | -static int vfbMouseProc(DeviceIntPtr pDevice, int onoff) | ||
441 | -{ | ||
442 | - BYTE map[6]; | ||
443 | - DevicePtr pDev = (DevicePtr)pDevice; | ||
444 | - | ||
445 | - switch (onoff) | ||
446 | - { | ||
447 | - case DEVICE_INIT: | ||
448 | - map[1] = 1; | ||
449 | - map[2] = 2; | ||
450 | - map[3] = 3; | ||
451 | - map[4] = 4; | ||
452 | - map[5] = 5; | ||
453 | - InitPointerDeviceStruct(pDev, map, 5, | ||
454 | -#if XORG == 15 | ||
455 | - GetMotionHistory, | ||
456 | -#endif | ||
457 | - (PtrCtrlProcPtr)NoopDDA, GetMotionHistorySize(), 2); | ||
458 | - break; | ||
459 | - | ||
460 | - case DEVICE_ON: | ||
461 | - pDev->on = TRUE; | ||
462 | - break; | ||
463 | - | ||
464 | - case DEVICE_OFF: | ||
465 | - pDev->on = FALSE; | ||
466 | - break; | ||
467 | - | ||
468 | - case DEVICE_CLOSE: | ||
469 | - break; | ||
470 | - } | ||
471 | - return Success; | ||
472 | -} | ||
473 | Index: unix/xserver/hw/vnc/XserverDesktop.h | ||
474 | =================================================================== | ||
475 | --- unix/xserver/hw/vnc/XserverDesktop.h (revision 3885) | ||
476 | +++ unix/xserver/hw/vnc/XserverDesktop.h (revision 3886) | ||
477 | @@ -32,6 +32,7 @@ | ||
478 | #include <rfb/Configuration.h> | ||
479 | #include <rfb/VNCServerST.h> | ||
480 | #include <rdr/SubstitutingInStream.h> | ||
481 | +#include "Input.h" | ||
482 | |||
483 | extern "C" { | ||
484 | #define class c_class | ||
485 | @@ -68,7 +69,6 @@ | ||
486 | void setCursor(CursorPtr cursor); | ||
487 | void add_changed(RegionPtr reg); | ||
488 | void add_copied(RegionPtr dst, int dx, int dy); | ||
489 | - void positionCursor(); | ||
490 | void ignoreHooks(bool b) { ignoreHooks_ = b; } | ||
491 | void blockHandler(fd_set* fds); | ||
492 | void wakeupHandler(fd_set* fds, int nfds); | ||
493 | @@ -122,6 +122,7 @@ | ||
494 | pointer arg); | ||
495 | void deferUpdate(); | ||
496 | ScreenPtr pScreen; | ||
497 | + PointerDevice *pointerDevice; | ||
498 | OsTimerPtr deferredUpdateTimer, dummyTimer; | ||
499 | rfb::VNCServerST* server; | ||
500 | rfb::HTTPServer* httpServer; | ||
501 | @@ -133,8 +134,6 @@ | ||
502 | bool grabbing; | ||
503 | bool ignoreHooks_; | ||
504 | bool directFbptr; | ||
505 | - int oldButtonMask; | ||
506 | - rfb::Point cursorPos, oldCursorPos; | ||
507 | |||
508 | void* queryConnectId; | ||
509 | rfb::CharArray queryConnectAddress; |