Show confirmation dialog if there are multiple open tabs on closing

As a followup #149 this fixes the behavior of the code to match the
description of the respective gsettings entry "confirm-window-close".
Said entry is also updated to reflect the change added in #149.
No changes to the gsettings handling were made thus only users
who have "confirm-window-close" turned on already will see the
new behavior.
Stefan Tauner 2017-08-11 11:47:54 +02:00 committed by raveit65
parent 11909bfdfe
commit a711e2e2c2
2 changed files with 20 additions and 15 deletions

View File

@ -72,7 +72,7 @@
<key name="confirm-window-close" type="b"> <key name="confirm-window-close" type="b">
<default>true</default> <default>true</default>
<summary>Whether to ask for confirmation when closing terminal windows</summary> <summary>Whether to ask for confirmation when closing terminal windows</summary>
<description>Whether to ask for confirmation when closing a terminal window which has more than one open tab.</description> <description>Whether to ask for confirmation when closing a terminal window which has more than one open tab or any foreground subprocesses.</description>
</key> </key>
<key name="middle-click-closes-tabs" type="b"> <key name="middle-click-closes-tabs" type="b">
<default>false</default> <default>false</default>

View File

@ -3501,7 +3501,9 @@ confirm_close_window_or_tab (TerminalWindow *window,
GtkWidget *dialog; GtkWidget *dialog;
GSettings *settings; GSettings *settings;
gboolean do_confirm; gboolean do_confirm;
gboolean has_processes;
int n_tabs; int n_tabs;
char *confirm_msg;
if (priv->confirm_close_dialog) if (priv->confirm_close_dialog)
{ {
@ -3518,7 +3520,7 @@ confirm_close_window_or_tab (TerminalWindow *window,
if (screen) if (screen)
{ {
do_confirm = terminal_screen_has_foreground_process (screen); has_processes = terminal_screen_has_foreground_process (screen);
n_tabs = 1; n_tabs = 1;
} }
else else
@ -3535,16 +3537,25 @@ confirm_close_window_or_tab (TerminalWindow *window,
TerminalScreen *terminal_screen; TerminalScreen *terminal_screen;
terminal_screen = terminal_screen_container_get_screen (TERMINAL_SCREEN_CONTAINER (t->data)); terminal_screen = terminal_screen_container_get_screen (TERMINAL_SCREEN_CONTAINER (t->data));
if (terminal_screen_has_foreground_process (terminal_screen)) has_processes = terminal_screen_has_foreground_process (terminal_screen);
{ if (has_processes)
do_confirm = TRUE;
break; break;
}
} }
g_list_free (tabs); g_list_free (tabs);
} }
if (!do_confirm)
if (has_processes)
{
if (n_tabs > 1)
confirm_msg = _("There are still processes running in some terminals in this window. "
"Closing the window will kill all of them.");
else
confirm_msg = _("There is still a process running in this terminal. "
"Closing the terminal will kill it.");
} else if (n_tabs > 1)
confirm_msg = _("There are multiple tabs open in this window.");
else
return FALSE; return FALSE;
dialog = priv->confirm_close_dialog = dialog = priv->confirm_close_dialog =
@ -3554,14 +3565,8 @@ confirm_close_window_or_tab (TerminalWindow *window,
GTK_BUTTONS_CANCEL, GTK_BUTTONS_CANCEL,
"%s", n_tabs > 1 ? _("Close this window?") : _("Close this terminal?")); "%s", n_tabs > 1 ? _("Close this window?") : _("Close this terminal?"));
if (n_tabs > 1) gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), "%s", confirm_msg);
"%s", _("There are still processes running in some terminals in this window. "
"Closing the window will kill all of them."));
else
gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
"%s", _("There is still a process running in this terminal. "
"Closing the terminal will kill it."));
gtk_window_set_title (GTK_WINDOW (dialog), ""); gtk_window_set_title (GTK_WINDOW (dialog), "");