summaryrefslogtreecommitdiffstats
path: root/vncviewer
diff options
context:
space:
mode:
Diffstat (limited to 'vncviewer')
-rw-r--r--vncviewer/CConn.cxx22
-rw-r--r--vncviewer/CConn.h4
-rw-r--r--vncviewer/Viewport.cxx8
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;