summaryrefslogtreecommitdiffstats
path: root/libvncserver/main.c
diff options
context:
space:
mode:
authorGeorge Kiagiadakis <kiagiadakis.george@gmail.com>2010-11-10 18:57:17 +0000
committerChristian Beier <dontmind@freeshell.org>2011-06-01 12:56:48 +0200
commit9f8d8d4ef38951767aa428796df127ff80de9b6e (patch)
treecafe023fdf284ce20a639d323e2a5bc30fbaecf8 /libvncserver/main.c
parentc8b8938106816500062336cae9f936cd7722c1bb (diff)
downloadlibtdevnc-9f8d8d4ef38951767aa428796df127ff80de9b6e.tar.gz
libtdevnc-9f8d8d4ef38951767aa428796df127ff80de9b6e.zip
Split two event-loop related functions out of the rfbProcessEvents() mechanism.
This is required to be able to do proper event loop integration with Qt. Idea was taken from vino's libvncserver fork. Signed-off-by: Christian Beier <dontmind@freeshell.org>
Diffstat (limited to 'libvncserver/main.c')
-rw-r--r--libvncserver/main.c62
1 files changed, 37 insertions, 25 deletions
diff --git a/libvncserver/main.c b/libvncserver/main.c
index eab4c84..bae4db4 100644
--- a/libvncserver/main.c
+++ b/libvncserver/main.c
@@ -1085,24 +1085,44 @@ rfbProcessEvents(rfbScreenInfoPtr screen,long usec)
i = rfbGetClientIteratorWithClosed(screen);
cl=rfbClientIteratorHead(i);
while(cl) {
- if (cl->sock >= 0 && !cl->onHold && FB_UPDATE_PENDING(cl) &&
+ result = rfbUpdateClient(cl);
+ clPrev=cl;
+ cl=rfbClientIteratorNext(i);
+ if(clPrev->sock==-1) {
+ rfbClientConnectionGone(clPrev);
+ result=TRUE;
+ }
+ }
+ rfbReleaseClientIterator(i);
+
+ return result;
+}
+
+rfbBool
+rfbUpdateClient(rfbClientPtr cl)
+{
+ struct timeval tv;
+ rfbBool result=FALSE;
+ rfbScreenInfoPtr screen = cl->screen;
+
+ if (cl->sock >= 0 && !cl->onHold && FB_UPDATE_PENDING(cl) &&
!sraRgnEmpty(cl->requestedRegion)) {
result=TRUE;
if(screen->deferUpdateTime == 0) {
- rfbSendFramebufferUpdate(cl,cl->modifiedRegion);
+ rfbSendFramebufferUpdate(cl,cl->modifiedRegion);
} else if(cl->startDeferring.tv_usec == 0) {
- gettimeofday(&cl->startDeferring,NULL);
- if(cl->startDeferring.tv_usec == 0)
- cl->startDeferring.tv_usec++;
+ gettimeofday(&cl->startDeferring,NULL);
+ if(cl->startDeferring.tv_usec == 0)
+ cl->startDeferring.tv_usec++;
} else {
- gettimeofday(&tv,NULL);
- if(tv.tv_sec < cl->startDeferring.tv_sec /* at midnight */
- || ((tv.tv_sec-cl->startDeferring.tv_sec)*1000
- +(tv.tv_usec-cl->startDeferring.tv_usec)/1000)
- > screen->deferUpdateTime) {
- cl->startDeferring.tv_usec = 0;
- rfbSendFramebufferUpdate(cl,cl->modifiedRegion);
- }
+ gettimeofday(&tv,NULL);
+ if(tv.tv_sec < cl->startDeferring.tv_sec /* at midnight */
+ || ((tv.tv_sec-cl->startDeferring.tv_sec)*1000
+ +(tv.tv_usec-cl->startDeferring.tv_usec)/1000)
+ > screen->deferUpdateTime) {
+ cl->startDeferring.tv_usec = 0;
+ rfbSendFramebufferUpdate(cl,cl->modifiedRegion);
+ }
}
}
@@ -1119,23 +1139,15 @@ rfbProcessEvents(rfbScreenInfoPtr screen,long usec)
+(tv.tv_usec-cl->startPtrDeferring.tv_usec)/1000)
> cl->screen->deferPtrUpdateTime) {
cl->startPtrDeferring.tv_usec = 0;
- cl->screen->ptrAddEvent(cl->lastPtrButtons,
- cl->lastPtrX,
+ cl->screen->ptrAddEvent(cl->lastPtrButtons,
+ cl->lastPtrX,
cl->lastPtrY, cl);
- cl->lastPtrX = -1;
+ cl->lastPtrX = -1;
}
}
}
- clPrev=cl;
- cl=rfbClientIteratorNext(i);
- if(clPrev->sock==-1) {
- rfbClientConnectionGone(clPrev);
- result=TRUE;
- }
- }
- rfbReleaseClientIterator(i);
- return result;
+ return result;
}
rfbBool rfbIsActive(rfbScreenInfoPtr screenInfo) {