diff --git a/src/apps/terminal/AppearPrefView.cpp b/src/apps/terminal/AppearPrefView.cpp index 0c6f35e6b5..cbaa820425 100644 --- a/src/apps/terminal/AppearPrefView.cpp +++ b/src/apps/terminal/AppearPrefView.cpp @@ -13,6 +13,7 @@ #include #include +#include #include #include #include @@ -85,6 +86,9 @@ AppearancePrefView::AppearancePrefView(const char* name, SetLayout(new BGroupLayout(B_HORIZONTAL)); + fWarnOnExit = new BCheckBox(B_TRANSLATE("Warn on Exit"), + new BMessage(MSG_WARN_ON_EXIT_CHANGED)); + BMenu* fontMenu = _MakeFontMenu(MSG_HALF_FONT_CHANGED, PrefHandler::Default()->getString(PREF_HALF_FONT_FAMILY), PrefHandler::Default()->getString(PREF_HALF_FONT_STYLE)); @@ -124,6 +128,7 @@ AppearancePrefView::AppearancePrefView(const char* name, .AddGlue() .Add(fColorControl = new BColorControl(BPoint(10, 10), B_CELLS_32x8, 8.0, "", new BMessage(MSG_COLOR_CHANGED))) + .Add(fWarnOnExit) .End() .End(); @@ -137,6 +142,8 @@ AppearancePrefView::AppearancePrefView(const char* name, fColorControl->SetEnabled(false); fColorControl->SetValue(PrefHandler::Default()->getRGB(PREF_TEXT_FORE_COLOR)); + fWarnOnExit->SetValue(PrefHandler::Default()->getBool(PREF_WARN_ON_EXIT)); + BTextControl* redInput = (BTextControl*)fColorControl->ChildAt(0); BTextControl* greenInput = (BTextControl*)fColorControl->ChildAt(1); BTextControl* blueInput = (BTextControl*)fColorControl->ChildAt(2); @@ -161,6 +168,9 @@ AppearancePrefView::GetPreferredSize(float* _width, float* _height) void AppearancePrefView::Revert() { + fWarnOnExit->SetValue(PrefHandler::Default()->getBool( + PREF_WARN_ON_EXIT)); + fColorSchemaField->Menu()->ItemAt(0)->SetMarked(true); fColorControl->SetValue(PrefHandler::Default()-> getRGB(PREF_TEXT_FORE_COLOR)); @@ -175,6 +185,8 @@ AppearancePrefView::Revert() void AppearancePrefView::AttachedToWindow() { + fWarnOnExit->SetTarget(this); + fFontSize->Menu()->SetTargetForItems(this); fFont->Menu()->SetTargetForItems(this); @@ -261,6 +273,14 @@ AppearancePrefView::MessageReceived(BMessage* msg) fColorField->Menu()->FindMarked()->Label())); break; + case MSG_WARN_ON_EXIT_CHANGED: + if (PrefHandler::Default()->getBool(PREF_WARN_ON_EXIT) + != fWarnOnExit->Value()) { + PrefHandler::Default()->setBool(PREF_WARN_ON_EXIT, + fWarnOnExit->Value()); + modified = true; + } + break; default: BView::MessageReceived(msg); return; diff --git a/src/apps/terminal/AppearPrefView.h b/src/apps/terminal/AppearPrefView.h index f67933bea4..bc4d6110e5 100644 --- a/src/apps/terminal/AppearPrefView.h +++ b/src/apps/terminal/AppearPrefView.h @@ -21,7 +21,7 @@ const ulong MSG_COLOR_FIELD_CHANGED = 'mccf'; const ulong MSG_COLOR_CHANGED = 'mcbc'; const ulong MSG_COLOR_SCHEMA_CHANGED = 'mccs'; - +const ulong MSG_WARN_ON_EXIT_CHANGED = 'mwec'; const ulong MSG_COLS_CHANGED = 'mccl'; const ulong MSG_ROWS_CHANGED = 'mcrw'; const ulong MSG_HISTORY_CHANGED = 'mhst'; @@ -34,6 +34,7 @@ class BColorControl; class BMenu; class BMenuField; class BPopUpMenu; +class BCheckBox; class AppearancePrefView : public BView { public: @@ -65,6 +66,7 @@ private: static BPopUpMenu* _MakeColorSchemaMenu(uint32 msg, const color_schema **schemas, const color_schema *defaultItemName); + BCheckBox *fWarnOnExit; BMenuField *fFont; BMenuField *fFontSize; diff --git a/src/apps/terminal/PrefHandler.cpp b/src/apps/terminal/PrefHandler.cpp index 1d3906a4e8..03aa1715cf 100644 --- a/src/apps/terminal/PrefHandler.cpp +++ b/src/apps/terminal/PrefHandler.cpp @@ -58,6 +58,9 @@ static const pref_defaults kTermDefaults[] = { { PREF_GUI_LANGUAGE, "English"}, { PREF_IM_AWARE, "0"}, + + { PREF_WARN_ON_EXIT, PREF_TRUE }, + { NULL, NULL}, }; @@ -425,6 +428,7 @@ PrefHandler::_LoadFromFile(const char* path) setRGB(PREF_SELECT_BACK_COLOR, prefs.selbg); setRGB(PREF_SELECT_FORE_COLOR, prefs.selfg); setString(PREF_TEXT_ENCODING, EncodingAsString(prefs.encoding)); + setBool(PREF_WARN_ON_EXIT, prefs.warn_on_exit); return B_OK; } diff --git a/src/apps/terminal/PrefHandler.h b/src/apps/terminal/PrefHandler.h index b85231d7c1..ccda172f70 100644 --- a/src/apps/terminal/PrefHandler.h +++ b/src/apps/terminal/PrefHandler.h @@ -41,7 +41,8 @@ struct termprefs { rgb_color selbg; rgb_color selfg; char encoding; // index in the menu (0 = UTF-8) - char unknown[3]; + bool warn_on_exit; + char unknown[2]; }; struct pref_defaults { diff --git a/src/apps/terminal/TermConst.h b/src/apps/terminal/TermConst.h index 7abee6c0cf..59fa35120c 100644 --- a/src/apps/terminal/TermConst.h +++ b/src/apps/terminal/TermConst.h @@ -130,6 +130,8 @@ const char* const PREF_SHELL = "Shell"; const char* const PREF_TEXT_ENCODING = "Text encoding"; const char* const PREF_GUI_LANGUAGE = "Language"; +const char* const PREF_WARN_ON_EXIT = "Warn on exit"; + // Color type enum { TEXT_FOREGROUND_COLOR, diff --git a/src/apps/terminal/TermWindow.cpp b/src/apps/terminal/TermWindow.cpp index 32479ca28a..213b2c9ef4 100644 --- a/src/apps/terminal/TermWindow.cpp +++ b/src/apps/terminal/TermWindow.cpp @@ -233,6 +233,30 @@ TermWindow::_InitWindow() bool TermWindow::QuitRequested() { + bool warnOnExit = PrefHandler::Default()->getBool(PREF_WARN_ON_EXIT); + + if (!warnOnExit) + return BWindow::QuitRequested(); + + bool isBusy = false; + for (int32 i = 0; i < fSessions.CountItems(); i++) { + if (_TermViewAt(i)->IsShellBusy()) { + isBusy = true; + break; + } + } + + if (isBusy) { + const char *alertMessage = B_TRANSLATE("A process is still running.\n" + "If you close the Terminal the process will be killed."); + BAlert *alert = new BAlert(B_TRANSLATE("Really quit?"), + alertMessage, B_TRANSLATE("OK"), B_TRANSLATE("Cancel"), NULL, + B_WIDTH_AS_USUAL, B_WARNING_ALERT); + int32 result = alert->Go(); + if (result == 1) + return false; + } + return BWindow::QuitRequested(); }