]> asedeno.scripts.mit.edu Git - PuTTY.git/commitdiff
Avoid freeing the backend in notify_remote_exit(), since that's
authorSimon Tatham <anakin@pobox.com>
Mon, 17 Nov 2008 18:36:27 +0000 (18:36 +0000)
committerSimon Tatham <anakin@pobox.com>
Mon, 17 Nov 2008 18:36:27 +0000 (18:36 +0000)
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

index 456978897a0a67ad5fb1f688d6e632077ba3ac7e..6510e267ba8e2fe7f47f5f2f72962d8e2bf1e7ae 100644 (file)
@@ -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)