Annotation of /trunk/tigervnc/patches/tigervnc-1.7.0-xorg119.patch
Parent Directory
|
Revision Log
Revision 2896 -
(hide annotations)
(download)
Fri Mar 31 13:08:41 2017 UTC (7 years, 2 months ago) by niro
File size: 13649 byte(s)
Fri Mar 31 13:08:41 2017 UTC (7 years, 2 months ago) by niro
File size: 13649 byte(s)
-fixed xorg-1.19 patches
1 | niro | 2896 | diff -up tigervnc-1.7.0/unix/xserver/hw/vnc/vncBlockHandler.c.xserver119 tigervnc-1.7.0/unix/xserver/hw/vnc/vncBlockHandler.c |
2 | --- tigervnc-1.7.0/unix/xserver/hw/vnc/vncBlockHandler.c.xserver119 2016-09-08 12:31:18.000000000 +0200 | ||
3 | +++ tigervnc-1.7.0/unix/xserver/hw/vnc/vncBlockHandler.c 2016-10-04 17:17:35.618889747 +0200 | ||
4 | @@ -30,6 +30,23 @@ | ||
5 | |||
6 | #include "vncExtInit.h" | ||
7 | #include "vncBlockHandler.h" | ||
8 | +#include "xorg-version.h" | ||
9 | + | ||
10 | +#if XORG >= 119 | ||
11 | + | ||
12 | +static void vncBlockHandler(void* data, void* timeout) | ||
13 | +{ | ||
14 | + vncCallBlockHandlers(timeout); | ||
15 | +} | ||
16 | + | ||
17 | +void vncRegisterBlockHandlers(void) | ||
18 | +{ | ||
19 | + if (!RegisterBlockAndWakeupHandlers(vncBlockHandler, | ||
20 | + (ServerWakeupHandlerProcPtr)NoopDDA, 0)) | ||
21 | + FatalError("RegisterBlockAndWakeupHandlers() failed\n"); | ||
22 | +} | ||
23 | + | ||
24 | +#else | ||
25 | |||
26 | static void vncBlockHandler(void * data, OSTimePtr t, void * readmask); | ||
27 | static void vncWakeupHandler(void * data, int nfds, void * readmask); | ||
28 | @@ -144,3 +161,5 @@ static void vncWriteWakeupHandlerFallbac | ||
29 | |||
30 | vncWriteWakeupHandler(ret, &fallbackFds); | ||
31 | } | ||
32 | + | ||
33 | +#endif | ||
34 | diff -up tigervnc-1.7.0/unix/xserver/hw/vnc/vncExtInit.cc.xserver119 tigervnc-1.7.0/unix/xserver/hw/vnc/vncExtInit.cc | ||
35 | --- tigervnc-1.7.0/unix/xserver/hw/vnc/vncExtInit.cc.xserver119 2016-09-08 12:31:18.000000000 +0200 | ||
36 | +++ tigervnc-1.7.0/unix/xserver/hw/vnc/vncExtInit.cc 2016-10-04 17:17:35.618889747 +0200 | ||
37 | @@ -241,6 +241,17 @@ int vncExtensionIsActive(int scrIdx) | ||
38 | return (desktop[scrIdx] != NULL); | ||
39 | } | ||
40 | |||
41 | +#if XORG >= 119 | ||
42 | + | ||
43 | +void vncCallBlockHandlers(int* timeout) | ||
44 | +{ | ||
45 | + for (int scr = 0; scr < vncGetScreenCount(); scr++) | ||
46 | + if (desktop[scr]) | ||
47 | + desktop[scr]->blockHandler(timeout); | ||
48 | +} | ||
49 | + | ||
50 | +#else | ||
51 | + | ||
52 | void vncCallReadBlockHandlers(fd_set * fds, struct timeval ** timeout) | ||
53 | { | ||
54 | for (int scr = 0; scr < vncGetScreenCount(); scr++) | ||
55 | @@ -269,6 +280,8 @@ void vncCallWriteWakeupHandlers(fd_set * | ||
56 | desktop[scr]->writeWakeupHandler(fds, nfds); | ||
57 | } | ||
58 | |||
59 | +#endif | ||
60 | + | ||
61 | int vncGetAvoidShiftNumLock(void) | ||
62 | { | ||
63 | return (bool)avoidShiftNumLock; | ||
64 | diff -up tigervnc-1.7.0/unix/xserver/hw/vnc/vncExtInit.h.xserver119 tigervnc-1.7.0/unix/xserver/hw/vnc/vncExtInit.h | ||
65 | --- tigervnc-1.7.0/unix/xserver/hw/vnc/vncExtInit.h.xserver119 2016-09-08 12:31:18.000000000 +0200 | ||
66 | +++ tigervnc-1.7.0/unix/xserver/hw/vnc/vncExtInit.h 2016-10-04 17:17:35.618889747 +0200 | ||
67 | @@ -22,6 +22,7 @@ | ||
68 | #include <stdint.h> | ||
69 | #include <stddef.h> | ||
70 | #include <sys/select.h> | ||
71 | +#include "xorg-version.h" | ||
72 | |||
73 | // Only from C++ | ||
74 | #ifdef __cplusplus | ||
75 | @@ -52,10 +53,14 @@ extern int vncInetdSock; | ||
76 | void vncExtensionInit(void); | ||
77 | int vncExtensionIsActive(int scrIdx); | ||
78 | |||
79 | +#if XORG >= 119 | ||
80 | +void vncCallBlockHandlers(int* timeout); | ||
81 | +#else | ||
82 | void vncCallReadBlockHandlers(fd_set * fds, struct timeval ** timeout); | ||
83 | void vncCallReadWakeupHandlers(fd_set * fds, int nfds); | ||
84 | void vncCallWriteBlockHandlers(fd_set * fds, struct timeval ** timeout); | ||
85 | void vncCallWriteWakeupHandlers(fd_set * fds, int nfds); | ||
86 | +#endif | ||
87 | |||
88 | int vncGetAvoidShiftNumLock(void); | ||
89 | |||
90 | diff -up tigervnc-1.7.0/unix/xserver/hw/vnc/vncHooks.c.xserver119 tigervnc-1.7.0/unix/xserver/hw/vnc/vncHooks.c | ||
91 | --- tigervnc-1.7.0/unix/xserver/hw/vnc/vncHooks.c.xserver119 2016-09-08 12:31:18.000000000 +0200 | ||
92 | +++ tigervnc-1.7.0/unix/xserver/hw/vnc/vncHooks.c 2016-10-04 17:17:35.618889747 +0200 | ||
93 | @@ -128,9 +128,11 @@ static Bool vncHooksDisplayCursor(Device | ||
94 | #if XORG <= 112 | ||
95 | static void vncHooksBlockHandler(int i, pointer blockData, pointer pTimeout, | ||
96 | pointer pReadmask); | ||
97 | -#else | ||
98 | +#elif XORG <= 118 | ||
99 | static void vncHooksBlockHandler(ScreenPtr pScreen, void * pTimeout, | ||
100 | void * pReadmask); | ||
101 | +#else | ||
102 | +static void vncHooksBlockHandler(ScreenPtr pScreen, void * pTimeout); | ||
103 | #endif | ||
104 | #ifdef RENDER | ||
105 | static void vncHooksComposite(CARD8 op, PicturePtr pSrc, PicturePtr pMask, | ||
106 | @@ -716,9 +718,11 @@ out: | ||
107 | #if XORG <= 112 | ||
108 | static void vncHooksBlockHandler(int i, pointer blockData, pointer pTimeout, | ||
109 | pointer pReadmask) | ||
110 | -#else | ||
111 | +#elif XORG <= 118 | ||
112 | static void vncHooksBlockHandler(ScreenPtr pScreen_, void * pTimeout, | ||
113 | void * pReadmask) | ||
114 | +#else | ||
115 | +static void vncHooksBlockHandler(ScreenPtr pScreen_, void * pTimeout) | ||
116 | #endif | ||
117 | { | ||
118 | #if XORG <= 112 | ||
119 | @@ -731,8 +735,10 @@ static void vncHooksBlockHandler(ScreenP | ||
120 | |||
121 | #if XORG <= 112 | ||
122 | (*pScreen->BlockHandler) (i, blockData, pTimeout, pReadmask); | ||
123 | -#else | ||
124 | +#elif XORG <= 118 | ||
125 | (*pScreen->BlockHandler) (pScreen, pTimeout, pReadmask); | ||
126 | +#else | ||
127 | + (*pScreen->BlockHandler) (pScreen, pTimeout); | ||
128 | #endif | ||
129 | |||
130 | vncHooksScreen->ignoreHooks--; | ||
131 | @@ -1033,12 +1039,21 @@ static void vncHooksCopyClip(GCPtr dst, | ||
132 | |||
133 | // Unwrap and rewrap helpers | ||
134 | |||
135 | +#if XORG >= 116 | ||
136 | +#define GC_OP_PROLOGUE(pGC, name)\ | ||
137 | + vncHooksGCPtr pGCPriv = vncHooksGCPrivate(pGC);\ | ||
138 | + const GCFuncs *oldFuncs = pGC->funcs;\ | ||
139 | + pGC->funcs = pGCPriv->wrappedFuncs;\ | ||
140 | + pGC->ops = pGCPriv->wrappedOps; \ | ||
141 | + DBGPRINT((stderr,"vncHooks" #name " called\n")) | ||
142 | +#else | ||
143 | #define GC_OP_PROLOGUE(pGC, name)\ | ||
144 | vncHooksGCPtr pGCPriv = vncHooksGCPrivate(pGC);\ | ||
145 | GCFuncs *oldFuncs = pGC->funcs;\ | ||
146 | pGC->funcs = pGCPriv->wrappedFuncs;\ | ||
147 | pGC->ops = pGCPriv->wrappedOps; \ | ||
148 | DBGPRINT((stderr,"vncHooks" #name " called\n")) | ||
149 | +#endif | ||
150 | |||
151 | #define GC_OP_EPILOGUE(pGC)\ | ||
152 | pGCPriv->wrappedOps = pGC->ops;\ | ||
153 | diff -up tigervnc-1.7.0/unix/xserver/hw/vnc/xorg-version.h.xserver119 tigervnc-1.7.0/unix/xserver/hw/vnc/xorg-version.h | ||
154 | --- tigervnc-1.7.0/unix/xserver/hw/vnc/xorg-version.h.xserver119 2016-09-08 12:31:18.000000000 +0200 | ||
155 | +++ tigervnc-1.7.0/unix/xserver/hw/vnc/xorg-version.h 2016-10-04 17:24:51.640654527 +0200 | ||
156 | @@ -50,8 +50,10 @@ | ||
157 | #define XORG 117 | ||
158 | #elif XORG_VERSION_CURRENT < ((1 * 10000000) + (18 * 100000) + (99 * 1000)) | ||
159 | #define XORG 118 | ||
160 | +#elif XORG_VERSION_CURRENT < ((1 * 10000000) + (19 * 100000) + (99 * 1000)) | ||
161 | +#define XORG 119 | ||
162 | #else | ||
163 | -#error "X.Org newer than 1.18 is not supported" | ||
164 | +#error "X.Org newer than 1.19 is not supported" | ||
165 | #endif | ||
166 | |||
167 | #endif | ||
168 | diff -up tigervnc-1.7.0/unix/xserver/hw/vnc/XserverDesktop.cc.xserver119 tigervnc-1.7.0/unix/xserver/hw/vnc/XserverDesktop.cc | ||
169 | --- tigervnc-1.7.0/unix/xserver/hw/vnc/XserverDesktop.cc.xserver119 2016-09-08 12:31:18.000000000 +0200 | ||
170 | +++ tigervnc-1.7.0/unix/xserver/hw/vnc/XserverDesktop.cc 2016-10-04 17:23:47.171977905 +0200 | ||
171 | @@ -89,6 +89,30 @@ public: | ||
172 | XserverDesktop* desktop; | ||
173 | }; | ||
174 | |||
175 | +#if XORG >= 119 | ||
176 | +extern "C" { | ||
177 | +/* | ||
178 | + * xserver NotifyFd callbacks. Note we also expect write notifies to work, | ||
179 | + * which only works with xserver >= 1.19. | ||
180 | + */ | ||
181 | +#include "os.h" | ||
182 | + | ||
183 | +static void HandleListenFd(int fd, int xevents, void *data) | ||
184 | +{ | ||
185 | + XserverDesktop *desktop = (XserverDesktop *)data; | ||
186 | + | ||
187 | + desktop->handleListenFd(fd); | ||
188 | +} | ||
189 | + | ||
190 | +static void HandleSocketFd(int fd, int xevents, void *data) | ||
191 | +{ | ||
192 | + XserverDesktop *desktop = (XserverDesktop *)data; | ||
193 | + | ||
194 | + desktop->handleSocketFd(fd, xevents); | ||
195 | +} | ||
196 | + | ||
197 | +} | ||
198 | +#endif | ||
199 | |||
200 | XserverDesktop::XserverDesktop(int screenIndex_, | ||
201 | std::list<network::TcpListener*> listeners_, | ||
202 | @@ -110,15 +134,35 @@ XserverDesktop::XserverDesktop(int scree | ||
203 | |||
204 | if (!httpListeners.empty ()) | ||
205 | httpServer = new FileHTTPServer(this); | ||
206 | + | ||
207 | +#if XORG >= 119 | ||
208 | + for (std::list<TcpListener*>::iterator i = listeners.begin(); | ||
209 | + i != listeners.end(); | ||
210 | + i++) { | ||
211 | + SetNotifyFd((*i)->getFd(), HandleListenFd, X_NOTIFY_READ, this); | ||
212 | + } | ||
213 | + | ||
214 | + for (std::list<TcpListener*>::iterator i = httpListeners.begin(); | ||
215 | + i != httpListeners.end(); | ||
216 | + i++) { | ||
217 | + SetNotifyFd((*i)->getFd(), HandleListenFd, X_NOTIFY_READ, this); | ||
218 | + } | ||
219 | +#endif | ||
220 | } | ||
221 | |||
222 | XserverDesktop::~XserverDesktop() | ||
223 | { | ||
224 | while (!listeners.empty()) { | ||
225 | +#if XORG >= 119 | ||
226 | + RemoveNotifyFd(listeners.back()->getFd()); | ||
227 | +#endif | ||
228 | delete listeners.back(); | ||
229 | listeners.pop_back(); | ||
230 | } | ||
231 | while (!httpListeners.empty()) { | ||
232 | +#if XORG >= 119 | ||
233 | + RemoveNotifyFd(listeners.back()->getFd()); | ||
234 | +#endif | ||
235 | delete httpListeners.back(); | ||
236 | httpListeners.pop_back(); | ||
237 | } | ||
238 | @@ -388,6 +432,140 @@ void XserverDesktop::add_copied(const rf | ||
239 | } | ||
240 | } | ||
241 | |||
242 | +#if XORG >= 119 | ||
243 | +void XserverDesktop::handleListenFd(int fd) | ||
244 | +{ | ||
245 | + std::list<TcpListener*>::iterator i; | ||
246 | + SocketServer *fd_server = NULL; | ||
247 | + bool is_http = false; | ||
248 | + | ||
249 | + for (i = listeners.begin(); i != listeners.end(); i++) { | ||
250 | + if ((*i)->getFd() == fd) { | ||
251 | + fd_server = server; | ||
252 | + break; | ||
253 | + } | ||
254 | + } | ||
255 | + if (httpServer && !fd_server) { | ||
256 | + for (i = httpListeners.begin(); i != httpListeners.end(); i++) { | ||
257 | + if ((*i)->getFd() == fd) { | ||
258 | + fd_server = httpServer; | ||
259 | + is_http = true; | ||
260 | + break; | ||
261 | + } | ||
262 | + } | ||
263 | + } | ||
264 | + if (!fd_server) { | ||
265 | + vlog.error("XserverDesktop::handleListenFd: Error cannot find fd"); | ||
266 | + return; | ||
267 | + } | ||
268 | + | ||
269 | + Socket* sock = (*i)->accept(); | ||
270 | + sock->outStream().setBlocking(false); | ||
271 | + vlog.debug("new %sclient, sock %d", is_http ? "http " : "", sock->getFd()); | ||
272 | + fd_server->addSocket(sock); | ||
273 | + SetNotifyFd(sock->getFd(), HandleSocketFd, X_NOTIFY_READ, this); | ||
274 | +} | ||
275 | + | ||
276 | +void XserverDesktop::handleSocketFd(int fd, int xevents) | ||
277 | +{ | ||
278 | + std::list<Socket*> sockets; | ||
279 | + std::list<Socket*>::iterator i; | ||
280 | + SocketServer *fd_server = NULL; | ||
281 | + bool is_http = false; | ||
282 | + | ||
283 | + server->getSockets(&sockets); | ||
284 | + for (i = sockets.begin(); i != sockets.end(); i++) { | ||
285 | + if ((*i)->getFd() == fd) { | ||
286 | + fd_server = server; | ||
287 | + break; | ||
288 | + } | ||
289 | + } | ||
290 | + if (httpServer && !fd_server) { | ||
291 | + httpServer->getSockets(&sockets); | ||
292 | + for (i = sockets.begin(); i != sockets.end(); i++) { | ||
293 | + if ((*i)->getFd() == fd) { | ||
294 | + fd_server = httpServer; | ||
295 | + is_http = true; | ||
296 | + break; | ||
297 | + } | ||
298 | + } | ||
299 | + } | ||
300 | + if (!fd_server) { | ||
301 | + vlog.error("XserverDesktop::handleSocketFd: Error cannot find fd"); | ||
302 | + return; | ||
303 | + } | ||
304 | + | ||
305 | + if (xevents & X_NOTIFY_READ) | ||
306 | + fd_server->processSocketReadEvent(*i); | ||
307 | + | ||
308 | + if (xevents & X_NOTIFY_WRITE) | ||
309 | + fd_server->processSocketWriteEvent(*i); | ||
310 | + | ||
311 | + if ((*i)->isShutdown()) { | ||
312 | + vlog.debug("%sclient gone, sock %d", is_http ? "http " : "", fd); | ||
313 | + RemoveNotifyFd(fd); | ||
314 | + fd_server->removeSocket(*i); | ||
315 | + if (!is_http) | ||
316 | + vncClientGone(fd); | ||
317 | + delete (*i); | ||
318 | + } | ||
319 | +} | ||
320 | + | ||
321 | +void XserverDesktop::blockHandler(int* timeout) | ||
322 | +{ | ||
323 | + // We don't have a good callback for when we can init input devices[1], | ||
324 | + // so we abuse the fact that this routine will be called first thing | ||
325 | + // once the dix is done initialising. | ||
326 | + // [1] Technically Xvnc has InitInput(), but libvnc.so has nothing. | ||
327 | + vncInitInputDevice(); | ||
328 | + | ||
329 | + try { | ||
330 | + std::list<Socket*> sockets; | ||
331 | + std::list<Socket*>::iterator i; | ||
332 | + server->getSockets(&sockets); | ||
333 | + for (i = sockets.begin(); i != sockets.end(); i++) { | ||
334 | + int fd = (*i)->getFd(); | ||
335 | + if ((*i)->isShutdown()) { | ||
336 | + vlog.debug("client gone, sock %d",fd); | ||
337 | + server->removeSocket(*i); | ||
338 | + vncClientGone(fd); | ||
339 | + delete (*i); | ||
340 | + } else { | ||
341 | + /* Update existing NotifyFD to listen for write (or not) */ | ||
342 | + if ((*i)->outStream().bufferUsage() > 0) | ||
343 | + SetNotifyFd(fd, HandleSocketFd, X_NOTIFY_READ | X_NOTIFY_WRITE, this); | ||
344 | + else | ||
345 | + SetNotifyFd(fd, HandleSocketFd, X_NOTIFY_READ, this); | ||
346 | + } | ||
347 | + } | ||
348 | + if (httpServer) { | ||
349 | + httpServer->getSockets(&sockets); | ||
350 | + for (i = sockets.begin(); i != sockets.end(); i++) { | ||
351 | + int fd = (*i)->getFd(); | ||
352 | + if ((*i)->isShutdown()) { | ||
353 | + vlog.debug("http client gone, sock %d",fd); | ||
354 | + httpServer->removeSocket(*i); | ||
355 | + delete (*i); | ||
356 | + } else { | ||
357 | + /* Update existing NotifyFD to listen for write (or not) */ | ||
358 | + if ((*i)->outStream().bufferUsage() > 0) | ||
359 | + SetNotifyFd(fd, HandleSocketFd, X_NOTIFY_READ | X_NOTIFY_WRITE, this); | ||
360 | + else | ||
361 | + SetNotifyFd(fd, HandleSocketFd, X_NOTIFY_READ, this); | ||
362 | + } | ||
363 | + } | ||
364 | + } | ||
365 | + | ||
366 | + int nextTimeout = server->checkTimeouts(); | ||
367 | + if (nextTimeout > 0 && (*timeout == -1 || nextTimeout < *timeout)) | ||
368 | + *timeout = nextTimeout; | ||
369 | + } catch (rdr::Exception& e) { | ||
370 | + vlog.error("XserverDesktop::blockHandler: %s",e.str()); | ||
371 | + } | ||
372 | +} | ||
373 | + | ||
374 | +#else | ||
375 | + | ||
376 | void XserverDesktop::readBlockHandler(fd_set* fds, struct timeval ** timeout) | ||
377 | { | ||
378 | // We don't have a good callback for when we can init input devices[1], | ||
379 | @@ -600,10 +778,15 @@ void XserverDesktop::writeWakeupHandler( | ||
380 | } | ||
381 | } | ||
382 | |||
383 | +#endif | ||
384 | + | ||
385 | void XserverDesktop::addClient(Socket* sock, bool reverse) | ||
386 | { | ||
387 | vlog.debug("new client, sock %d reverse %d",sock->getFd(),reverse); | ||
388 | server->addSocket(sock, reverse); | ||
389 | +#if XORG >= 119 | ||
390 | + SetNotifyFd(sock->getFd(), HandleSocketFd, X_NOTIFY_READ, this); | ||
391 | +#endif | ||
392 | } | ||
393 | |||
394 | void XserverDesktop::disconnectClients() | ||
395 | diff -up tigervnc-1.7.0/unix/xserver/hw/vnc/XserverDesktop.h.xserver119 tigervnc-1.7.0/unix/xserver/hw/vnc/XserverDesktop.h | ||
396 | --- tigervnc-1.7.0/unix/xserver/hw/vnc/XserverDesktop.h.xserver119 2016-09-08 12:31:18.000000000 +0200 | ||
397 | +++ tigervnc-1.7.0/unix/xserver/hw/vnc/XserverDesktop.h 2016-10-04 17:17:35.617889712 +0200 | ||
398 | @@ -38,6 +38,7 @@ | ||
399 | #include <rfb/VNCServerST.h> | ||
400 | #include <rdr/SubstitutingInStream.h> | ||
401 | #include "Input.h" | ||
402 | +#include "xorg-version.h" | ||
403 | |||
404 | namespace rfb { | ||
405 | class VNCServerST; | ||
406 | @@ -69,10 +70,16 @@ public: | ||
407 | const unsigned char *rgbaData); | ||
408 | void add_changed(const rfb::Region ®ion); | ||
409 | void add_copied(const rfb::Region &dest, const rfb::Point &delta); | ||
410 | +#if XORG >= 119 | ||
411 | + void handleListenFd(int fd); | ||
412 | + void handleSocketFd(int fd, int xevents); | ||
413 | + void blockHandler(int* timeout); | ||
414 | +#else | ||
415 | void readBlockHandler(fd_set* fds, struct timeval ** timeout); | ||
416 | void readWakeupHandler(fd_set* fds, int nfds); | ||
417 | void writeBlockHandler(fd_set* fds, struct timeval ** timeout); | ||
418 | void writeWakeupHandler(fd_set* fds, int nfds); | ||
419 | +#endif | ||
420 | void addClient(network::Socket* sock, bool reverse); | ||
421 | void disconnectClients(); | ||
422 |