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

Alexandre Julliard julliard at winehq.org
Mon Mar 10 07:16:49 CDT 2008


Module: wine
Branch: master
Commit: 025d84e644cffbb1b38e67cd11cbb2cedae88e88
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=025d84e644cffbb1b38e67cd11cbb2cedae88e88

Author: Huw Davies <huw at codeweavers.com>
Date:   Fri Mar  7 17:02:32 2008 +0000

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

---

 dlls/gdi32/freetype.c |  115 ++++++++++++++++++++++++++++++------------------
 1 files changed, 72 insertions(+), 43 deletions(-)

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




More information about the wine-cvs mailing list