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

View File

@ -13,6 +13,7 @@
#include <Button.h>
#include <Catalog.h>
#include <CheckBox.h>
#include <ColorControl.h>
#include <GridLayoutBuilder.h>
#include <GroupLayoutBuilder.h>
@ -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;

View File

@ -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;

View File

@ -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;
}

View File

@ -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 {

View File

@ -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,

View File

@ -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();
}