Blob Blame History Raw
--- lxterminal-0.4.0/src/lxterminal.c.orig	2023-05-26 13:59:55.800250980 +0900
+++ lxterminal-0.4.0/src/lxterminal.c	2023-06-09 14:03:22.478441852 +0900
@@ -59,6 +59,7 @@ static void terminal_new_window_activate
 static void terminal_new_tab_activate_event(GtkAction * action, LXTerminal * terminal);
 static void terminal_close_tab_activate_event(GtkAction * action, LXTerminal * terminal);
 static void terminal_close_window_activate_event(GtkAction * action, LXTerminal * terminal);
+static void terminal_close_window_activate_event_internal(GtkAction * action, LXTerminal * terminal);
 static void terminal_open_url_activate_event(GtkAction * action, LXTerminal * terminal);
 static void terminal_copy_url_activate_event(GtkAction * action, LXTerminal * terminal);
 static void terminal_copy_activate_event(GtkAction * action, LXTerminal * terminal);
@@ -480,15 +481,28 @@ static void terminal_close_window_activa
     if (!terminal_close_window_confirmation_dialog(terminal)) {
         return;
     }
+    terminal_close_window_activate_event_internal(action, terminal);
+}
 
+static void terminal_close_window_activate_event_internal(GtkAction * action, LXTerminal * terminal)
+{
     /* Play it safe and delete tabs one by one. */
-    while(terminal->terms->len > 0) {
+    while(1 /* terminal->terms->len > 0 */) {
+      /* terminal_child_exited_event() finally frees terminal->terms */
+      /* terminal_window_exit() finally frees terminal itself
+         when closing one window of multiple ones
+        */
+        guint len = terminal->terms->len;
         Term *term = g_ptr_array_index(terminal->terms, 0);
 #if VTE_CHECK_VERSION (0, 38, 0)
         terminal_child_exited_event(VTE_TERMINAL(term->vte), 0, term);
 #else
         terminal_child_exited_event(VTE_TERMINAL(term->vte), term);
 #endif
+       if (len <= 1) {
+          break;
+        }
+
     }
 }
 
@@ -838,7 +852,15 @@ static void terminal_window_title_change
 /* Handler for "delete-event" signal on a LXTerminal. */
 static gboolean terminal_close_window_confirmation_event(GtkWidget * widget, GdkEventButton * event, LXTerminal * terminal)
 {
+#if 0
     return !terminal_close_window_confirmation_dialog(terminal);
+#else
+    gboolean status = terminal_close_window_confirmation_dialog(terminal);
+    if (status) {
+        terminal_close_window_activate_event_internal(NULL, terminal);
+    }
+    return TRUE; /* Always nuke this event, call the above function explicitly */
+#endif
 }
 
 /* Display closing tabs warning */