Close on exit. I'm not entirely happy with the distribution of this
authorowen <owen@cda61777-01e9-0310-a592-d414129be87e>
Tue, 1 Mar 2005 21:38:06 +0000 (21:38 +0000)
committerowen <owen@cda61777-01e9-0310-a592-d414129be87e>
Tue, 1 Mar 2005 21:38:06 +0000 (21:38 +0000)
across mac_closeterm() and notify_remote_exit() but it will do for now.
Also, "PuTTY (inactive)" looks strange as a Mac window title in a way it
doesn't on Unix or Windows.  Perhaps we should find another way of
indicating that a window contains a dead session?

git-svn-id: svn://svn.tartarus.org/sgt/putty@5424 cda61777-01e9-0310-a592-d414129be87e

mac/mac.c
mac/mac.h
mac/macdlg.c
mac/macterm.c

index 2fb7d44..9e1d1f3 100644 (file)
--- a/mac/mac.c
+++ b/mac/mac.c
@@ -659,9 +659,10 @@ void cleanup_exit(int status)
 }
 
 /* This should only kill the current session, not the whole application. */
-void connection_fatal(void *fontend, char *fmt, ...) {
+void connection_fatal(void *frontend, char *fmt, ...) {
     va_list ap;
     Str255 stuff;
+    Session *s = frontend;
     
     va_start(ap, fmt);
     /* We'd like stuff to be a Pascal string */
@@ -669,7 +670,11 @@ void connection_fatal(void *fontend, char *fmt, ...) {
     va_end(ap);
     ParamText(stuff, NULL, NULL, NULL);
     StopAlert(128, NULL);
-    cleanup_exit(1);
+
+    s->session_closed = TRUE;
+
+    if (s->cfg.close_on_exit == FORCE_ON)
+       mac_closewindow(s->window);
 }
 
 /* Null SSH agent client -- never finds an agent. */
@@ -832,7 +837,41 @@ void update_specials_menu(void *frontend)
        mac_adjustmenus();
 }
 
-void notify_remote_exit(void *fe) { /* XXX anything needed here? */ }
+void notify_remote_exit(void *frontend)
+{
+    Session *s = frontend;
+    int exitcode;
+
+    if (!s->session_closed &&
+       (exitcode = s->back->exitcode(s->backhandle)) >=0) {
+       s->session_closed = TRUE;
+       if (s->cfg.close_on_exit == FORCE_ON ||
+           (s->cfg.close_on_exit == AUTO && exitcode == 0)) {
+           mac_closewindow(s->window);
+           return;
+       }
+
+       /* The session's dead */
+
+       if (s->ldisc) {
+           ldisc_free(s->ldisc);
+           s->ldisc = NULL;
+       }
+
+       if (s->back) {
+           s->back->free(s->backhandle);
+           s->backhandle = NULL;
+           s->back = NULL;
+           update_specials_menu(s);
+       }
+
+       {
+           char title[100];
+           sprintf(title, "%.70s (inactive)", appname);
+           set_title(s, title);
+       }
+    }
+}
 
 /*
  * Local Variables:
index 8e73b7d..c1dcc74 100644 (file)
--- a/mac/mac.h
+++ b/mac/mac.h
@@ -106,6 +106,8 @@ typedef struct Session {
     void *logctx;
     /* Unicode stuff */
     struct unicode_data ucsdata;
+    /* Session closed flag */
+    int session_closed;
 
     /* Mac-specific elements */
     short              fontnum;
index cef7dea..2fa9687 100644 (file)
@@ -77,6 +77,7 @@ static void mac_config(int midsession)
         memset(s, 0, sizeof(*s));
         do_defaults(NULL, &s->cfg);
         s->hasfile = FALSE;
+       s->session_closed = FALSE;
     }
 
     /* Copy the configuration somewhere else in case this is a *
index 22360e1..d5a6014 100644 (file)
@@ -1015,7 +1015,7 @@ void mac_closeterm(WindowPtr window)
     int alertret;
     Session *s = mac_windowsession(window);
 
-    if (s->cfg.warn_on_close) {
+    if (s->cfg.warn_on_close && !s->session_closed) {
        ParamText("\pAre you sure you want to close this session?",
                  NULL, NULL, NULL);
        alertret=CautionAlert(wQuestion, NULL);
@@ -1028,8 +1028,10 @@ void mac_closeterm(WindowPtr window)
     HideWindow(s->window);
     *s->prev = s->next;
     s->next->prev = s->prev;
-    ldisc_free(s->ldisc);
-    s->back->free(s->backhandle);
+    if (s->ldisc)
+       ldisc_free(s->ldisc);
+    if (s->back)
+       s->back->free(s->backhandle);
     log_free(s->logctx);
     if (s->uni_to_font != NULL)
        DisposeUnicodeToTextInfo(&s->uni_to_font);