From: simon Date: Mon, 17 Nov 2008 18:36:27 +0000 (+0000) Subject: Avoid freeing the backend in notify_remote_exit(), since that's X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/putty/commitdiff_plain/ee5e66d8ffb8750a588db17306acfd3193cc10a9 Avoid freeing the backend in notify_remote_exit(), since that's called from within a backend function which will expect its own backend pointer to still be valid on return. Instead, move all the real functionality of notify_remote_exit() out into a GTK idle function. git-svn-id: svn://svn.tartarus.org/sgt/putty@8304 cda61777-01e9-0310-a592-d414129be87e --- diff --git a/unix/gtkwin.c b/unix/gtkwin.c index 45697889..6510e267 100644 --- a/unix/gtkwin.c +++ b/unix/gtkwin.c @@ -75,6 +75,7 @@ struct gui_data { int mouseptr_visible; int busy_status; guint term_paste_idle_id; + guint term_exit_idle_id; int alt_keycode; int alt_digits; char wintitle[sizeof(((Config *)0)->wintitle)]; @@ -1220,9 +1221,9 @@ void frontend_keypress(void *handle) exit(0); } -void notify_remote_exit(void *frontend) +static gint idle_exit_func(gpointer data) { - struct gui_data *inst = (struct gui_data *)frontend; + struct gui_data *inst = (struct gui_data *)data; int exitcode; if (!inst->exited && @@ -1244,6 +1245,16 @@ void notify_remote_exit(void *frontend) } gtk_widget_show(inst->restartitem); } + + 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); } static gint timer_trigger(gpointer data)