From 5feba83ba3a5d11ceedf3b276fa8ce1258822080 Mon Sep 17 00:00:00 2001 From: Hans de Goede Date: Oct 04 2016 16:04:55 +0000 Subject: Update tigervnc-1.7.0-xserver119-support.patch to also request write notfication when necessary --- diff --git a/tigervnc-1.7.0-xserver119-support.patch b/tigervnc-1.7.0-xserver119-support.patch index f45e9c3..067960b 100644 --- a/tigervnc-1.7.0-xserver119-support.patch +++ b/tigervnc-1.7.0-xserver119-support.patch @@ -1,7 +1,174 @@ -diff -ur tigervnc-1.7.0/unix/xserver/hw/vnc/XserverDesktop.cc tigervnc-1.7.0.new/unix/xserver/hw/vnc/XserverDesktop.cc ---- tigervnc-1.7.0/unix/xserver/hw/vnc/XserverDesktop.cc 2016-09-08 12:31:18.000000000 +0200 -+++ tigervnc-1.7.0.new/unix/xserver/hw/vnc/XserverDesktop.cc 2016-10-03 15:04:48.844035351 +0200 -@@ -89,6 +89,30 @@ +diff -up tigervnc-1.7.0/unix/xserver/hw/vnc/vncBlockHandler.c.xserver119 tigervnc-1.7.0/unix/xserver/hw/vnc/vncBlockHandler.c +--- tigervnc-1.7.0/unix/xserver/hw/vnc/vncBlockHandler.c.xserver119 2016-09-08 12:31:18.000000000 +0200 ++++ tigervnc-1.7.0/unix/xserver/hw/vnc/vncBlockHandler.c 2016-10-04 17:17:35.618889747 +0200 +@@ -30,6 +30,23 @@ + + #include "vncExtInit.h" + #include "vncBlockHandler.h" ++#include "xorg-version.h" ++ ++#if XORG >= 119 ++ ++static void vncBlockHandler(void* data, void* timeout) ++{ ++ vncCallBlockHandlers(timeout); ++} ++ ++void vncRegisterBlockHandlers(void) ++{ ++ if (!RegisterBlockAndWakeupHandlers(vncBlockHandler, ++ (ServerWakeupHandlerProcPtr)NoopDDA, 0)) ++ FatalError("RegisterBlockAndWakeupHandlers() failed\n"); ++} ++ ++#else + + static void vncBlockHandler(void * data, OSTimePtr t, void * readmask); + static void vncWakeupHandler(void * data, int nfds, void * readmask); +@@ -144,3 +161,5 @@ static void vncWriteWakeupHandlerFallbac + + vncWriteWakeupHandler(ret, &fallbackFds); + } ++ ++#endif +diff -up tigervnc-1.7.0/unix/xserver/hw/vnc/vncExtInit.cc.xserver119 tigervnc-1.7.0/unix/xserver/hw/vnc/vncExtInit.cc +--- tigervnc-1.7.0/unix/xserver/hw/vnc/vncExtInit.cc.xserver119 2016-09-08 12:31:18.000000000 +0200 ++++ tigervnc-1.7.0/unix/xserver/hw/vnc/vncExtInit.cc 2016-10-04 17:17:35.618889747 +0200 +@@ -241,6 +241,17 @@ int vncExtensionIsActive(int scrIdx) + return (desktop[scrIdx] != NULL); + } + ++#if XORG >= 119 ++ ++void vncCallBlockHandlers(int* timeout) ++{ ++ for (int scr = 0; scr < vncGetScreenCount(); scr++) ++ if (desktop[scr]) ++ desktop[scr]->blockHandler(timeout); ++} ++ ++#else ++ + void vncCallReadBlockHandlers(fd_set * fds, struct timeval ** timeout) + { + for (int scr = 0; scr < vncGetScreenCount(); scr++) +@@ -269,6 +280,8 @@ void vncCallWriteWakeupHandlers(fd_set * + desktop[scr]->writeWakeupHandler(fds, nfds); + } + ++#endif ++ + int vncGetAvoidShiftNumLock(void) + { + return (bool)avoidShiftNumLock; +diff -up tigervnc-1.7.0/unix/xserver/hw/vnc/vncExtInit.h.xserver119 tigervnc-1.7.0/unix/xserver/hw/vnc/vncExtInit.h +--- tigervnc-1.7.0/unix/xserver/hw/vnc/vncExtInit.h.xserver119 2016-09-08 12:31:18.000000000 +0200 ++++ tigervnc-1.7.0/unix/xserver/hw/vnc/vncExtInit.h 2016-10-04 17:17:35.618889747 +0200 +@@ -22,6 +22,7 @@ + #include + #include + #include ++#include "xorg-version.h" + + // Only from C++ + #ifdef __cplusplus +@@ -52,10 +53,14 @@ extern int vncInetdSock; + void vncExtensionInit(void); + int vncExtensionIsActive(int scrIdx); + ++#if XORG >= 119 ++void vncCallBlockHandlers(int* timeout); ++#else + void vncCallReadBlockHandlers(fd_set * fds, struct timeval ** timeout); + void vncCallReadWakeupHandlers(fd_set * fds, int nfds); + void vncCallWriteBlockHandlers(fd_set * fds, struct timeval ** timeout); + void vncCallWriteWakeupHandlers(fd_set * fds, int nfds); ++#endif + + int vncGetAvoidShiftNumLock(void); + +diff -up tigervnc-1.7.0/unix/xserver/hw/vnc/vncHooks.c.xserver119 tigervnc-1.7.0/unix/xserver/hw/vnc/vncHooks.c +--- tigervnc-1.7.0/unix/xserver/hw/vnc/vncHooks.c.xserver119 2016-09-08 12:31:18.000000000 +0200 ++++ tigervnc-1.7.0/unix/xserver/hw/vnc/vncHooks.c 2016-10-04 17:17:35.618889747 +0200 +@@ -128,9 +128,11 @@ static Bool vncHooksDisplayCursor(Device + #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 + #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; }; @@ -32,7 +199,7 @@ diff -ur tigervnc-1.7.0/unix/xserver/hw/vnc/XserverDesktop.cc tigervnc-1.7.0.new XserverDesktop::XserverDesktop(int screenIndex_, std::list listeners_, -@@ -110,15 +134,35 @@ +@@ -110,15 +134,35 @@ XserverDesktop::XserverDesktop(int scree if (!httpListeners.empty ()) httpServer = new FileHTTPServer(this); @@ -68,7 +235,7 @@ diff -ur tigervnc-1.7.0/unix/xserver/hw/vnc/XserverDesktop.cc tigervnc-1.7.0.new delete httpListeners.back(); httpListeners.pop_back(); } -@@ -388,6 +432,100 @@ +@@ -388,6 +432,140 @@ void XserverDesktop::add_copied(const rf } } @@ -159,9 +326,49 @@ diff -ur tigervnc-1.7.0/unix/xserver/hw/vnc/XserverDesktop.cc tigervnc-1.7.0.new + // [1] Technically Xvnc has InitInput(), but libvnc.so has nothing. + vncInitInputDevice(); + -+ int nextTimeout = server->checkTimeouts(); -+ if (nextTimeout > 0 && (*timeout == -1 || nextTimeout < *timeout)) ++ try { ++ std::list sockets; ++ std::list::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 @@ -169,7 +376,7 @@ diff -ur tigervnc-1.7.0/unix/xserver/hw/vnc/XserverDesktop.cc tigervnc-1.7.0.new 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 +738,15 @@ +@@ -600,10 +778,15 @@ void XserverDesktop::writeWakeupHandler( } } @@ -185,9 +392,9 @@ diff -ur tigervnc-1.7.0/unix/xserver/hw/vnc/XserverDesktop.cc tigervnc-1.7.0.new } void XserverDesktop::disconnectClients() -diff -ur tigervnc-1.7.0/unix/xserver/hw/vnc/XserverDesktop.h tigervnc-1.7.0.new/unix/xserver/hw/vnc/XserverDesktop.h ---- tigervnc-1.7.0/unix/xserver/hw/vnc/XserverDesktop.h 2016-09-08 12:31:18.000000000 +0200 -+++ tigervnc-1.7.0.new/unix/xserver/hw/vnc/XserverDesktop.h 2016-10-03 13:58:58.434844924 +0200 +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 #include @@ -196,7 +403,7 @@ diff -ur tigervnc-1.7.0/unix/xserver/hw/vnc/XserverDesktop.h tigervnc-1.7.0.new/ namespace rfb { class VNCServerST; -@@ -69,10 +70,16 @@ +@@ -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); @@ -213,170 +420,3 @@ diff -ur tigervnc-1.7.0/unix/xserver/hw/vnc/XserverDesktop.h tigervnc-1.7.0.new/ void addClient(network::Socket* sock, bool reverse); void disconnectClients(); -diff -ur tigervnc-1.7.0/unix/xserver/hw/vnc/vncBlockHandler.c tigervnc-1.7.0.new/unix/xserver/hw/vnc/vncBlockHandler.c ---- tigervnc-1.7.0/unix/xserver/hw/vnc/vncBlockHandler.c 2016-09-08 12:31:18.000000000 +0200 -+++ tigervnc-1.7.0.new/unix/xserver/hw/vnc/vncBlockHandler.c 2016-10-03 14:06:30.461357037 +0200 -@@ -30,6 +30,23 @@ - - #include "vncExtInit.h" - #include "vncBlockHandler.h" -+#include "xorg-version.h" -+ -+#if XORG >= 119 -+ -+static void vncBlockHandler(void* data, void* timeout) -+{ -+ vncCallBlockHandlers(timeout); -+} -+ -+void vncRegisterBlockHandlers(void) -+{ -+ if (!RegisterBlockAndWakeupHandlers(vncBlockHandler, -+ (ServerWakeupHandlerProcPtr)NoopDDA, 0)) -+ FatalError("RegisterBlockAndWakeupHandlers() failed\n"); -+} -+ -+#else - - static void vncBlockHandler(void * data, OSTimePtr t, void * readmask); - static void vncWakeupHandler(void * data, int nfds, void * readmask); -@@ -144,3 +161,5 @@ - - vncWriteWakeupHandler(ret, &fallbackFds); - } -+ -+#endif -diff -ur tigervnc-1.7.0/unix/xserver/hw/vnc/vncExtInit.cc tigervnc-1.7.0.new/unix/xserver/hw/vnc/vncExtInit.cc ---- tigervnc-1.7.0/unix/xserver/hw/vnc/vncExtInit.cc 2016-09-08 12:31:18.000000000 +0200 -+++ tigervnc-1.7.0.new/unix/xserver/hw/vnc/vncExtInit.cc 2016-10-03 14:08:21.109727176 +0200 -@@ -241,6 +241,17 @@ - return (desktop[scrIdx] != NULL); - } - -+#if XORG >= 119 -+ -+void vncCallBlockHandlers(int* timeout) -+{ -+ for (int scr = 0; scr < vncGetScreenCount(); scr++) -+ if (desktop[scr]) -+ desktop[scr]->blockHandler(timeout); -+} -+ -+#else -+ - void vncCallReadBlockHandlers(fd_set * fds, struct timeval ** timeout) - { - for (int scr = 0; scr < vncGetScreenCount(); scr++) -@@ -269,6 +280,8 @@ - desktop[scr]->writeWakeupHandler(fds, nfds); - } - -+#endif -+ - int vncGetAvoidShiftNumLock(void) - { - return (bool)avoidShiftNumLock; -diff -ur tigervnc-1.7.0/unix/xserver/hw/vnc/vncExtInit.h tigervnc-1.7.0.new/unix/xserver/hw/vnc/vncExtInit.h ---- tigervnc-1.7.0/unix/xserver/hw/vnc/vncExtInit.h 2016-09-08 12:31:18.000000000 +0200 -+++ tigervnc-1.7.0.new/unix/xserver/hw/vnc/vncExtInit.h 2016-10-03 14:06:34.253369722 +0200 -@@ -22,6 +22,7 @@ - #include - #include - #include -+#include "xorg-version.h" - - // Only from C++ - #ifdef __cplusplus -@@ -52,10 +53,14 @@ - void vncExtensionInit(void); - int vncExtensionIsActive(int scrIdx); - -+#if XORG >= 119 -+void vncCallBlockHandlers(int* timeout); -+#else - void vncCallReadBlockHandlers(fd_set * fds, struct timeval ** timeout); - void vncCallReadWakeupHandlers(fd_set * fds, int nfds); - void vncCallWriteBlockHandlers(fd_set * fds, struct timeval ** timeout); - void vncCallWriteWakeupHandlers(fd_set * fds, int nfds); -+#endif - - int vncGetAvoidShiftNumLock(void); - -diff -ur tigervnc-1.7.0/unix/xserver/hw/vnc/vncHooks.c tigervnc-1.7.0.new/unix/xserver/hw/vnc/vncHooks.c ---- tigervnc-1.7.0/unix/xserver/hw/vnc/vncHooks.c 2016-09-08 12:31:18.000000000 +0200 -+++ tigervnc-1.7.0.new/unix/xserver/hw/vnc/vncHooks.c 2016-10-03 13:25:54.469267290 +0200 -@@ -128,9 +128,11 @@ - #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 - #ifdef RENDER - static void vncHooksComposite(CARD8 op, PicturePtr pSrc, PicturePtr pMask, -@@ -716,9 +718,11 @@ - #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 @@ - - #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 @@ - - // 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 -ur tigervnc-1.7.0/unix/xserver/hw/vnc/xorg-version.h tigervnc-1.7.0.new/unix/xserver/hw/vnc/xorg-version.h ---- tigervnc-1.7.0/unix/xserver/hw/vnc/xorg-version.h 2016-09-08 12:31:18.000000000 +0200 -+++ tigervnc-1.7.0.new/unix/xserver/hw/vnc/xorg-version.h 2016-10-03 10:27:53.721116357 +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.18 is not supported" - #endif - - #endif diff --git a/tigervnc.spec b/tigervnc.spec index de516a0..743af9c 100644 --- a/tigervnc.spec +++ b/tigervnc.spec @@ -1,6 +1,6 @@ Name: tigervnc Version: 1.7.0 -Release: 2%{?dist} +Release: 3%{?dist} Summary: A TigerVNC remote display system %global _hardened_build 1 @@ -139,7 +139,7 @@ This package contains icons for TigerVNC viewer %prep %setup -q -%patch1 -p1 +%patch1 -p1 -b .xserver119 %patch3 -p1 -b .libvnc-os cp -r /usr/share/xorg-x11-server-source/* unix/xserver @@ -319,6 +319,10 @@ fi %{_datadir}/icons/hicolor/*/apps/* %changelog +* Tue Oct 4 2016 Hans de Goede - 1.7.0-3 +- Update tigervnc-1.7.0-xserver119-support.patch to also request write + notfication when necessary + * Mon Oct 3 2016 Hans de Goede - 1.7.0-2 - Add patches for use with xserver-1.19 - Rebuild against xserver-1.19