X-Git-Url: https://git.reactos.org/?p=reactos.git;a=blobdiff_plain;f=dll%2Fcpl%2Finput%2Fsettings.c;h=849d70cd62a96e5378d0b9b584a631ce06d1da7b;hp=4d8043dd59b60c6ec5d810ce5266c6b2f99108be;hb=b1d8a4df819c95bcb81cd8d6e8d9a397125147a9;hpb=79e9ba171b07100f209c1abca802d015cef7b522 diff --git a/dll/cpl/input/settings.c b/dll/cpl/input/settings.c index 4d8043dd59b..849d70cd62a 100644 --- a/dll/cpl/input/settings.c +++ b/dll/cpl/input/settings.c @@ -5,15 +5,14 @@ * PURPOSE: input.dll * PROGRAMMER: Dmitry Chapyshev (dmitry@reactos.org) * Colin Finck + * Gregor Schneider * UPDATE HISTORY: * 06-09-2007 Created */ -#include "resource.h" #include "input.h" static HWND MainDlgWnd; -static HIMAGELIST hImgList; // for SaveInputLang() static INT OldLayoutNum; @@ -64,7 +63,10 @@ IsLayoutExists(LPTSTR szLayoutID, LPTSTR szLangID) GetLocaleInfo(langid, LOCALE_ILANGUAGE, szTmp, sizeof(szTmp) / sizeof(TCHAR)); wsprintf(szOldLangID, _T("0000%s"), szTmp); - if (_tcscmp(szOldLangID, szLangID) == 0) IsLangExists = TRUE; + if (_tcscmp(szOldLangID, szLangID) == 0) + IsLangExists = TRUE; + else + IsLangExists = FALSE; if (szPreload[0] == 'd') { @@ -84,7 +86,7 @@ IsLayoutExists(LPTSTR szLayoutID, LPTSTR szLangID) } else { - if (_tcscmp(szPreload, szLayoutID) == 0) + if ((_tcscmp(szPreload, szLayoutID) == 0) && (IsLangExists)) { RegCloseKey(hKey); return TRUE; @@ -214,7 +216,7 @@ GetLayoutName(LPCTSTR szLCID, LPTSTR szName) DWORD dwBufLen; TCHAR szBuf[MAX_PATH], szDispName[MAX_PATH], szIndex[MAX_PATH], szPath[MAX_PATH]; HANDLE hLib; - int i, j, k; + unsigned i, j, k; wsprintf(szBuf, _T("SYSTEM\\CurrentControlSet\\Control\\Keyboard Layouts\\%s"), szLCID); @@ -295,7 +297,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]; @@ -366,11 +368,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 @@ -427,6 +490,7 @@ DeleteLayout(VOID) if (RegDeleteValue(hKey, szLayoutNum) == ERROR_SUCCESS) { UpdateLayoutsList(); + UpdateRegValueNames(hKey); } } RegCloseKey(hKey); @@ -670,12 +734,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; @@ -723,7 +789,6 @@ SettingPageProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam) } break; case WM_DESTROY: - (VOID) ImageList_Destroy(hImgList); break; }