The stored (and default) font settings are now tested against the fonts installed

in the system; if a font chosen could not be found, a fallback font (be_fixed_font)
is used.
Cleanup.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@14603 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler
2005-10-31 23:24:17 +00:00
parent 9b1ad6f45e
commit 11516cee1e
3 changed files with 199 additions and 181 deletions
+115 -78
View File
@@ -32,13 +32,14 @@
#include "PrefHandler.h" #include "PrefHandler.h"
#include "TermConst.h" #include "TermConst.h"
#include <Directory.h>
#include <Entry.h>
#include <File.h>
#include <FindDirectory.h>
#include <Font.h>
#include <GraphicsDefs.h> #include <GraphicsDefs.h>
#include <Message.h> #include <Message.h>
#include <File.h>
#include <Entry.h>
#include <NodeInfo.h> #include <NodeInfo.h>
#include <Directory.h>
#include <FindDirectory.h>
#include <Path.h> #include <Path.h>
#include <stdio.h> #include <stdio.h>
@@ -48,8 +49,8 @@
/* /*
* Startup preference settings. * Startup preference settings.
*/ */
const prefDefaults termDefaults[] ={ static const prefDefaults kTermDefaults[] = {
{ PREF_COLS, "80" }, { PREF_COLS, "80" },
{ PREF_ROWS, "25" }, { PREF_ROWS, "25" },
@@ -87,12 +88,15 @@ const prefDefaults termDefaults[] ={
PrefHandler::PrefHandler() PrefHandler::PrefHandler()
:
fContainer('Pref')
{ {
fContainer.what = 'Pref';
BPath path; BPath path;
GetDefaultPath(path); GetDefaultPath(path);
OpenText(path.Path(), termDefaults); OpenText(path.Path(), kTermDefaults);
_ConfirmFont(PREF_HALF_FONT_FAMILY, be_fixed_font);
_ConfirmFont(PREF_FULL_FONT_FAMILY, be_fixed_font);
} }
@@ -130,9 +134,9 @@ PrefHandler::Open(const char *path, const prefDefaults *defaults)
{ {
BEntry entry(path); BEntry entry(path);
if (entry.Exists()) if (entry.Exists())
return loadFromFile(&entry); return _LoadFromFile(&entry);
return loadFromDefault(defaults); return _LoadFromDefault(defaults);
} }
@@ -141,9 +145,9 @@ PrefHandler::OpenText(const char *path, const prefDefaults *defaults)
{ {
BEntry entry(path); BEntry entry(path);
if (entry.Exists()) if (entry.Exists())
return loadFromTextFile(path); return _LoadFromTextFile(path);
return loadFromDefault(defaults); return _LoadFromDefault(defaults);
} }
@@ -325,83 +329,116 @@ PrefHandler::IsEmpty() const
} }
status_t void
PrefHandler::loadFromFile(BEntry *ent) PrefHandler::_ConfirmFont(const char *key, const BFont *fallback)
{ {
// Future: It would be nice if we could simply use a flatened BMessage to int32 count = count_font_families();
// save the settings. (Who cares about compatibility in this case anyway?) const char *font = getString(key);
if (font == NULL)
count = 0;
BFile file (ent, B_READ_ONLY); font_family family;
//fContainer.MakeEmpty();
//fContainer.Unflatten(&file);
off_t size;
if (file.GetSize(&size) != B_OK || size != sizeof(struct termprefs))
return B_ERROR;
struct termprefs prefs; for (int32 i = 0; i < count; i++) {
file.Read(&prefs, size); if (get_font_family(i, &family) != B_OK)
if (prefs.magic != TP_MAGIC || prefs.version != TP_VERSION) continue;
return B_ERROR;
//Valid settings file! if (!strcmp(family, font)) {
setInt32(PREF_COLS, prefs.cols); // found font family: we can safely use this font
setInt32(PREF_ROWS, prefs.rows); return;
setInt32(PREF_HALF_FONT_SIZE, prefs.font_size); }
setInt32(PREF_FULL_FONT_SIZE, prefs.font_size); }
char *font_family = strtok(prefs.font, "/");
char *font_style = strtok(NULL, ""); // use fall-back font
setString(PREF_FULL_FONT_FAMILY, font_family);
setString(PREF_FULL_FONT_STYLE, font_style); fallback->GetFamilyAndStyle(&family, NULL);
setString(PREF_HALF_FONT_FAMILY, font_family); setString(key, family);
setString(PREF_HALF_FONT_STYLE, font_style);
setRGB(PREF_TEXT_BACK_COLOR, prefs.bg);
setRGB(PREF_TEXT_FORE_COLOR, prefs.fg);
setRGB(PREF_CURSOR_BACK_COLOR, prefs.curbg);
setRGB(PREF_CURSOR_FORE_COLOR, prefs.curfg);
setRGB(PREF_SELECT_BACK_COLOR, prefs.selbg);
setRGB(PREF_SELECT_FORE_COLOR, prefs.selfg);
setString(PREF_TEXT_ENCODING, encoding_table[prefs.encoding].name);
return B_OK;
} }
/////////////////////////////////////////////////////////////////////////////
//
//
/////////////////////////////////////////////////////////////////////////////
status_t status_t
PrefHandler::loadFromDefault(const prefDefaults* defaluts) PrefHandler::_LoadFromFile(BEntry *entry)
{ {
if(defaluts == NULL) return B_ERROR; // Future: It would be nice if we could simply use a flatened BMessage to
// save the settings. (Who cares about compatibility in this case anyway?)
while(defaluts->key){
this->setString(defaluts->key, defaluts->item); BFile file(entry, B_READ_ONLY);
++defaluts; //fContainer.MakeEmpty();
} //fContainer.Unflatten(&file);
return B_OK;
off_t size;
if (file.GetSize(&size) != B_OK || size != sizeof(struct termprefs))
return B_ERROR;
struct termprefs prefs;
file.Read(&prefs, size);
if (prefs.magic != TP_MAGIC || prefs.version != TP_VERSION)
return B_ERROR;
// Valid settings file!
setInt32(PREF_COLS, prefs.cols);
setInt32(PREF_ROWS, prefs.rows);
setInt32(PREF_HALF_FONT_SIZE, prefs.font_size);
setInt32(PREF_FULL_FONT_SIZE, prefs.font_size);
char *font_family = strtok(prefs.font, "/");
char *font_style = strtok(NULL, "");
setString(PREF_FULL_FONT_FAMILY, font_family);
setString(PREF_FULL_FONT_STYLE, font_style);
setString(PREF_HALF_FONT_FAMILY, font_family);
setString(PREF_HALF_FONT_STYLE, font_style);
setRGB(PREF_TEXT_BACK_COLOR, prefs.bg);
setRGB(PREF_TEXT_FORE_COLOR, prefs.fg);
setRGB(PREF_CURSOR_BACK_COLOR, prefs.curbg);
setRGB(PREF_CURSOR_FORE_COLOR, prefs.curfg);
setRGB(PREF_SELECT_BACK_COLOR, prefs.selbg);
setRGB(PREF_SELECT_FORE_COLOR, prefs.selfg);
setString(PREF_TEXT_ENCODING, encoding_table[prefs.encoding].name);
return B_OK;
} }
/////////////////////////////////////////////////////////////////////////////
//
// Text is "key","Content"
// Comment : Start with '#'
/////////////////////////////////////////////////////////////////////////////
status_t status_t
PrefHandler::loadFromTextFile(const char * path) PrefHandler::_LoadFromDefault(const prefDefaults* defaults)
{ {
char buf[1024]; if (defaults == NULL)
char key[B_FIELD_NAME_LENGTH], data[512]; return B_ERROR;
int n;
FILE *fp;
fp = fopen(path, "r"); while (defaults->key) {
setString(defaults->key, defaults->item);
++defaults;
}
while(fgets(buf, sizeof(buf), fp) != NULL){ return B_OK;
if (*buf == '#') continue; }
n = sscanf(buf, "%*[\"]%[^\"]%*[\"]%*[^\"]%*[\"]%[^\"]", key, data);
if (n == 2) this->setString(key, data);
} /** Text is "key","Content"
* Comment : Start with '#'
fclose(fp); */
return B_OK; status_t
PrefHandler::_LoadFromTextFile(const char * path)
{
char buffer[1024];
char key[B_FIELD_NAME_LENGTH], data[512];
int n;
FILE *file;
file = fopen(path, "r");
if (file == NULL)
return B_ENTRY_NOT_FOUND;
while (fgets(buffer, sizeof(buffer), file) != NULL) {
if (*buffer == '#')
continue;
n = sscanf(buffer, "%*[\"]%[^\"]%*[\"]%*[^\"]%*[\"]%[^\"]", key, data);
if (n == 2)
setString(key, data);
}
fclose(file);
return B_OK;
} }
+4 -3
View File
@@ -102,9 +102,10 @@ class PrefHandler {
static status_t GetDefaultPath(BPath& path); static status_t GetDefaultPath(BPath& path);
private: private:
status_t loadFromFile(BEntry *ent); void _ConfirmFont(const char *key, const BFont *fallback);
status_t loadFromDefault(const prefDefaults* defaluts = NULL); status_t _LoadFromFile(BEntry *ent);
status_t loadFromTextFile(const char * path); status_t _LoadFromDefault(const prefDefaults* defaluts = NULL);
status_t _LoadFromTextFile(const char * path);
BMessage fContainer; BMessage fContainer;
}; };
+80 -100
View File
@@ -86,134 +86,114 @@ TermWindow::~TermWindow()
delete (fWindowUpdate); delete (fWindowUpdate);
} }
/*
* // #pragma mark - public methods
* PUBLIC MEMBER FUNCTIONS.
*
*/ /** Initialize Window object. */
////////////////////////////////////////////////////////////////////////////
// Init Window (void)
// Initialize Window object.
////////////////////////////////////////////////////////////////////////////
void void
TermWindow::InitWindow(void) TermWindow::InitWindow(void)
{ {
// make menu bar // make menu bar
SetupMenu(); SetupMenu();
// Setup font.
BFont halfFont; // Setup font.
BFont fullFont;
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);
// Make Terminal text view. const char *family = gTermPref->getString(PREF_HALF_FONT_FAMILY);
BRect textframe = Bounds(); BFont halfFont;
textframe.top = fMenubar->Bounds().bottom + 1.0; halfFont.SetFamilyAndStyle(family, NULL);
halfFont.SetSize(gTermPref->getFloat(PREF_HALF_FONT_SIZE));
halfFont.SetSpacing(B_FIXED_SPACING);
fCodeConv = new CodeConv (); family = gTermPref->getString(PREF_FULL_FONT_FAMILY);
fTermView = new TermView(Bounds(), fCodeConv);
/* BFont fullFont;
* MuTerm has two views. BaseView is window base view. fullFont.SetFamilyAndStyle(family, NULL);
* TermView is character Terminal view on BaseView. It has paste fullFont.SetSize(gTermPref->getFloat(PREF_FULL_FONT_SIZE));
* on BaseView shift as VIEW_OFFSET. fullFont.SetSpacing(B_FIXED_SPACING);
*/
fBaseView = new TermBaseView (textframe, fTermView);
// // Make Terminal text view.
//Initialize TermView. (font, size and color)
//
fTermView->SetTermFont (&halfFont, &fullFont);
BRect r = fTermView->SetTermSize (gTermPref->getInt32 (PREF_ROWS),
gTermPref->getInt32 (PREF_COLS),
1);
int width, height; BRect textframe = Bounds();
textframe.top = fMenubar->Bounds().bottom + 1.0;
fTermView->GetFontSize (&width, &height);
SetSizeLimits (MIN_COLS * width, MAX_COLS * width,
MIN_COLS * height, MAX_COLS * height);
fCodeConv = new CodeConv();
fTermView = new TermView(Bounds(), fCodeConv);
fTermView->SetTermColor (); /*
fBaseView->SetViewColor (gTermPref->getRGB (PREF_TEXT_BACK_COLOR)); * MuTerm has two views. BaseView is window base view.
* TermView is character Terminal view on BaseView. It has paste
* on BaseView shift as VIEW_OFFSET.
*/
fBaseView = new TermBaseView(textframe, fTermView);
// Add offset to baseview. // Initialize TermView. (font, size and color)
r.InsetBy (-VIEW_OFFSET, -VIEW_OFFSET);
// fTermView->SetTermFont(&halfFont, &fullFont);
// Resize Window BRect rect = fTermView->SetTermSize(gTermPref->getInt32(PREF_ROWS),
// gTermPref->getInt32(PREF_COLS), 1);
ResizeTo (r.Width()+ B_V_SCROLL_BAR_WIDTH,
r.Height()+fMenubar->Bounds().Height());
fBaseView-> ResizeTo (r.Width(), r.Height()); int width, height;
fBaseView->AddChild (fTermView);
fTermView->MoveBy (VIEW_OFFSET, VIEW_OFFSET);
//
// Make Scroll Bar.
//
BRect scr(0, 0,
B_V_SCROLL_BAR_WIDTH,
r.Height() - B_H_SCROLL_BAR_HEIGHT + 1);
scr.OffsetBy (r.Width() + 1 , fMenubar->Bounds().Height()); fTermView->GetFontSize(&width, &height);
SetSizeLimits(MIN_COLS * width, MAX_COLS * width,
BScrollBar *scrbar = MIN_COLS * height, MAX_COLS * height);
new BScrollBar (scr, "scrollbar", fTermView, 0, 0, B_VERTICAL);
fTermView->SetScrollBar (scrbar); fTermView->SetTermColor();
fBaseView->SetViewColor(gTermPref->getRGB(PREF_TEXT_BACK_COLOR));
this->AddChild (scrbar); // Add offset to baseview.
this->AddChild (fBaseView); rect.InsetBy(-VIEW_OFFSET, -VIEW_OFFSET);
// Resize Window
// scrview->SetTarget (fTermView); ResizeTo(rect.Width()+ B_V_SCROLL_BAR_WIDTH,
rect.Height() + fMenubar->Bounds().Height());
// Set fEditmenu's target to fTermView. (Oh!...)
fEditmenu->SetTargetForItems(fTermView);
// fBaseView->ResizeTo(rect.Width(), rect.Height());
// Initialize TermParse fBaseView->AddChild(fTermView);
// fTermView->MoveBy(VIEW_OFFSET, VIEW_OFFSET);
gNowCoding = longname2op(gTermPref->getString(PREF_TEXT_ENCODING));
fTermParse = new TermParse ();
fTermParse->InitPtyReader (this);
fTermParse->InitTermParse(fTermView, fCodeConv);
// Set Coding. // Make Scroll Bar.
// Initialize MessageRunner. BRect scrollRect(0, 0, B_V_SCROLL_BAR_WIDTH,
fWindowUpdate = new BMessageRunner (BMessenger (this), rect.Height() - B_H_SCROLL_BAR_HEIGHT + 1);
new BMessage (MSGRUN_WINDOW),
500000); scrollRect.OffsetBy(rect.Width() + 1, fMenubar->Bounds().Height());
return; BScrollBar *scrollBar = new BScrollBar(scrollRect, "scrollbar",
fTermView, 0, 0, B_VERTICAL);
fTermView->SetScrollBar(scrollBar);
AddChild(scrollBar);
AddChild(fBaseView);
// Set fEditmenu's target to fTermView. (Oh!...)
fEditmenu->SetTargetForItems(fTermView);
// Initialize TermParse
gNowCoding = longname2op(gTermPref->getString(PREF_TEXT_ENCODING));
fTermParse = new TermParse();
fTermParse->InitPtyReader(this);
fTermParse->InitTermParse(fTermView, fCodeConv);
// Set Coding.
// Initialize MessageRunner.
fWindowUpdate = new BMessageRunner(BMessenger(this),
new BMessage (MSGRUN_WINDOW), 500000);
} }
////////////////////////////////////////////////////////////////////////////
// void MenusBeginning (void)
// Dispatch MenuBegininng
////////////////////////////////////////////////////////////////////////////
void void
TermWindow::MenusBeginning(void) TermWindow::MenusBeginning(void)
{ {
// Syncronize Encode Menu Pop-up menu and Preference. // Syncronize Encode Menu Pop-up menu and Preference.
(fEncodingmenu->FindItem(op2longname(gNowCoding)))->SetMarked(true); (fEncodingmenu->FindItem(op2longname(gNowCoding)))->SetMarked(true);
BWindow::MenusBeginning(); BWindow::MenusBeginning();
} }