Hugh McMaster : regedit: Re-implement favourite registry key handling.

Alexandre Julliard julliard at winehq.org
Mon Jun 5 16:56:29 CDT 2017


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

Author: Hugh McMaster <hugh.mcmaster at outlook.com>
Date:   Mon Jun  5 00:57:53 2017 +0000

regedit: Re-implement favourite registry key handling.

Signed-off-by: Hugh McMaster <hugh.mcmaster at outlook.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 programs/regedit/framewnd.c | 77 +++++++++++++++++++++++++++------------------
 programs/regedit/regproc.c  | 13 --------
 programs/regedit/regproc.h  |  9 ++++++
 3 files changed, 56 insertions(+), 43 deletions(-)

diff --git a/programs/regedit/framewnd.c b/programs/regedit/framewnd.c
index cd7dad0..e654d48 100644
--- a/programs/regedit/framewnd.c
+++ b/programs/regedit/framewnd.c
@@ -198,38 +198,55 @@ static void UpdateMenuItems(HMENU hMenu) {
     HeapFree(GetProcessHeap(), 0, keyName);
 }
 
-static void OnInitMenuPopup(HWND hWnd, HMENU hMenu, short wItem)
+static void add_favourite_key_menu_items(HMENU hMenu)
 {
-    if (wItem == 3) {
-        HKEY hKey;
-        while(GetMenuItemCount(hMenu)>2)
+    HKEY hkey;
+    LONG rc;
+    DWORD num_values, max_value_len, value_len, type, i;
+    WCHAR *value_name;
+
+    rc = RegOpenKeyExW(HKEY_CURRENT_USER, favoritesKey, 0, KEY_READ, &hkey);
+    if (rc != ERROR_SUCCESS) return;
+
+    rc = RegQueryInfoKeyW(hkey, NULL, NULL, NULL, NULL, NULL, NULL, &num_values,
+                          &max_value_len, NULL, NULL, NULL);
+    if (rc != ERROR_SUCCESS)
+    {
+        ERR("RegQueryInfoKey failed: %d\n", rc);
+        goto exit;
+    }
+
+    if (!num_values) goto exit;
+
+    max_value_len++;
+    value_name = HeapAlloc(GetProcessHeap(), 0, max_value_len * sizeof(WCHAR));
+    CHECK_ENOUGH_MEMORY(value_name);
+
+    AppendMenuW(hMenu, MF_SEPARATOR, 0, 0);
+
+    for (i = 0; i < num_values; i++)
+    {
+        value_len = max_value_len;
+        rc = RegEnumValueW(hkey, i, value_name, &value_len, NULL, &type, NULL, NULL);
+        if (rc == ERROR_SUCCESS && type == REG_SZ)
+            AppendMenuW(hMenu, MF_ENABLED | MF_STRING, ID_FAVORITE_FIRST + i, value_name);
+    }
+
+    HeapFree(GetProcessHeap(), 0, value_name);
+exit:
+    RegCloseKey(hkey);
+}
+
+static void OnInitMenuPopup(HWND hWnd, HMENU hMenu)
+{
+    if (hMenu == GetSubMenu(hMenuFrame, ID_FAVORITES_MENU))
+    {
+        while (GetMenuItemCount(hMenu) > 2)
             DeleteMenu(hMenu, 2, MF_BYPOSITION);
-        if (RegOpenKeyExW(HKEY_CURRENT_USER, favoritesKey,
-            0, KEY_READ, &hKey) == ERROR_SUCCESS) {
-            WCHAR namebuf[KEY_MAX_LEN];
-            BYTE valuebuf[4096];
-            int i = 0;
-            BOOL sep = FALSE;
-            DWORD ksize, vsize, type;
-            LONG error;
-            do {
-                ksize = KEY_MAX_LEN;
-                vsize = sizeof(valuebuf);
-                error = RegEnumValueW(hKey, i, namebuf, &ksize, NULL, &type, valuebuf, &vsize);
-                if (error != ERROR_SUCCESS)
-                    break;
-                if (type == REG_SZ) {
-                    if (!sep) {
-                        AppendMenuW(hMenu, MF_SEPARATOR, -1, NULL);
-                        sep = TRUE;
-                    }
-                    AppendMenuW(hMenu, MF_STRING, ID_FAVORITE_FIRST+i, namebuf);
-                }
-                i++;
-            } while(error == ERROR_SUCCESS);
-            RegCloseKey(hKey);
-        }
+
+        add_favourite_key_menu_items(hMenu);
     }
+
     UpdateMenuItems(hMenu);
 }
 
@@ -1056,7 +1073,7 @@ LRESULT CALLBACK FrameWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPa
         break;
     case WM_INITMENUPOPUP:
         if (!HIWORD(lParam))
-            OnInitMenuPopup(hWnd, (HMENU)wParam, LOWORD(lParam));
+            OnInitMenuPopup(hWnd, (HMENU)wParam);
         break;
     case WM_MENUSELECT:
         OnMenuSelect(hWnd, LOWORD(wParam), HIWORD(wParam), (HMENU)lParam);
diff --git a/programs/regedit/regproc.c b/programs/regedit/regproc.c
index 10b4a38..d5be72f 100644
--- a/programs/regedit/regproc.c
+++ b/programs/regedit/regproc.c
@@ -50,19 +50,6 @@ static HKEY reg_class_keys[] = {
 
 #define ARRAY_SIZE(A) (sizeof(A)/sizeof(*A))
 
-/* return values */
-#define NOT_ENOUGH_MEMORY     1
-
-/* processing macros */
-
-/* common check of memory allocation results */
-#define CHECK_ENOUGH_MEMORY(p) \
-if (!(p)) \
-{ \
-    output_message(STRING_OUT_OF_MEMORY, __FILE__, __LINE__); \
-    exit(NOT_ENOUGH_MEMORY); \
-}
-
 /******************************************************************************
  * Allocates memory and converts input from multibyte to wide chars
  * Returned string must be freed by the caller
diff --git a/programs/regedit/regproc.h b/programs/regedit/regproc.h
index aff4bee..72e6b38 100644
--- a/programs/regedit/regproc.h
+++ b/programs/regedit/regproc.h
@@ -24,6 +24,15 @@
 #define REG_FORMAT_5 1
 #define REG_FORMAT_4 2
 
+#define NOT_ENOUGH_MEMORY          1
+
+#define CHECK_ENOUGH_MEMORY(p) \
+if (!(p)) \
+{ \
+    output_message(STRING_OUT_OF_MEMORY, __FILE__, __LINE__); \
+    exit(NOT_ENOUGH_MEMORY); \
+}
+
 void __cdecl output_message(unsigned int id, ...);
 
 BOOL export_registry_key(WCHAR *file_name, WCHAR *reg_key_name, DWORD format);




More information about the wine-cvs mailing list