Destroy the main UI and connection objects before popping up the fatal error
message. This avoids a lot of problems with recursion and trying to send
events over a dead socket.


git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@4582 3789f03b-4d11-0410-bbf8-ca57d06f2519
diff --git a/vncviewer/CConn.cxx b/vncviewer/CConn.cxx
index 31ceff1..e295c34 100644
--- a/vncviewer/CConn.cxx
+++ b/vncviewer/CConn.cxx
@@ -198,8 +198,7 @@
     exit_vncviewer();
   } catch (rdr::Exception& e) {
     vlog.error(e.str());
-    fl_alert(e.str());
-    exit_vncviewer();
+    exit_vncviewer(e.str());
   }
 
   recursing = false;
diff --git a/vncviewer/vncviewer.cxx b/vncviewer/vncviewer.cxx
index cfe5cfa..7b9434f 100644
--- a/vncviewer/vncviewer.cxx
+++ b/vncviewer/vncviewer.cxx
@@ -66,9 +66,15 @@
 static char aboutText[1024];
 
 static bool exitMainloop = false;
+static const char *exitError = NULL;
 
-void exit_vncviewer()
+void exit_vncviewer(const char *error)
 {
+  // Prioritise the first error we get as that is probably the most
+  // relevant one.
+  if ((error != NULL) && (exitError == NULL))
+    exitError = strdup(error);
+
   exitMainloop = true;
 }
 
@@ -267,7 +273,7 @@
       return 1;
   }
 
-  CConn cc(vncServerName);
+  CConn *cc = new CConn(vncServerName);
 
   while (!exitMainloop) {
     int next_timer;
@@ -282,5 +288,10 @@
     }
   }
 
+  delete cc;
+
+  if (exitError != NULL)
+    fl_alert(exitError);
+
   return 0;
 }
diff --git a/vncviewer/vncviewer.h b/vncviewer/vncviewer.h
index ab16b68..443dbea 100644
--- a/vncviewer/vncviewer.h
+++ b/vncviewer/vncviewer.h
@@ -19,7 +19,7 @@
 #ifndef __VNCVIEWER_H__
 #define __VNCVIEWER_H__
 
-void exit_vncviewer();
+void exit_vncviewer(const char *error = NULL);
 void about_vncviewer();
 
 #endif