diff options
Diffstat (limited to 'vncviewer')
-rw-r--r-- | vncviewer/CConn.cxx | 22 | ||||
-rw-r--r-- | vncviewer/CConn.h | 4 | ||||
-rw-r--r-- | vncviewer/Viewport.cxx | 8 |
3 files changed, 30 insertions, 4 deletions
diff --git a/vncviewer/CConn.cxx b/vncviewer/CConn.cxx index e9032840..faf85cc9 100644 --- a/vncviewer/CConn.cxx +++ b/vncviewer/CConn.cxx @@ -48,7 +48,8 @@ CConn::CConn(const char* vncServerName) : serverHost(0), serverPort(0), sock(NULL), desktop(NULL), currentEncoding(encodingTight), lastServerEncoding((unsigned int)-1), formatChange(false), encodingChange(false), - firstUpdate(true), pendingUpdate(false) + firstUpdate(true), pendingUpdate(false), + forceNonincremental(false) { setShared(::shared); @@ -98,6 +99,14 @@ CConn::~CConn() delete sock; } +void CConn::refreshFramebuffer() +{ + // FIXME: We cannot safely trigger an update request directly but must + // wait for the next update to arrive. + if (!formatChange) + forceNonincremental = true; +} + // The RFB core is not properly asynchronous, so it calls this callback // whenever it needs to block to wait for more data. Since FLTK is // monitoring the socket, we just make sure FLTK gets to run. @@ -442,9 +451,16 @@ void CConn::requestNewUpdate() desktop->setServerPF(pf); cp.setPF(pf); writer()->writeSetPixelFormat(pf); + + forceNonincremental = true; + + formatChange = false; } + checkEncodings(); + writer()->writeFramebufferUpdateRequest(Rect(0, 0, cp.width, cp.height), - !formatChange); - formatChange = false; + !forceNonincremental); + + forceNonincremental = false; } diff --git a/vncviewer/CConn.h b/vncviewer/CConn.h index 0f5be621..45928878 100644 --- a/vncviewer/CConn.h +++ b/vncviewer/CConn.h @@ -32,6 +32,8 @@ public: CConn(const char* vncServerName); ~CConn(); + void refreshFramebuffer(); + // FdInStreamBlockCallback methods void blockCallback(); @@ -91,6 +93,8 @@ private: bool firstUpdate; bool pendingUpdate; + + bool forceNonincremental; }; #endif diff --git a/vncviewer/Viewport.cxx b/vncviewer/Viewport.cxx index 2ce788f0..c8713b8c 100644 --- a/vncviewer/Viewport.cxx +++ b/vncviewer/Viewport.cxx @@ -56,7 +56,8 @@ static rfb::LogWriter vlog("Viewport"); // Menu constants -enum { ID_EXIT, ID_CTRL, ID_ALT, ID_MENUKEY, ID_CTRLALTDEL, ID_DISMISS }; +enum { ID_EXIT, ID_CTRL, ID_ALT, ID_MENUKEY, ID_CTRLALTDEL, + ID_REFRESH, ID_DISMISS }; Viewport::Viewport(int w, int h, const rfb::PixelFormat& serverPF, CConn* cc_) : Fl_Widget(0, 0, w, h), cc(cc_), frameBuffer(NULL), pixelTrans(NULL), @@ -520,6 +521,8 @@ void Viewport::initContextMenu() contextMenu->add("Secret shortcut menu key", FL_F + 8, NULL, (void*)ID_MENUKEY, FL_MENU_INVISIBLE); // Broken, see STR2613 contextMenu->add(_("Send Ctrl-Alt-Del"), 0, NULL, (void*)ID_CTRLALTDEL, FL_MENU_DIVIDER); + contextMenu->add(_("Refresh screen"), 0, NULL, (void*)ID_REFRESH, FL_MENU_DIVIDER); + contextMenu->add(_("Dismiss menu"), 0, NULL, (void*)ID_DISMISS, 0); } @@ -563,6 +566,9 @@ void Viewport::popupContextMenu() cc->writer()->keyEvent(XK_Control_L, false); } break; + case ID_REFRESH: + cc->refreshFramebuffer(); + break; case ID_DISMISS: // Don't need to do anything break; |