]> git.pld-linux.org Git - packages/tigervnc.git/blob - tigervnc-xserver.patch
067960b74e2bd61c05b98da7436f5d7baf5c8322
[packages/tigervnc.git] / tigervnc-xserver.patch
1 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 &region);
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  
This page took 0.0802 seconds and 2 git commands to generate.