Commit 1c26789e authored by dscho's avatar dscho

introduce -deferptrupdate (thanks Dave)

parent 1b81e342
...@@ -28,7 +28,7 @@ email!): Akira Hatakeyama, Karl J. Runge, Justin "Zippy" Dearing, ...@@ -28,7 +28,7 @@ email!): Akira Hatakeyama, Karl J. Runge, Justin "Zippy" Dearing,
Oliver Mihatsch, Greg Sternberg, Werner Hofer, Giampiero Giancipoli, Oliver Mihatsch, Greg Sternberg, Werner Hofer, Giampiero Giancipoli,
Glenn Mabutt, Paul Kreiner, Erik Kunze, Mike Frysinger, Martin Waitz, Glenn Mabutt, Paul Kreiner, Erik Kunze, Mike Frysinger, Martin Waitz,
Mark McLoughlin, Paul Fox, Juan Jose Costello, Andre Leiadella, Mark McLoughlin, Paul Fox, Juan Jose Costello, Andre Leiadella,
Alberto Lusiani. Alberto Lusiani, Malvina Mazin, Dave Stuart.
Probably I forgot quite a few people sending a patch here and there, which Probably I forgot quite a few people sending a patch here and there, which
really made a difference. Without those, some obscure bugs still would really made a difference. Without those, some obscure bugs still would
......
2005-12-19 Dave Stuart <dave@justdave.us>
* libvncserver/{main.c,rfbserver.c,cargs.c}, rfb/rfb.h: introduce
deferPtrUpdateTime, which defers the handling of pointer events
for a couple of milliseconds.
2005-12-19 Johannes E. Schindelin <Johannes.Schindelin@gmx.de>
* client_examples/SDLvncviewer.c, libvncclient/{sockets.c,vncviewer.c},
libvncserver/{main.c,rfbserver.c,sockets.c}: fix MinGW32 compilation
2005-12-08 "Mazin, Malvina" <Malvina.Mazin@kla-tencor.com> 2005-12-08 "Mazin, Malvina" <Malvina.Mazin@kla-tencor.com>
* configure.ac, libvncserver/sockets.c: on Solaris 2.7, write may * configure.ac, libvncserver/sockets.c: on Solaris 2.7, write may
return ENOENT when it really means EAGAIN. return ENOENT when it really means EAGAIN.
......
...@@ -29,6 +29,8 @@ rfbUsage(void) ...@@ -29,6 +29,8 @@ rfbUsage(void)
" (use plain-password as password, USE AT YOUR RISK)\n"); " (use plain-password as password, USE AT YOUR RISK)\n");
fprintf(stderr, "-deferupdate time time in ms to defer updates " fprintf(stderr, "-deferupdate time time in ms to defer updates "
"(default 40)\n"); "(default 40)\n");
fprintf(stderr, "-deferptrupdate time time in ms to defer pointer updates"
" (default none)\n");
fprintf(stderr, "-desktop name VNC desktop name (default \"LibVNCServer\")\n"); fprintf(stderr, "-desktop name VNC desktop name (default \"LibVNCServer\")\n");
fprintf(stderr, "-alwaysshared always treat new clients as shared\n"); fprintf(stderr, "-alwaysshared always treat new clients as shared\n");
fprintf(stderr, "-nevershared never treat new clients as shared\n"); fprintf(stderr, "-nevershared never treat new clients as shared\n");
...@@ -104,6 +106,12 @@ rfbProcessArguments(rfbScreenInfoPtr rfbScreen,int* argc, char *argv[]) ...@@ -104,6 +106,12 @@ rfbProcessArguments(rfbScreenInfoPtr rfbScreen,int* argc, char *argv[])
return FALSE; return FALSE;
} }
rfbScreen->deferUpdateTime = atoi(argv[++i]); rfbScreen->deferUpdateTime = atoi(argv[++i]);
} else if (strcmp(argv[i], "-deferptrupdate") == 0) { /* -deferptrupdate milliseconds */
if (i + 1 >= *argc) {
rfbUsage();
return FALSE;
}
rfbScreen->deferPtrUpdateTime = atoi(argv[++i]);
} else if (strcmp(argv[i], "-desktop") == 0) { /* -desktop desktop-name */ } else if (strcmp(argv[i], "-desktop") == 0) { /* -desktop desktop-name */
if (i + 1 >= *argc) { if (i + 1 >= *argc) {
rfbUsage(); rfbUsage();
......
...@@ -931,6 +931,27 @@ rfbProcessEvents(rfbScreenInfoPtr screen,long usec) ...@@ -931,6 +931,27 @@ rfbProcessEvents(rfbScreenInfoPtr screen,long usec)
} }
} }
} }
if (!cl->viewOnly && cl->lastPtrX >= 0) {
if(cl->startPtrDeferring.tv_usec == 0) {
gettimeofday(&cl->startPtrDeferring,NULL);
if(cl->startPtrDeferring.tv_usec == 0)
cl->startPtrDeferring.tv_usec++;
} else {
struct timeval tv;
gettimeofday(&tv,NULL);
if(tv.tv_sec < cl->startPtrDeferring.tv_sec /* at midnight */
|| ((tv.tv_sec-cl->startPtrDeferring.tv_sec)*1000
+(tv.tv_usec-cl->startPtrDeferring.tv_usec)/1000)
> cl->screen->deferPtrUpdateTime) {
cl->startPtrDeferring.tv_usec = 0;
cl->screen->ptrAddEvent(cl->lastPtrButtons,
cl->lastPtrX,
cl->lastPtrY, cl);
cl->lastPtrX = -1;
}
}
}
clPrev=cl; clPrev=cl;
cl=rfbClientIteratorNext(i); cl=rfbClientIteratorNext(i);
if(clPrev->sock==-1) { if(clPrev->sock==-1) {
......
...@@ -353,6 +353,8 @@ rfbNewTCPOrUDPClient(rfbScreenInfoPtr rfbScreen, ...@@ -353,6 +353,8 @@ rfbNewTCPOrUDPClient(rfbScreenInfoPtr rfbScreen,
cl->extensions = NULL; cl->extensions = NULL;
cl->lastPtrX = -1;
sprintf(pv,rfbProtocolVersionFormat,rfbProtocolMajorVersion, sprintf(pv,rfbProtocolVersionFormat,rfbProtocolMajorVersion,
rfbProtocolMinorVersion); rfbProtocolMinorVersion);
...@@ -1071,11 +1073,19 @@ rfbProcessClientNormalMessage(rfbClientPtr cl) ...@@ -1071,11 +1073,19 @@ rfbProcessClientNormalMessage(rfbClientPtr cl)
cl->screen->pointerClient = cl; cl->screen->pointerClient = cl;
if(!cl->viewOnly) { if(!cl->viewOnly) {
cl->screen->ptrAddEvent(msg.pe.buttonMask, if (msg.pe.buttonMask != cl->lastPtrButtons ||
Swap16IfLE(msg.pe.x), Swap16IfLE(msg.pe.y), cl); cl->screen->deferPtrUpdateTime == 0) {
} cl->screen->ptrAddEvent(msg.pe.buttonMask,
Swap16IfLE(msg.pe.x), Swap16IfLE(msg.pe.y), cl);
cl->lastPtrButtons = msg.pe.buttonMask;
} else {
cl->lastPtrX = Swap16IfLE(msg.pe.x);
cl->lastPtrY = Swap16IfLE(msg.pe.y);
cl->lastPtrButtons = msg.pe.buttonMask;
}
}
return;
return;
case rfbClientCutText: case rfbClientCutText:
......
...@@ -62,8 +62,10 @@ extern "C" ...@@ -62,8 +62,10 @@ extern "C"
#define TINI_COND(cond) (rfbLog("%s:%d TINI_COND(%s)\n",__FILE__,__LINE__,#cond), pthread_cond_destroy(&(cond))) #define TINI_COND(cond) (rfbLog("%s:%d TINI_COND(%s)\n",__FILE__,__LINE__,#cond), pthread_cond_destroy(&(cond)))
#define IF_PTHREADS(x) x #define IF_PTHREADS(x) x
#else #else
#if !NONETWORK
#define LOCK(mutex) pthread_mutex_lock(&(mutex)); #define LOCK(mutex) pthread_mutex_lock(&(mutex));
#define UNLOCK(mutex) pthread_mutex_unlock(&(mutex)); #define UNLOCK(mutex) pthread_mutex_unlock(&(mutex));
#endif
#define MUTEX(mutex) pthread_mutex_t (mutex) #define MUTEX(mutex) pthread_mutex_t (mutex)
#define INIT_MUTEX(mutex) pthread_mutex_init(&(mutex),NULL) #define INIT_MUTEX(mutex) pthread_mutex_init(&(mutex),NULL)
#define TINI_MUTEX(mutex) pthread_mutex_destroy(&(mutex)) #define TINI_MUTEX(mutex) pthread_mutex_destroy(&(mutex))
...@@ -307,6 +309,7 @@ typedef struct _rfbScreenInfo ...@@ -307,6 +309,7 @@ typedef struct _rfbScreenInfo
int progressiveSliceHeight; int progressiveSliceHeight;
in_addr_t listenInterface; in_addr_t listenInterface;
int deferPtrUpdateTime;
} rfbScreenInfo, *rfbScreenInfoPtr; } rfbScreenInfo, *rfbScreenInfoPtr;
...@@ -418,6 +421,10 @@ typedef struct _rfbClientRec { ...@@ -418,6 +421,10 @@ typedef struct _rfbClientRec {
into a single update. */ into a single update. */
struct timeval startDeferring; struct timeval startDeferring;
struct timeval startPtrDeferring;
int lastPtrX;
int lastPtrY;
int lastPtrButtons;
/* translateFn points to the translation function which is used to copy /* translateFn points to the translation function which is used to copy
and translate a rectangle from the framebuffer to an output buffer. */ and translate a rectangle from the framebuffer to an output buffer. */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment