git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@4392 3789f03b-4d11-0410-bbf8-ca57d06f2519tags/v1.1.90
@@ -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; | |||
} |
@@ -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 |
@@ -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; |