gdi32: Update the Windows font registry keys only when they have changed.
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
a6f0349e84
commit
000e32f183
|
@ -38,6 +38,7 @@
|
||||||
#include "resource.h"
|
#include "resource.h"
|
||||||
#include "wine/exception.h"
|
#include "wine/exception.h"
|
||||||
#include "wine/heap.h"
|
#include "wine/heap.h"
|
||||||
|
#include "wine/rbtree.h"
|
||||||
#include "wine/unicode.h"
|
#include "wine/unicode.h"
|
||||||
#include "wine/debug.h"
|
#include "wine/debug.h"
|
||||||
|
|
||||||
|
@ -3583,42 +3584,6 @@ static void init_font_options(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
* font_init
|
|
||||||
*/
|
|
||||||
void font_init(void)
|
|
||||||
{
|
|
||||||
static const WCHAR mutex_nameW[] = {'_','_','W','I','N','E','_','F','O','N','T','_','M','U','T','E','X','_','_',0};
|
|
||||||
HANDLE mutex;
|
|
||||||
DWORD disposition;
|
|
||||||
|
|
||||||
if (RegCreateKeyExA( HKEY_CURRENT_USER, "Software\\Wine\\Fonts", 0, NULL, 0,
|
|
||||||
KEY_ALL_ACCESS, NULL, &wine_fonts_key, NULL ))
|
|
||||||
return;
|
|
||||||
|
|
||||||
init_font_options();
|
|
||||||
update_codepage();
|
|
||||||
if (!WineEngInit( &font_funcs )) return;
|
|
||||||
|
|
||||||
if (!(mutex = CreateMutexW( NULL, FALSE, mutex_nameW ))) return;
|
|
||||||
WaitForSingleObject( mutex, INFINITE );
|
|
||||||
|
|
||||||
RegCreateKeyExA( wine_fonts_key, "Cache", 0, NULL, REG_OPTION_VOLATILE,
|
|
||||||
KEY_ALL_ACCESS, NULL, &wine_fonts_cache_key, &disposition );
|
|
||||||
|
|
||||||
if (disposition == REG_CREATED_NEW_KEY) font_funcs->load_fonts();
|
|
||||||
else load_font_list_from_cache();
|
|
||||||
|
|
||||||
ReleaseMutex( mutex );
|
|
||||||
|
|
||||||
reorder_font_list();
|
|
||||||
load_gdi_font_subst();
|
|
||||||
load_gdi_font_replacements();
|
|
||||||
load_system_links();
|
|
||||||
dump_gdi_font_list();
|
|
||||||
dump_gdi_font_subst();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void FONT_LogFontAToW( const LOGFONTA *fontA, LPLOGFONTW fontW )
|
static void FONT_LogFontAToW( const LOGFONTA *fontA, LPLOGFONTW fontW )
|
||||||
{
|
{
|
||||||
|
@ -7441,7 +7406,7 @@ static BOOL remove_font_resource( LPCWSTR file, DWORD flags )
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void load_system_bitmap_fonts(void)
|
static void load_system_bitmap_fonts(void)
|
||||||
{
|
{
|
||||||
static const WCHAR keyW[] = {'S','o','f','t','w','a','r','e','\\','F','o','n','t','s',0};
|
static const WCHAR keyW[] = {'S','o','f','t','w','a','r','e','\\','F','o','n','t','s',0};
|
||||||
static const WCHAR fontsW[] = {'F','O','N','T','S','.','F','O','N',0};
|
static const WCHAR fontsW[] = {'F','O','N','T','S','.','F','O','N',0};
|
||||||
|
@ -7482,7 +7447,7 @@ static void load_directory_fonts( WCHAR *path, UINT flags )
|
||||||
FindClose( handle );
|
FindClose( handle );
|
||||||
}
|
}
|
||||||
|
|
||||||
void load_file_system_fonts(void)
|
static void load_file_system_fonts(void)
|
||||||
{
|
{
|
||||||
static const WCHAR pathW[] = {'P','a','t','h',0};
|
static const WCHAR pathW[] = {'P','a','t','h',0};
|
||||||
static const WCHAR slashstarW[] = {'\\','*',0};
|
static const WCHAR slashstarW[] = {'\\','*',0};
|
||||||
|
@ -7513,7 +7478,121 @@ void load_file_system_fonts(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void load_registry_fonts(void)
|
struct external_key
|
||||||
|
{
|
||||||
|
struct wine_rb_entry entry;
|
||||||
|
BOOL found;
|
||||||
|
WCHAR value[LF_FULLFACESIZE + 12];
|
||||||
|
WCHAR path[1];
|
||||||
|
};
|
||||||
|
|
||||||
|
static int compare_external_key( const void *key, const struct wine_rb_entry *entry )
|
||||||
|
{
|
||||||
|
return strcmpiW( key, WINE_RB_ENTRY_VALUE( entry, struct external_key, entry )->value );
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct wine_rb_tree external_keys = { compare_external_key };
|
||||||
|
|
||||||
|
static HKEY load_external_font_keys(void)
|
||||||
|
{
|
||||||
|
static const WCHAR externalW[] = {'E','x','t','e','r','n','a','l',' ','F','o','n','t','s',0};
|
||||||
|
WCHAR value[LF_FULLFACESIZE + 12], path[MAX_PATH];
|
||||||
|
DWORD i = 0, type, dlen, vlen;
|
||||||
|
struct external_key *key;
|
||||||
|
HKEY hkey;
|
||||||
|
|
||||||
|
if (RegCreateKeyW( wine_fonts_key, externalW, &hkey )) return 0;
|
||||||
|
|
||||||
|
vlen = ARRAY_SIZE(value);
|
||||||
|
dlen = sizeof(path);
|
||||||
|
while (!RegEnumValueW( hkey, i++, value, &vlen, NULL, &type, (BYTE *)path, &dlen ))
|
||||||
|
{
|
||||||
|
if (type != REG_SZ) goto next;
|
||||||
|
dlen /= sizeof(WCHAR);
|
||||||
|
if (!(key = HeapAlloc( GetProcessHeap(), 0, offsetof(struct external_key, path[dlen]) ))) break;
|
||||||
|
key->found = FALSE;
|
||||||
|
strcpyW( key->value, value );
|
||||||
|
strcpyW( key->path, path );
|
||||||
|
wine_rb_put( &external_keys, value, &key->entry );
|
||||||
|
next:
|
||||||
|
vlen = ARRAY_SIZE(value);
|
||||||
|
dlen = sizeof(path);
|
||||||
|
}
|
||||||
|
return hkey;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void update_external_font_keys( HKEY hkey )
|
||||||
|
{
|
||||||
|
static const WCHAR win9x_keyW[] = {'S','o','f','t','w','a','r','e','\\',
|
||||||
|
'M','i','c','r','o','s','o','f','t','\\',
|
||||||
|
'W','i','n','d','o','w','s','\\',
|
||||||
|
'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\',
|
||||||
|
'F','o','n','t','s',0};
|
||||||
|
static const WCHAR winnt_keyW[] = {'S','o','f','t','w','a','r','e','\\',
|
||||||
|
'M','i','c','r','o','s','o','f','t','\\',
|
||||||
|
'W','i','n','d','o','w','s',' ','N','T','\\',
|
||||||
|
'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\',
|
||||||
|
'F','o','n','t','s',0};
|
||||||
|
static const WCHAR TrueType[] = {' ','(','T','r','u','e','T','y','p','e',')',0};
|
||||||
|
HKEY winnt_key = 0, win9x_key = 0;
|
||||||
|
struct gdi_font_family *family;
|
||||||
|
struct gdi_font_face *face;
|
||||||
|
struct wine_rb_entry *entry;
|
||||||
|
struct external_key *key, *next;
|
||||||
|
DWORD len;
|
||||||
|
BOOL skip;
|
||||||
|
WCHAR value[LF_FULLFACESIZE + 12], path[MAX_PATH];
|
||||||
|
WCHAR *file;
|
||||||
|
|
||||||
|
RegCreateKeyExW( HKEY_LOCAL_MACHINE, winnt_keyW, 0, NULL, 0, KEY_ALL_ACCESS, NULL, &winnt_key, NULL );
|
||||||
|
RegCreateKeyExW( HKEY_LOCAL_MACHINE, win9x_keyW, 0, NULL, 0, KEY_ALL_ACCESS, NULL, &win9x_key, NULL );
|
||||||
|
|
||||||
|
/* enumerate the fonts and add external ones to the two keys */
|
||||||
|
|
||||||
|
LIST_FOR_EACH_ENTRY( family, &font_list, struct gdi_font_family, entry )
|
||||||
|
{
|
||||||
|
LIST_FOR_EACH_ENTRY( face, &family->faces, struct gdi_font_face, entry )
|
||||||
|
{
|
||||||
|
if (!(face->flags & ADDFONT_EXTERNAL_FONT)) continue;
|
||||||
|
|
||||||
|
strcpyW( value, face->full_name );
|
||||||
|
if (face->scalable) strcatW( value, TrueType );
|
||||||
|
|
||||||
|
if (GetFullPathNameW( face->file, MAX_PATH, path, NULL ))
|
||||||
|
file = path;
|
||||||
|
else if ((file = strrchrW( face->file, '\\' )))
|
||||||
|
file++;
|
||||||
|
else
|
||||||
|
file = face->file;
|
||||||
|
|
||||||
|
skip = FALSE;
|
||||||
|
if ((entry = wine_rb_get( &external_keys, value )))
|
||||||
|
{
|
||||||
|
struct external_key *key = WINE_RB_ENTRY_VALUE( entry, struct external_key, entry );
|
||||||
|
skip = key->found && !strcmpiW( key->path, file );
|
||||||
|
wine_rb_remove_key( &external_keys, value );
|
||||||
|
HeapFree( GetProcessHeap(), 0, key );
|
||||||
|
}
|
||||||
|
if (skip) continue;
|
||||||
|
len = (strlenW(file) + 1) * sizeof(WCHAR);
|
||||||
|
RegSetValueExW( winnt_key, value, 0, REG_SZ, (BYTE *)file, len );
|
||||||
|
RegSetValueExW( win9x_key, value, 0, REG_SZ, (BYTE *)file, len );
|
||||||
|
RegSetValueExW( hkey, value, 0, REG_SZ, (BYTE *)file, len );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
WINE_RB_FOR_EACH_ENTRY_DESTRUCTOR( key, next, &external_keys, struct external_key, entry )
|
||||||
|
{
|
||||||
|
RegDeleteValueW( win9x_key, key->value );
|
||||||
|
RegDeleteValueW( winnt_key, key->value );
|
||||||
|
RegDeleteValueW( hkey, key->value );
|
||||||
|
wine_rb_remove_key( &external_keys, key->value );
|
||||||
|
HeapFree( GetProcessHeap(), 0, key );
|
||||||
|
}
|
||||||
|
RegCloseKey( win9x_key );
|
||||||
|
RegCloseKey( winnt_key );
|
||||||
|
}
|
||||||
|
|
||||||
|
static void load_registry_fonts(void)
|
||||||
{
|
{
|
||||||
static const WCHAR dot_fonW[] = {'.','f','o','n',0};
|
static const WCHAR dot_fonW[] = {'.','f','o','n',0};
|
||||||
static const WCHAR win9x_key[] = {'S','o','f','t','w','a','r','e','\\',
|
static const WCHAR win9x_key[] = {'S','o','f','t','w','a','r','e','\\',
|
||||||
|
@ -7526,8 +7605,9 @@ void load_registry_fonts(void)
|
||||||
'W','i','n','d','o','w','s',' ','N','T','\\',
|
'W','i','n','d','o','w','s',' ','N','T','\\',
|
||||||
'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\',
|
'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\',
|
||||||
'F','o','n','t','s',0};
|
'F','o','n','t','s',0};
|
||||||
WCHAR value[MAX_PATH], data[MAX_PATH];
|
WCHAR value[LF_FULLFACESIZE + 12], data[MAX_PATH];
|
||||||
DWORD i = 0, type, dlen, vlen;
|
DWORD i = 0, type, dlen, vlen;
|
||||||
|
struct wine_rb_entry *entry;
|
||||||
HKEY hkey;
|
HKEY hkey;
|
||||||
|
|
||||||
/* Look under HKLM\Software\Microsoft\Windows[ NT]\CurrentVersion\Fonts
|
/* Look under HKLM\Software\Microsoft\Windows[ NT]\CurrentVersion\Fonts
|
||||||
|
@ -7541,18 +7621,73 @@ void load_registry_fonts(void)
|
||||||
dlen = sizeof(data);
|
dlen = sizeof(data);
|
||||||
while (!RegEnumValueW( hkey, i++, value, &vlen, NULL, &type, (LPBYTE)data, &dlen ))
|
while (!RegEnumValueW( hkey, i++, value, &vlen, NULL, &type, (LPBYTE)data, &dlen ))
|
||||||
{
|
{
|
||||||
|
if (type != REG_SZ) goto next;
|
||||||
dlen /= sizeof(WCHAR);
|
dlen /= sizeof(WCHAR);
|
||||||
|
if ((entry = wine_rb_get( &external_keys, value )))
|
||||||
|
{
|
||||||
|
struct external_key *key = WINE_RB_ENTRY_VALUE( entry, struct external_key, entry );
|
||||||
|
if (!strcmpiW( key->path, data ))
|
||||||
|
{
|
||||||
|
key->found = TRUE;
|
||||||
|
goto next;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (data[0] && data[1] == ':')
|
if (data[0] && data[1] == ':')
|
||||||
add_font_resource( data, ADDFONT_ALLOW_BITMAP | ADDFONT_ADD_TO_CACHE );
|
add_font_resource( data, ADDFONT_ALLOW_BITMAP | ADDFONT_ADD_TO_CACHE );
|
||||||
else if (dlen >= 6 && !strcmpiW( data + dlen - 5, dot_fonW ))
|
else if (dlen >= 6 && !strcmpiW( data + dlen - 5, dot_fonW ))
|
||||||
add_system_font_resource( data, ADDFONT_ALLOW_BITMAP | ADDFONT_ADD_TO_CACHE );
|
add_system_font_resource( data, ADDFONT_ALLOW_BITMAP | ADDFONT_ADD_TO_CACHE );
|
||||||
|
next:
|
||||||
vlen = ARRAY_SIZE(value);
|
vlen = ARRAY_SIZE(value);
|
||||||
dlen = sizeof(data);
|
dlen = sizeof(data);
|
||||||
}
|
}
|
||||||
RegCloseKey( hkey );
|
RegCloseKey( hkey );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* font_init
|
||||||
|
*/
|
||||||
|
void font_init(void)
|
||||||
|
{
|
||||||
|
static const WCHAR mutex_nameW[] = {'_','_','W','I','N','E','_','F','O','N','T','_','M','U','T','E','X','_','_',0};
|
||||||
|
HANDLE mutex;
|
||||||
|
DWORD disposition;
|
||||||
|
|
||||||
|
if (RegCreateKeyExA( HKEY_CURRENT_USER, "Software\\Wine\\Fonts", 0, NULL, 0,
|
||||||
|
KEY_ALL_ACCESS, NULL, &wine_fonts_key, NULL ))
|
||||||
|
return;
|
||||||
|
|
||||||
|
init_font_options();
|
||||||
|
update_codepage();
|
||||||
|
if (!WineEngInit( &font_funcs )) return;
|
||||||
|
|
||||||
|
if (!(mutex = CreateMutexW( NULL, FALSE, mutex_nameW ))) return;
|
||||||
|
WaitForSingleObject( mutex, INFINITE );
|
||||||
|
|
||||||
|
RegCreateKeyExA( wine_fonts_key, "Cache", 0, NULL, REG_OPTION_VOLATILE,
|
||||||
|
KEY_ALL_ACCESS, NULL, &wine_fonts_cache_key, &disposition );
|
||||||
|
|
||||||
|
if (disposition == REG_CREATED_NEW_KEY)
|
||||||
|
{
|
||||||
|
HKEY key = load_external_font_keys();
|
||||||
|
load_system_bitmap_fonts();
|
||||||
|
load_file_system_fonts();
|
||||||
|
load_registry_fonts();
|
||||||
|
font_funcs->load_fonts();
|
||||||
|
update_external_font_keys( key );
|
||||||
|
RegCloseKey( key );
|
||||||
|
}
|
||||||
|
else load_font_list_from_cache();
|
||||||
|
|
||||||
|
ReleaseMutex( mutex );
|
||||||
|
|
||||||
|
reorder_font_list();
|
||||||
|
load_gdi_font_subst();
|
||||||
|
load_gdi_font_replacements();
|
||||||
|
load_system_links();
|
||||||
|
dump_gdi_font_list();
|
||||||
|
dump_gdi_font_subst();
|
||||||
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* AddFontResourceExW (GDI32.@)
|
* AddFontResourceExW (GDI32.@)
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -250,19 +250,6 @@ static inline FT_Face get_ft_face( struct gdi_font *font )
|
||||||
|
|
||||||
static const struct font_backend_funcs font_funcs;
|
static const struct font_backend_funcs font_funcs;
|
||||||
|
|
||||||
static const WCHAR win9x_font_reg_key[] = {'S','o','f','t','w','a','r','e','\\','M','i','c','r','o','s','o','f','t','\\',
|
|
||||||
'W','i','n','d','o','w','s','\\',
|
|
||||||
'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\',
|
|
||||||
'F','o','n','t','s','\0'};
|
|
||||||
|
|
||||||
static const WCHAR winnt_font_reg_key[] = {'S','o','f','t','w','a','r','e','\\','M','i','c','r','o','s','o','f','t','\\',
|
|
||||||
'W','i','n','d','o','w','s',' ','N','T','\\',
|
|
||||||
'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\',
|
|
||||||
'F','o','n','t','s','\0'};
|
|
||||||
|
|
||||||
static const WCHAR external_fonts_reg_key[] = {'S','o','f','t','w','a','r','e','\\','W','i','n','e','\\',
|
|
||||||
'F','o','n','t','s','\\','E','x','t','e','r','n','a','l',' ','F','o','n','t','s','\0'};
|
|
||||||
|
|
||||||
static const WCHAR SymbolW[] = {'S','y','m','b','o','l','\0'};
|
static const WCHAR SymbolW[] = {'S','y','m','b','o','l','\0'};
|
||||||
|
|
||||||
struct font_mapping
|
struct font_mapping
|
||||||
|
@ -1511,177 +1498,6 @@ static void load_mac_fonts(void)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static WCHAR *get_full_path_name(const WCHAR *name)
|
|
||||||
{
|
|
||||||
WCHAR *full_path;
|
|
||||||
DWORD len;
|
|
||||||
|
|
||||||
if (!(len = GetFullPathNameW(name, 0, NULL, NULL)))
|
|
||||||
{
|
|
||||||
ERR("GetFullPathNameW() failed, name %s.\n", debugstr_w(name));
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(full_path = HeapAlloc(GetProcessHeap(), 0, len * sizeof(*full_path))))
|
|
||||||
{
|
|
||||||
ERR("Could not get memory.\n");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (GetFullPathNameW(name, len, full_path, NULL) != len - 1)
|
|
||||||
{
|
|
||||||
ERR("Unexpected GetFullPathNameW() result, name %s.\n", debugstr_w(name));
|
|
||||||
HeapFree(GetProcessHeap(), 0, full_path);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return full_path;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*************************************************************
|
|
||||||
*
|
|
||||||
* This adds registry entries for any externally loaded fonts
|
|
||||||
* (fonts from fontconfig or FontDirs). It also deletes entries
|
|
||||||
* of no longer existing fonts.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
static void update_reg_entries(void)
|
|
||||||
{
|
|
||||||
HKEY winnt_key = 0, win9x_key = 0, external_key = 0;
|
|
||||||
LPWSTR valueW;
|
|
||||||
DWORD len;
|
|
||||||
Family *family;
|
|
||||||
Face *face;
|
|
||||||
WCHAR *file, *path;
|
|
||||||
static const WCHAR TrueType[] = {' ','(','T','r','u','e','T','y','p','e',')','\0'};
|
|
||||||
|
|
||||||
if(RegCreateKeyExW(HKEY_LOCAL_MACHINE, winnt_font_reg_key,
|
|
||||||
0, NULL, 0, KEY_ALL_ACCESS, NULL, &winnt_key, NULL) != ERROR_SUCCESS) {
|
|
||||||
ERR("Can't create Windows font reg key\n");
|
|
||||||
goto end;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(RegCreateKeyExW(HKEY_LOCAL_MACHINE, win9x_font_reg_key,
|
|
||||||
0, NULL, 0, KEY_ALL_ACCESS, NULL, &win9x_key, NULL) != ERROR_SUCCESS) {
|
|
||||||
ERR("Can't create Windows font reg key\n");
|
|
||||||
goto end;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(RegCreateKeyExW(HKEY_CURRENT_USER, external_fonts_reg_key,
|
|
||||||
0, NULL, 0, KEY_ALL_ACCESS, NULL, &external_key, NULL) != ERROR_SUCCESS) {
|
|
||||||
ERR("Can't create external font reg key\n");
|
|
||||||
goto end;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* enumerate the fonts and add external ones to the two keys */
|
|
||||||
|
|
||||||
LIST_FOR_EACH_ENTRY( family, &font_list, Family, entry ) {
|
|
||||||
LIST_FOR_EACH_ENTRY( face, &family->faces, Face, entry ) {
|
|
||||||
if (!(face->flags & ADDFONT_EXTERNAL_FONT)) continue;
|
|
||||||
|
|
||||||
len = strlenW( face->full_name ) + 1;
|
|
||||||
if (face->scalable)
|
|
||||||
len += ARRAY_SIZE(TrueType);
|
|
||||||
|
|
||||||
valueW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
|
|
||||||
strcpyW( valueW, face->full_name );
|
|
||||||
|
|
||||||
if (face->scalable)
|
|
||||||
strcatW(valueW, TrueType);
|
|
||||||
|
|
||||||
if ((path = get_full_path_name(face->file)))
|
|
||||||
{
|
|
||||||
file = path;
|
|
||||||
}
|
|
||||||
else if ((file = strrchrW(face->file, '\\')))
|
|
||||||
{
|
|
||||||
file++;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
file = face->file;
|
|
||||||
}
|
|
||||||
|
|
||||||
len = strlenW(file) + 1;
|
|
||||||
RegSetValueExW(winnt_key, valueW, 0, REG_SZ, (BYTE*)file, len * sizeof(WCHAR));
|
|
||||||
RegSetValueExW(win9x_key, valueW, 0, REG_SZ, (BYTE*)file, len * sizeof(WCHAR));
|
|
||||||
RegSetValueExW(external_key, valueW, 0, REG_SZ, (BYTE*)file, len * sizeof(WCHAR));
|
|
||||||
|
|
||||||
HeapFree(GetProcessHeap(), 0, path);
|
|
||||||
HeapFree(GetProcessHeap(), 0, valueW);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
end:
|
|
||||||
if(external_key) RegCloseKey(external_key);
|
|
||||||
if(win9x_key) RegCloseKey(win9x_key);
|
|
||||||
if(winnt_key) RegCloseKey(winnt_key);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void delete_external_font_keys(void)
|
|
||||||
{
|
|
||||||
HKEY winnt_key = 0, win9x_key = 0, external_key = 0;
|
|
||||||
DWORD dlen, plen, vlen, datalen, valuelen, i, type, path_type;
|
|
||||||
LPWSTR valueW;
|
|
||||||
LPVOID data;
|
|
||||||
BYTE *path;
|
|
||||||
|
|
||||||
if(RegCreateKeyExW(HKEY_LOCAL_MACHINE, winnt_font_reg_key,
|
|
||||||
0, NULL, 0, KEY_ALL_ACCESS, NULL, &winnt_key, NULL) != ERROR_SUCCESS) {
|
|
||||||
ERR("Can't create Windows font reg key\n");
|
|
||||||
goto end;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(RegCreateKeyExW(HKEY_LOCAL_MACHINE, win9x_font_reg_key,
|
|
||||||
0, NULL, 0, KEY_ALL_ACCESS, NULL, &win9x_key, NULL) != ERROR_SUCCESS) {
|
|
||||||
ERR("Can't create Windows font reg key\n");
|
|
||||||
goto end;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(RegCreateKeyW(HKEY_CURRENT_USER, external_fonts_reg_key, &external_key) != ERROR_SUCCESS) {
|
|
||||||
ERR("Can't create external font reg key\n");
|
|
||||||
goto end;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Delete all external fonts added last time */
|
|
||||||
|
|
||||||
RegQueryInfoKeyW(external_key, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
||||||
&valuelen, &datalen, NULL, NULL);
|
|
||||||
valuelen++; /* returned value doesn't include room for '\0' */
|
|
||||||
valueW = HeapAlloc(GetProcessHeap(), 0, valuelen * sizeof(WCHAR));
|
|
||||||
data = HeapAlloc(GetProcessHeap(), 0, datalen);
|
|
||||||
path = HeapAlloc(GetProcessHeap(), 0, datalen);
|
|
||||||
|
|
||||||
dlen = datalen;
|
|
||||||
vlen = valuelen;
|
|
||||||
i = 0;
|
|
||||||
while(RegEnumValueW(external_key, i++, valueW, &vlen, NULL, &type, data,
|
|
||||||
&dlen) == ERROR_SUCCESS) {
|
|
||||||
plen = dlen;
|
|
||||||
if (RegQueryValueExW(winnt_key, valueW, 0, &path_type, path, &plen) == ERROR_SUCCESS &&
|
|
||||||
type == path_type && dlen == plen && !memcmp(data, path, plen))
|
|
||||||
RegDeleteValueW(winnt_key, valueW);
|
|
||||||
|
|
||||||
plen = dlen;
|
|
||||||
if (RegQueryValueExW(win9x_key, valueW, 0, &path_type, path, &plen) == ERROR_SUCCESS &&
|
|
||||||
type == path_type && dlen == plen && !memcmp(data, path, plen))
|
|
||||||
RegDeleteValueW(win9x_key, valueW);
|
|
||||||
|
|
||||||
/* reset dlen and vlen */
|
|
||||||
dlen = datalen;
|
|
||||||
vlen = valuelen;
|
|
||||||
}
|
|
||||||
HeapFree(GetProcessHeap(), 0, path);
|
|
||||||
HeapFree(GetProcessHeap(), 0, data);
|
|
||||||
HeapFree(GetProcessHeap(), 0, valueW);
|
|
||||||
|
|
||||||
/* Delete the old external fonts key */
|
|
||||||
RegCloseKey(external_key);
|
|
||||||
RegDeleteKeyW(HKEY_CURRENT_USER, external_fonts_reg_key);
|
|
||||||
|
|
||||||
end:
|
|
||||||
if(win9x_key) RegCloseKey(win9x_key);
|
|
||||||
if(winnt_key) RegCloseKey(winnt_key);
|
|
||||||
}
|
|
||||||
|
|
||||||
static BOOL init_freetype(void)
|
static BOOL init_freetype(void)
|
||||||
{
|
{
|
||||||
|
@ -1772,11 +1588,6 @@ sym_not_found:
|
||||||
*/
|
*/
|
||||||
static void CDECL freetype_load_fonts(void)
|
static void CDECL freetype_load_fonts(void)
|
||||||
{
|
{
|
||||||
delete_external_font_keys();
|
|
||||||
load_system_bitmap_fonts();
|
|
||||||
load_file_system_fonts();
|
|
||||||
load_registry_fonts();
|
|
||||||
|
|
||||||
#ifdef SONAME_LIBFONTCONFIG
|
#ifdef SONAME_LIBFONTCONFIG
|
||||||
load_fontconfig_fonts();
|
load_fontconfig_fonts();
|
||||||
#elif defined(HAVE_CARBON_CARBON_H)
|
#elif defined(HAVE_CARBON_CARBON_H)
|
||||||
|
@ -1784,8 +1595,6 @@ static void CDECL freetype_load_fonts(void)
|
||||||
#elif defined(__ANDROID__)
|
#elif defined(__ANDROID__)
|
||||||
ReadFontDir("/system/fonts", TRUE);
|
ReadFontDir("/system/fonts", TRUE);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
update_reg_entries();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*************************************************************
|
/*************************************************************
|
||||||
|
|
|
@ -449,10 +449,6 @@ struct font_backend_funcs
|
||||||
void (CDECL *destroy_font)( struct gdi_font *font );
|
void (CDECL *destroy_font)( struct gdi_font *font );
|
||||||
};
|
};
|
||||||
|
|
||||||
extern void load_system_bitmap_fonts(void) DECLSPEC_HIDDEN;
|
|
||||||
extern void load_file_system_fonts(void) DECLSPEC_HIDDEN;
|
|
||||||
extern void load_registry_fonts(void) DECLSPEC_HIDDEN;
|
|
||||||
|
|
||||||
extern const WCHAR *get_gdi_font_subst( const WCHAR *from_name, int from_charset, int *to_charset ) DECLSPEC_HIDDEN;
|
extern const WCHAR *get_gdi_font_subst( const WCHAR *from_name, int from_charset, int *to_charset ) DECLSPEC_HIDDEN;
|
||||||
|
|
||||||
extern struct list font_list DECLSPEC_HIDDEN;
|
extern struct list font_list DECLSPEC_HIDDEN;
|
||||||
|
|
Loading…
Reference in New Issue