]> source.dussan.org Git - tigervnc.git/commitdiff
Terminate the viewer even when waiting for data
authorPierre Ossman <ossman@cendio.se>
Wed, 23 Sep 2015 10:20:32 +0000 (12:20 +0200)
committerPierre Ossman <ossman@cendio.se>
Wed, 23 Sep 2015 10:20:32 +0000 (12:20 +0200)
It should be possible to exit the viewer even if the network has
stalled in the middle of a transfer.

vncviewer/CConn.cxx
vncviewer/vncviewer.cxx
vncviewer/vncviewer.h

index 2acb373e5f42fac9133a43ac1825e8ffb90c9061..686ce30db181866c34cf4ee2e345f81df7d50b82 100644 (file)
@@ -240,6 +240,9 @@ void CConn::blockCallback()
     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 @@ void CConn::socketEvent(FL_SOCKET fd, void *data)
     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;
index 4b989bb28f519c137483947e19ad9fb2a9bf1962..f9258b90639f640202a00df9a08be7f160e7bdf6 100644 (file)
@@ -117,6 +117,11 @@ void exit_vncviewer(const char *error)
   exitMainloop = true;
 }
 
+bool should_exit()
+{
+  return exitMainloop;
+}
+
 void about_vncviewer()
 {
   fl_message_title(_("About TigerVNC Viewer"));
index 089fb27051ce7c2fd18d3fa44db5f148f05bfd26..4d0566bb73faa4eeb474a49dfc47f06cba7a8ba3 100644 (file)
@@ -22,6 +22,7 @@
 #define VNCSERVERNAMELEN 64
 
 void exit_vncviewer(const char *error = NULL);
+bool should_exit();
 void about_vncviewer();
 
 #endif