From a44366585fbc11021c330a2f110d2b24f5d0c9cd Mon Sep 17 00:00:00 2001 From: Simon Tatham Date: Sat, 17 Aug 2013 16:06:22 +0000 Subject: [PATCH] Revamp GTK's session close handling using toplevel callbacks. Instead of having a special GTK idle function for dealing with session closing, I now use the new top-level callback mechanism which is slightly simpler for calling a one-off function. Also in this commit, I've arranged for connection_fatal to queue a call to the same session close function after displaying the message box, with the effect that now all the same processing takes place no matter whether the session closes cleanly or uncleanly - e.g. the SSH specials submenu is cleaned out, as it should be. [originally from svn r10022] --- unix/gtkwin.c | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/unix/gtkwin.c b/unix/gtkwin.c index f42761e1..7bc41cc9 100644 --- a/unix/gtkwin.c +++ b/unix/gtkwin.c @@ -93,7 +93,6 @@ struct gui_data { int ignore_sbar; int mouseptr_visible; int busy_status; - guint term_exit_idle_id; guint toplevel_callback_idle_id; int alt_keycode; int alt_digits; @@ -136,6 +135,7 @@ static int send_raw_mouse; static char *app_name = "pterm"; static void start_backend(struct gui_data *inst); +static void exit_callback(void *vinst); char *x_get_default(const char *key) { @@ -151,11 +151,10 @@ void connection_fatal(void *frontend, char *p, ...) va_start(ap, p); msg = dupvprintf(p, ap); va_end(ap); - inst->exited = TRUE; fatal_message_box(inst->window, msg); sfree(msg); - if (conf_get_int(inst->conf, CONF_close_on_exit) == FORCE_ON) - cleanup_exit(1); + + queue_toplevel_callback(exit_callback, inst); } /* @@ -1364,9 +1363,9 @@ void frontend_keypress(void *handle) cleanup_exit(0); } -static gint idle_exit_func(gpointer data) +static void exit_callback(void *vinst) { - struct gui_data *inst = (struct gui_data *)data; + struct gui_data *inst = (struct gui_data *)vinst; int exitcode, close_on_exit; if (!inst->exited && @@ -1387,16 +1386,13 @@ static gint idle_exit_func(gpointer data) update_specials_menu(inst); gtk_widget_set_sensitive(inst->restartitem, TRUE); } - - gtk_idle_remove(inst->term_exit_idle_id); - return TRUE; } void notify_remote_exit(void *frontend) { struct gui_data *inst = (struct gui_data *)frontend; - inst->term_exit_idle_id = gtk_idle_add(idle_exit_func, inst); + queue_toplevel_callback(exit_callback, inst); } static gint idle_toplevel_callback_func(gpointer data)