* Sync to recent trunk (r52563).
[reactos.git] / dll / cpl / input / settings.c
index 58642f5..5f1ca81 100644 (file)
@@ -5,6 +5,7 @@
  * PURPOSE:         input.dll
  * PROGRAMMER:      Dmitry Chapyshev (dmitry@reactos.org)
  *                  Colin Finck
+ *                  Gregor Schneider
  * UPDATE HISTORY:
  *      06-09-2007  Created
  */
@@ -13,7 +14,6 @@
 #include "input.h"
 
 static HWND MainDlgWnd;
-static HIMAGELIST hImgList;
 // for SaveInputLang()
 static INT OldLayoutNum;
 
@@ -298,7 +298,7 @@ AddListColumn(HWND hWnd)
 }
 
 static VOID
-InitLangList(HWND hWnd)
+InitLangList(HWND hWnd, HIMAGELIST hImgList)
 {
     HKEY hKey, hSubKey;
     TCHAR szBuf[MAX_PATH], szPreload[CCH_LAYOUT_ID + 1], szSub[CCH_LAYOUT_ID + 1];
@@ -369,11 +369,72 @@ InitLangList(HWND hWnd)
 VOID
 UpdateLayoutsList(VOID)
 {
-    (VOID) ImageList_Destroy(hImgList);
+    HIMAGELIST hImgList;
+
+    /* Clear the list */
     (VOID) ListView_DeleteAllItems(GetDlgItem(MainDlgWnd, IDC_KEYLAYOUT_LIST));
+
+    /* Crate new list */
     hImgList = ImageList_Create(16, 16, ILC_COLOR8 | ILC_MASK, 0, 1);
-    InitLangList(MainDlgWnd);
-    (VOID) ListView_SetImageList(GetDlgItem(MainDlgWnd, IDC_KEYLAYOUT_LIST), hImgList, LVSIL_SMALL);
+    InitLangList(MainDlgWnd, hImgList);
+    hImgList = ListView_SetImageList(GetDlgItem(MainDlgWnd, IDC_KEYLAYOUT_LIST), hImgList, LVSIL_SMALL);
+
+    /* Destroy old image list */
+    if(hImgList)
+        (VOID) ImageList_Destroy(hImgList);
+}
+
+typedef struct _REG_KB_ENTRY_
+{
+    TCHAR szLayoutID[3];
+    DWORD dwType;
+    TCHAR szData[CCH_LAYOUT_ID + 1];
+    DWORD dwDataSize;
+} REG_KB_ENTRY;
+
+/* Layouts were deleted so we have to order the existing ones */
+static VOID
+UpdateRegValueNames(HKEY hKey)
+{
+    DWORD dwIndex = 0, dwGot = 0, dwLayoutSize;
+    DWORD dwSets = 5;
+    REG_KB_ENTRY* data = HeapAlloc(GetProcessHeap(), 0, dwSets * sizeof(REG_KB_ENTRY));
+
+    /* Get all existing entries and delete them */
+    dwLayoutSize = sizeof(data[0].szLayoutID);
+    while (RegEnumValue(hKey,
+                        dwIndex,
+                        data[dwGot].szLayoutID, 
+                        &dwLayoutSize,
+                        NULL, 
+                        &data[dwGot].dwType,
+                        (PBYTE)data[dwGot].szData, 
+                        &data[dwGot].dwDataSize) != ERROR_NO_MORE_ITEMS)
+    {
+        if (_tcslen(data[dwGot].szLayoutID) <= 2 && _tcslen(data[dwGot].szData) == CCH_LAYOUT_ID)
+        {
+            RegDeleteValue(hKey, data[dwGot].szLayoutID);
+            dwGot++;
+            if (dwGot == dwSets)
+            {
+                dwSets += 5;
+                data = HeapReAlloc(GetProcessHeap(), 0, data, dwSets * sizeof(REG_KB_ENTRY));
+            }
+        }
+        dwIndex++;
+        dwLayoutSize = sizeof(data[0].szLayoutID);
+    }
+
+    /* Set all entries with an updated value name */
+    for (dwIndex = 0; dwIndex < dwGot; dwIndex++)
+    {
+        TCHAR szNewLayoutID[3];
+
+        _stprintf(szNewLayoutID, TEXT("%u"), dwIndex + 1);
+        RegSetValueEx(hKey, szNewLayoutID, 0, data[dwIndex].dwType, 
+                      (PBYTE)data[dwIndex].szData, data[dwIndex].dwDataSize);
+    }
+    HeapFree(GetProcessHeap(), 0, data);
 }
 
 static VOID
@@ -430,6 +491,7 @@ DeleteLayout(VOID)
                 if (RegDeleteValue(hKey, szLayoutNum) == ERROR_SUCCESS)
                 {
                     UpdateLayoutsList();
+                    UpdateRegValueNames(hKey);
                 }
             }
             RegCloseKey(hKey);
@@ -673,12 +735,14 @@ SettingPageProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam)
     {
         case WM_INITDIALOG:
         {
+               HIMAGELIST hImgList;
+
             MainDlgWnd = hwndDlg;
             AddListColumn(hwndDlg);
             (VOID) ListView_SetExtendedListViewStyle(GetDlgItem(MainDlgWnd, IDC_KEYLAYOUT_LIST),
                                                      LVS_EX_FULLROWSELECT);
             hImgList = ImageList_Create(16, 16, ILC_COLOR8 | ILC_MASK, 0, 1);
-            InitLangList(hwndDlg);
+            InitLangList(hwndDlg, hImgList);
             (VOID) ListView_SetImageList(GetDlgItem(MainDlgWnd, IDC_KEYLAYOUT_LIST), hImgList, LVSIL_SMALL);
         }
             break;
@@ -726,7 +790,6 @@ SettingPageProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam)
             }
             break;
         case WM_DESTROY:
-            (VOID) ImageList_Destroy(hImgList);
             break;
     }