* Implemented automatic font_directory creation for font_mappings.

* Minor cleanup.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15584 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler 2005-12-19 12:02:17 +00:00
parent cbe65c2e73
commit 39cc80346c
2 changed files with 82 additions and 26 deletions
headers/private/servers/app
src/servers/app

@ -79,6 +79,7 @@ class FontManager : public BLooper {
void _AddSystemPaths();
font_directory* _FindDirectory(node_ref& nodeRef);
void _RemoveDirectory(font_directory* directory);
status_t _CreateDirectories(const char* path);
status_t _AddPath(const char* path);
status_t _AddPath(BEntry& entry, font_directory** _newDirectory = NULL);

@ -29,11 +29,11 @@
using std::nothrow;
//#define TRACE_WATCHING
#ifdef TRACE_WATCHING
# define WTRACE(x) printf x
//#define TRACE_FONT_MANAGER
#ifdef TRACE_FONT_MANAGER
# define FTRACE(x) printf x
#else
# define WTRACE(x) ;
# define FTRACE(x) ;
#endif
@ -220,9 +220,9 @@ FontManager::MessageReceived(BMessage* message)
fromDirectory->styles.RemoveItem(style, false);
directory->styles.AddItem(style);
}
WTRACE(("font moved"));
FTRACE(("font moved"));
} else {
WTRACE(("font added: %s\n", name));
FTRACE(("font added: %s\n", name));
_AddFont(*directory, entry);
}
}
@ -276,7 +276,7 @@ void
FontManager::_AddDefaultMapping(const char* family, const char* style,
const char* path)
{
font_mapping* mapping = new (nothrow) font_mapping;
font_mapping* mapping = new (std::nothrow) font_mapping;
if (mapping == NULL)
return;
@ -311,6 +311,9 @@ FontManager::_LoadRecentFontMappings()
status_t
FontManager::_AddMappedFont(const char* familyName, const char* styleName)
{
FTRACE(("_AddMappedFont(family = \"%s\", style = \"%s\")\n",
familyName, styleName));
for (int32 i = 0; i < fMappings.CountItems(); i++) {
font_mapping* mapping = fMappings.ItemAt(i);
@ -329,8 +332,13 @@ FontManager::_AddMappedFont(const char* familyName, const char* styleName)
nodeRef.node = mapping->ref.directory;
font_directory* directory = _FindDirectory(nodeRef);
if (directory == NULL) {
// unknown directory, maybe this is a user font
continue;
// unknown directory, maybe this is a user font - try
// to create the missing directory
BPath path(&entry);
if (path.GetParent(&path) != B_OK
|| _CreateDirectories(path.Path()) != B_OK
|| (directory = _FindDirectory(nodeRef)) == NULL)
continue;
}
return _AddFont(*directory, entry);
@ -350,7 +358,7 @@ FontManager::_AddMappedFont(const char* familyName, const char* styleName)
void
FontManager::_RemoveStyle(font_directory& directory, FontStyle* style)
{
WTRACE(("font removed: %s\n", style->Name()));
FTRACE(("font removed: %s\n", style->Name()));
directory.styles.RemoveItem(style);
directory.revision++;
@ -416,21 +424,21 @@ FontManager::_SetDefaultFonts()
if (style == NULL)
return B_ERROR;
fDefaultPlainFont = new (nothrow) ServerFont(*style, DEFAULT_PLAIN_FONT_SIZE);
fDefaultPlainFont = new (std::nothrow) ServerFont(*style, DEFAULT_PLAIN_FONT_SIZE);
if (fDefaultPlainFont == NULL)
return B_NO_MEMORY;
style = _GetDefaultStyle(DEFAULT_BOLD_FONT_FAMILY, DEFAULT_BOLD_FONT_STYLE,
FALLBACK_BOLD_FONT_FAMILY, DEFAULT_BOLD_FONT_STYLE, B_BOLD_FACE);
fDefaultBoldFont = new (nothrow) ServerFont(*style, DEFAULT_BOLD_FONT_SIZE);
fDefaultBoldFont = new (std::nothrow) ServerFont(*style, DEFAULT_BOLD_FONT_SIZE);
if (fDefaultBoldFont == NULL)
return B_NO_MEMORY;
style = _GetDefaultStyle(DEFAULT_FIXED_FONT_FAMILY, DEFAULT_FIXED_FONT_STYLE,
FALLBACK_FIXED_FONT_FAMILY, DEFAULT_FIXED_FONT_STYLE, B_REGULAR_FACE);
fDefaultFixedFont = new (nothrow) ServerFont(*style, DEFAULT_FIXED_FONT_SIZE);
fDefaultFixedFont = new (std::nothrow) ServerFont(*style, DEFAULT_FIXED_FONT_SIZE);
if (fDefaultFixedFont == NULL)
return B_NO_MEMORY;
@ -443,19 +451,13 @@ void
FontManager::_AddSystemPaths()
{
BPath path;
if (find_directory(B_BEOS_FONTS_DIRECTORY, &path, true) == B_OK) {
if (find_directory(B_BEOS_FONTS_DIRECTORY, &path, true) == B_OK)
_AddPath(path.Path());
if (path.Append("ttfonts") == B_OK)
_AddPath(path.Path());
}
// We don't scan these in test mode to help shave off some startup time
#if !TEST_MODE
if (find_directory(B_COMMON_FONTS_DIRECTORY, &path, true) == B_OK) {
if (find_directory(B_COMMON_FONTS_DIRECTORY, &path, true) == B_OK)
_AddPath(path.Path());
if (path.Append("ttfonts") == B_OK)
_AddPath(path.Path());
}
#endif
}
@ -518,7 +520,7 @@ FontManager::_AddFont(font_directory& directory, BEntry& entry)
}
if (family == NULL) {
family = new (nothrow) FontFamily(face->family_name, fNextID++);
family = new (std::nothrow) FontFamily(face->family_name, fNextID++);
if (family == NULL
|| !fFamilies.BinaryInsert(family, compare_font_families)) {
delete family;
@ -527,7 +529,7 @@ FontManager::_AddFont(font_directory& directory, BEntry& entry)
}
}
WTRACE(("\tadd style: %s, %s\n", face->family_name, face->style_name));
FTRACE(("\tadd style: %s, %s\n", face->family_name, face->style_name));
// the FontStyle takes over ownership of the FT_Face object
FontStyle *style = new FontStyle(nodeRef, path.Path(), face);
@ -561,7 +563,7 @@ FontManager::_FindDirectory(node_ref& nodeRef)
void
FontManager::_RemoveDirectory(font_directory* directory)
{
WTRACE(("FontManager: Remove directory (%Ld)!\n", directory->directory.node));
FTRACE(("FontManager: Remove directory (%Ld)!\n", directory->directory.node));
fDirectories.RemoveItem(directory, false);
@ -602,7 +604,7 @@ FontManager::_AddPath(BEntry& entry, font_directory** _newDirectory)
// it's a new one, so let's add it
directory = new (nothrow) font_directory;
directory = new (std::nothrow) font_directory;
if (directory == NULL)
return B_NO_MEMORY;
@ -626,7 +628,7 @@ FontManager::_AddPath(BEntry& entry, font_directory** _newDirectory)
// TODO: should go into syslog()
} else {
BPath path(&entry);
WTRACE(("FontManager: now watching: %s\n", path.Path()));
FTRACE(("FontManager: now watching: %s\n", path.Path()));
}
fDirectories.AddItem(directory);
@ -639,6 +641,59 @@ FontManager::_AddPath(BEntry& entry, font_directory** _newDirectory)
}
/*!
\brief Creates all unknown font_directories of the specified path - but
only if one of its parent directories is already known.
This method is used to create the font_directories for font_mappings.
It recursively walks upwards in the directory hierarchy until it finds
a known font_directory (or hits the root directory, in which case it
bails out).
*/
status_t
FontManager::_CreateDirectories(const char* path)
{
FTRACE(("_CreateDirectories(path = %s)\n", path));
if (!strcmp(path, "/")) {
// we walked our way up to the root
return B_ENTRY_NOT_FOUND;
}
BEntry entry;
status_t status = entry.SetTo(path);
if (status != B_OK)
return status;
node_ref nodeRef;
status = entry.GetNodeRef(&nodeRef);
if (status != B_OK)
return status;
// check if we are already know this directory
font_directory* directory = _FindDirectory(nodeRef);
if (directory != NULL)
return B_OK;
// We don't know this one yet - keep walking the path upwards
// and try to find a match.
BPath parent(path);
status = parent.GetParent(&parent);
if (status != B_OK)
return status;
status = _CreateDirectories(parent.Path());
if (status != B_OK)
return status;
// We have our match, create sub directory
return _AddPath(path);
}
/*!
\brief Scan a folder for all valid fonts
\param directoryPath Path of the folder to scan.