From 0cef8a897d47c5f6127ebd56291addbad170aa7d Mon Sep 17 00:00:00 2001 From: Simon Tatham Date: Mon, 17 Nov 2008 18:36:27 +0000 Subject: [PATCH] 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. [originally from svn r8304] --- unix/gtkwin.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) 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)