From e268659d32f45af26754cbb5a0de61842ded1093 Mon Sep 17 00:00:00 2001 From: MacDue Date: Wed, 4 May 2022 21:36:07 +0100 Subject: [PATCH] Terminal+TerminalSettings: Allow disabling close confirmations --- Userland/Applications/Terminal/main.cpp | 25 ++++++++++++++++--- .../TerminalSettings/TerminalSettingsMain.gml | 13 ++++++++++ .../TerminalSettingsWidget.cpp | 11 ++++++++ .../TerminalSettings/TerminalSettingsWidget.h | 2 ++ 4 files changed, 48 insertions(+), 3 deletions(-) diff --git a/Userland/Applications/Terminal/main.cpp b/Userland/Applications/Terminal/main.cpp index c488f90ac7..e9d5635129 100644 --- a/Userland/Applications/Terminal/main.cpp +++ b/Userland/Applications/Terminal/main.cpp @@ -57,8 +57,11 @@ public: { VERIFY(domain == "Terminal"); - if (group == "Terminal" && key == "ShowScrollBar") { - m_parent_terminal.set_show_scrollbar(value); + if (group == "Terminal") { + if (key == "ShowScrollBar") + m_parent_terminal.set_show_scrollbar(value); + else if (key == "ConfirmClose" && on_confirm_close_changed) + on_confirm_close_changed(value); } } @@ -99,6 +102,8 @@ public: } } + Function on_confirm_close_changed; + private: VT::TerminalWidget& m_parent_terminal; }; @@ -297,6 +302,7 @@ ErrorOr serenity_main(Main::Arguments arguments) window->set_icon(app_icon.bitmap_for_size(16)); Config::monitor_domain("Terminal"); + auto should_confirm_close = Config::read_bool("Terminal", "Terminal", "ConfirmClose", true); TerminalChangeListener listener { terminal }; auto bell = Config::read_string("Terminal", "Window", "Bell", "Visible"); @@ -352,6 +358,8 @@ ErrorOr serenity_main(Main::Arguments arguments) }; auto check_terminal_quit = [&]() -> int { + if (!should_confirm_close) + return GUI::MessageBox::ExecOK; Optional close_message; if (tty_has_foreground_process()) { close_message = "There is still a process running in this terminal. Closing the terminal will kill it."; @@ -420,8 +428,19 @@ ErrorOr serenity_main(Main::Arguments arguments) window->set_modified(tty_has_foreground_process() || shell_child_process_count() > 0); }); + listener.on_confirm_close_changed = [&](bool confirm_close) { + if (confirm_close) { + modified_state_check_timer->start(); + } else { + modified_state_check_timer->stop(); + window->set_modified(false); + } + should_confirm_close = confirm_close; + }; + window->show(); - modified_state_check_timer->start(); + if (should_confirm_close) + modified_state_check_timer->start(); int result = app->exec(); dbgln("Exiting terminal, updating utmp"); utmp_update(ptsname, 0, false); diff --git a/Userland/Applications/TerminalSettings/TerminalSettingsMain.gml b/Userland/Applications/TerminalSettings/TerminalSettingsMain.gml index ba87b0974c..e6600baa38 100644 --- a/Userland/Applications/TerminalSettings/TerminalSettingsMain.gml +++ b/Userland/Applications/TerminalSettings/TerminalSettingsMain.gml @@ -61,4 +61,17 @@ orientation: "Horizontal" } } + + @GUI::GroupBox { + title: "Exit Behaviour" + shrink_to_fit: true + layout: @GUI::VerticalBoxLayout { + margins: [16, 8, 8] + } + + @GUI::CheckBox { + name: "terminal_confirm_close" + text: "Ask before closing if processes are running in the terminal" + } + } } diff --git a/Userland/Applications/TerminalSettings/TerminalSettingsWidget.cpp b/Userland/Applications/TerminalSettings/TerminalSettingsWidget.cpp index 9cfa571b20..9688a4dc5b 100644 --- a/Userland/Applications/TerminalSettings/TerminalSettingsWidget.cpp +++ b/Userland/Applications/TerminalSettings/TerminalSettingsWidget.cpp @@ -83,6 +83,15 @@ TerminalSettingsMainWidget::TerminalSettingsMainWidget() Config::write_bool("Terminal", "Terminal", "ShowScrollBar", show_scrollbar); }; show_scrollbar_checkbox.set_checked(m_show_scrollbar); + + m_confirm_close = Config::read_bool("Terminal", "Terminal", "ConfirmClose", true); + m_orignal_confirm_close = m_confirm_close; + auto& confirm_close_checkbox = *find_descendant_of_type_named("terminal_confirm_close"); + confirm_close_checkbox.on_checked = [&](bool confirm_close) { + m_confirm_close = confirm_close; + Config::write_bool("Terminal", "Terminal", "ConfirmClose", confirm_close); + }; + confirm_close_checkbox.set_checked(m_confirm_close); } TerminalSettingsViewWidget::TerminalSettingsViewWidget() @@ -190,12 +199,14 @@ void TerminalSettingsMainWidget::apply_settings() m_original_max_history_size = m_max_history_size; m_orignal_show_scrollbar = m_show_scrollbar; m_original_bell_mode = m_bell_mode; + m_orignal_confirm_close = m_confirm_close; write_back_settings(); } void TerminalSettingsMainWidget::write_back_settings() const { Config::write_i32("Terminal", "Terminal", "MaxHistorySize", static_cast(m_original_max_history_size)); Config::write_bool("Terminal", "Terminal", "ShowScrollBar", m_orignal_show_scrollbar); + Config::write_bool("Terminal", "Terminal", "ConfirmClose", m_orignal_confirm_close); Config::write_string("Terminal", "Window", "Bell", stringify_bell(m_original_bell_mode)); } diff --git a/Userland/Applications/TerminalSettings/TerminalSettingsWidget.h b/Userland/Applications/TerminalSettings/TerminalSettingsWidget.h index 5b6e280fe8..bc4a2352f5 100644 --- a/Userland/Applications/TerminalSettings/TerminalSettingsWidget.h +++ b/Userland/Applications/TerminalSettings/TerminalSettingsWidget.h @@ -29,10 +29,12 @@ private: VT::TerminalWidget::BellMode m_bell_mode = VT::TerminalWidget::BellMode::Disabled; size_t m_max_history_size; bool m_show_scrollbar { true }; + bool m_confirm_close { true }; VT::TerminalWidget::BellMode m_original_bell_mode; size_t m_original_max_history_size; bool m_orignal_show_scrollbar { true }; + bool m_orignal_confirm_close { true }; }; class TerminalSettingsViewWidget final : public GUI::SettingsWindow::Tab {