diff -ur abiword-2.4.6/abi/src/af/xap/unix/xap_UnixFontManager.cpp abiword-2.4.6-rob/abi/src/af/xap/unix/xap_UnixFontManager.cpp --- abiword-2.4.6/abi/src/af/xap/unix/xap_UnixFontManager.cpp 2006-05-12 14:08:58.000000000 +0100 +++ abiword-2.4.6-rob/abi/src/af/xap/unix/xap_UnixFontManager.cpp 2007-08-08 22:28:39.000000000 +0100 @@ -212,6 +212,7 @@ FcPattern* fp; FcPattern* result_fp; FcResult result; + FcChar8* orig_family; UT_DEBUGMSG(("searchFont [%s]\n", pszXftName)); UT_UTF8String sXftName = pszXftName; @@ -233,10 +234,17 @@ } fp = FcNameParse(reinterpret_cast(sXftName.utf8_str())); + FcPatternPrint (fp); + + if (FcPatternGetString(fp, FC_FAMILY, 0, &orig_family) != FcResultMatch) + orig_family = NULL; + FcConfigSubstitute(m_pConfig, fp, FcMatchPattern); + FcPatternPrint (fp); result_fp = FcFontSetMatch (m_pConfig, &m_pFontSet, 1, fp, &result); + FcPatternPrint (result_fp); FcPatternDestroy(fp); - + if (!result_fp) { UT_UTF8String message("AbiWord has not been able to find any font. Please check that\n" @@ -282,6 +290,17 @@ } XAP_UnixFont* pUnixFont = getFont(reinterpret_cast(family), s); + + if (pUnixFont) { + /*insert a 'virtual on in our font list with the asked-for name*/ + if (orig_family) { + XAP_UnixFont *pNewUnixFont = new XAP_UnixFont(*pUnixFont); + pNewUnixFont->setName(reinterpret_cast(orig_family)); + UT_DEBUGMSG(("adding font %s\n", pNewUnixFont->getName())); + _addFont(pNewUnixFont, NULL); + sendFontsChangedEvent(); + } + } FcPatternDestroy(result_fp); return pUnixFont; @@ -588,3 +607,39 @@ m_fontHash.insert(fontkey, newfont); } + +void XAP_UnixFontManager::addFontsChangedListener(XAP_UnixListener* pObj) +{ + UT_DEBUGMSG(("addFontsChangedListener!\n")); + m_listeners.addItem(pObj); +} + +void XAP_UnixFontManager::removeFontsChangedListener(XAP_UnixListener* pObj) +{ + UT_DEBUGMSG(("removeFontsChangedListener!\n")); + UT_sint32 count = m_listeners.getItemCount(); + + for (UT_sint32 i = 0; i < count; i++) + { + XAP_UnixListener * obj = m_listeners.getNthItem(i); + + if (obj == pObj) + { + m_listeners.deleteNthItem(i); + break; + } + } +} + +void XAP_UnixFontManager::sendFontsChangedEvent() +{ + UT_DEBUGMSG(("sendFontsChangedEvent!\n")); + UT_sint32 count = m_listeners.getItemCount(); + + for (UT_sint32 i = 0; i < count; i++) + { + XAP_UnixListener* pObj = m_listeners.getNthItem(i); + pObj->notify(); + } +} + Only in abiword-2.4.6-rob/abi/src/af/xap/unix: .xap_UnixFontManager.cpp.swp diff -ur abiword-2.4.6/abi/src/af/xap/unix/xap_UnixFontManager.h abiword-2.4.6-rob/abi/src/af/xap/unix/xap_UnixFontManager.h --- abiword-2.4.6/abi/src/af/xap/unix/xap_UnixFontManager.h 2004-03-23 00:12:04.000000000 +0000 +++ abiword-2.4.6-rob/abi/src/af/xap/unix/xap_UnixFontManager.h 2007-08-08 21:59:32.000000000 +0100 @@ -36,6 +36,15 @@ class UT_String; +class ABI_EXPORT XAP_UnixListener +{ +public: + virtual ~XAP_UnixListener() {} + + virtual void notify() = 0; +}; + + class ABI_EXPORT XAP_UnixFontManager { public: @@ -65,7 +74,10 @@ // member, font caching can't be implemented without a whole lot of code rewriting static XAP_UnixFontManager* pFontManager; + void addFontsChangedListener(XAP_UnixListener* pObj); + void removeFontsChangedListener(XAP_UnixListener* pObj); private: + void sendFontsChangedEvent (); XAP_UnixFont* forceFontSynth(XAP_UnixFontManager* pFontManager, const char* pszFontFamily, @@ -82,6 +94,7 @@ FcFontSet* m_pFontSet; FcConfig* m_pConfig; UT_GenericVector m_vecDeallocatedFonts; + UT_GenericVector m_listeners; }; #endif /* XAP_UNIXFONTMANAGER_H */ diff -ur abiword-2.4.6/abi/src/wp/ap/unix/ap_UnixToolbar_FontCombo.cpp abiword-2.4.6-rob/abi/src/wp/ap/unix/ap_UnixToolbar_FontCombo.cpp --- abiword-2.4.6/abi/src/wp/ap/unix/ap_UnixToolbar_FontCombo.cpp 2005-06-21 18:32:58.000000000 +0100 +++ abiword-2.4.6-rob/abi/src/wp/ap/unix/ap_UnixToolbar_FontCombo.cpp 2007-08-08 22:27:08.000000000 +0100 @@ -40,6 +40,18 @@ #include "ev_Toolbar.h" +class AP_UnixToobar_FontComboListener : public XAP_UnixListener +{ +public: + AP_UnixToobar_FontComboListener (AP_UnixToolbar_FontCombo *combo) : fontcombo(combo) {} + + virtual ~AP_UnixToobar_FontComboListener() {} + virtual void notify () {fontcombo->populate();} +private: + AP_UnixToolbar_FontCombo *fontcombo; +}; + + EV_Toolbar_Control * AP_UnixToolbar_FontCombo::static_constructor(EV_Toolbar * pToolbar, XAP_Toolbar_Id id) { @@ -59,22 +71,36 @@ UT_ASSERT(list); m_nLimit = list->size(); + m_pCustomListener = NULL; DELETEP(list); + } AP_UnixToolbar_FontCombo::~AP_UnixToolbar_FontCombo(void) { - // nothing to purge. contents are static strings + EV_UnixToolbar * toolbar = static_cast(m_pToolbar); + if (m_pCustomListener) { + toolbar->getApp()->getFontManager()->removeFontsChangedListener(m_pCustomListener); + delete m_pCustomListener; + } + } bool AP_UnixToolbar_FontCombo::populate(void) { UT_ASSERT(m_pToolbar); - + + UT_DEBUGMSG(("FontCombo::populate\n")); // Things are relatively easy with the font manager. Just // request all fonts and ask them their names. EV_UnixToolbar * toolbar = static_cast(m_pToolbar); + /*install a listener to refresh, if itisn't already there*/ + if (!m_pCustomListener) { + m_pCustomListener = new AP_UnixToobar_FontComboListener(this); + toolbar->getApp()->getFontManager()->addFontsChangedListener (m_pCustomListener); + } + UT_GenericVector* list = toolbar->getApp()->getFontManager()->getAllFonts(); UT_ASSERT(list); Only in abiword-2.4.6-rob/abi/src/wp/ap/unix: .ap_UnixToolbar_FontCombo.cpp.swp diff -ur abiword-2.4.6/abi/src/wp/ap/unix/ap_UnixToolbar_FontCombo.h abiword-2.4.6-rob/abi/src/wp/ap/unix/ap_UnixToolbar_FontCombo.h --- abiword-2.4.6/abi/src/wp/ap/unix/ap_UnixToolbar_FontCombo.h 2001-02-06 22:54:51.000000000 +0000 +++ abiword-2.4.6-rob/abi/src/wp/ap/unix/ap_UnixToolbar_FontCombo.h 2007-08-08 21:44:51.000000000 +0100 @@ -25,6 +25,7 @@ #include "ev_UnixToolbar.h" #include "ev_Toolbar_Control.h" class EV_Toolbar; +class AP_UnixToobar_FontComboListener; class AP_UnixToolbar_FontCombo : public EV_Toolbar_Control { @@ -36,8 +37,8 @@ virtual bool populate(void); -protected: - +private: + AP_UnixToobar_FontComboListener * m_pCustomListener; }; #endif /* AP_UNIXTOOLBAR_FONTCOMBO_H */