Aric Stewart : gdi32: Keep our internal generated system links separate and append them to any user defined system links .
Alexandre Julliard
julliard at winehq.org
Tue Feb 7 15:53:57 CST 2012
Module: wine
Branch: master
Commit: e7a79b5565803f4d38d5c54276579ea589e50246
URL: http://source.winehq.org/git/wine.git/?a=commit;h=e7a79b5565803f4d38d5c54276579ea589e50246
Author: Aric Stewart <aric at codeweavers.com>
Date: Tue Feb 7 07:18:34 2012 -0600
gdi32: Keep our internal generated system links separate and append them to any user defined system links.
---
dlls/gdi32/freetype.c | 102 ++++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 97 insertions(+), 5 deletions(-)
diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c
index afbc971..ce9556d 100644
--- a/dlls/gdi32/freetype.c
+++ b/dlls/gdi32/freetype.c
@@ -532,6 +532,10 @@ static const WCHAR system_link[] = {'S','o','f','t','w','a','r','e','\\','M','i'
'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\','F','o','n','t','L','i','n','k','\\',
'S','y','s','t','e','m','L','i','n','k',0};
+static const WCHAR internal_system_link[] = {'S','o','f','t','w','a','r','e','\\','W','i','n','e','\\',
+ 'F','o','n','t','L','i','n','k','\\',
+ 'S','y','s','t','e','m','L','i','n','k',0};
+
/****************************************
* Notes on .fon files
*
@@ -2007,6 +2011,97 @@ static BOOL init_system_links(void)
RegCloseKey(hkey);
}
+ if(RegOpenKeyW(HKEY_CURRENT_USER, internal_system_link, &hkey) == ERROR_SUCCESS)
+ {
+ RegQueryInfoKeyW(hkey, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &max_val, &max_data, NULL, NULL);
+ value = HeapAlloc(GetProcessHeap(), 0, (max_val + 1) * sizeof(WCHAR));
+ data = HeapAlloc(GetProcessHeap(), 0, max_data);
+ val_len = max_val + 1;
+ data_len = max_data;
+ index = 0;
+ while(RegEnumValueW(hkey, index++, value, &val_len, NULL, &type, (LPBYTE)data, &data_len) == ERROR_SUCCESS)
+ {
+ BOOL existing = FALSE;
+ memset(&fs, 0, sizeof(fs));
+ psub = get_font_subst(&font_subst_list, value, -1);
+ /* Don't store fonts that are only substitutes for other fonts */
+ if(psub)
+ {
+ TRACE("%s: Internal SystemLink entry for substituted font, ignoring\n", debugstr_w(value));
+ goto next_internal;
+ }
+
+ LIST_FOR_EACH_ENTRY(font_link, &system_links, SYSTEM_LINKS, entry)
+ {
+ if(!strcmpiW(font_link->font_name, value))
+ {
+ existing = TRUE;
+ break;
+ }
+ }
+
+ if (!existing)
+ {
+ font_link = HeapAlloc(GetProcessHeap(), 0, sizeof(*font_link));
+ font_link->font_name = strdupW(value);
+ list_init(&font_link->links);
+ }
+
+ for(entry = data; (char*)entry < (char*)data + data_len && *entry != 0; entry = next)
+ {
+ WCHAR *face_name;
+ CHILD_FONT *child_font;
+
+ TRACE("Internal entry %s: %s\n", debugstr_w(value), debugstr_w(entry));
+
+ next = entry + strlenW(entry) + 1;
+
+ face_name = strchrW(entry, ',');
+ if(face_name)
+ {
+ *face_name++ = 0;
+ while(isspaceW(*face_name))
+ face_name++;
+
+ psub = get_font_subst(&font_subst_list, face_name, -1);
+ if(psub)
+ face_name = psub->to.name;
+ }
+ face = find_face_from_filename(entry, face_name);
+ if(!face)
+ {
+ TRACE("Unable to find file %s face name %s\n", debugstr_w(entry), debugstr_w(face_name));
+ continue;
+ }
+
+ child_font = HeapAlloc(GetProcessHeap(), 0, sizeof(*child_font));
+ child_font->face = face;
+ child_font->font = NULL;
+ fs.fsCsb[0] |= face->fs.fsCsb[0];
+ fs.fsCsb[1] |= face->fs.fsCsb[1];
+ TRACE("Adding file %s index %ld\n", child_font->face->file, child_font->face->face_index);
+ list_add_tail(&font_link->links, &child_font->entry);
+ }
+ family = find_family_from_name(font_link->font_name);
+ if(family)
+ {
+ LIST_FOR_EACH_ENTRY(face, &family->faces, Face, entry)
+ {
+ face->fs_links = fs;
+ }
+ }
+ if (!existing)
+ list_add_tail(&system_links, &font_link->entry);
+ next_internal:
+ val_len = max_val + 1;
+ data_len = max_data;
+ }
+
+ HeapFree(GetProcessHeap(), 0, value);
+ HeapFree(GetProcessHeap(), 0, data);
+ RegCloseKey(hkey);
+ }
+
/* Explicitly add an entry for the system font, this links to Tahoma and any links
that Tahoma has */
@@ -2798,9 +2893,6 @@ static void update_font_info(void)
}
if (!done)
FIXME("there is no font defaults for codepages %u,%u\n", ansi_cp, oem_cp);
-
- /* Clear out system links */
- RegDeleteKeyW(HKEY_LOCAL_MACHINE, system_link);
}
static void populate_system_links(HKEY hkey, const WCHAR *name, const WCHAR *const *values)
@@ -2885,7 +2977,7 @@ static void update_system_links(void)
static const WCHAR MS_Shell_Dlg[] = {'M','S',' ','S','h','e','l','l',' ','D','l','g',0};
- if (!RegCreateKeyExW(HKEY_LOCAL_MACHINE, system_link, 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hkey, &disposition))
+ if (!RegCreateKeyExW(HKEY_CURRENT_USER, internal_system_link, 0, NULL, REG_OPTION_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, &disposition))
{
if (disposition == REG_OPENED_EXISTING_KEY)
{
@@ -2924,7 +3016,7 @@ static void update_system_links(void)
if (!done)
WARN("there is no SystemLink default list for MS Shell Dlg %s\n", debugstr_w(psub->to.name));
} else
- WARN("failed to create SystemLink key\n");
+ WARN("failed to create Internal SystemLink key\n");
}
More information about the wine-cvs
mailing list