Example #1
0
void
rfbProcessEvents(rfbScreenInfoPtr rfbScreen,long usec)
{
  rfbClientIteratorPtr i;
  rfbClientPtr cl,clPrev;
  struct timeval tv;

  if(usec<0)
    usec=rfbScreen->rfbDeferUpdateTime*1000;

  rfbCheckFds(rfbScreen,usec);
  httpCheckFds(rfbScreen);
#ifdef CORBA
  corbaCheckFds(rfbScreen);
#endif

  i = rfbGetClientIterator(rfbScreen);
  cl=rfbClientIteratorNext(i);
  while(cl) {
    if(cl->sock>=0 && (!cl->onHold) && FB_UPDATE_PENDING(cl)) {
      if(cl->screen->rfbDeferUpdateTime == 0) {
	  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++;
      } 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)
	     > cl->screen->rfbDeferUpdateTime) {
	  cl->startDeferring.tv_usec = 0;
	  rfbSendFramebufferUpdate(cl,cl->modifiedRegion);
	}
      }
    }
    clPrev=cl;
    cl=rfbClientIteratorNext(i);
    if(clPrev->sock==-1)
      rfbClientConnectionGone(clPrev);
  }
  rfbReleaseClientIterator(i);
}
Example #2
0
rfbBool
rfbProcessEvents(rfbScreenInfoPtr screen,long usec)
{
	rfbClientIteratorPtr i;
	rfbClientPtr cl,clPrev;
	struct timeval tv;
	rfbBool result=FALSE;
	extern rfbClientIteratorPtr
	rfbGetClientIteratorWithClosed(rfbScreenInfoPtr rfbScreen);

	if(usec<0)
		usec=screen->deferUpdateTime*1000;

	rfbCheckFds(screen,usec);
	rfbHttpCheckFds(screen);
#ifdef CORBA
	corbaCheckFds(screen);
#endif

	i = rfbGetClientIteratorWithClosed(screen);
	cl = rfbClientIteratorHead(i);
	while(cl) {
		if (cl->sock >= 0 && !cl->onHold && FB_UPDATE_PENDING(cl) &&
				!sraRgnEmpty(cl->requestedRegion)) {
			result=TRUE;
			if(screen->deferUpdateTime == 0) {
				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++;
			} 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);
				}
			}
		}

		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;
		cl=rfbClientIteratorNext(i);
		if(clPrev->sock==-1) {
			rfbClientConnectionGone(clPrev);
			result=TRUE;
		}
	}
	rfbReleaseClientIterator(i);

	return result;
}