From 05bd1efe5b72256ccd4afa82fafb7da4ae045e0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Thu, 3 Nov 2005 17:03:36 +0000 Subject: [PATCH] * the FontManager is now a looper (but doesn't do anything useful yet). * moved the system default font functionality into the DesktopSettings class. * ServerFont::SetStyle() is now a public method. * Improved font fallback routines: they will never end up without a font if there is at least one font installed. * fixed some minor bugs in the DecorManager. * Decorator now get a DesktopSettings object passed - dunno if that's a good idea (since we'll have to open the DesktopSettings header), but it works for now (and something like this is probably needed anyway). * a clean ServerFont is now set to the system default font - and not to the (user chosen) desktop default font anymore (since the font manager doesn't know about that one). * Improved font directory scanning in the font manager a bit, it's now using find_directory() instead of hard-coded paths. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@14666 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/private/servers/app/Decorator.h | 53 ++-- headers/private/servers/app/FontManager.h | 46 ++-- headers/private/servers/app/ServerConfig.h | 6 +- headers/private/servers/app/ServerFont.h | 13 +- src/servers/app/AppServer.cpp | 45 +--- src/servers/app/DecorManager.cpp | 155 +++++------ src/servers/app/DecorManager.h | 68 ++--- src/servers/app/Decorator.cpp | 52 ++-- src/servers/app/DefaultDecorator.cpp | 27 +- src/servers/app/DefaultDecorator.h | 52 ++-- src/servers/app/Desktop.cpp | 2 + src/servers/app/DesktopSettings.cpp | 119 +++++++++ src/servers/app/DesktopSettings.h | 10 + src/servers/app/DesktopSettingsPrivate.h | 17 ++ src/servers/app/FontManager.cpp | 276 ++++++++++---------- src/servers/app/LayerData.cpp | 6 +- src/servers/app/ServerApp.cpp | 52 ++-- src/servers/app/ServerFont.cpp | 39 ++- src/servers/app/WinBorder.cpp | 5 +- src/servers/app/drawing/Painter/Painter.cpp | 3 - 20 files changed, 557 insertions(+), 489 deletions(-) diff --git a/headers/private/servers/app/Decorator.h b/headers/private/servers/app/Decorator.h index aac38cd758..c71d955dbd 100644 --- a/headers/private/servers/app/Decorator.h +++ b/headers/private/servers/app/Decorator.h @@ -1,33 +1,15 @@ -//------------------------------------------------------------------------------ -// Copyright (c) 2001-2005, Haiku, Inc. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the "Software"), -// to deal in the Software without restriction, including without limitation -// the rights to use, copy, modify, merge, publish, distribute, sublicense, -// and/or sell copies of the Software, and to permit persons to whom the -// Software is furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -// DEALINGS IN THE SOFTWARE. -// -// File Name: Decorator.h -// Author: DarkWyrm -// Stephan Aßmus -// Description: Base class for window decorators -// -//------------------------------------------------------------------------------ +/* + * Copyright 2001-2005, Haiku. + * Distributed under the terms of the MIT License. + * + * Authors: + * DarkWyrm + * Stephan Aßmus + */ #ifndef _DECORATOR_H_ #define _DECORATOR_H_ + #include #include #include @@ -36,10 +18,12 @@ #include "ColorSet.h" #include "LayerData.h" +class DesktopSettings; class DisplayDriver; class ServerFont; class BRegion; + typedef enum { DEC_NONE = 0, DEC_ZOOM, @@ -63,10 +47,8 @@ typedef enum { class Decorator { public: - Decorator(BRect rect, - int32 wlook, - int32 wfeel, - int32 wflags); + Decorator(DesktopSettings& settings, BRect rect, + int32 look, int32 feel, int32 flags); virtual ~Decorator(); void SetColors(const ColorSet &cset); @@ -145,7 +127,7 @@ class Decorator { virtual void _DrawFrame(BRect r); virtual void _DrawTab(BRect r); - + virtual void _DrawClose(BRect r); virtual void _DrawTitle(BRect r); virtual void _DrawZoom(BRect r); @@ -153,7 +135,7 @@ class Decorator { virtual void _SetFocus(); virtual void _SetColors(); - + ColorSet* _colors; DisplayDriver* _driver; DrawData _drawdata; @@ -182,6 +164,7 @@ class Decorator { // add-on stuff typedef float get_version(void); -typedef Decorator* create_decorator(BRect rect, int32 wlook, int32 wfeel, int32 wflags); +typedef Decorator* create_decorator(DesktopSettings& desktopSettings, BRect rect, + int32 look, int32 feel, int32 flags); -#endif +#endif /* _DECORATOR_H_ */ diff --git a/headers/private/servers/app/FontManager.h b/headers/private/servers/app/FontManager.h index c3cc765546..4dba4d26c2 100644 --- a/headers/private/servers/app/FontManager.h +++ b/headers/private/servers/app/FontManager.h @@ -10,9 +10,7 @@ #define FONT_MANAGER_H -#include -#include -#include +#include #include #include @@ -31,20 +29,19 @@ class ServerFont; \class FontManager FontManager.h \brief Manager for the largest part of the font subsystem */ -class FontManager : public BLocker { +class FontManager : public BLooper { public: FontManager(); - ~FontManager(); + virtual ~FontManager(); status_t InitCheck() { return fInitStatus; } - int32 CountFamilies(); - int32 CountStyles(const char *family); - void RemoveFamily(const char *family); - void ScanSystemFolders(); - status_t ScanDirectory(const char *path); + virtual void MessageReceived(BMessage* message); + + int32 CountFamilies() const; + int32 CountStyles(const char *family) const; + FontFamily* FamilyAt(int32 index) const; - FontFamily* GetFamilyByIndex(int32 index) const; FontFamily *GetFamily(uint16 familyID) const; FontFamily *GetFamily(const char *name) const; @@ -53,14 +50,11 @@ class FontManager : public BLocker { uint16 styleID = 0xffff, uint16 face = 0); FontStyle *GetStyle(const char *family, uint16 styleID); FontStyle *GetStyle(uint16 familyID, uint16 styleID); + FontStyle* FindStyleMatchingFace(uint16 face) const; - ServerFont *GetSystemPlain(); - ServerFont *GetSystemBold(); - ServerFont *GetSystemFixed(); - - bool SetSystemPlain(const char *family, const char *style, float size); - bool SetSystemBold(const char *family, const char *style, float size); - bool SetSystemFixed(const char *family, const char *style, float size); + ServerFont* GetFont(const char *family, const char *style, float size); + ServerFont* GetFont(uint16 face, float size); + const ServerFont* DefaultFont() const; bool FontsNeedUpdated() { return fNeedUpdate; } /*! @@ -68,15 +62,27 @@ class FontManager : public BLocker { */ void FontsUpdated() { fNeedUpdate = false; } + void AttachUser(uid_t userID); + void DetachUser(uid_t userID); + private: - void _AddFont(BPath &path); + void _SetDefaultFont(); + void _ScanSystemFonts(); + status_t _AddPath(const char* path); + status_t _AddPath(BEntry& entry); + + void _RemoveFamily(const char *family); + + status_t _ScanDirectory(BEntry &entry); + void _AddFont(BPath& path); FT_CharMap _GetSupportedCharmap(const FT_Face &face); private: status_t fInitStatus; + BObjectList fFontDirectories; BObjectList fFamilies; - ServerFont *fPlain, *fBold, *fFixed; + ServerFont *fDefaultFont; bool fNeedUpdate; int32 fNextID; }; diff --git a/headers/private/servers/app/ServerConfig.h b/headers/private/servers/app/ServerConfig.h index 8ef9cd9628..324bbe2521 100644 --- a/headers/private/servers/app/ServerConfig.h +++ b/headers/private/servers/app/ServerConfig.h @@ -60,15 +60,15 @@ # define DEFAULT_PLAIN_FONT_FAMILY "Bitstream Vera Sans" # define FALLBACK_PLAIN_FONT_FAMILY "Swis721 BT" # define DEFAULT_PLAIN_FONT_STYLE "Roman" -# define DEFAULT_PLAIN_FONT_SIZE 12 +# define DEFAULT_PLAIN_FONT_SIZE 12.0f # define DEFAULT_BOLD_FONT_FAMILY "Bitstream Vera Sans" # define FALLBACK_BOLD_FONT_FAMILY "Swis721 BT" # define DEFAULT_BOLD_FONT_STYLE "Bold" -# define DEFAULT_BOLD_FONT_SIZE 12 +# define DEFAULT_BOLD_FONT_SIZE 12.0f # define DEFAULT_FIXED_FONT_FAMILY "Bitstream Vera Sans Mono" # define FALLBACK_FIXED_FONT_FAMILY "Courier10 BT" # define DEFAULT_FIXED_FONT_STYLE "Roman" -# define DEFAULT_FIXED_FONT_SIZE 12 +# define DEFAULT_FIXED_FONT_SIZE 12.0f // This is the port capacity for all monitoring objects - ServerApps // and ServerWindows #define DEFAULT_MONITOR_PORT_SIZE 30 diff --git a/headers/private/servers/app/ServerFont.h b/headers/private/servers/app/ServerFont.h index 1f39331b1d..f79eedce8f 100644 --- a/headers/private/servers/app/ServerFont.h +++ b/headers/private/servers/app/ServerFont.h @@ -5,9 +5,10 @@ * Authors: * DarkWyrm * Jérôme Duval, jerome.duval@free.fr + * Axel Dörfler, axeld@pinc-software.de */ -#ifndef SERVERFONT_H_ -#define SERVERFONT_H_ +#ifndef SERVER_FONT_H +#define SERVER_FONT_H #include @@ -62,7 +63,8 @@ class ServerFont { const char* GetFamily() const; const char* GetPath() const { return fStyle->Path(); } - + + void SetStyle(FontStyle& style); status_t SetFamilyAndStyle(uint16 familyID, uint16 styleID); status_t SetFamilyAndStyle(uint32 fontID); @@ -151,8 +153,6 @@ class ServerFont { protected: friend class FontStyle; - void _SetStyle(FontStyle* style); - FontStyle* fStyle; edge_info fEdges; @@ -167,5 +167,4 @@ protected: uint32 fEncoding; }; -#endif - +#endif /* SERVER_FONT_H */ diff --git a/src/servers/app/AppServer.cpp b/src/servers/app/AppServer.cpp index d7bd8382c4..9818ec51ec 100644 --- a/src/servers/app/AppServer.cpp +++ b/src/servers/app/AppServer.cpp @@ -100,49 +100,10 @@ AppServer::AppServer() // Create the font server and scan the proper directories. gFontManager = new FontManager; - gFontManager->Lock(); - gFontManager->ScanSystemFolders(); + if (gFontManager->InitCheck() != B_OK) + debugger("font manager could not be initialized!"); - if (!gFontManager->SetSystemPlain(DEFAULT_PLAIN_FONT_FAMILY, - DEFAULT_PLAIN_FONT_STYLE, - DEFAULT_PLAIN_FONT_SIZE) && - !gFontManager->SetSystemPlain(FALLBACK_PLAIN_FONT_FAMILY, - DEFAULT_PLAIN_FONT_STYLE, - DEFAULT_PLAIN_FONT_SIZE)) { - printf("Couldn't set plain to %s (fallback: %s), %s %d pt\n", - DEFAULT_PLAIN_FONT_FAMILY, - FALLBACK_PLAIN_FONT_FAMILY, - DEFAULT_PLAIN_FONT_STYLE, - DEFAULT_PLAIN_FONT_SIZE); - } - - if (!gFontManager->SetSystemBold(DEFAULT_BOLD_FONT_FAMILY, - DEFAULT_BOLD_FONT_STYLE, - DEFAULT_BOLD_FONT_SIZE) && - !gFontManager->SetSystemBold(FALLBACK_BOLD_FONT_FAMILY, - DEFAULT_BOLD_FONT_STYLE, - DEFAULT_BOLD_FONT_SIZE)) { - printf("Couldn't set bold to %s (fallback: %s), %s %d pt\n", - DEFAULT_BOLD_FONT_FAMILY, - FALLBACK_BOLD_FONT_FAMILY, - DEFAULT_BOLD_FONT_STYLE, - DEFAULT_BOLD_FONT_SIZE); - } - - if (!gFontManager->SetSystemFixed(DEFAULT_FIXED_FONT_FAMILY, - DEFAULT_FIXED_FONT_STYLE, - DEFAULT_FIXED_FONT_SIZE) && - !gFontManager->SetSystemFixed(FALLBACK_FIXED_FONT_FAMILY, - DEFAULT_FIXED_FONT_STYLE, - DEFAULT_FIXED_FONT_SIZE)) { - printf("Couldn't set fixed to %s (fallback: %s), %s %d pt\n", - DEFAULT_FIXED_FONT_FAMILY, - FALLBACK_FIXED_FONT_FAMILY, - DEFAULT_FIXED_FONT_STYLE, - DEFAULT_FIXED_FONT_SIZE); - } - - gFontManager->Unlock(); + gFontManager->Run(); // Load the GUI colors here and set the global set to the values contained therein. If this // is not possible, set colors to the defaults diff --git a/src/servers/app/DecorManager.cpp b/src/servers/app/DecorManager.cpp index e9885af0a3..246a0f8cfc 100644 --- a/src/servers/app/DecorManager.cpp +++ b/src/servers/app/DecorManager.cpp @@ -7,14 +7,17 @@ #include -#include +#include #include #include -#include +#include +#include #include "AppServer.h" #include "ColorSet.h" #include "DefaultDecorator.h" +#include "Desktop.h" +#include "DesktopSettings.h" #include "ServerConfig.h" #include "DecorManager.h" @@ -23,37 +26,38 @@ DecorManager gDecorManager; -Decorator* create_default_decorator(BRect rect, int32 wlook, int32 wfeel, - int32 wflags); - // This is a class used only by the DecorManager to track all the decorators in memory class DecorInfo { -public: - DecorInfo(const image_id &id, const char *name, - create_decorator *alloc); - ~DecorInfo(void); - image_id GetID(void) const { return fID; } - const char* GetName(void) const { return fName.String(); } - Decorator* Instantiate(BRect rect, const char *title, - int32 wlook, int32 wfeel, - int32 wflags, DisplayDriver *ddriver); -private: - image_id fID; - BString fName; - create_decorator *fAllocator; + public: + DecorInfo(image_id id, const char* name, + create_decorator* allocator = NULL); + ~DecorInfo(); + + status_t InitCheck() const; + + image_id ID() const { return fID; } + const char* Name() const { return fName.String(); } + + Decorator* Instantiate(Desktop* desktop, BRect rect, const char* title, + int32 look, int32 feel, int32 flags); + + private: + image_id fID; + BString fName; + create_decorator *fAllocator; }; -DecorInfo::DecorInfo(const image_id &id, const char *name, create_decorator *alloc) +DecorInfo::DecorInfo(image_id id, const char* name, create_decorator* allocator) : fID(id), fName(name), - fAllocator(alloc) + fAllocator(allocator) { } -DecorInfo::~DecorInfo(void) +DecorInfo::~DecorInfo() { // Do nothing. Normal programming practice would say that one should unload // the object's associate image_id. However, there is some funkiness with @@ -68,20 +72,30 @@ DecorInfo::~DecorInfo(void) Decorator * -DecorInfo::Instantiate(BRect rect, const char *title, int32 wlook, int32 wfeel, - int32 wflags, DisplayDriver *ddriver) +DecorInfo::Instantiate(Desktop* desktop, BRect rect, const char *title, + int32 look, int32 feel, int32 flags) { - Decorator *dec = fAllocator(rect, wlook, wfeel, wflags); - - dec->SetDriver(ddriver); + DesktopSettings settings(desktop); + Decorator *decorator; + try { + if (fAllocator != NULL) + decorator = fAllocator(settings, rect, look, feel, flags); + else + decorator = new DefaultDecorator(settings, rect, look, feel, flags); + } catch (...) { + return NULL; + } + + decorator->SetDriver(desktop->GetDisplayDriver()); + gGUIColorSet.Lock(); - dec->SetColors(gGUIColorSet); + decorator->SetColors(gGUIColorSet); gGUIColorSet.Unlock(); - dec->SetTitle(title); + decorator->SetTitle(title); - return dec; + return decorator; } @@ -94,9 +108,9 @@ DecorManager::DecorManager() fCurrentDecor(NULL) { // Start with the default decorator - index is always 0 - DecorInfo *defaultDecor = new DecorInfo(-1, "Default", create_default_decorator); - fDecorList.AddItem( defaultDecor ); - + DecorInfo *defaultDecor = new DecorInfo(-1, "Default", NULL); + fDecorList.AddItem(defaultDecor); + // Add any on disk RescanDecorators(); @@ -112,18 +126,18 @@ DecorManager::DecorManager() if (file.InitCheck() == B_OK && settings.Unflatten(&file) == B_OK) { BString itemtext; if (settings.FindString("decorator", &itemtext) == B_OK) { - fCurrentDecor = FindDecor(itemtext.String()); + fCurrentDecor = _FindDecor(itemtext.String()); } } if (!fCurrentDecor) - fCurrentDecor = (DecorInfo*) fDecorList.ItemAt(0L); + fCurrentDecor = (DecorInfo*)fDecorList.ItemAt(0L); } DecorManager::~DecorManager() { - EmptyList(); + _EmptyList(); } @@ -136,11 +150,10 @@ DecorManager::RescanDecorators() return; entry_ref ref; - BString fullpath; - while (dir.GetNextRef(&ref) == B_OK) { - fullpath = DECORATORS_DIR; - fullpath += ref.name; + BPath path; + path.SetTo(DECORATORS_DIR); + path.Append(ref.name); // Because this function is used for both initialization and for keeping // the list up to date, check for existence in the list. Note that we @@ -149,11 +162,11 @@ DecorManager::RescanDecorators() // been deleted, it is still available until the next boot, at which point // it will obviously not be loaded. - if (FindDecor(ref.name)) + if (_FindDecor(ref.name)) continue; - image_id tempID = load_add_on(fullpath.String()); - if (tempID == B_ERROR) + image_id image = load_add_on(path.Path()); + if (image != B_OK) continue; // As of now, we do nothing with decorator versions, but the possibility @@ -161,25 +174,25 @@ DecorManager::RescanDecorators() // to do so. If we *did* do anything with decorator versions, the // assignment would go here. - create_decorator *createfunc; + create_decorator* createFunc; // Get the instantiation function - status_t status = get_image_symbol(tempID, "instantiate_decorator", - B_SYMBOL_TYPE_TEXT, (void**)&createfunc); + status_t status = get_image_symbol(image, "instantiate_decorator", + B_SYMBOL_TYPE_TEXT, (void**)&createFunc); if (status != B_OK) { - unload_add_on(tempID); + unload_add_on(image); continue; } - fDecorList.AddItem(new DecorInfo(tempID, ref.name, createfunc)); + // TODO: unload images until they are actually used! + fDecorList.AddItem(new DecorInfo(image, ref.name, createFunc)); } } Decorator * -DecorManager::AllocateDecorator(BRect rect, const char *title, - int32 wlook, int32 wfeel, - int32 wflags, DisplayDriver *ddriver) +DecorManager::AllocateDecorator(Desktop* desktop, BRect rect, const char *title, + int32 look, int32 feel, int32 flags) { // Create a new instance of the current decorator. Ownership is that of the caller @@ -189,26 +202,26 @@ DecorManager::AllocateDecorator(BRect rect, const char *title, return NULL; } - return fCurrentDecor->Instantiate(rect, title, wlook, wfeel, wflags, ddriver); + return fCurrentDecor->Instantiate(desktop, rect, title, look, feel, flags); } int32 -DecorManager::CountDecorators(void) const +DecorManager::CountDecorators() const { return fDecorList.CountItems(); } int32 -DecorManager::GetDecorator(void) const +DecorManager::GetDecorator() const { return fDecorList.IndexOf(fCurrentDecor); } bool -DecorManager::SetDecorator(const int32 &index) +DecorManager::SetDecorator(int32 index) { DecorInfo *newDecInfo = (DecorInfo*)fDecorList.ItemAt(index); @@ -222,7 +235,7 @@ DecorManager::SetDecorator(const int32 &index) bool -DecorManager::SetR5Decorator(const int32 &value) +DecorManager::SetR5Decorator(int32 value) { BString string; @@ -235,7 +248,7 @@ DecorManager::SetR5Decorator(const int32 &value) return false; } - DecorInfo *newDecInfo = FindDecor(string.String()); + DecorInfo *newDecInfo = _FindDecor(string.String()); if (newDecInfo) { fCurrentDecor = newDecInfo; return true; @@ -246,53 +259,41 @@ DecorManager::SetR5Decorator(const int32 &value) const char * -DecorManager::GetDecoratorName(const int32 &index) +DecorManager::GetDecoratorName(int32 index) { - DecorInfo *info = (DecorInfo*)fDecorList.ItemAt(index); - + DecorInfo *info = fDecorList.ItemAt(index); if (info) - return info->GetName(); + return info->Name(); return NULL; } void -DecorManager::EmptyList(void) +DecorManager::_EmptyList() { for (int32 i = 0; i < fDecorList.CountItems(); i++) { - DecorInfo *info = (DecorInfo*)fDecorList.ItemAt(i); - delete info; + delete fDecorList.ItemAt(i);; } + fDecorList.MakeEmpty(); fCurrentDecor = NULL; } DecorInfo* -DecorManager::FindDecor(const char *name) +DecorManager::_FindDecor(const char *name) { if (!name) return NULL; for (int32 i = 0; i < fDecorList.CountItems(); i++) { - DecorInfo *info = (DecorInfo*)fDecorList.ItemAt(i); + DecorInfo* info = fDecorList.ItemAt(i); - if (info && strcmp(name, info->GetName()) == 0) + if (strcmp(name, info->Name()) == 0) return info; } return NULL; } - -// #pragma mark - - - -// This is the allocator function for the default decorator -Decorator* -create_default_decorator(BRect rect, int32 wlook, int32 wfeel, int32 wflags) -{ - return new DefaultDecorator(rect, wlook, wfeel, wflags); -} - diff --git a/src/servers/app/DecorManager.h b/src/servers/app/DecorManager.h index 7b59ec7e51..ffb65a6329 100644 --- a/src/servers/app/DecorManager.h +++ b/src/servers/app/DecorManager.h @@ -4,50 +4,52 @@ * * Author: DarkWyrm */ -#ifndef DECORMANAGER_H -#define DECORMANAGER_H +#ifndef DECOR_MANAGER_H +#define DECOR_MANAGER_H + #include #include #include -#include +#include #include "Decorator.h" #include "DisplayDriver.h" class DecorInfo; +class Desktop; -class DecorManager : public BLocker -{ -public: - DecorManager(void); - ~DecorManager(void); - - void RescanDecorators(void); - - Decorator * AllocateDecorator(BRect rect, const char *title, - int32 wlook, int32 wfeel, - int32 wflags, DisplayDriver *ddriver); - - int32 CountDecorators(void) const; - - int32 GetDecorator(void) const; - bool SetDecorator(const int32 &index); - bool SetR5Decorator(const int32 &value); - const char * GetDecoratorName(const int32 &index); - - // TODO: Implement this method once the rest of the necessary infrastructure - // is in place -// status_t GetPreview(const int32 &index, ServerBitmap *bitmap); - -private: - void EmptyList(void); - DecorInfo* FindDecor(const char *name); - - BList fDecorList; - DecorInfo* fCurrentDecor; + +class DecorManager : public BLocker { + public: + DecorManager(); + ~DecorManager(); + + void RescanDecorators(); + + Decorator* AllocateDecorator(Desktop* desktop, BRect rect, + const char *title, int32 look, int32 feel, + int32 flags); + + int32 CountDecorators() const; + + int32 GetDecorator() const; + bool SetDecorator(int32 index); + bool SetR5Decorator(int32 value); + const char* GetDecoratorName(int32 index); + + // TODO: Implement this method once the rest of the necessary infrastructure + // is in place + //status_t GetPreview(int32 index, ServerBitmap *bitmap); + + private: + void _EmptyList(); + DecorInfo* _FindDecor(const char *name); + + BObjectList fDecorList; + DecorInfo* fCurrentDecor; }; extern DecorManager gDecorManager; -#endif +#endif /* DECOR_MANAGER_H */ diff --git a/src/servers/app/Decorator.cpp b/src/servers/app/Decorator.cpp index 977c16a5df..b3231a3a68 100644 --- a/src/servers/app/Decorator.cpp +++ b/src/servers/app/Decorator.cpp @@ -1,36 +1,23 @@ -//------------------------------------------------------------------------------ -// Copyright (c) 2001-2005, Haiku, Inc. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the "Software"), -// to deal in the Software without restriction, including without limitation -// the rights to use, copy, modify, merge, publish, distribute, sublicense, -// and/or sell copies of the Software, and to permit persons to whom the -// Software is furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -// DEALINGS IN THE SOFTWARE. -// -// File Name: Decorator.cpp -// Author: DarkWyrm -// Stephan Aßmus -// Description: Base class for window decorators -// -//------------------------------------------------------------------------------ -#include +/* + * Copyright 2001-2005, Haiku. + * Distributed under the terms of the MIT License. + * + * Authors: + * DarkWyrm + * Stephan Aßmus + */ + +/** Base class for window decorators */ + #include "ColorSet.h" #include "Decorator.h" #include "DisplayDriver.h" + +#include + #include + /*! \brief Constructor \param rect Size of client area @@ -41,14 +28,15 @@ Does general initialization of internal data members and creates a colorset object. */ -Decorator::Decorator(BRect rect, int32 wlook, int32 wfeel, int32 wflags) +Decorator::Decorator(DesktopSettings& settings, BRect rect, int32 look, + int32 feel, int32 flags) : _colors(new ColorSet()), _driver(NULL), _drawdata(), - _look(wlook), - _feel(wfeel), - _flags(wflags), + _look(look), + _feel(feel), + _flags(flags), _zoomrect(), _closerect(), diff --git a/src/servers/app/DefaultDecorator.cpp b/src/servers/app/DefaultDecorator.cpp index 8740eb11d5..ad792fc8d9 100644 --- a/src/servers/app/DefaultDecorator.cpp +++ b/src/servers/app/DefaultDecorator.cpp @@ -4,24 +4,26 @@ * * Authors: * DarkWyrm + * Stephan Aßmus */ /** Default and fallback decorator for the app_server - the yellow tabs */ -#include - -#include -#include +#include "DefaultDecorator.h" #include "ColorUtils.h" +#include "DesktopSettings.h" #include "DisplayDriver.h" #include "FontManager.h" #include "LayerData.h" #include "PatternHandler.h" #include "RGBColor.h" -#include "DefaultDecorator.h" +#include +#include + +#include //#define USE_VIEW_FILL_HACK @@ -33,12 +35,17 @@ # define STRACE(x) ; #endif -DefaultDecorator::DefaultDecorator(BRect rect, int32 wlook, int32 wfeel, int32 wflags) - : Decorator(rect, wlook, wfeel, wflags), - fTruncatedTitle("") + +DefaultDecorator::DefaultDecorator(DesktopSettings& settings, BRect rect, + int32 look, int32 feel, int32 flags) + : Decorator(settings, rect, look, feel, flags) { - ServerFont font(_look == B_FLOATING_WINDOW_LOOK ? - *gFontManager->GetSystemPlain() : *gFontManager->GetSystemBold()); + ServerFont font; + if (_look == B_FLOATING_WINDOW_LOOK) + settings.GetDefaultPlainFont(font); + else + settings.GetDefaultBoldFont(font); + font.SetFlags(B_FORCE_ANTIALIASING); font.SetSpacing(B_STRING_SPACING); SetFont(&font); diff --git a/src/servers/app/DefaultDecorator.h b/src/servers/app/DefaultDecorator.h index 00d19ef830..b4aafaf0a0 100644 --- a/src/servers/app/DefaultDecorator.h +++ b/src/servers/app/DefaultDecorator.h @@ -1,43 +1,27 @@ -//------------------------------------------------------------------------------ -// Copyright (c) 2001-2002, Haiku, Inc. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the "Software"), -// to deal in the Software without restriction, including without limitation -// the rights to use, copy, modify, merge, publish, distribute, sublicense, -// and/or sell copies of the Software, and to permit persons to whom the -// Software is furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -// DEALINGS IN THE SOFTWARE. -// -// File Name: DefaultDecorator.h -// Author: DarkWyrm -// Description: Fallback decorator for the app_server -// -//------------------------------------------------------------------------------ -#ifndef _DEFAULT_DECORATOR_H_ -#define _DEFAULT_DECORATOR_H_ +/* + * Copyright 2001-2005, Haiku. + * Distributed under the terms of the MIT License. + * + * Authors: + * DarkWyrm + * Stephan Aßmus + */ +#ifndef DEFAULT_DECORATOR_H +#define DEFAULT_DECORATOR_H + #include "Decorator.h" #include +class Desktop; + + class DefaultDecorator: public Decorator { public: - DefaultDecorator(BRect frame, - int32 look, - int32 feel, - int32 flags); + DefaultDecorator(DesktopSettings& settings, BRect frame, + int32 look, int32 feel, int32 flags); virtual ~DefaultDecorator(); - + virtual void MoveBy(float x, float y); virtual void MoveBy(BPoint pt); virtual void ResizeBy(float x, float y); @@ -98,4 +82,4 @@ private: int32 fTruncatedTitleLength; }; -#endif +#endif /* DEFAULT_DECORATOR_H */ diff --git a/src/servers/app/Desktop.cpp b/src/servers/app/Desktop.cpp index ad3edb7ece..2fd0a7441c 100644 --- a/src/servers/app/Desktop.cpp +++ b/src/servers/app/Desktop.cpp @@ -75,6 +75,7 @@ Desktop::Desktop(uid_t userID) return; fLink.SetReceiverPort(fMessagePort); + gFontManager->AttachUser(fUserID); } @@ -87,6 +88,7 @@ Desktop::~Desktop() delete fSettings; delete_port(fMessagePort); + gFontManager->DetachUser(fUserID); } diff --git a/src/servers/app/DesktopSettings.cpp b/src/servers/app/DesktopSettings.cpp index d5c94917ef..2a7789deb3 100644 --- a/src/servers/app/DesktopSettings.cpp +++ b/src/servers/app/DesktopSettings.cpp @@ -11,6 +11,8 @@ #include "DesktopSettings.h" #include "DesktopSettingsPrivate.h" #include "Desktop.h" +#include "FontManager.h" +#include "ServerConfig.h" DesktopSettings::Private::Private() @@ -30,6 +32,17 @@ DesktopSettings::Private::~Private() void DesktopSettings::Private::_SetDefaults() { + _SetFont(fPlainFont, DEFAULT_PLAIN_FONT_FAMILY, DEFAULT_PLAIN_FONT_STYLE, + DEFAULT_PLAIN_FONT_SIZE, FALLBACK_PLAIN_FONT_FAMILY, DEFAULT_PLAIN_FONT_STYLE, + B_REGULAR_FACE); + _SetFont(fBoldFont, DEFAULT_BOLD_FONT_FAMILY, DEFAULT_BOLD_FONT_STYLE, + DEFAULT_BOLD_FONT_SIZE, FALLBACK_BOLD_FONT_FAMILY, DEFAULT_BOLD_FONT_STYLE, + B_BOLD_FACE); + _SetFont(fFixedFont, DEFAULT_FIXED_FONT_FAMILY, DEFAULT_FIXED_FONT_STYLE, + DEFAULT_FIXED_FONT_SIZE, FALLBACK_FIXED_FONT_FAMILY, DEFAULT_FIXED_FONT_STYLE, + B_REGULAR_FACE); + fFixedFont.SetSpacing(B_FIXED_SPACING); + fMouseMode = B_NORMAL_MOUSE; // init scrollbar info @@ -54,6 +67,28 @@ DesktopSettings::Private::_SetDefaults() } +void +DesktopSettings::Private::_SetFont(ServerFont &font, const char *familyName, + const char *styleName, float size, const char *fallbackFamily, + const char *fallbackStyle, uint16 fallbackFace) +{ + BAutolock locker(gFontManager); + + // try to find a matching font + + FontStyle* style = gFontManager->GetStyle(familyName, styleName); + if (style == NULL) { + style = gFontManager->GetStyle(fallbackFamily, fallbackStyle); + if (style == NULL) { + style = gFontManager->FindStyleMatchingFace(fallbackFace); + } + } + + if (style != NULL) + font.SetStyle(*style); +} + + status_t DesktopSettings::Private::_Load() { @@ -69,6 +104,48 @@ DesktopSettings::Private::Save() } +void +DesktopSettings::Private::SetDefaultPlainFont(const ServerFont &font) +{ + fPlainFont = font; +} + + +const ServerFont & +DesktopSettings::Private::DefaultPlainFont() const +{ + return fPlainFont; +} + + +void +DesktopSettings::Private::SetDefaultBoldFont(const ServerFont &font) +{ + fBoldFont = font; +} + + +const ServerFont & +DesktopSettings::Private::DefaultBoldFont() const +{ + return fBoldFont; +} + + +void +DesktopSettings::Private::SetDefaultFixedFont(const ServerFont &font) +{ + fFixedFont = font; +} + + +const ServerFont & +DesktopSettings::Private::DefaultFixedFont() const +{ + return fFixedFont; +} + + void DesktopSettings::Private::SetScrollBarInfo(const scroll_bar_info& info) { @@ -174,6 +251,48 @@ DesktopSettings::~DesktopSettings() } +void +DesktopSettings::SetDefaultPlainFont(const ServerFont &font) +{ + fSettings->SetDefaultPlainFont(font); +} + + +void +DesktopSettings::GetDefaultPlainFont(ServerFont &font) const +{ + font = fSettings->DefaultPlainFont(); +} + + +void +DesktopSettings::SetDefaultBoldFont(const ServerFont &font) +{ + fSettings->SetDefaultBoldFont(font); +} + + +void +DesktopSettings::GetDefaultBoldFont(ServerFont &font) const +{ + font = fSettings->DefaultBoldFont(); +} + + +void +DesktopSettings::SetDefaultFixedFont(const ServerFont &font) +{ + fSettings->SetDefaultFixedFont(font); +} + + +void +DesktopSettings::GetDefaultFixedFont(ServerFont &font) const +{ + font = fSettings->DefaultFixedFont(); +} + + void DesktopSettings::SetScrollBarInfo(const scroll_bar_info& info) { diff --git a/src/servers/app/DesktopSettings.h b/src/servers/app/DesktopSettings.h index 045c138993..12cc6fc9e2 100644 --- a/src/servers/app/DesktopSettings.h +++ b/src/servers/app/DesktopSettings.h @@ -14,6 +14,7 @@ #include class Desktop; +class ServerFont; static const int32 kMaxWorkspaces = 32; @@ -26,6 +27,15 @@ class DesktopSettings { status_t Save(); + void SetDefaultPlainFont(const ServerFont& font); + void GetDefaultPlainFont(ServerFont& font) const; + + void SetDefaultBoldFont(const ServerFont& font); + void GetDefaultBoldFont(ServerFont& font) const; + + void SetDefaultFixedFont(const ServerFont& font); + void GetDefaultFixedFont(ServerFont& font) const; + void SetScrollBarInfo(const scroll_bar_info& info); void GetScrollBarInfo(scroll_bar_info& info) const; diff --git a/src/servers/app/DesktopSettingsPrivate.h b/src/servers/app/DesktopSettingsPrivate.h index eec42c92c8..326e1746cb 100644 --- a/src/servers/app/DesktopSettingsPrivate.h +++ b/src/servers/app/DesktopSettingsPrivate.h @@ -10,6 +10,7 @@ #include "DesktopSettings.h" +#include "ServerFont.h" #include @@ -21,6 +22,15 @@ class DesktopSettings::Private : public BLocker { status_t Save(); + void SetDefaultPlainFont(const ServerFont& font); + const ServerFont& DefaultPlainFont() const; + + void SetDefaultBoldFont(const ServerFont& font); + const ServerFont& DefaultBoldFont() const; + + void SetDefaultFixedFont(const ServerFont& font); + const ServerFont& DefaultFixedFont() const; + void SetScrollBarInfo(const scroll_bar_info &info); const scroll_bar_info& ScrollBarInfo() const; @@ -39,8 +49,15 @@ class DesktopSettings::Private : public BLocker { private: void _SetDefaults(); + void _SetFont(ServerFont& font, const char* family, const char* style, + float size, const char *fallbackFamily, + const char* fallbackStyle, uint16 fallbackFace); status_t _Load(); + ServerFont fPlainFont; + ServerFont fBoldFont; + ServerFont fFixedFont; + scroll_bar_info fScrollBarInfo; menu_info fMenuInfo; mode_mouse fMouseMode; diff --git a/src/servers/app/FontManager.cpp b/src/servers/app/FontManager.cpp index 515269dd8f..db9785345d 100644 --- a/src/servers/app/FontManager.cpp +++ b/src/servers/app/FontManager.cpp @@ -4,23 +4,26 @@ * * Authors: * DarkWyrm + * Axel Dörfler, axeld@pinc-software.de */ -/** Handles the largest part of the font subsystem */ +/** Manages font families and styles */ +#include +#include +#include +#include + +#include #include #include #include +#include #include #include #include -#include -#include -#include -#include "ServerConfig.h" - #include @@ -50,15 +53,22 @@ face_requester(FTC_FaceID face_id, FT_Library library, //! Does basic set up so that directories can be scanned FontManager::FontManager() - : BLocker("font server lock"), + : BLooper("Font Manager"), fFamilies(20), - fPlain(NULL), - fBold(NULL), - fFixed(NULL), + fDefaultFont(NULL), fNextID(0) { fInitStatus = FT_Init_FreeType(&gFreeTypeLibrary) == 0 ? B_OK : B_ERROR; + if (fInitStatus == B_OK) { + _ScanSystemFonts(); + + if (CountFamilies() != 0) + _SetDefaultFont(); + else + fInitStatus = B_ENTRY_NOT_FOUND; + } + /* Fire up the font caching subsystem. The three zeros tell FreeType to use the defaults, which are 2 faces, @@ -79,30 +89,10 @@ FontManager::~FontManager() } -/*! - \brief Counts the number of font families available - \return The number of unique font families currently available -*/ -int32 -FontManager::CountFamilies(void) +void +FontManager::MessageReceived(BMessage* message) { - return fFamilies.CountItems(); -} - - -/*! - \brief Counts the number of styles available in a font family - \param family Name of the font family to scan - \return The number of font styles currently available for the font family -*/ -int32 -FontManager::CountStyles(const char *familyName) -{ - FontFamily *family = GetFamily(familyName); - if (family) - return family->CountStyles(); - - return 0; + // nothing to do here yet } @@ -111,7 +101,7 @@ FontManager::CountStyles(const char *familyName) \param family The family to remove */ void -FontManager::RemoveFamily(const char *familyName) +FontManager::_RemoveFamily(const char *familyName) { FontFamily *family = GetFamily(familyName); if (family) { @@ -121,17 +111,36 @@ FontManager::RemoveFamily(const char *familyName) } +/*! + \brief Sets the font that will be used when you create an empty + ServerFont without specifying a style. +*/ +void +FontManager::_SetDefaultFont() +{ + FontStyle* style = GetStyle(DEFAULT_PLAIN_FONT_FAMILY, DEFAULT_PLAIN_FONT_STYLE); + if (style == NULL) { + style = FindStyleMatchingFace(B_REGULAR_FACE); + if (style == NULL) + style = FamilyAt(0)->StyleAt(0); + } + + fDefaultFont = new ServerFont(*style, DEFAULT_PLAIN_FONT_SIZE); +} + + //! Scans the four default system font folders void -FontManager::ScanSystemFolders(void) +FontManager::_ScanSystemFonts() { - ScanDirectory("/boot/beos/etc/fonts/ttfonts/"); - + BPath path; + if (find_directory(B_BEOS_FONTS_DIRECTORY, &path) == B_OK) + _AddPath(path.Path()); + // We don't scan these in test mode to help shave off some startup time #if !TEST_MODE - ScanDirectory("/boot/beos/etc/fonts/PS-Type1/"); - ScanDirectory("/boot/home/config/fonts/ttfonts/"); - ScanDirectory("/boot/home/config/fonts/psfonts/"); + if (find_directory(B_COMMON_FONTS_DIRECTORY, &path) == B_OK) + _AddPath(path.Path()); #endif } @@ -176,29 +185,62 @@ FontManager::_AddFont(BPath &path) } +status_t +FontManager::_AddPath(const char* path) +{ + BEntry entry; + status_t status = entry.SetTo(path); + if (status != B_OK) + return status; + + return _AddPath(entry); +} + + +status_t +FontManager::_AddPath(BEntry& entry) +{ + status_t status = _ScanDirectory(entry); + if (status != B_OK) + return status; + + node_ref nodeRef; + if (entry.GetNodeRef(&nodeRef) != B_OK) + return status; + + // TODO: don't add it twice! + // TODO: monitor this directory! + return B_OK; +} + + /*! \brief Scan a folder for all valid fonts \param directoryPath Path of the folder to scan. */ status_t -FontManager::ScanDirectory(const char *directoryPath) +FontManager::_ScanDirectory(BEntry& entry) { // This bad boy does all the real work. It loads each entry in the // directory. If a valid font file, it adds both the family and the style. // Both family and style are stored internally as BStrings. Once everything BDirectory dir; - status_t status = dir.SetTo(directoryPath); + status_t status = dir.SetTo(&entry); if (status != B_OK) return status; - BEntry entry; while (dir.GetNextEntry(&entry) == B_OK) { BPath path; status = entry.GetPath(&path); if (status < B_OK) continue; + if (entry.IsDirectory()) { + // scan this directory recursively + _AddPath(entry); + continue; + } // TODO: Commenting this out makes my "Unicode glyph lookup" // work with our default fonts. The real fix is to select the @@ -265,8 +307,35 @@ FontManager::_GetSupportedCharmap(const FT_Face& face) } +/*! + \brief Counts the number of font families available + \return The number of unique font families currently available +*/ +int32 +FontManager::CountFamilies() const +{ + return fFamilies.CountItems(); +} + + +/*! + \brief Counts the number of styles available in a font family + \param family Name of the font family to scan + \return The number of font styles currently available for the font family +*/ +int32 +FontManager::CountStyles(const char *familyName) const +{ + FontFamily *family = GetFamily(familyName); + if (family) + return family->CountStyles(); + + return 0; +} + + FontFamily* -FontManager::GetFamilyByIndex(int32 index) const +FontManager::FamilyAt(int32 index) const { return fFamilies.ItemAt(index); } @@ -378,106 +447,51 @@ FontManager::GetStyle(uint16 familyID, uint16 styleID) /*! - \brief Returns the current object used for the regular style - \return A ServerFont pointer which is the plain font. - - Do NOT delete this object. If you access it, make a copy of it. + \brief If you don't find your preferred font style, but are anxious + to have one fitting your needs, you may want to use this method. */ -ServerFont* -FontManager::GetSystemPlain() +FontStyle* +FontManager::FindStyleMatchingFace(uint16 face) const { - return fPlain; + int32 count = fFamilies.CountItems(); + + for (int32 i = 0; i < count; i++) { + FontFamily* family = fFamilies.ItemAt(i); + FontStyle* style = family->GetStyleMatchingFace(face); + if (style != NULL) + return style; + } + + return NULL; } -/*! - \brief Returns the current object used for the bold style - \return A ServerFont pointer which is the bold font. - - Do NOT delete this object. If you access it, make a copy of it. -*/ -ServerFont* -FontManager::GetSystemBold() +const ServerFont* +FontManager::DefaultFont() const { - return fBold; + return fDefaultFont; } -/*! - \brief Returns the current object used for the fixed style - \return A ServerFont pointer which is the fixed font. - - Do NOT delete this object. If you access it, make a copy of it. -*/ -ServerFont* -FontManager::GetSystemFixed() +void +FontManager::AttachUser(uid_t userID) { - return fFixed; + BAutolock locker(this); + +/* + BPath path; + status_t status = find_directory(B_USER_FONTS_DIRECTORY, &path); + if (status != B_OK) + return status; + + _AddPath(path.Path()); +*/ } -/*! - \brief Sets the system's plain font to the specified family and style - \param family Name of the font's family - \param style Name of the style desired - \param size Size desired - \return true if successful, false if not. - -*/ -bool -FontManager::SetSystemPlain(const char* familyName, const char* styleName, float size) +void +FontManager::DetachUser(uid_t userID) { - FontStyle *style = GetStyle(familyName, styleName); - if (style == NULL) - return false; - - delete fPlain; - fPlain = new ServerFont(*style, size); - - return true; -} - - -/*! - \brief Sets the system's bold font to the specified family and style - \param family Name of the font's family - \param style Name of the style desired - \param size Size desired - \return true if successful, false if not. - -*/ -bool -FontManager::SetSystemBold(const char* familyName, const char* styleName, float size) -{ - FontStyle *style = GetStyle(familyName, styleName); - if (style == NULL) - return false; - - delete fBold; - fBold = new ServerFont(*style, size); - - return true; -} - - -/*! - \brief Sets the system's fixed font to the specified family and style - \param family Name of the font's family - \param style Name of the style desired - \param size Size desired - \return true if successful, false if not. - -*/ -bool -FontManager::SetSystemFixed(const char* familyName, const char* styleName, float size) -{ - FontStyle *style = GetStyle(familyName, styleName); - if (style == NULL) - return false; - - delete fFixed; - fFixed = new ServerFont(*style, size); - - return true; + BAutolock locker(this); } diff --git a/src/servers/app/LayerData.cpp b/src/servers/app/LayerData.cpp index 21798f69a0..7e5214caec 100644 --- a/src/servers/app/LayerData.cpp +++ b/src/servers/app/LayerData.cpp @@ -21,7 +21,6 @@ #include "LayerData.h" -// constructor DrawData::DrawData() : fOrigin(0.0, 0.0), fScale(1.0), @@ -34,7 +33,6 @@ DrawData::DrawData() fAlphaFncMode(B_ALPHA_OVERLAY), fPenLocation(0.0, 0.0), fPenSize(1.0), - fFont(*gFontManager->GetSystemPlain()), fFontAliasing(false), fSubPixelPrecise(false), fLineCapMode(B_BUTT_CAP), @@ -44,14 +42,14 @@ DrawData::DrawData() fUnscaledFontSize = fFont.Size(); } -// copy constructor + DrawData::DrawData(const DrawData& from) : fClippingRegion(NULL) { *this = from; } -// copy constructor + DrawData::DrawData(const DrawData* from) : fOrigin(0.0, 0.0), fScale(1.0), diff --git a/src/servers/app/ServerApp.cpp b/src/servers/app/ServerApp.cpp index 0bab868515..12e169ed06 100644 --- a/src/servers/app/ServerApp.cpp +++ b/src/servers/app/ServerApp.cpp @@ -1134,27 +1134,13 @@ ServerApp::_DispatchMessage(int32 code, BPrivate::LinkReceiver &link) gFontManager->Lock(); bool needsUpdate = gFontManager->FontsNeedUpdated(); gFontManager->Unlock(); - - if(checkonly) - { + + if (checkonly) { fLink.StartMessage(needsUpdate ? SERVER_TRUE : SERVER_FALSE); fLink.Flush(); - } - else - { - if(needsUpdate) - { - gFontManager->Lock(); - gFontManager->ScanSystemFolders(); - gFontManager->Unlock(); - fLink.StartMessage(SERVER_TRUE); - fLink.Flush(); - } - else - { - fLink.StartMessage(SERVER_FALSE); - fLink.Flush(); - } + } else { + fLink.StartMessage(SERVER_FALSE); + fLink.Flush(); } break; } @@ -1172,7 +1158,7 @@ ServerApp::_DispatchMessage(int32 code, BPrivate::LinkReceiver &link) gFontManager->Lock(); - FontFamily *family = gFontManager->GetFamilyByIndex(index); + FontFamily *family = gFontManager->FamilyAt(index); if (family) { fLink.StartMessage(B_OK); fLink.AttachString(family->Name()); @@ -1555,32 +1541,28 @@ ServerApp::_DispatchMessage(int32 code, BPrivate::LinkReceiver &link) // 4) uint16 - face flags // 5) uint32 - font flags - gFontManager->Lock(); + DesktopSettings settings(fDesktop); - ServerFont *font = NULL; + ServerFont font; switch (code) { case AS_SET_SYSFONT_PLAIN: - font = gFontManager->GetSystemPlain(); + settings.GetDefaultPlainFont(font); break; case AS_SET_SYSFONT_BOLD: - font = gFontManager->GetSystemBold(); + settings.GetDefaultBoldFont(font); break; case AS_SET_SYSFONT_FIXED: - font = gFontManager->GetSystemFixed(); + settings.GetDefaultFixedFont(font); break; } - if (font != NULL) { - fLink.StartMessage(B_OK); - fLink.Attach(font->FamilyID()); - fLink.Attach(font->StyleID()); - fLink.Attach(font->Size()); - fLink.Attach(font->Face()); - fLink.Attach(font->Flags()); - } else - fLink.StartMessage(B_BAD_VALUE); + fLink.StartMessage(B_OK); + fLink.Attach(font.FamilyID()); + fLink.Attach(font.StyleID()); + fLink.Attach(font.Size()); + fLink.Attach(font.Face()); + fLink.Attach(font.Flags()); - gFontManager->Unlock(); fLink.Flush(); break; } diff --git a/src/servers/app/ServerFont.cpp b/src/servers/app/ServerFont.cpp index 1cb68de92a..7abbb93203 100644 --- a/src/servers/app/ServerFont.cpp +++ b/src/servers/app/ServerFont.cpp @@ -147,7 +147,7 @@ ServerFont::ServerFont() : fStyle(NULL) { - *this = *gFontManager->GetSystemPlain(); + *this = *gFontManager->DefaultFont(); } @@ -190,8 +190,7 @@ ServerFont::operator=(const ServerFont& font) fEncoding = font.fEncoding; fBounds = font.fBounds; - _SetStyle(font.fStyle); - + SetStyle(*font.fStyle); return *this; } @@ -232,6 +231,21 @@ ServerFont::GetFamily() const } +void +ServerFont::SetStyle(FontStyle& style) +{ + if (&style != fStyle) { + // detach from old style + if (fStyle) + fStyle->Release(); + + // attach to new style + fStyle = &style; + fStyle->Acquire(); + } +} + + /*! \brief Sets the ServerFont instance to whatever font is specified \param familyID ID number of the family to set @@ -254,7 +268,7 @@ ServerFont::SetFamilyAndStyle(uint16 familyID, uint16 styleID) if (!style) return B_ERROR; - _SetStyle(style); + SetStyle(*style); style->Release(); return B_OK; @@ -708,20 +722,3 @@ ServerFont::TruncateString(BString* inOut, uint32 mode, float width) const } } - -void -ServerFont::_SetStyle(FontStyle* style) -{ - if (style == NULL) - debugger("set NULL style!"); - - if (style != fStyle) { - // detach from old style - if (fStyle) - fStyle->Release(); - - // attach to new style - fStyle = style; - fStyle->Acquire(); - } -} diff --git a/src/servers/app/WinBorder.cpp b/src/servers/app/WinBorder.cpp index fa261ecea7..a1bc79ca22 100644 --- a/src/servers/app/WinBorder.cpp +++ b/src/servers/app/WinBorder.cpp @@ -24,6 +24,7 @@ #include "MessagePrivate.h" #include "PortLink.h" #include "RootLayer.h" +#include "ServerApp.h" #include "ServerWindow.h" #include "TokenHandler.h" #include "Workspace.h" @@ -110,8 +111,8 @@ WinBorder::WinBorder(const BRect &frame, QuietlySetFeel(feel); if (fFeel != B_NO_BORDER_WINDOW_LOOK) { - fDecorator = gDecorManager.AllocateDecorator(frame, name, fLook, fFeel, - fWindowFlags, fDriver); + fDecorator = gDecorManager.AllocateDecorator(window->App()->GetDesktop(), frame, + name, fLook, fFeel, fWindowFlags); if (fDecorator) fDecorator->GetSizeLimits(&fMinWidth, &fMinHeight, &fMaxWidth, &fMaxHeight); } diff --git a/src/servers/app/drawing/Painter/Painter.cpp b/src/servers/app/drawing/Painter/Painter.cpp index ef04b386b6..5e244fffef 100644 --- a/src/servers/app/drawing/Painter/Painter.cpp +++ b/src/servers/app/drawing/Painter/Painter.cpp @@ -89,9 +89,6 @@ Painter::Painter() fPatternHandler(new PatternHandler()), fTextRenderer(new AGGTextRenderer()) { - if (gFontManager && gFontManager->GetSystemPlain()) - fFont = *gFontManager->GetSystemPlain(); - _UpdateFont(); _UpdateLineWidth(); }