Update tigervnc-1.7.0-xserver119-support.patch to also request write

notfication when necessary
This commit is contained in:
Hans de Goede 2016-10-04 18:04:55 +02:00
parent fba1c6a341
commit 5feba83ba3
2 changed files with 226 additions and 182 deletions

View File

@ -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 <stdint.h>
#include <stddef.h>
#include <sys/select.h>
+#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<network::TcpListener*> 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<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
@ -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 <rfb/VNCServerST.h>
#include <rdr/SubstitutingInStream.h>
@ -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 &region);
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 <stdint.h>
#include <stddef.h>
#include <sys/select.h>
+#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

View File

@ -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 <hdegoede@redhat.com> - 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 <hdegoede@redhat.com> - 1.7.0-2
- Add patches for use with xserver-1.19
- Rebuild against xserver-1.19