1 |
diff -up tigervnc-1.7.0/unix/xserver/hw/vnc/vncBlockHandler.c.xserver119 tigervnc-1.7.0/unix/xserver/hw/vnc/vncBlockHandler.c |
diff -up xserver/configure.ac.xserver116-rebased xserver/configure.ac |
2 |
--- tigervnc-1.7.0/unix/xserver/hw/vnc/vncBlockHandler.c.xserver119 2016-09-08 12:31:18.000000000 +0200 |
--- xserver/configure.ac.xserver116-rebased 2016-09-29 13:14:45.595441590 +0200 |
3 |
+++ tigervnc-1.7.0/unix/xserver/hw/vnc/vncBlockHandler.c 2016-10-04 17:17:35.618889747 +0200 |
+++ xserver/configure.ac 2016-09-29 13:14:45.631442006 +0200 |
4 |
@@ -30,6 +30,23 @@ |
@@ -74,6 +74,7 @@ dnl forcing an entire recompile.x |
5 |
|
AC_CONFIG_HEADERS(include/version-config.h) |
6 |
#include "vncExtInit.h" |
|
7 |
#include "vncBlockHandler.h" |
AM_PROG_AS |
8 |
+#include "xorg-version.h" |
+AC_PROG_CXX |
9 |
+ |
AC_PROG_LN_S |
10 |
+#if XORG >= 119 |
LT_PREREQ([2.2]) |
11 |
+ |
LT_INIT([disable-static win32-dll]) |
12 |
+static void vncBlockHandler(void* data, void* timeout) |
@@ -1863,6 +1864,10 @@ if test "x$XVFB" = xyes; then |
13 |
+{ |
AC_SUBST([XVFB_SYS_LIBS]) |
14 |
+ vncCallBlockHandlers(timeout); |
fi |
15 |
+} |
|
16 |
+ |
+dnl Xvnc DDX |
17 |
+void vncRegisterBlockHandlers(void) |
+AC_SUBST([XVNC_CPPFLAGS], ["-DHAVE_DIX_CONFIG_H $XSERVER_CFLAGS"]) |
18 |
+{ |
+AC_SUBST([XVNC_LIBS], ["$FB_LIB $FIXES_LIB $XEXT_LIB $CONFIG_LIB $DBE_LIB $RECORD_LIB $GLX_LIBS $RANDR_LIB $RENDER_LIB $DAMAGE_LIB $DRI3_LIB $PRESENT_LIB $MIEXT_SYNC_LIB $MIEXT_DAMAGE_LIB $MIEXT_SHADOW_LIB $XI_LIB $XKB_LIB $XKB_STUB_LIB $COMPOSITE_LIB $MAIN_LIB"]) |
19 |
+ if (!RegisterBlockAndWakeupHandlers(vncBlockHandler, |
+AC_SUBST([XVNC_SYS_LIBS], ["$GLX_SYS_LIBS"]) |
20 |
+ (ServerWakeupHandlerProcPtr)NoopDDA, 0)) |
|
21 |
+ FatalError("RegisterBlockAndWakeupHandlers() failed\n"); |
dnl Xnest DDX |
22 |
+} |
|
23 |
+ |
@@ -1898,6 +1903,8 @@ if test "x$XORG" = xauto; then |
24 |
+#else |
fi |
25 |
|
AC_MSG_RESULT([$XORG]) |
26 |
static void vncBlockHandler(void * data, OSTimePtr t, void * readmask); |
|
27 |
static void vncWakeupHandler(void * data, int nfds, void * readmask); |
+AC_DEFINE_UNQUOTED(XORG_VERSION_CURRENT, [$VENDOR_RELEASE], [Current Xorg version]) |
28 |
@@ -144,3 +161,5 @@ static void vncWriteWakeupHandlerFallbac |
+ |
29 |
|
if test "x$XORG" = xyes; then |
30 |
vncWriteWakeupHandler(ret, &fallbackFds); |
XORG_DDXINCS='-I$(top_srcdir)/hw/xfree86 -I$(top_srcdir)/hw/xfree86/include -I$(top_srcdir)/hw/xfree86/common' |
31 |
} |
XORG_OSINCS='-I$(top_srcdir)/hw/xfree86/os-support -I$(top_srcdir)/hw/xfree86/os-support/bus -I$(top_srcdir)/os' |
32 |
+ |
@@ -2116,7 +2123,6 @@ if test "x$XORG" = xyes; then |
33 |
+#endif |
AC_DEFINE(XORG_SERVER, 1, [Building Xorg server]) |
34 |
diff -up tigervnc-1.7.0/unix/xserver/hw/vnc/vncExtInit.cc.xserver119 tigervnc-1.7.0/unix/xserver/hw/vnc/vncExtInit.cc |
AC_DEFINE(XORGSERVER, 1, [Building Xorg server]) |
35 |
--- tigervnc-1.7.0/unix/xserver/hw/vnc/vncExtInit.cc.xserver119 2016-09-08 12:31:18.000000000 +0200 |
AC_DEFINE(XFree86Server, 1, [Building XFree86 server]) |
36 |
+++ tigervnc-1.7.0/unix/xserver/hw/vnc/vncExtInit.cc 2016-10-04 17:17:35.618889747 +0200 |
- AC_DEFINE_UNQUOTED(XORG_VERSION_CURRENT, [$VENDOR_RELEASE], [Current Xorg version]) |
37 |
@@ -241,6 +241,17 @@ int vncExtensionIsActive(int scrIdx) |
AC_DEFINE(NEED_XF86_TYPES, 1, [Need XFree86 typedefs]) |
38 |
return (desktop[scrIdx] != NULL); |
AC_DEFINE(NEED_XF86_PROTOTYPES, 1, [Need XFree86 helper functions]) |
39 |
} |
AC_DEFINE(__XSERVERNAME__, "Xorg", [Name of X server]) |
40 |
|
@@ -2691,6 +2697,7 @@ hw/dmx/Makefile |
41 |
+#if XORG >= 119 |
hw/dmx/man/Makefile |
42 |
+ |
hw/vfb/Makefile |
43 |
+void vncCallBlockHandlers(int* timeout) |
hw/vfb/man/Makefile |
44 |
+{ |
+hw/vnc/Makefile |
45 |
+ for (int scr = 0; scr < vncGetScreenCount(); scr++) |
hw/xnest/Makefile |
46 |
+ if (desktop[scr]) |
hw/xnest/man/Makefile |
47 |
+ desktop[scr]->blockHandler(timeout); |
hw/xwin/Makefile |
48 |
+} |
diff -up xserver/hw/Makefile.am.xserver116-rebased xserver/hw/Makefile.am |
49 |
+ |
--- xserver/hw/Makefile.am.xserver116-rebased 2016-09-29 13:14:45.601441659 +0200 |
50 |
+#else |
+++ xserver/hw/Makefile.am 2016-09-29 13:14:45.631442006 +0200 |
51 |
+ |
@@ -38,7 +38,8 @@ SUBDIRS = \ |
52 |
void vncCallReadBlockHandlers(fd_set * fds, struct timeval ** timeout) |
$(DMX_SUBDIRS) \ |
53 |
{ |
$(KDRIVE_SUBDIRS) \ |
54 |
for (int scr = 0; scr < vncGetScreenCount(); scr++) |
$(XQUARTZ_SUBDIRS) \ |
55 |
@@ -269,6 +280,8 @@ void vncCallWriteWakeupHandlers(fd_set * |
- $(XWAYLAND_SUBDIRS) |
56 |
desktop[scr]->writeWakeupHandler(fds, nfds); |
+ $(XWAYLAND_SUBDIRS) \ |
57 |
} |
+ vnc |
58 |
|
|
59 |
+#endif |
DIST_SUBDIRS = dmx xfree86 vfb xnest xwin xquartz kdrive xwayland |
60 |
+ |
|
61 |
int vncGetAvoidShiftNumLock(void) |
diff -up xserver/mi/miinitext.c.xserver116-rebased xserver/mi/miinitext.c |
62 |
{ |
--- xserver/mi/miinitext.c.xserver116-rebased 2016-09-29 13:14:45.618441855 +0200 |
63 |
return (bool)avoidShiftNumLock; |
+++ xserver/mi/miinitext.c 2016-09-29 13:14:45.631442006 +0200 |
64 |
diff -up tigervnc-1.7.0/unix/xserver/hw/vnc/vncExtInit.h.xserver119 tigervnc-1.7.0/unix/xserver/hw/vnc/vncExtInit.h |
@@ -114,6 +114,10 @@ SOFTWARE. |
65 |
--- tigervnc-1.7.0/unix/xserver/hw/vnc/vncExtInit.h.xserver119 2016-09-08 12:31:18.000000000 +0200 |
#include "micmap.h" |
66 |
+++ tigervnc-1.7.0/unix/xserver/hw/vnc/vncExtInit.h 2016-10-04 17:17:35.618889747 +0200 |
#include "globals.h" |
67 |
@@ -22,6 +22,7 @@ |
|
68 |
#include <stdint.h> |
+#ifdef TIGERVNC |
69 |
#include <stddef.h> |
+extern void vncExtensionInit(INITARGS); |
70 |
#include <sys/select.h> |
+#endif |
71 |
+#include "xorg-version.h" |
+ |
72 |
|
/* The following is only a small first step towards run-time |
73 |
// Only from C++ |
* configurable extensions. |
74 |
#ifdef __cplusplus |
*/ |
75 |
@@ -52,10 +53,14 @@ extern int vncInetdSock; |
@@ -238,6 +242,9 @@ EnableDisableExtensionError(const char * |
76 |
void vncExtensionInit(void); |
|
77 |
int vncExtensionIsActive(int scrIdx); |
/* List of built-in (statically linked) extensions */ |
78 |
|
static const ExtensionModule staticExtensions[] = { |
79 |
+#if XORG >= 119 |
+#ifdef TIGERVNC |
80 |
+void vncCallBlockHandlers(int* timeout); |
+ {vncExtensionInit, "VNC-EXTENSION", NULL}, |
81 |
+#else |
+#endif |
82 |
void vncCallReadBlockHandlers(fd_set * fds, struct timeval ** timeout); |
{GEExtensionInit, "Generic Event Extension", &noGEExtension}, |
83 |
void vncCallReadWakeupHandlers(fd_set * fds, int nfds); |
{ShapeExtensionInit, "SHAPE", NULL}, |
84 |
void vncCallWriteBlockHandlers(fd_set * fds, struct timeval ** timeout); |
#ifdef MITSHM |
85 |
void vncCallWriteWakeupHandlers(fd_set * fds, int nfds); |
--- xserver/include/os.h~ 2016-10-03 09:07:29.000000000 +0200 |
86 |
+#endif |
+++ xserver/include/os.h 2016-10-03 14:13:00.013654506 +0200 |
87 |
|
@@ -621,7 +621,7 @@ |
88 |
int vncGetAvoidShiftNumLock(void); |
extern _X_EXPORT void |
89 |
|
LogClose(enum ExitCode error); |
90 |
diff -up tigervnc-1.7.0/unix/xserver/hw/vnc/vncHooks.c.xserver119 tigervnc-1.7.0/unix/xserver/hw/vnc/vncHooks.c |
extern _X_EXPORT Bool |
91 |
--- tigervnc-1.7.0/unix/xserver/hw/vnc/vncHooks.c.xserver119 2016-09-08 12:31:18.000000000 +0200 |
-LogSetParameter(LogParameter param, int value); |
92 |
+++ tigervnc-1.7.0/unix/xserver/hw/vnc/vncHooks.c 2016-10-04 17:17:35.618889747 +0200 |
+LogSetParameter(enum _LogParameter param, int value); |
93 |
@@ -128,9 +128,11 @@ static Bool vncHooksDisplayCursor(Device |
extern _X_EXPORT void |
94 |
#if XORG <= 112 |
LogVWrite(int verb, const char *f, va_list args) |
95 |
static void vncHooksBlockHandler(int i, pointer blockData, pointer pTimeout, |
_X_ATTRIBUTE_PRINTF(2, 0); |
|
pointer pReadmask); |
|
|
-#else |
|
|
+#elif XORG <= 118 |
|
|
static void vncHooksBlockHandler(ScreenPtr pScreen, void * pTimeout, |
|
|
void * pReadmask); |
|
|
+#else |
|
|
+static void vncHooksBlockHandler(ScreenPtr pScreen, void * pTimeout); |
|
|
#endif |
|
|
#ifdef RENDER |
|
|
static void vncHooksComposite(CARD8 op, PicturePtr pSrc, PicturePtr pMask, |
|
|
@@ -716,9 +718,11 @@ out: |
|
|
#if XORG <= 112 |
|
|
static void vncHooksBlockHandler(int i, pointer blockData, pointer pTimeout, |
|
|
pointer pReadmask) |
|
|
-#else |
|
|
+#elif XORG <= 118 |
|
|
static void vncHooksBlockHandler(ScreenPtr pScreen_, void * pTimeout, |
|
|
void * pReadmask) |
|
|
+#else |
|
|
+static void vncHooksBlockHandler(ScreenPtr pScreen_, void * pTimeout) |
|
|
#endif |
|
|
{ |
|
|
#if XORG <= 112 |
|
|
@@ -731,8 +735,10 @@ static void vncHooksBlockHandler(ScreenP |
|
|
|
|
|
#if XORG <= 112 |
|
|
(*pScreen->BlockHandler) (i, blockData, pTimeout, pReadmask); |
|
|
-#else |
|
|
+#elif XORG <= 118 |
|
|
(*pScreen->BlockHandler) (pScreen, pTimeout, pReadmask); |
|
|
+#else |
|
|
+ (*pScreen->BlockHandler) (pScreen, pTimeout); |
|
|
#endif |
|
|
|
|
|
vncHooksScreen->ignoreHooks--; |
|
|
@@ -1033,12 +1039,21 @@ static void vncHooksCopyClip(GCPtr dst, |
|
|
|
|
|
// Unwrap and rewrap helpers |
|
|
|
|
|
+#if XORG >= 116 |
|
|
+#define GC_OP_PROLOGUE(pGC, name)\ |
|
|
+ vncHooksGCPtr pGCPriv = vncHooksGCPrivate(pGC);\ |
|
|
+ const GCFuncs *oldFuncs = pGC->funcs;\ |
|
|
+ pGC->funcs = pGCPriv->wrappedFuncs;\ |
|
|
+ pGC->ops = pGCPriv->wrappedOps; \ |
|
|
+ DBGPRINT((stderr,"vncHooks" #name " called\n")) |
|
|
+#else |
|
|
#define GC_OP_PROLOGUE(pGC, name)\ |
|
|
vncHooksGCPtr pGCPriv = vncHooksGCPrivate(pGC);\ |
|
|
GCFuncs *oldFuncs = pGC->funcs;\ |
|
|
pGC->funcs = pGCPriv->wrappedFuncs;\ |
|
|
pGC->ops = pGCPriv->wrappedOps; \ |
|
|
DBGPRINT((stderr,"vncHooks" #name " called\n")) |
|
|
+#endif |
|
|
|
|
|
#define GC_OP_EPILOGUE(pGC)\ |
|
|
pGCPriv->wrappedOps = pGC->ops;\ |
|
|
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 |
|
|
--- tigervnc-1.7.0/unix/xserver/hw/vnc/xorg-version.h.xserver119 2016-09-08 12:31:18.000000000 +0200 |
|
|
+++ tigervnc-1.7.0/unix/xserver/hw/vnc/xorg-version.h 2016-10-04 17:24:51.640654527 +0200 |
|
|
@@ -50,8 +50,10 @@ |
|
|
#define XORG 117 |
|
|
#elif XORG_VERSION_CURRENT < ((1 * 10000000) + (18 * 100000) + (99 * 1000)) |
|
|
#define XORG 118 |
|
|
+#elif XORG_VERSION_CURRENT < ((1 * 10000000) + (19 * 100000) + (99 * 1000)) |
|
|
+#define XORG 119 |
|
|
#else |
|
|
-#error "X.Org newer than 1.18 is not supported" |
|
|
+#error "X.Org newer than 1.19 is not supported" |
|
|
#endif |
|
|
|
|
|
#endif |
|
|
diff -up tigervnc-1.7.0/unix/xserver/hw/vnc/XserverDesktop.cc.xserver119 tigervnc-1.7.0/unix/xserver/hw/vnc/XserverDesktop.cc |
|
|
--- tigervnc-1.7.0/unix/xserver/hw/vnc/XserverDesktop.cc.xserver119 2016-09-08 12:31:18.000000000 +0200 |
|
|
+++ tigervnc-1.7.0/unix/xserver/hw/vnc/XserverDesktop.cc 2016-10-04 17:23:47.171977905 +0200 |
|
|
@@ -89,6 +89,30 @@ public: |
|
|
XserverDesktop* desktop; |
|
|
}; |
|
|
|
|
|
+#if XORG >= 119 |
|
|
+extern "C" { |
|
|
+/* |
|
|
+ * xserver NotifyFd callbacks. Note we also expect write notifies to work, |
|
|
+ * which only works with xserver >= 1.19. |
|
|
+ */ |
|
|
+#include "os.h" |
|
|
+ |
|
|
+static void HandleListenFd(int fd, int xevents, void *data) |
|
|
+{ |
|
|
+ XserverDesktop *desktop = (XserverDesktop *)data; |
|
|
+ |
|
|
+ desktop->handleListenFd(fd); |
|
|
+} |
|
|
+ |
|
|
+static void HandleSocketFd(int fd, int xevents, void *data) |
|
|
+{ |
|
|
+ XserverDesktop *desktop = (XserverDesktop *)data; |
|
|
+ |
|
|
+ desktop->handleSocketFd(fd, xevents); |
|
|
+} |
|
|
+ |
|
|
+} |
|
|
+#endif |
|
|
|
|
|
XserverDesktop::XserverDesktop(int screenIndex_, |
|
|
std::list<network::TcpListener*> listeners_, |
|
|
@@ -110,15 +134,35 @@ XserverDesktop::XserverDesktop(int scree |
|
|
|
|
|
if (!httpListeners.empty ()) |
|
|
httpServer = new FileHTTPServer(this); |
|
|
+ |
|
|
+#if XORG >= 119 |
|
|
+ for (std::list<TcpListener*>::iterator i = listeners.begin(); |
|
|
+ i != listeners.end(); |
|
|
+ i++) { |
|
|
+ SetNotifyFd((*i)->getFd(), HandleListenFd, X_NOTIFY_READ, this); |
|
|
+ } |
|
|
+ |
|
|
+ for (std::list<TcpListener*>::iterator i = httpListeners.begin(); |
|
|
+ i != httpListeners.end(); |
|
|
+ i++) { |
|
|
+ SetNotifyFd((*i)->getFd(), HandleListenFd, X_NOTIFY_READ, this); |
|
|
+ } |
|
|
+#endif |
|
|
} |
|
|
|
|
|
XserverDesktop::~XserverDesktop() |
|
|
{ |
|
|
while (!listeners.empty()) { |
|
|
+#if XORG >= 119 |
|
|
+ RemoveNotifyFd(listeners.back()->getFd()); |
|
|
+#endif |
|
|
delete listeners.back(); |
|
|
listeners.pop_back(); |
|
|
} |
|
|
while (!httpListeners.empty()) { |
|
|
+#if XORG >= 119 |
|
|
+ RemoveNotifyFd(listeners.back()->getFd()); |
|
|
+#endif |
|
|
delete httpListeners.back(); |
|
|
httpListeners.pop_back(); |
|
|
} |
|
|
@@ -388,6 +432,140 @@ void XserverDesktop::add_copied(const rf |
|
|
} |
|
|
} |
|
|
|
|
|
+#if XORG >= 119 |
|
|
+void XserverDesktop::handleListenFd(int fd) |
|
|
+{ |
|
|
+ std::list<TcpListener*>::iterator i; |
|
|
+ SocketServer *fd_server = NULL; |
|
|
+ bool is_http = false; |
|
|
+ |
|
|
+ for (i = listeners.begin(); i != listeners.end(); i++) { |
|
|
+ if ((*i)->getFd() == fd) { |
|
|
+ fd_server = server; |
|
|
+ break; |
|
|
+ } |
|
|
+ } |
|
|
+ if (httpServer && !fd_server) { |
|
|
+ for (i = httpListeners.begin(); i != httpListeners.end(); i++) { |
|
|
+ if ((*i)->getFd() == fd) { |
|
|
+ fd_server = httpServer; |
|
|
+ is_http = true; |
|
|
+ break; |
|
|
+ } |
|
|
+ } |
|
|
+ } |
|
|
+ if (!fd_server) { |
|
|
+ vlog.error("XserverDesktop::handleListenFd: Error cannot find fd"); |
|
|
+ return; |
|
|
+ } |
|
|
+ |
|
|
+ Socket* sock = (*i)->accept(); |
|
|
+ sock->outStream().setBlocking(false); |
|
|
+ vlog.debug("new %sclient, sock %d", is_http ? "http " : "", sock->getFd()); |
|
|
+ fd_server->addSocket(sock); |
|
|
+ SetNotifyFd(sock->getFd(), HandleSocketFd, X_NOTIFY_READ, this); |
|
|
+} |
|
|
+ |
|
|
+void XserverDesktop::handleSocketFd(int fd, int xevents) |
|
|
+{ |
|
|
+ std::list<Socket*> sockets; |
|
|
+ std::list<Socket*>::iterator i; |
|
|
+ SocketServer *fd_server = NULL; |
|
|
+ bool is_http = false; |
|
|
+ |
|
|
+ server->getSockets(&sockets); |
|
|
+ for (i = sockets.begin(); i != sockets.end(); i++) { |
|
|
+ if ((*i)->getFd() == fd) { |
|
|
+ fd_server = server; |
|
|
+ break; |
|
|
+ } |
|
|
+ } |
|
|
+ if (httpServer && !fd_server) { |
|
|
+ httpServer->getSockets(&sockets); |
|
|
+ for (i = sockets.begin(); i != sockets.end(); i++) { |
|
|
+ if ((*i)->getFd() == fd) { |
|
|
+ fd_server = httpServer; |
|
|
+ is_http = true; |
|
|
+ break; |
|
|
+ } |
|
|
+ } |
|
|
+ } |
|
|
+ if (!fd_server) { |
|
|
+ vlog.error("XserverDesktop::handleSocketFd: Error cannot find fd"); |
|
|
+ return; |
|
|
+ } |
|
|
+ |
|
|
+ if (xevents & X_NOTIFY_READ) |
|
|
+ fd_server->processSocketReadEvent(*i); |
|
|
+ |
|
|
+ if (xevents & X_NOTIFY_WRITE) |
|
|
+ fd_server->processSocketWriteEvent(*i); |
|
|
+ |
|
|
+ if ((*i)->isShutdown()) { |
|
|
+ vlog.debug("%sclient gone, sock %d", is_http ? "http " : "", fd); |
|
|
+ RemoveNotifyFd(fd); |
|
|
+ fd_server->removeSocket(*i); |
|
|
+ if (!is_http) |
|
|
+ vncClientGone(fd); |
|
|
+ delete (*i); |
|
|
+ } |
|
|
+} |
|
|
+ |
|
|
+void XserverDesktop::blockHandler(int* timeout) |
|
|
+{ |
|
|
+ // We don't have a good callback for when we can init input devices[1], |
|
|
+ // so we abuse the fact that this routine will be called first thing |
|
|
+ // once the dix is done initialising. |
|
|
+ // [1] Technically Xvnc has InitInput(), but libvnc.so has nothing. |
|
|
+ vncInitInputDevice(); |
|
|
+ |
|
|
+ try { |
|
|
+ std::list<Socket*> sockets; |
|
|
+ std::list<Socket*>::iterator i; |
|
|
+ server->getSockets(&sockets); |
|
|
+ for (i = sockets.begin(); i != sockets.end(); i++) { |
|
|
+ int fd = (*i)->getFd(); |
|
|
+ if ((*i)->isShutdown()) { |
|
|
+ vlog.debug("client gone, sock %d",fd); |
|
|
+ server->removeSocket(*i); |
|
|
+ vncClientGone(fd); |
|
|
+ delete (*i); |
|
|
+ } else { |
|
|
+ /* Update existing NotifyFD to listen for write (or not) */ |
|
|
+ if ((*i)->outStream().bufferUsage() > 0) |
|
|
+ SetNotifyFd(fd, HandleSocketFd, X_NOTIFY_READ | X_NOTIFY_WRITE, this); |
|
|
+ else |
|
|
+ SetNotifyFd(fd, HandleSocketFd, X_NOTIFY_READ, this); |
|
|
+ } |
|
|
+ } |
|
|
+ if (httpServer) { |
|
|
+ httpServer->getSockets(&sockets); |
|
|
+ for (i = sockets.begin(); i != sockets.end(); i++) { |
|
|
+ int fd = (*i)->getFd(); |
|
|
+ if ((*i)->isShutdown()) { |
|
|
+ vlog.debug("http client gone, sock %d",fd); |
|
|
+ httpServer->removeSocket(*i); |
|
|
+ delete (*i); |
|
|
+ } else { |
|
|
+ /* Update existing NotifyFD to listen for write (or not) */ |
|
|
+ if ((*i)->outStream().bufferUsage() > 0) |
|
|
+ SetNotifyFd(fd, HandleSocketFd, X_NOTIFY_READ | X_NOTIFY_WRITE, this); |
|
|
+ else |
|
|
+ SetNotifyFd(fd, HandleSocketFd, X_NOTIFY_READ, this); |
|
|
+ } |
|
|
+ } |
|
|
+ } |
|
|
+ |
|
|
+ int nextTimeout = server->checkTimeouts(); |
|
|
+ if (nextTimeout > 0 && (*timeout == -1 || nextTimeout < *timeout)) |
|
|
+ *timeout = nextTimeout; |
|
|
+ } catch (rdr::Exception& e) { |
|
|
+ vlog.error("XserverDesktop::blockHandler: %s",e.str()); |
|
|
+ } |
|
|
+} |
|
|
+ |
|
|
+#else |
|
|
+ |
|
|
void XserverDesktop::readBlockHandler(fd_set* fds, struct timeval ** timeout) |
|
|
{ |
|
|
// We don't have a good callback for when we can init input devices[1], |
|
|
@@ -600,10 +778,15 @@ void XserverDesktop::writeWakeupHandler( |
|
|
} |
|
|
} |
|
|
|
|
|
+#endif |
|
|
+ |
|
|
void XserverDesktop::addClient(Socket* sock, bool reverse) |
|
|
{ |
|
|
vlog.debug("new client, sock %d reverse %d",sock->getFd(),reverse); |
|
|
server->addSocket(sock, reverse); |
|
|
+#if XORG >= 119 |
|
|
+ SetNotifyFd(sock->getFd(), HandleSocketFd, X_NOTIFY_READ, this); |
|
|
+#endif |
|
|
} |
|
|
|
|
|
void XserverDesktop::disconnectClients() |
|
|
diff -up tigervnc-1.7.0/unix/xserver/hw/vnc/XserverDesktop.h.xserver119 tigervnc-1.7.0/unix/xserver/hw/vnc/XserverDesktop.h |
|
|
--- tigervnc-1.7.0/unix/xserver/hw/vnc/XserverDesktop.h.xserver119 2016-09-08 12:31:18.000000000 +0200 |
|
|
+++ tigervnc-1.7.0/unix/xserver/hw/vnc/XserverDesktop.h 2016-10-04 17:17:35.617889712 +0200 |
|
|
@@ -38,6 +38,7 @@ |
|
|
#include <rfb/VNCServerST.h> |
|
|
#include <rdr/SubstitutingInStream.h> |
|
|
#include "Input.h" |
|
|
+#include "xorg-version.h" |
|
|
|
|
|
namespace rfb { |
|
|
class VNCServerST; |
|
|
@@ -69,10 +70,16 @@ public: |
|
|
const unsigned char *rgbaData); |
|
|
void add_changed(const rfb::Region ®ion); |
|
|
void add_copied(const rfb::Region &dest, const rfb::Point &delta); |
|
|
+#if XORG >= 119 |
|
|
+ void handleListenFd(int fd); |
|
|
+ void handleSocketFd(int fd, int xevents); |
|
|
+ void blockHandler(int* timeout); |
|
|
+#else |
|
|
void readBlockHandler(fd_set* fds, struct timeval ** timeout); |
|
|
void readWakeupHandler(fd_set* fds, int nfds); |
|
|
void writeBlockHandler(fd_set* fds, struct timeval ** timeout); |
|
|
void writeWakeupHandler(fd_set* fds, int nfds); |
|
|
+#endif |
|
|
void addClient(network::Socket* sock, bool reverse); |
|
|
void disconnectClients(); |
|
|
|
|