diff options
author | dscho <dscho> | 2003-07-28 00:57:52 +0000 |
---|---|---|
committer | dscho <dscho> | 2003-07-28 00:57:52 +0000 |
commit | 9f0a1a3bc16d26420c703c6e6cc0f18bd4f6b81e (patch) | |
tree | 0aa185de6ff17df411ce24001954435a524a970e /rfbserver.c | |
parent | b9ebdab1f255316ccb9160daa0976d57adfe2675 (diff) | |
download | libtdevnc-9f0a1a3bc16d26420c703c6e6cc0f18bd4f6b81e.tar.gz libtdevnc-9f0a1a3bc16d26420c703c6e6cc0f18bd4f6b81e.zip |
synced with TightVNC and RealVNC
Diffstat (limited to 'rfbserver.c')
-rw-r--r-- | rfbserver.c | 106 |
1 files changed, 63 insertions, 43 deletions
diff --git a/rfbserver.c b/rfbserver.c index 1403714..9ab205e 100644 --- a/rfbserver.c +++ b/rfbserver.c @@ -233,6 +233,8 @@ rfbNewTCPOrUDPClient(rfbScreen,sock,isUDP) cl->screen = rfbScreen; cl->sock = sock; + cl->viewOnly = FALSE; + rfbResetStats(cl); if(isUDP) { @@ -932,70 +934,78 @@ rfbProcessClientNormalMessage(cl) case rfbKeyEvent: - cl->rfbKeyEventsRcvd++; + cl->rfbKeyEventsRcvd++; - if ((n = ReadExact(cl, ((char *)&msg) + 1, - sz_rfbKeyEventMsg - 1)) <= 0) { - if (n != 0) - rfbLogPerror("rfbProcessClientNormalMessage: read"); - rfbCloseClient(cl); - return; - } + if ((n = ReadExact(cl, ((char *)&msg) + 1, + sz_rfbKeyEventMsg - 1)) <= 0) { + if (n != 0) + rfbLogPerror("rfbProcessClientNormalMessage: read"); + rfbCloseClient(cl); + return; + } + + if(!cl->viewOnly) { + cl->screen->kbdAddEvent(msg.ke.down, (KeySym)Swap32IfLE(msg.ke.key), cl); + } - cl->screen->kbdAddEvent(msg.ke.down, (KeySym)Swap32IfLE(msg.ke.key), cl); return; case rfbPointerEvent: - cl->rfbPointerEventsRcvd++; + cl->rfbPointerEventsRcvd++; - if ((n = ReadExact(cl, ((char *)&msg) + 1, - sz_rfbPointerEventMsg - 1)) <= 0) { - if (n != 0) - rfbLogPerror("rfbProcessClientNormalMessage: read"); - rfbCloseClient(cl); - return; - } + if ((n = ReadExact(cl, ((char *)&msg) + 1, + sz_rfbPointerEventMsg - 1)) <= 0) { + if (n != 0) + rfbLogPerror("rfbProcessClientNormalMessage: read"); + rfbCloseClient(cl); + return; + } - if (pointerClient && (pointerClient != cl)) - return; + if (pointerClient && (pointerClient != cl)) + return; - if (msg.pe.buttonMask == 0) - pointerClient = NULL; - else - pointerClient = cl; + if (msg.pe.buttonMask == 0) + pointerClient = NULL; + else + pointerClient = cl; + + if(!cl->viewOnly) { + cl->screen->ptrAddEvent(msg.pe.buttonMask, + Swap16IfLE(msg.pe.x), Swap16IfLE(msg.pe.y), cl); + } - cl->screen->ptrAddEvent(msg.pe.buttonMask, - Swap16IfLE(msg.pe.x), Swap16IfLE(msg.pe.y), cl); return; case rfbClientCutText: - if ((n = ReadExact(cl, ((char *)&msg) + 1, - sz_rfbClientCutTextMsg - 1)) <= 0) { - if (n != 0) - rfbLogPerror("rfbProcessClientNormalMessage: read"); - rfbCloseClient(cl); - return; - } + if ((n = ReadExact(cl, ((char *)&msg) + 1, + sz_rfbClientCutTextMsg - 1)) <= 0) { + if (n != 0) + rfbLogPerror("rfbProcessClientNormalMessage: read"); + rfbCloseClient(cl); + return; + } - msg.cct.length = Swap32IfLE(msg.cct.length); + if(!cl->viewOnly) { + msg.cct.length = Swap32IfLE(msg.cct.length); - str = (char *)malloc(msg.cct.length); + str = (char *)malloc(msg.cct.length); - if ((n = ReadExact(cl, str, msg.cct.length)) <= 0) { - if (n != 0) - rfbLogPerror("rfbProcessClientNormalMessage: read"); - free(str); - rfbCloseClient(cl); - return; - } + if ((n = ReadExact(cl, str, msg.cct.length)) <= 0) { + if (n != 0) + rfbLogPerror("rfbProcessClientNormalMessage: read"); + free(str); + rfbCloseClient(cl); + return; + } - cl->screen->setXCutText(str, msg.cct.length, cl); + cl->screen->setXCutText(str, msg.cct.length, cl); + free(str); + } - free(str); return; @@ -1166,6 +1176,7 @@ rfbSendFramebufferUpdate(cl, givenUpdateRegion) nUpdateRegionRects += (((w-1) / cl->correMaxWidth + 1) * ((h-1) / cl->correMaxHeight + 1)); } + sraRgnReleaseIterator(i); #ifdef HAVE_LIBZ } else if (cl->preferredEncoding == rfbEncodingZlib) { nUpdateRegionRects = 0; @@ -1193,6 +1204,7 @@ rfbSendFramebufferUpdate(cl, givenUpdateRegion) } nUpdateRegionRects += n; } + sraRgnReleaseIterator(i); #endif #endif } else { @@ -1201,6 +1213,14 @@ rfbSendFramebufferUpdate(cl, givenUpdateRegion) fu->type = rfbFramebufferUpdate; if (nUpdateRegionRects != 0xFFFF) { + if(cl->screen->maxRectsPerUpdate>0 + && nUpdateRegionRects>cl->screen->maxRectsPerUpdate) { + sraRegion* newUpdateRegion = sraRgnBBox(updateRegion); + sraRgnDestroy(updateRegion); + updateRegion = newUpdateRegion; + nUpdateRegionRects = sraRgnCountRects(updateRegion); + } + fu->nRects = Swap16IfLE((uint16_t)(sraRgnCountRects(updateCopyRegion) + nUpdateRegionRects + !!sendCursorShape + !!sendCursorPos)); |