Terminal will issue an alert, if there are active processes and the

user closes the window (doesn't work if the user closes only a tab, yet).
Active by default but can be disabled by a checkbox.
- The preference window needs to be reworked.
- Wording of the alert and the option can be improved (I accept advices).



git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@37754 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Stefano Ceccherini
2010-07-26 12:24:31 +00:00
parent f700bfd569
commit 6491fb598a
6 changed files with 55 additions and 2 deletions
+20
View File
@@ -13,6 +13,7 @@
#include <Button.h> #include <Button.h>
#include <Catalog.h> #include <Catalog.h>
#include <CheckBox.h>
#include <ColorControl.h> #include <ColorControl.h>
#include <GridLayoutBuilder.h> #include <GridLayoutBuilder.h>
#include <GroupLayoutBuilder.h> #include <GroupLayoutBuilder.h>
@@ -85,6 +86,9 @@ AppearancePrefView::AppearancePrefView(const char* name,
SetLayout(new BGroupLayout(B_HORIZONTAL)); 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, BMenu* fontMenu = _MakeFontMenu(MSG_HALF_FONT_CHANGED,
PrefHandler::Default()->getString(PREF_HALF_FONT_FAMILY), PrefHandler::Default()->getString(PREF_HALF_FONT_FAMILY),
PrefHandler::Default()->getString(PREF_HALF_FONT_STYLE)); PrefHandler::Default()->getString(PREF_HALF_FONT_STYLE));
@@ -124,6 +128,7 @@ AppearancePrefView::AppearancePrefView(const char* name,
.AddGlue() .AddGlue()
.Add(fColorControl = new BColorControl(BPoint(10, 10), .Add(fColorControl = new BColorControl(BPoint(10, 10),
B_CELLS_32x8, 8.0, "", new BMessage(MSG_COLOR_CHANGED))) B_CELLS_32x8, 8.0, "", new BMessage(MSG_COLOR_CHANGED)))
.Add(fWarnOnExit)
.End() .End()
.End(); .End();
@@ -137,6 +142,8 @@ AppearancePrefView::AppearancePrefView(const char* name,
fColorControl->SetEnabled(false); fColorControl->SetEnabled(false);
fColorControl->SetValue(PrefHandler::Default()->getRGB(PREF_TEXT_FORE_COLOR)); 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* redInput = (BTextControl*)fColorControl->ChildAt(0);
BTextControl* greenInput = (BTextControl*)fColorControl->ChildAt(1); BTextControl* greenInput = (BTextControl*)fColorControl->ChildAt(1);
BTextControl* blueInput = (BTextControl*)fColorControl->ChildAt(2); BTextControl* blueInput = (BTextControl*)fColorControl->ChildAt(2);
@@ -161,6 +168,9 @@ AppearancePrefView::GetPreferredSize(float* _width, float* _height)
void void
AppearancePrefView::Revert() AppearancePrefView::Revert()
{ {
fWarnOnExit->SetValue(PrefHandler::Default()->getBool(
PREF_WARN_ON_EXIT));
fColorSchemaField->Menu()->ItemAt(0)->SetMarked(true); fColorSchemaField->Menu()->ItemAt(0)->SetMarked(true);
fColorControl->SetValue(PrefHandler::Default()-> fColorControl->SetValue(PrefHandler::Default()->
getRGB(PREF_TEXT_FORE_COLOR)); getRGB(PREF_TEXT_FORE_COLOR));
@@ -175,6 +185,8 @@ AppearancePrefView::Revert()
void void
AppearancePrefView::AttachedToWindow() AppearancePrefView::AttachedToWindow()
{ {
fWarnOnExit->SetTarget(this);
fFontSize->Menu()->SetTargetForItems(this); fFontSize->Menu()->SetTargetForItems(this);
fFont->Menu()->SetTargetForItems(this); fFont->Menu()->SetTargetForItems(this);
@@ -261,6 +273,14 @@ AppearancePrefView::MessageReceived(BMessage* msg)
fColorField->Menu()->FindMarked()->Label())); fColorField->Menu()->FindMarked()->Label()));
break; 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: default:
BView::MessageReceived(msg); BView::MessageReceived(msg);
return; return;
+3 -1
View File
@@ -21,7 +21,7 @@ const ulong MSG_COLOR_FIELD_CHANGED = 'mccf';
const ulong MSG_COLOR_CHANGED = 'mcbc'; const ulong MSG_COLOR_CHANGED = 'mcbc';
const ulong MSG_COLOR_SCHEMA_CHANGED = 'mccs'; const ulong MSG_COLOR_SCHEMA_CHANGED = 'mccs';
const ulong MSG_WARN_ON_EXIT_CHANGED = 'mwec';
const ulong MSG_COLS_CHANGED = 'mccl'; const ulong MSG_COLS_CHANGED = 'mccl';
const ulong MSG_ROWS_CHANGED = 'mcrw'; const ulong MSG_ROWS_CHANGED = 'mcrw';
const ulong MSG_HISTORY_CHANGED = 'mhst'; const ulong MSG_HISTORY_CHANGED = 'mhst';
@@ -34,6 +34,7 @@ class BColorControl;
class BMenu; class BMenu;
class BMenuField; class BMenuField;
class BPopUpMenu; class BPopUpMenu;
class BCheckBox;
class AppearancePrefView : public BView { class AppearancePrefView : public BView {
public: public:
@@ -65,6 +66,7 @@ private:
static BPopUpMenu* _MakeColorSchemaMenu(uint32 msg, const color_schema **schemas, static BPopUpMenu* _MakeColorSchemaMenu(uint32 msg, const color_schema **schemas,
const color_schema *defaultItemName); const color_schema *defaultItemName);
BCheckBox *fWarnOnExit;
BMenuField *fFont; BMenuField *fFont;
BMenuField *fFontSize; BMenuField *fFontSize;
+4
View File
@@ -58,6 +58,9 @@ static const pref_defaults kTermDefaults[] = {
{ PREF_GUI_LANGUAGE, "English"}, { PREF_GUI_LANGUAGE, "English"},
{ PREF_IM_AWARE, "0"}, { PREF_IM_AWARE, "0"},
{ PREF_WARN_ON_EXIT, PREF_TRUE },
{ NULL, NULL}, { NULL, NULL},
}; };
@@ -425,6 +428,7 @@ PrefHandler::_LoadFromFile(const char* path)
setRGB(PREF_SELECT_BACK_COLOR, prefs.selbg); setRGB(PREF_SELECT_BACK_COLOR, prefs.selbg);
setRGB(PREF_SELECT_FORE_COLOR, prefs.selfg); setRGB(PREF_SELECT_FORE_COLOR, prefs.selfg);
setString(PREF_TEXT_ENCODING, EncodingAsString(prefs.encoding)); setString(PREF_TEXT_ENCODING, EncodingAsString(prefs.encoding));
setBool(PREF_WARN_ON_EXIT, prefs.warn_on_exit);
return B_OK; return B_OK;
} }
+2 -1
View File
@@ -41,7 +41,8 @@ struct termprefs {
rgb_color selbg; rgb_color selbg;
rgb_color selfg; rgb_color selfg;
char encoding; // index in the menu (0 = UTF-8) char encoding; // index in the menu (0 = UTF-8)
char unknown[3]; bool warn_on_exit;
char unknown[2];
}; };
struct pref_defaults { struct pref_defaults {
+2
View File
@@ -130,6 +130,8 @@ const char* const PREF_SHELL = "Shell";
const char* const PREF_TEXT_ENCODING = "Text encoding"; const char* const PREF_TEXT_ENCODING = "Text encoding";
const char* const PREF_GUI_LANGUAGE = "Language"; const char* const PREF_GUI_LANGUAGE = "Language";
const char* const PREF_WARN_ON_EXIT = "Warn on exit";
// Color type // Color type
enum { enum {
TEXT_FOREGROUND_COLOR, TEXT_FOREGROUND_COLOR,
+24
View File
@@ -233,6 +233,30 @@ TermWindow::_InitWindow()
bool bool
TermWindow::QuitRequested() 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(); return BWindow::QuitRequested();
} }