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:
@@ -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){
|
BFile file(entry, B_READ_ONLY);
|
||||||
this->setString(defaluts->key, defaluts->item);
|
//fContainer.MakeEmpty();
|
||||||
++defaluts;
|
//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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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.
|
// Setup font.
|
||||||
|
|
||||||
BFont halfFont;
|
const char *family = gTermPref->getString(PREF_HALF_FONT_FAMILY);
|
||||||
BFont fullFont;
|
|
||||||
|
|
||||||
halfFont.SetFamilyAndStyle (gTermPref->getString(PREF_HALF_FONT_FAMILY),
|
BFont halfFont;
|
||||||
NULL);
|
halfFont.SetFamilyAndStyle(family, NULL);
|
||||||
halfFont.SetSize (gTermPref->getFloat(PREF_HALF_FONT_SIZE));
|
halfFont.SetSize(gTermPref->getFloat(PREF_HALF_FONT_SIZE));
|
||||||
halfFont.SetSpacing (B_FIXED_SPACING);
|
halfFont.SetSpacing(B_FIXED_SPACING);
|
||||||
|
|
||||||
fullFont.SetFamilyAndStyle (gTermPref->getString(PREF_FULL_FONT_FAMILY),
|
family = gTermPref->getString(PREF_FULL_FONT_FAMILY);
|
||||||
NULL);
|
|
||||||
fullFont.SetSize (gTermPref->getFloat(PREF_FULL_FONT_SIZE));
|
|
||||||
fullFont.SetSpacing (B_FIXED_SPACING);
|
|
||||||
|
|
||||||
// Make Terminal text view.
|
BFont fullFont;
|
||||||
|
fullFont.SetFamilyAndStyle(family, NULL);
|
||||||
|
fullFont.SetSize(gTermPref->getFloat(PREF_FULL_FONT_SIZE));
|
||||||
|
fullFont.SetSpacing(B_FIXED_SPACING);
|
||||||
|
|
||||||
BRect textframe = Bounds();
|
// Make Terminal text view.
|
||||||
textframe.top = fMenubar->Bounds().bottom + 1.0;
|
|
||||||
|
|
||||||
fCodeConv = new CodeConv ();
|
BRect textframe = Bounds();
|
||||||
fTermView = new TermView(Bounds(), fCodeConv);
|
textframe.top = fMenubar->Bounds().bottom + 1.0;
|
||||||
|
|
||||||
/*
|
fCodeConv = new CodeConv();
|
||||||
* MuTerm has two views. BaseView is window base view.
|
fTermView = new TermView(Bounds(), fCodeConv);
|
||||||
* TermView is character Terminal view on BaseView. It has paste
|
|
||||||
* on BaseView shift as VIEW_OFFSET.
|
|
||||||
*/
|
|
||||||
fBaseView = new TermBaseView (textframe, fTermView);
|
|
||||||
|
|
||||||
//
|
/*
|
||||||
//Initialize TermView. (font, size and color)
|
* MuTerm has two views. BaseView is window base view.
|
||||||
//
|
* TermView is character Terminal view on BaseView. It has paste
|
||||||
fTermView->SetTermFont (&halfFont, &fullFont);
|
* on BaseView shift as VIEW_OFFSET.
|
||||||
BRect r = fTermView->SetTermSize (gTermPref->getInt32 (PREF_ROWS),
|
*/
|
||||||
gTermPref->getInt32 (PREF_COLS),
|
fBaseView = new TermBaseView(textframe, fTermView);
|
||||||
1);
|
|
||||||
|
|
||||||
int width, height;
|
// Initialize TermView. (font, size and color)
|
||||||
|
|
||||||
fTermView->GetFontSize (&width, &height);
|
fTermView->SetTermFont(&halfFont, &fullFont);
|
||||||
SetSizeLimits (MIN_COLS * width, MAX_COLS * width,
|
BRect rect = fTermView->SetTermSize(gTermPref->getInt32(PREF_ROWS),
|
||||||
MIN_COLS * height, MAX_COLS * height);
|
gTermPref->getInt32(PREF_COLS), 1);
|
||||||
|
|
||||||
|
int width, height;
|
||||||
|
|
||||||
fTermView->SetTermColor ();
|
fTermView->GetFontSize(&width, &height);
|
||||||
fBaseView->SetViewColor (gTermPref->getRGB (PREF_TEXT_BACK_COLOR));
|
SetSizeLimits(MIN_COLS * width, MAX_COLS * width,
|
||||||
|
MIN_COLS * height, MAX_COLS * height);
|
||||||
|
|
||||||
// Add offset to baseview.
|
fTermView->SetTermColor();
|
||||||
r.InsetBy (-VIEW_OFFSET, -VIEW_OFFSET);
|
fBaseView->SetViewColor(gTermPref->getRGB(PREF_TEXT_BACK_COLOR));
|
||||||
|
|
||||||
//
|
// Add offset to baseview.
|
||||||
// Resize Window
|
rect.InsetBy(-VIEW_OFFSET, -VIEW_OFFSET);
|
||||||
//
|
|
||||||
ResizeTo (r.Width()+ B_V_SCROLL_BAR_WIDTH,
|
|
||||||
r.Height()+fMenubar->Bounds().Height());
|
|
||||||
|
|
||||||
fBaseView-> ResizeTo (r.Width(), r.Height());
|
// Resize Window
|
||||||
fBaseView->AddChild (fTermView);
|
|
||||||
fTermView->MoveBy (VIEW_OFFSET, VIEW_OFFSET);
|
|
||||||
|
|
||||||
//
|
ResizeTo(rect.Width()+ B_V_SCROLL_BAR_WIDTH,
|
||||||
// Make Scroll Bar.
|
rect.Height() + fMenubar->Bounds().Height());
|
||||||
//
|
|
||||||
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());
|
fBaseView->ResizeTo(rect.Width(), rect.Height());
|
||||||
|
fBaseView->AddChild(fTermView);
|
||||||
|
fTermView->MoveBy(VIEW_OFFSET, VIEW_OFFSET);
|
||||||
|
|
||||||
BScrollBar *scrbar =
|
// Make Scroll Bar.
|
||||||
new BScrollBar (scr, "scrollbar", fTermView, 0, 0, B_VERTICAL);
|
|
||||||
|
|
||||||
fTermView->SetScrollBar (scrbar);
|
BRect scrollRect(0, 0, B_V_SCROLL_BAR_WIDTH,
|
||||||
|
rect.Height() - B_H_SCROLL_BAR_HEIGHT + 1);
|
||||||
|
|
||||||
this->AddChild (scrbar);
|
scrollRect.OffsetBy(rect.Width() + 1, fMenubar->Bounds().Height());
|
||||||
this->AddChild (fBaseView);
|
|
||||||
|
|
||||||
|
BScrollBar *scrollBar = new BScrollBar(scrollRect, "scrollbar",
|
||||||
|
fTermView, 0, 0, B_VERTICAL);
|
||||||
|
fTermView->SetScrollBar(scrollBar);
|
||||||
|
|
||||||
// scrview->SetTarget (fTermView);
|
AddChild(scrollBar);
|
||||||
|
AddChild(fBaseView);
|
||||||
|
|
||||||
// Set fEditmenu's target to fTermView. (Oh!...)
|
// Set fEditmenu's target to fTermView. (Oh!...)
|
||||||
fEditmenu->SetTargetForItems(fTermView);
|
fEditmenu->SetTargetForItems(fTermView);
|
||||||
|
|
||||||
//
|
// Initialize TermParse
|
||||||
// Initialize TermParse
|
|
||||||
//
|
|
||||||
gNowCoding = longname2op(gTermPref->getString(PREF_TEXT_ENCODING));
|
|
||||||
fTermParse = new TermParse ();
|
|
||||||
fTermParse->InitPtyReader (this);
|
|
||||||
fTermParse->InitTermParse(fTermView, fCodeConv);
|
|
||||||
|
|
||||||
// Set Coding.
|
gNowCoding = longname2op(gTermPref->getString(PREF_TEXT_ENCODING));
|
||||||
|
fTermParse = new TermParse();
|
||||||
|
fTermParse->InitPtyReader(this);
|
||||||
|
fTermParse->InitTermParse(fTermView, fCodeConv);
|
||||||
|
|
||||||
// Initialize MessageRunner.
|
// Set Coding.
|
||||||
fWindowUpdate = new BMessageRunner (BMessenger (this),
|
|
||||||
new BMessage (MSGRUN_WINDOW),
|
|
||||||
500000);
|
|
||||||
|
|
||||||
return;
|
|
||||||
|
|
||||||
|
// 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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user