diff --git a/common/network/websocket.c b/common/network/websocket.c index 54707c4..2325cb9 100644 --- a/common/network/websocket.c +++ b/common/network/websocket.c @@ -44,6 +44,7 @@ int pipe_error = 0; settings_t settings; +extern int wakeuppipe[2]; void traffic(const char * token) { /*if ((settings.verbose) && (! settings.daemon)) { @@ -1558,6 +1559,20 @@ static uint8_t ownerapi(ws_ctx_t *ws_ctx, const char *in, const char * const use weblog(200, wsthread_handler_id, 0, origip, ip, user, 1, origpath, strlen(buf) + strlen(statbuf)); handler_msg("Sent frame stats to API caller\n"); + ret = 1; + } else entry("/api/send_full_frame") { + write(wakeuppipe[1], "", 1); + + sprintf(buf, "HTTP/1.1 200 OK\r\n" + "Server: KasmVNC/4.0\r\n" + "Connection: close\r\n" + "Content-type: text/plain\r\n" + "Content-length: 6\r\n" + "\r\n" + "200 OK"); + ws_send(ws_ctx, buf, strlen(buf)); + weblog(200, wsthread_handler_id, 0, origip, ip, user, 1, origpath, strlen(buf)); + ret = 1; } diff --git a/common/rfb/VNCServerST.cxx b/common/rfb/VNCServerST.cxx index a6f7090..f204546 100644 --- a/common/rfb/VNCServerST.cxx +++ b/common/rfb/VNCServerST.cxx @@ -1221,3 +1221,13 @@ void VNCServerST::handleClipboardAnnounceBinary(VNCSConnectionST* client, clipboardClient = client; desktop->handleClipboardAnnounceBinary(num, mimes); } + +void VNCServerST::refreshClients() +{ + add_changed(pb->getRect()); + + std::list::iterator i; + for (i = clients.begin(); i != clients.end(); i++) { + (*i)->add_changed_all(); + } +} diff --git a/common/rfb/VNCServerST.h b/common/rfb/VNCServerST.h index 71c1f32..e36412a 100644 --- a/common/rfb/VNCServerST.h +++ b/common/rfb/VNCServerST.h @@ -197,6 +197,8 @@ namespace rfb { void handleClipboardAnnounceBinary(VNCSConnectionST* client, const unsigned num, const char mimes[][32]); + void refreshClients(); + protected: friend class VNCSConnectionST; diff --git a/unix/xserver/hw/vnc/XserverDesktop.cc b/unix/xserver/hw/vnc/XserverDesktop.cc index 4c08fec..a3aa73a 100644 --- a/unix/xserver/hw/vnc/XserverDesktop.cc +++ b/unix/xserver/hw/vnc/XserverDesktop.cc @@ -49,6 +49,8 @@ extern "C" { void vncSetGlueContext(int screenIndex); + +extern int wakeuppipe[2]; } using namespace rfb; @@ -307,6 +309,15 @@ void XserverDesktop::handleSocketEvent(int fd, bool read, bool write) { try { if (read) { + + if (fd == wakeuppipe[0]) { + unsigned char buf; + while (::read(fd, &buf, 1) > 0); + + server->refreshClients(); + return; + } + if (handleListenerEvent(fd, &listeners, server)) return; } diff --git a/unix/xserver/hw/vnc/vncExtInit.cc b/unix/xserver/hw/vnc/vncExtInit.cc index 930c4c2..38cbf87 100644 --- a/unix/xserver/hw/vnc/vncExtInit.cc +++ b/unix/xserver/hw/vnc/vncExtInit.cc @@ -17,8 +17,10 @@ * USA. */ +#include #include #include +#include #include #include @@ -50,6 +52,8 @@ extern "C" { void vncSetGlueContext(int screenIndex); + +int wakeuppipe[2]; } using namespace rfb; @@ -228,6 +232,11 @@ void vncExtensionInit(void) dummyY < 16) vncFatalError("Invalid value to %s", Server::maxVideoResolution.getName()); + pipe(wakeuppipe); + const int flags = fcntl(wakeuppipe[0], F_GETFL, 0); + fcntl(wakeuppipe[0], F_SETFL, flags | O_NONBLOCK); + vncSetNotifyFd(wakeuppipe[0], 0, true, false); + initialised = true; }