зеркало из https://github.com/mozilla/gecko-dev.git
Bug 869762: Use Core Foundation notifications instead of ATS for font changes on OS X. r=jdaggett
This commit is contained in:
Родитель
71902a7d0a
Коммит
08b001d8f0
|
@ -6,6 +6,8 @@
|
|||
#ifndef gfxMacPlatformFontList_H_
|
||||
#define gfxMacPlatformFontList_H_
|
||||
|
||||
#include <CoreFoundation/CoreFoundation.h>
|
||||
|
||||
#include "mozilla/MemoryReporting.h"
|
||||
#include "nsDataHashtable.h"
|
||||
#include "nsRefPtrHashtable.h"
|
||||
|
@ -14,8 +16,6 @@
|
|||
#include "gfxPlatform.h"
|
||||
#include "gfxPlatformMac.h"
|
||||
|
||||
#include <Carbon/Carbon.h>
|
||||
|
||||
#include "nsUnicharUtils.h"
|
||||
#include "nsTArray.h"
|
||||
|
||||
|
@ -101,7 +101,11 @@ private:
|
|||
// special case font faces treated as font families (set via prefs)
|
||||
void InitSingleFaceList();
|
||||
|
||||
static void ATSNotification(ATSFontNotificationInfoRef aInfo, void* aUserArg);
|
||||
static void RegisteredFontsChangedNotificationCallback(CFNotificationCenterRef center,
|
||||
void *observer,
|
||||
CFStringRef name,
|
||||
const void *object,
|
||||
CFDictionaryRef userInfo);
|
||||
|
||||
// search fonts system-wide for a given character, null otherwise
|
||||
virtual gfxFontEntry* GlobalFontFallback(const uint32_t aCh,
|
||||
|
@ -112,9 +116,6 @@ private:
|
|||
|
||||
virtual bool UsesSystemFallback() { return true; }
|
||||
|
||||
// keep track of ATS generation to prevent unneeded updates when loading downloaded fonts
|
||||
uint32_t mATSGeneration;
|
||||
|
||||
enum {
|
||||
kATSGenerationInitial = -1
|
||||
};
|
||||
|
|
|
@ -43,7 +43,6 @@
|
|||
#endif
|
||||
#include "prlog.h"
|
||||
|
||||
#include <Carbon/Carbon.h>
|
||||
#include <algorithm>
|
||||
|
||||
#import <AppKit/AppKit.h>
|
||||
|
@ -646,12 +645,15 @@ gfxSingleFaceMacFontFamily::ReadOtherFamilyNames(gfxPlatformFontList *aPlatformF
|
|||
#pragma mark-
|
||||
|
||||
gfxMacPlatformFontList::gfxMacPlatformFontList() :
|
||||
gfxPlatformFontList(false), mATSGeneration(uint32_t(kATSGenerationInitial)),
|
||||
gfxPlatformFontList(false),
|
||||
mDefaultFont(nullptr)
|
||||
{
|
||||
::ATSFontNotificationSubscribe(ATSNotification,
|
||||
kATSFontNotifyOptionDefault,
|
||||
(void*)this, nullptr);
|
||||
::CFNotificationCenterAddObserver(::CFNotificationCenterGetLocalCenter(),
|
||||
this,
|
||||
RegisteredFontsChangedNotificationCallback,
|
||||
kCTFontManagerRegisteredFontsChangedNotification,
|
||||
0,
|
||||
CFNotificationSuspensionBehaviorDeliverImmediately);
|
||||
|
||||
// cache this in a static variable so that MacOSFontFamily objects
|
||||
// don't have to repeatedly look it up
|
||||
|
@ -670,19 +672,8 @@ gfxMacPlatformFontList::InitFontList()
|
|||
{
|
||||
nsAutoreleasePool localPool;
|
||||
|
||||
ATSGeneration currentGeneration = ::ATSGetGeneration();
|
||||
|
||||
// need to ignore notifications after adding each font
|
||||
if (mATSGeneration == currentGeneration)
|
||||
return NS_OK;
|
||||
|
||||
Telemetry::AutoTimer<Telemetry::MAC_INITFONTLIST_TOTAL> timer;
|
||||
|
||||
mATSGeneration = currentGeneration;
|
||||
#ifdef PR_LOGGING
|
||||
LOG_FONTLIST(("(fontlist) updating to generation: %d", mATSGeneration));
|
||||
#endif
|
||||
|
||||
// reset font lists
|
||||
gfxPlatformFontList::InitFontList();
|
||||
|
||||
|
@ -777,11 +768,18 @@ gfxMacPlatformFontList::GetStandardFamilyName(const nsAString& aFontName, nsAStr
|
|||
}
|
||||
|
||||
void
|
||||
gfxMacPlatformFontList::ATSNotification(ATSFontNotificationInfoRef aInfo,
|
||||
void* aUserArg)
|
||||
gfxMacPlatformFontList::RegisteredFontsChangedNotificationCallback(CFNotificationCenterRef center,
|
||||
void *observer,
|
||||
CFStringRef name,
|
||||
const void *object,
|
||||
CFDictionaryRef userInfo)
|
||||
{
|
||||
if (!::CFEqual(name, kCTFontManagerRegisteredFontsChangedNotification)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// xxx - should be carefully pruning the list of fonts, not rebuilding it from scratch
|
||||
static_cast<gfxMacPlatformFontList*>(aUserArg)->UpdateFontList();
|
||||
static_cast<gfxMacPlatformFontList*>(observer)->UpdateFontList();
|
||||
|
||||
// modify a preference that will trigger reflow everywhere
|
||||
static const char kPrefName[] = "font.internaluseonly.changed";
|
||||
|
|
Загрузка…
Ссылка в новой задаче