* PURPOSE: input.dll
* PROGRAMMER: Dmitry Chapyshev (dmitry@reactos.org)
* Colin Finck
+ * Gregor Schneider
* UPDATE HISTORY:
* 06-09-2007 Created
*/
#include "input.h"
static HWND MainDlgWnd;
-static HIMAGELIST hImgList;
// for SaveInputLang()
static INT OldLayoutNum;
}
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];
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
if (RegDeleteValue(hKey, szLayoutNum) == ERROR_SUCCESS)
{
UpdateLayoutsList();
+ UpdateRegValueNames(hKey);
}
}
RegCloseKey(hKey);
{
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;
}
break;
case WM_DESTROY:
- (VOID) ImageList_Destroy(hImgList);
break;
}