Terminate the viewer even when waiting for data

It should be possible to exit the viewer even if the network has
stalled in the middle of a transfer.
diff --git a/vncviewer/CConn.cxx b/vncviewer/CConn.cxx
index 2acb373..686ce30 100644
--- a/vncviewer/CConn.cxx
+++ b/vncviewer/CConn.cxx
@@ -240,6 +240,9 @@
     next_timer = INT_MAX;
 
   Fl::wait((double)next_timer / 1000.0);
+
+  if (should_exit())
+    throw rdr::Exception("Termination requested");
 }
 
 void CConn::socketEvent(FL_SOCKET fd, void *data)
@@ -267,7 +270,10 @@
     exit_vncviewer();
   } catch (rdr::Exception& e) {
     vlog.error("%s", e.str());
-    exit_vncviewer(e.str());
+    // Somebody might already have requested us to terminate, and
+    // might have already provided an error message.
+    if (!should_exit())
+      exit_vncviewer(e.str());
   }
 
   recursing = false;
diff --git a/vncviewer/vncviewer.cxx b/vncviewer/vncviewer.cxx
index 4b989bb..f9258b9 100644
--- a/vncviewer/vncviewer.cxx
+++ b/vncviewer/vncviewer.cxx
@@ -117,6 +117,11 @@
   exitMainloop = true;
 }
 
+bool should_exit()
+{
+  return exitMainloop;
+}
+
 void about_vncviewer()
 {
   fl_message_title(_("About TigerVNC Viewer"));
diff --git a/vncviewer/vncviewer.h b/vncviewer/vncviewer.h
index 089fb27..4d0566b 100644
--- a/vncviewer/vncviewer.h
+++ b/vncviewer/vncviewer.h
@@ -22,6 +22,7 @@
 #define VNCSERVERNAMELEN 64
 
 void exit_vncviewer(const char *error = NULL);
+bool should_exit();
 void about_vncviewer();
 
 #endif