Window size is now saved into preferences. This resolves bug #42

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@18429 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
DarkWyrm
2006-08-07 13:57:30 +00:00
parent 1920c5bc7d
commit 464b524b93
+258 -277
View File
@@ -123,6 +123,7 @@ TermWindow::InitWindow(void)
// Initialize TermView. (font, size and color)
fTermView->SetTermFont(&halfFont, &fullFont);
BRect rect = fTermView->SetTermSize(gTermPref->getInt32(PREF_ROWS),
gTermPref->getInt32(PREF_COLS), 1);
@@ -191,37 +192,33 @@ TermWindow::MenusBeginning(void)
void
TermWindow::SetupMenu(void)
{
PrefHandler menuText;
LoadLocaleFile (&menuText);
// Menu bar object.
fMenubar = new BMenuBar(Bounds(), "mbar");
/*
* Make File Menu.
*/
fFilemenu = new BMenu("Terminal");
fFilemenu->AddItem(new BMenuItem("Switch Terminals", new BMessage(MENU_SWITCH_TERM),'G'));
fFilemenu->AddItem(new BMenuItem("Start New Terminal", new BMessage(MENU_NEW_TERM), 'N'));
fFilemenu->AddSeparatorItem();
fFilemenu->AddItem(new BMenuItem("Page Setup...", new BMessage(MENU_PAGE_SETUP)));
fFilemenu->AddItem(new BMenuItem("Print", new BMessage(MENU_PRINT),'P'));
fFilemenu->AddSeparatorItem();
fFilemenu->AddItem(new BMenuItem("About Terminal...", new BMessage(B_ABOUT_REQUESTED)));
fFilemenu->AddSeparatorItem();
fFilemenu->AddItem(new BMenuItem("Quit", new BMessage(MENU_FILE_QUIT), 'Q'));
fMenubar->AddItem(fFilemenu);
/*
* Make Edit Menu.
*/
fEditmenu = new BMenu ("Edit");
fEditmenu->AddItem (new BMenuItem ("Copy", new BMessage (B_COPY),'C'));
fEditmenu->AddItem (new BMenuItem ("Paste", new BMessage (B_PASTE),'V'));
fEditmenu->AddSeparatorItem ();
fEditmenu->AddItem (new BMenuItem ("Select All", new BMessage (B_SELECT_ALL), 'A'));
fEditmenu->AddItem (new BMenuItem ("Clear All", new BMessage (MENU_CLEAR_ALL), 'L'));
PrefHandler menuText;
LoadLocaleFile (&menuText);
// Menu bar object.
fMenubar = new BMenuBar(Bounds(), "mbar");
// Make File Menu.
fFilemenu = new BMenu("Terminal");
fFilemenu->AddItem(new BMenuItem("Switch Terminals", new BMessage(MENU_SWITCH_TERM),'G'));
fFilemenu->AddItem(new BMenuItem("Start New Terminal", new BMessage(MENU_NEW_TERM), 'N'));
fFilemenu->AddSeparatorItem();
fFilemenu->AddItem(new BMenuItem("Page Setup...", new BMessage(MENU_PAGE_SETUP)));
fFilemenu->AddItem(new BMenuItem("Print", new BMessage(MENU_PRINT),'P'));
fFilemenu->AddSeparatorItem();
fFilemenu->AddItem(new BMenuItem("About Terminal...", new BMessage(B_ABOUT_REQUESTED)));
fFilemenu->AddSeparatorItem();
fFilemenu->AddItem(new BMenuItem("Quit", new BMessage(MENU_FILE_QUIT), 'Q'));
fMenubar->AddItem(fFilemenu);
// Make Edit Menu.
fEditmenu = new BMenu ("Edit");
fEditmenu->AddItem (new BMenuItem ("Copy", new BMessage (B_COPY),'C'));
fEditmenu->AddItem (new BMenuItem ("Paste", new BMessage (B_PASTE),'V'));
fEditmenu->AddSeparatorItem ();
fEditmenu->AddItem (new BMenuItem ("Select All", new BMessage (B_SELECT_ALL), 'A'));
fEditmenu->AddItem (new BMenuItem ("Clear All", new BMessage (MENU_CLEAR_ALL), 'L'));
/*
// TODO: Implement Finding
@@ -231,18 +228,15 @@ TermWindow::SetupMenu(void)
*/
fMenubar->AddItem (fEditmenu);
/*
* Make Help Menu.
*/
// Make Help Menu.
fHelpmenu = new BMenu("Settings");
fWindowSizeMenu = new BMenu("Window Size");
fWindowSizeMenu->AddItem(new BMenuItem("80x24", new BMessage(EIGHTYTWENTYFOUR)));
fWindowSizeMenu->AddItem(new BMenuItem("80x25", new BMessage(EIGHTYTWENTYFIVE)));
fWindowSizeMenu->AddItem(new BMenuItem("80x40", new BMessage(EIGHTYFORTY)));
fWindowSizeMenu->AddItem(new BMenuItem("132x24", new BMessage(ONETHREETWOTWENTYFOUR)));
fWindowSizeMenu->AddItem(new BMenuItem("132x25", new BMessage(ONETHREETWOTWENTYFIVE)));
fWindowSizeMenu->AddItem(new BMenuItem("Fullscreen", new BMessage(FULLSCREEN), B_ENTER));
fWindowSizeMenu->AddItem(new BMenuItem("80x24", new BMessage(EIGHTYTWENTYFOUR)));
fWindowSizeMenu->AddItem(new BMenuItem("80x25", new BMessage(EIGHTYTWENTYFIVE)));
fWindowSizeMenu->AddItem(new BMenuItem("80x40", new BMessage(EIGHTYFORTY)));
fWindowSizeMenu->AddItem(new BMenuItem("132x24", new BMessage(ONETHREETWOTWENTYFOUR)));
fWindowSizeMenu->AddItem(new BMenuItem("132x25", new BMessage(ONETHREETWOTWENTYFIVE)));
fWindowSizeMenu->AddItem(new BMenuItem("Fullscreen", new BMessage(FULLSCREEN), B_ENTER));
// Considering we have this in the preferences window, this menu is not
// needed and should not be shown if we are to not confuse the user
@@ -271,7 +265,7 @@ TermWindow::SetupMenu(void)
fHelpmenu->AddSeparatorItem();
fHelpmenu->AddItem(new BMenuItem("Save as default", new BMessage(SAVE_AS_DEFAULT)));
fMenubar->AddItem(fHelpmenu);
AddChild(fMenubar);
}
@@ -284,233 +278,223 @@ TermWindow::MessageReceived(BMessage *message)
BFont halfFont;
BFont fullFont;
switch (message->what) {
case MENU_SWITCH_TERM:
be_app->PostMessage(MENU_SWITCH_TERM);
break;
case MENU_NEW_TERM: {
app_info info;
be_app->GetAppInfo(&info);
// try launching two different ways to work around possible problems
if (be_roster->Launch(&info.ref)!=B_OK)
be_roster->Launch(TERM_SIGNATURE);
}
break;
case MENU_PREF_OPEN:
if (!fPrefWindow){
fPrefWindow = new PrefDlg(this);
}else{
fPrefWindow->Activate();
}
break;
case MSG_PREF_CLOSED:
fPrefWindow = NULL;
break;
case MENU_FILE_QUIT:
be_app->PostMessage(B_QUIT_REQUESTED);
break;
case MENU_ENCODING:
message->FindInt32 ("op", &coding_id);
gNowCoding = coding_id;
SetCoding(coding_id);
break;
/*
* Extended B_SET_PROPERTY. Dispatch this message,
* Set coding ID.
*/
case B_SET_PROPERTY:
{
int32 i;
BMessage spe;
message->GetCurrentSpecifier(&i, &spe);
if (!strcmp("encode", spe.FindString("property", i))){
message->FindInt32 ("data", &coding_id);
gNowCoding = coding_id;
SetCoding (coding_id);
message->SendReply(B_REPLY);
}else{
BWindow::MessageReceived(message);
}
break;
}
/*
* Extended B_GET_PROPERTY. Dispatch this message,
* reply now coding ID.
*/
case B_GET_PROPERTY:
{
int32 i;
BMessage spe;
message->GetCurrentSpecifier(&i, &spe);
if (!strcmp("encode", spe.FindString("property", i))){
BMessage reply(B_REPLY);
reply.AddInt32("result", gNowCoding);
message->SendReply(&reply);
}else if (!strcmp("tty", spe.FindString("property", i))){
BMessage reply(B_REPLY);
reply.AddString("result", &tty_name[8]);
message->SendReply(&reply);
}else{
BWindow::MessageReceived(message);
}
break;
}
/*
* Message from Preference panel.
*/
case MSG_ROWS_CHANGED:
case MSG_COLS_CHANGED:
r = fTermView->SetTermSize (gTermPref->getInt32 (PREF_ROWS),
gTermPref->getInt32 (PREF_COLS),
0);
ResizeTo (r.Width()+ B_V_SCROLL_BAR_WIDTH + VIEW_OFFSET * 2,
r.Height()+fMenubar->Bounds().Height() + VIEW_OFFSET *2);
break;
case MSG_HALF_FONT_CHANGED:
case MSG_FULL_FONT_CHANGED:
case MSG_HALF_SIZE_CHANGED:
case MSG_FULL_SIZE_CHANGED:
halfFont.SetFamilyAndStyle (gTermPref->getString(PREF_HALF_FONT_FAMILY),
NULL);
halfFont.SetSize (gTermPref->getFloat(PREF_HALF_FONT_SIZE));
halfFont.SetSpacing (B_FIXED_SPACING);
fullFont.SetFamilyAndStyle (gTermPref->getString(PREF_FULL_FONT_FAMILY),
NULL);
fullFont.SetSize (gTermPref->getFloat(PREF_FULL_FONT_SIZE));
fullFont.SetSpacing (B_FIXED_SPACING);
fTermView->SetTermFont (&halfFont, &fullFont);
r = fTermView->SetTermSize (0, 0, 0);
int width, height;
fTermView->GetFontSize (&width, &height);
SetSizeLimits (MIN_COLS * width, MAX_COLS * width,
MIN_COLS * height, MAX_COLS * height);
ResizeTo (r.Width()+ B_V_SCROLL_BAR_WIDTH + VIEW_OFFSET * 2,
r.Height()+fMenubar->Bounds().Height() + VIEW_OFFSET * 2);
fTermView->Invalidate();
break;
case EIGHTYTWENTYFOUR:
gTermPref->setString(PREF_COLS, "80");
gTermPref->setString(PREF_ROWS, "24");
this->PostMessage (MSG_ROWS_CHANGED);
this->PostMessage (MSG_COLS_CHANGED);
break;
case EIGHTYTWENTYFIVE:
gTermPref->setString(PREF_COLS, "80");
gTermPref->setString(PREF_ROWS, "25");
this->PostMessage (MSG_ROWS_CHANGED);
this->PostMessage (MSG_COLS_CHANGED);
break;
case EIGHTYFORTY:
gTermPref->setString(PREF_COLS, "80");
gTermPref->setString(PREF_ROWS, "40");
this->PostMessage (MSG_ROWS_CHANGED);
this->PostMessage (MSG_COLS_CHANGED);
break;
case ONETHREETWOTWENTYFOUR:
gTermPref->setString(PREF_COLS, "132");
gTermPref->setString(PREF_ROWS, "24");
this->PostMessage (MSG_ROWS_CHANGED);
this->PostMessage (MSG_COLS_CHANGED);
break;
case ONETHREETWOTWENTYFIVE:
gTermPref->setString(PREF_COLS, "132");
gTermPref->setString(PREF_ROWS, "25");
this->PostMessage (MSG_ROWS_CHANGED);
this->PostMessage (MSG_COLS_CHANGED);
break;
case FULLSCREEN:
if (!fSavedFrame.IsValid()) { // go fullscreen
float mbHeight = fMenubar->Bounds().Height() + 1;
fSavedFrame = Frame();
BScreen screen(this);
fTermView->ScrollBar()->Hide();
fMenubar->Hide();
fBaseView->MoveTo(0,0);
fBaseView->ResizeBy(B_V_SCROLL_BAR_WIDTH, mbHeight);
fSavedLook = Look();
// done before ResizeTo to work around a Dano bug (not erasing the decor)
SetLook(B_NO_BORDER_WINDOW_LOOK);
ResizeTo(screen.Frame().Width()+1, screen.Frame().Height()+1);
MoveTo(screen.Frame().left, screen.Frame().top);
} else { // exit fullscreen
float mbHeight = fMenubar->Bounds().Height() + 1;
fMenubar->Show();
fTermView->ScrollBar()->Show();
ResizeTo(fSavedFrame.Width(), fSavedFrame.Height());
MoveTo(fSavedFrame.left, fSavedFrame.top);
fBaseView->ResizeBy(-B_V_SCROLL_BAR_WIDTH, -mbHeight);
fBaseView->MoveTo(0,mbHeight);
SetLook(fSavedLook);
fSavedFrame = BRect(0,0,-1,-1);
switch (message->what) {
case MENU_SWITCH_TERM: {
be_app->PostMessage(MENU_SWITCH_TERM);
break;
}
case MENU_NEW_TERM: {
app_info info;
be_app->GetAppInfo(&info);
// try launching two different ways to work around possible problems
if (be_roster->Launch(&info.ref)!=B_OK)
be_roster->Launch(TERM_SIGNATURE);
break;
}
case MENU_PREF_OPEN: {
if (!fPrefWindow)
fPrefWindow = new PrefDlg(this);
else
fPrefWindow->Activate();
break;
}
case MSG_PREF_CLOSED: {
fPrefWindow = NULL;
break;
}
case MENU_FILE_QUIT: {
be_app->PostMessage(B_QUIT_REQUESTED);
break;
}
case MENU_ENCODING: {
message->FindInt32 ("op", &coding_id);
gNowCoding = coding_id;
SetCoding(coding_id);
break;
}
// Extended B_SET_PROPERTY. Dispatch this message,
// Set coding ID.
case B_SET_PROPERTY: {
int32 i;
BMessage spe;
message->GetCurrentSpecifier(&i, &spe);
if (!strcmp("encode", spe.FindString("property", i))){
message->FindInt32 ("data", &coding_id);
gNowCoding = coding_id;
SetCoding (coding_id);
message->SendReply(B_REPLY);
} else {
BWindow::MessageReceived(message);
}
break;
}
// Extended B_GET_PROPERTY. Dispatch this message, reply now coding ID.
case B_GET_PROPERTY: {
int32 i;
BMessage spe;
message->GetCurrentSpecifier(&i, &spe);
if (!strcmp("encode", spe.FindString("property", i))){
BMessage reply(B_REPLY);
reply.AddInt32("result", gNowCoding);
message->SendReply(&reply);
}
else if (!strcmp("tty", spe.FindString("property", i))) {
BMessage reply(B_REPLY);
reply.AddString("result", &tty_name[8]);
message->SendReply(&reply);
} else {
BWindow::MessageReceived(message);
}
break;
}
break;
case MSG_FONT_CHANGED:
gTermPref->setString (PREF_HALF_FONT_FAMILY, fNewFontMenu->FindMarked()->Label());
this->PostMessage (MSG_HALF_FONT_CHANGED);
break;
case MSG_COLOR_CHANGED:
fBaseView->SetViewColor (gTermPref->getRGB (PREF_TEXT_BACK_COLOR));
fTermView->SetTermColor ();
fBaseView->Invalidate();
fTermView->Invalidate();
break;
case SAVE_AS_DEFAULT:
{
// Message from Preference panel.
case MSG_ROWS_CHANGED:
case MSG_COLS_CHANGED: {
r = fTermView->SetTermSize (gTermPref->getInt32 (PREF_ROWS),
gTermPref->getInt32 (PREF_COLS), 0);
ResizeTo (r.Width()+ B_V_SCROLL_BAR_WIDTH + VIEW_OFFSET * 2,
r.Height()+fMenubar->Bounds().Height() + VIEW_OFFSET *2);
BPath path;
if (PrefHandler::GetDefaultPath(path) == B_OK)
gTermPref->SaveAsText(path.Path(), PREFFILE_MIMETYPE);
break;
}
break;
case MENU_PAGE_SETUP:
DoPageSetup ();
break;
case MENU_PRINT:
DoPrint ();
break;
case MSGRUN_WINDOW:
fTermView->UpdateSIGWINCH ();
break;
case B_ABOUT_REQUESTED:
be_app->PostMessage(B_ABOUT_REQUESTED);
break;
default:
BWindow::MessageReceived(message);
break;
}
case MSG_HALF_FONT_CHANGED:
case MSG_FULL_FONT_CHANGED:
case MSG_HALF_SIZE_CHANGED:
case MSG_FULL_SIZE_CHANGED: {
halfFont.SetFamilyAndStyle (gTermPref->getString(PREF_HALF_FONT_FAMILY),NULL);
halfFont.SetSize (gTermPref->getFloat(PREF_HALF_FONT_SIZE));
halfFont.SetSpacing (B_FIXED_SPACING);
fullFont.SetFamilyAndStyle (gTermPref->getString(PREF_FULL_FONT_FAMILY),NULL);
fullFont.SetSize (gTermPref->getFloat(PREF_FULL_FONT_SIZE));
fullFont.SetSpacing (B_FIXED_SPACING);
fTermView->SetTermFont (&halfFont, &fullFont);
r = fTermView->SetTermSize (0, 0, 0);
int width, height;
fTermView->GetFontSize (&width, &height);
SetSizeLimits (MIN_COLS * width, MAX_COLS * width,
MIN_COLS * height, MAX_COLS * height);
ResizeTo (r.Width()+ B_V_SCROLL_BAR_WIDTH + VIEW_OFFSET * 2,
r.Height()+fMenubar->Bounds().Height() + VIEW_OFFSET * 2);
fTermView->Invalidate();
break;
}
case EIGHTYTWENTYFOUR: {
gTermPref->setString(PREF_COLS, "80");
gTermPref->setString(PREF_ROWS, "24");
this->PostMessage (MSG_ROWS_CHANGED);
this->PostMessage (MSG_COLS_CHANGED);
break;
}
case EIGHTYTWENTYFIVE: {
gTermPref->setString(PREF_COLS, "80");
gTermPref->setString(PREF_ROWS, "25");
this->PostMessage (MSG_ROWS_CHANGED);
this->PostMessage (MSG_COLS_CHANGED);
break;
}
case EIGHTYFORTY: {
gTermPref->setString(PREF_COLS, "80");
gTermPref->setString(PREF_ROWS, "40");
this->PostMessage (MSG_ROWS_CHANGED);
this->PostMessage (MSG_COLS_CHANGED);
break;
}
case ONETHREETWOTWENTYFOUR: {
gTermPref->setString(PREF_COLS, "132");
gTermPref->setString(PREF_ROWS, "24");
this->PostMessage (MSG_ROWS_CHANGED);
this->PostMessage (MSG_COLS_CHANGED);
break;
}
case ONETHREETWOTWENTYFIVE: {
gTermPref->setString(PREF_COLS, "132");
gTermPref->setString(PREF_ROWS, "25");
this->PostMessage (MSG_ROWS_CHANGED);
this->PostMessage (MSG_COLS_CHANGED);
break;
}
case FULLSCREEN: {
if (!fSavedFrame.IsValid()) { // go fullscreen
float mbHeight = fMenubar->Bounds().Height() + 1;
fSavedFrame = Frame();
BScreen screen(this);
fTermView->ScrollBar()->Hide();
fMenubar->Hide();
fBaseView->MoveTo(0,0);
fBaseView->ResizeBy(B_V_SCROLL_BAR_WIDTH, mbHeight);
fSavedLook = Look();
// done before ResizeTo to work around a Dano bug (not erasing the decor)
SetLook(B_NO_BORDER_WINDOW_LOOK);
ResizeTo(screen.Frame().Width()+1, screen.Frame().Height()+1);
MoveTo(screen.Frame().left, screen.Frame().top);
} else { // exit fullscreen
float mbHeight = fMenubar->Bounds().Height() + 1;
fMenubar->Show();
fTermView->ScrollBar()->Show();
ResizeTo(fSavedFrame.Width(), fSavedFrame.Height());
MoveTo(fSavedFrame.left, fSavedFrame.top);
fBaseView->ResizeBy(-B_V_SCROLL_BAR_WIDTH, -mbHeight);
fBaseView->MoveTo(0,mbHeight);
SetLook(fSavedLook);
fSavedFrame = BRect(0,0,-1,-1);
}
break;
}
case MSG_FONT_CHANGED: {
gTermPref->setString (PREF_HALF_FONT_FAMILY, fNewFontMenu->FindMarked()->Label());
this->PostMessage (MSG_HALF_FONT_CHANGED);
break;
}
case MSG_COLOR_CHANGED: {
fBaseView->SetViewColor (gTermPref->getRGB (PREF_TEXT_BACK_COLOR));
fTermView->SetTermColor ();
fBaseView->Invalidate();
fTermView->Invalidate();
break;
}
case SAVE_AS_DEFAULT: {
BPath path;
if (PrefHandler::GetDefaultPath(path) == B_OK)
gTermPref->SaveAsText(path.Path(), PREFFILE_MIMETYPE);
break;
}
case MENU_PAGE_SETUP: {
DoPageSetup ();
break;
}
case MENU_PRINT: {
DoPrint ();
break;
}
case MSGRUN_WINDOW: {
fTermView->UpdateSIGWINCH ();
break;
}
case B_ABOUT_REQUESTED: {
be_app->PostMessage(B_ABOUT_REQUESTED);
break;
}
default: {
BWindow::MessageReceived(message);
break;
}
}
}
////////////////////////////////////////////////////////////////////////////
// WindowActivated (bool)
@@ -536,11 +520,11 @@ TermWindow::WindowActivated (bool )
void
TermWindow::Quit(void)
{
delete fTermParse;
delete fCodeConv;
if(fPrefWindow) fPrefWindow->PostMessage (B_QUIT_REQUESTED);
be_app->PostMessage (B_QUIT_REQUESTED, be_app);
BWindow::Quit ();
delete fTermParse;
delete fCodeConv;
if(fPrefWindow) fPrefWindow->PostMessage (B_QUIT_REQUESTED);
be_app->PostMessage (B_QUIT_REQUESTED, be_app);
BWindow::Quit ();
}
@@ -557,18 +541,15 @@ TermWindow::QuitRequested(void)
int
TermWindow::GetTimeZone ()
{
struct timeval tv;
struct timezone tm;
gettimeofday (&tv, &tm);
return -tm.tz_minuteswest / 60;
struct timeval tv;
struct timezone tm;
gettimeofday (&tv, &tm);
return -tm.tz_minuteswest / 60;
}
#include "spawn.h"
void
TermWindow::TermWinActivate()
{