[Xfce4-commits] [apps/xfce4-terminal] 01/01: Request confirmation when closing the window while a process is running

noreply at xfce.org noreply at xfce.org
Thu Aug 17 15:07:33 CEST 2017


This is an automated email from the git hooks/post-receive script.

f   2   4   0   4       p   u   s   h   e   d       a       c   o   m   m   i   t       t   o       b   r   a   n   c   h       m   a   s   t   e   r   
   in repository apps/xfce4-terminal.

commit 17dafe40dc89f0e69b774f4af9ef8e121a7acdb1
Author: Igor <f2404 at yandex.ru>
Date:   Thu Aug 17 09:04:45 2017 -0400

    Request confirmation when closing the window while a process is running
    
    If any tab has a process (other than shell) running, a confirmation window
    will be shown.
    Fixes bug #13781
---
 terminal/terminal-screen.c | 33 +++++++++++++++++++++++++++++
 terminal/terminal-screen.h |  2 ++
 terminal/terminal-window.c | 53 ++++++++++++++++++++++++++++++++++++----------
 3 files changed, 77 insertions(+), 11 deletions(-)

diff --git a/terminal/terminal-screen.c b/terminal/terminal-screen.c
index 007700a..15b3f44 100644
--- a/terminal/terminal-screen.c
+++ b/terminal/terminal-screen.c
@@ -2529,3 +2529,36 @@ terminal_screen_save_contents (TerminalScreen *screen,
   vte_terminal_write_contents_sync (VTE_TERMINAL (screen->terminal),
                                     stream, VTE_WRITE_DEFAULT, NULL, &error);
 }
+
+
+
+/**
+ * terminal_screen_has_foreground_process:
+ * @screen  : A #TerminalScreen.
+ *
+ * Return value: %TRUE if there's a foreground process running in @screen.
+ **/
+gboolean
+terminal_screen_has_foreground_process (TerminalScreen *screen)
+{
+  VtePty *pty;
+  int     fd;
+  int     fgpid;
+
+  if (screen == NULL)
+    return FALSE;
+
+  pty = vte_terminal_get_pty (VTE_TERMINAL (screen->terminal));
+  if (pty == NULL)
+    return FALSE;
+
+  fd = vte_pty_get_fd (pty);
+  if (fd == -1)
+    return FALSE;
+
+  fgpid = tcgetpgrp (fd);
+  if (fgpid == -1 || fgpid == screen->pid)
+    return FALSE;
+
+  return TRUE;
+}
diff --git a/terminal/terminal-screen.h b/terminal/terminal-screen.h
index ad151b2..ab273cf 100644
--- a/terminal/terminal-screen.h
+++ b/terminal/terminal-screen.h
@@ -125,6 +125,8 @@ void            terminal_screen_save_contents             (TerminalScreen *scree
                                                            GOutputStream  *stream,
                                                            GError         *error);
 
+gboolean        terminal_screen_has_foreground_process    (TerminalScreen *screen);
+
 
 G_END_DECLS
 
diff --git a/terminal/terminal-window.c b/terminal/terminal-window.c
index 84c6303..a8f2450 100644
--- a/terminal/terminal-window.c
+++ b/terminal/terminal-window.c
@@ -755,16 +755,27 @@ terminal_window_confirm_close (TerminalWindow *window)
   gchar     *message;
   gchar     *markup;
   gint       response;
-  gint       n_tabs;
-
-  n_tabs = gtk_notebook_get_n_pages (GTK_NOTEBOOK (window->priv->notebook));
-  if (G_UNLIKELY (n_tabs < 2))
-    return TRUE;
+  gint       i, n_tabs;
 
   g_object_get (G_OBJECT (window->priv->preferences), "misc-confirm-close", &confirm_close, NULL);
   if (!confirm_close)
     return TRUE;
 
+  n_tabs = gtk_notebook_get_n_pages (GTK_NOTEBOOK (window->priv->notebook));
+  confirm_close = FALSE;
+  for (i = 0; i < n_tabs; ++i)
+    {
+      TerminalScreen *screen = TERMINAL_SCREEN (gtk_notebook_get_nth_page (GTK_NOTEBOOK (window->priv->notebook), i));
+      if (terminal_screen_has_foreground_process (screen))
+        {
+          confirm_close = TRUE;
+          break;
+        }
+    }
+
+  if (n_tabs < 2 && !confirm_close)
+    return TRUE;
+
   dialog = gtk_dialog_new_with_buttons (_("Warning"), GTK_WINDOW (window),
                                         GTK_DIALOG_DESTROY_WITH_PARENT
                                         | GTK_DIALOG_MODAL,
@@ -772,8 +783,30 @@ terminal_window_confirm_close (TerminalWindow *window)
                                         GTK_RESPONSE_CANCEL,
                                         NULL);
 
-  button = xfce_gtk_button_new_mixed ("window-close", _("Close T_ab"));
-  gtk_dialog_add_action_widget (GTK_DIALOG (dialog), button, GTK_RESPONSE_CLOSE);
+  if (n_tabs > 1)
+    {
+      /* multiple tabs */
+      button = xfce_gtk_button_new_mixed ("window-close", _("Close T_ab"));
+      gtk_dialog_add_action_widget (GTK_DIALOG (dialog), button, GTK_RESPONSE_CLOSE);
+
+      if (confirm_close)
+        {
+          /* and process running */
+          message = g_strdup_printf (_("There are still processes running in some tabs.\n"
+                                       "Closing this window will kill all of them."));
+        }
+      else
+        {
+          message = g_strdup_printf (_("This window has %d tabs open. Closing this window\n"
+                                       "will also close all its tabs."), n_tabs);
+        }
+    }
+  else
+    {
+      /* single tab, process running */
+      message = g_strdup_printf (_("There is still a process running.\n"
+                                   "Closing this window will kill it."));
+    }
 
   button = xfce_gtk_button_new_mixed ("application-exit", _("Close _Window"));
   gtk_dialog_add_action_widget (GTK_DIALOG (dialog), button, GTK_RESPONSE_YES);
@@ -791,10 +824,8 @@ terminal_window_confirm_close (TerminalWindow *window)
   vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
   gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
 
-  message = g_strdup_printf (_("This window has %d tabs open. Closing this window\n"
-                               "will also close all its tabs."), n_tabs);
   markup = g_strdup_printf ("<span weight=\"bold\" size=\"larger\">%s</span>\n\n%s",
-                            _("Close all tabs?"), message);
+                            n_tabs > 1 ? _("Close all tabs?") : _("Close window?"), message);
   g_free (message);
 
   label = g_object_new (GTK_TYPE_LABEL,
@@ -2076,7 +2107,7 @@ terminal_window_action_set_title (GtkAction      *action,
                         G_CALLBACK (title_popover_close), window);
     }
 
-    gtk_widget_show_all (window->priv->title_popover);
+  gtk_widget_show_all (window->priv->title_popover);
 }
 
 

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the Xfce4-commits mailing list