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:
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user