From 8154b6022bd42b4aba03fc9adcbabd4f588b6575 Mon Sep 17 00:00:00 2001 From: owen Date: Tue, 1 Mar 2005 21:38:06 +0000 Subject: [PATCH] Close on exit. I'm not entirely happy with the distribution of this 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 | 45 ++++++++++++++++++++++++++++++++++++++++++--- mac/mac.h | 2 ++ mac/macdlg.c | 1 + mac/macterm.c | 8 +++++--- 4 files changed, 50 insertions(+), 6 deletions(-) diff --git a/mac/mac.c b/mac/mac.c index 2fb7d44c..9e1d1f30 100644 --- 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: diff --git a/mac/mac.h b/mac/mac.h index 8e73b7db..c1dcc74f 100644 --- 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; diff --git a/mac/macdlg.c b/mac/macdlg.c index cef7dea3..2fa9687a 100644 --- a/mac/macdlg.c +++ b/mac/macdlg.c @@ -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 * diff --git a/mac/macterm.c b/mac/macterm.c index 22360e14..d5a6014d 100644 --- a/mac/macterm.c +++ b/mac/macterm.c @@ -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); -- 2.11.0