More robust event and close handling
There were still some circumstances where we could get stuck reading
data and not respect close events properly. Move that logic to a more
central place in order to make it more reliable.
diff --git a/vncviewer/CConn.cxx b/vncviewer/CConn.cxx
index 140b1d6..baf01d4 100644
--- a/vncviewer/CConn.cxx
+++ b/vncviewer/CConn.cxx
@@ -254,6 +254,15 @@
// until the buffers are empty or things will stall.
do {
cc->processMsg();
+
+ // Make sure that the FLTK handling and the timers gets some CPU
+ // time in case of back to back messages
+ Fl::check();
+ Timer::checkTimeouts();
+
+ // Also check if we need to stop reading and terminate
+ if (should_exit())
+ break;
} while (cc->sock->inStream().checkNoWait(1));
} catch (rdr::EndOfStream& e) {
vlog.info("%s", e.str());
@@ -397,11 +406,6 @@
// Compute new settings based on updated bandwidth values
if (autoSelect)
autoSelectFormatAndEncoding();
-
- // Make sure that the FLTK handling and the timers gets some CPU time
- // in case of back to back framebuffer updates.
- Fl::check();
- Timer::checkTimeouts();
}
// The rest of the callbacks are fairly self-explanatory...