gdi32: Update both winnt and win9x font keys and factor out the cleanup code.

This commit is contained in:
Huw Davies 2008-03-07 17:02:32 +00:00 committed by Alexandre Julliard
parent af7172c186
commit 025d84e644
1 changed files with 72 additions and 43 deletions

View File

@ -1760,10 +1760,9 @@ static void load_system_fonts(void)
*/ */
static void update_reg_entries(void) static void update_reg_entries(void)
{ {
HKEY winkey = 0, externalkey = 0; HKEY winnt_key = 0, win9x_key = 0, external_key = 0;
LPWSTR valueW; LPWSTR valueW;
LPVOID data; DWORD len, len_fam;
DWORD dlen, vlen, datalen, valuelen, i, type, len, len_fam;
Family *family; Family *family;
Face *face; Face *face;
struct list *family_elem_ptr, *face_elem_ptr; struct list *family_elem_ptr, *face_elem_ptr;
@ -1772,47 +1771,20 @@ static void update_reg_entries(void)
static const WCHAR spaceW[] = {' ', '\0'}; static const WCHAR spaceW[] = {' ', '\0'};
char *path; char *path;
if(RegCreateKeyExW(HKEY_LOCAL_MACHINE, is_win9x() ? win9x_font_reg_key : winnt_font_reg_key, if(RegCreateKeyExW(HKEY_LOCAL_MACHINE, winnt_font_reg_key,
0, NULL, 0, KEY_ALL_ACCESS, NULL, &winkey, NULL) != ERROR_SUCCESS) { 0, NULL, 0, KEY_ALL_ACCESS, NULL, &winnt_key, NULL) != ERROR_SUCCESS) {
ERR("Can't create Windows font reg key\n"); ERR("Can't create Windows font reg key\n");
goto end; goto end;
} }
/* @@ Wine registry key: HKCU\Software\Wine\Fonts\ExternalFonts */
if(RegCreateKeyW(HKEY_CURRENT_USER, external_fonts_reg_key, &externalkey) != ERROR_SUCCESS) { if(RegCreateKeyExW(HKEY_LOCAL_MACHINE, win9x_font_reg_key,
ERR("Can't create external font reg key\n"); 0, NULL, 0, KEY_ALL_ACCESS, NULL, &win9x_key, NULL) != ERROR_SUCCESS) {
ERR("Can't create Windows font reg key\n");
goto end; goto end;
} }
/* Delete all external fonts added last time */
RegQueryInfoKeyW(externalkey, 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 * sizeof(WCHAR));
dlen = datalen * sizeof(WCHAR);
vlen = valuelen;
i = 0;
while(RegEnumValueW(externalkey, i++, valueW, &vlen, NULL, &type, data,
&dlen) == ERROR_SUCCESS) {
RegDeleteValueW(winkey, valueW);
/* reset dlen and vlen */
dlen = datalen;
vlen = valuelen;
}
HeapFree(GetProcessHeap(), 0, data);
HeapFree(GetProcessHeap(), 0, valueW);
/* Delete the old external fonts key */
RegCloseKey(externalkey);
externalkey = 0;
RegDeleteKeyW(HKEY_CURRENT_USER, external_fonts_reg_key);
/* @@ Wine registry key: HKCU\Software\Wine\Fonts\ExternalFonts */
if(RegCreateKeyExW(HKEY_CURRENT_USER, external_fonts_reg_key, if(RegCreateKeyExW(HKEY_CURRENT_USER, external_fonts_reg_key,
0, NULL, 0, KEY_ALL_ACCESS, NULL, &externalkey, NULL) != ERROR_SUCCESS) { 0, NULL, 0, KEY_ALL_ACCESS, NULL, &external_key, NULL) != ERROR_SUCCESS) {
ERR("Can't create external font reg key\n"); ERR("Can't create external font reg key\n");
goto end; goto end;
} }
@ -1843,21 +1815,76 @@ static void update_reg_entries(void)
file = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR)); file = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
MultiByteToWideChar(CP_ACP, 0, path, -1, file, len); MultiByteToWideChar(CP_ACP, 0, path, -1, file, len);
RegSetValueExW(winkey, valueW, 0, REG_SZ, (BYTE*)file, len * sizeof(WCHAR)); RegSetValueExW(winnt_key, valueW, 0, REG_SZ, (BYTE*)file, len * sizeof(WCHAR));
RegSetValueExW(externalkey, 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, file); HeapFree(GetProcessHeap(), 0, file);
HeapFree(GetProcessHeap(), 0, valueW); HeapFree(GetProcessHeap(), 0, valueW);
} }
} }
end: end:
if(externalkey) if(external_key) RegCloseKey(external_key);
RegCloseKey(externalkey); if(win9x_key) RegCloseKey(win9x_key);
if(winkey) if(winnt_key) RegCloseKey(winnt_key);
RegCloseKey(winkey);
return; return;
} }
static void delete_external_font_keys(void)
{
HKEY winnt_key = 0, win9x_key = 0, external_key = 0;
DWORD dlen, vlen, datalen, valuelen, i, type;
LPWSTR valueW;
LPVOID data;
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 * sizeof(WCHAR));
dlen = datalen * sizeof(WCHAR);
vlen = valuelen;
i = 0;
while(RegEnumValueW(external_key, i++, valueW, &vlen, NULL, &type, data,
&dlen) == ERROR_SUCCESS) {
RegDeleteValueW(winnt_key, valueW);
RegDeleteValueW(win9x_key, valueW);
/* reset dlen and vlen */
dlen = datalen;
vlen = valuelen;
}
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);
}
/************************************************************* /*************************************************************
* WineEngAddFontResourceEx * WineEngAddFontResourceEx
@ -2229,6 +2256,8 @@ BOOL WineEngInit(void)
} }
WaitForSingleObject(font_mutex, INFINITE); WaitForSingleObject(font_mutex, INFINITE);
delete_external_font_keys();
/* load the system bitmap fonts */ /* load the system bitmap fonts */
load_system_fonts(); load_system_fonts();