|
5 | 5 | * PURPOSE: input.dll
|
6 | 6 | * PROGRAMMER: Dmitry Chapyshev ([email protected])
|
7 | 7 | * Colin Finck
|
| 8 | + * Gregor Schneider |
8 | 9 | * UPDATE HISTORY:
|
9 | 10 | * 06-09-2007 Created
|
10 | 11 | */
|
@@ -376,6 +377,59 @@ UpdateLayoutsList(VOID)
|
376 | 377 | (VOID) ListView_SetImageList(GetDlgItem(MainDlgWnd, IDC_KEYLAYOUT_LIST), hImgList, LVSIL_SMALL);
|
377 | 378 | }
|
378 | 379 |
|
| 380 | +typedef struct _REG_KB_ENTRY_ |
| 381 | +{ |
| 382 | + TCHAR szLayoutID[3]; |
| 383 | + DWORD dwType; |
| 384 | + TCHAR szData[CCH_LAYOUT_ID + 1]; |
| 385 | + DWORD dwDataSize; |
| 386 | +} REG_KB_ENTRY; |
| 387 | + |
| 388 | +/* Layouts were deleted so we have to order the existing ones */ |
| 389 | +static VOID |
| 390 | +UpdateRegValueNames(HKEY hKey) |
| 391 | +{ |
| 392 | + DWORD dwIndex = 0, dwGot = 0, dwLayoutSize; |
| 393 | + DWORD dwSets = 5; |
| 394 | + REG_KB_ENTRY* data = HeapAlloc(GetProcessHeap(), 0, dwSets * sizeof(REG_KB_ENTRY)); |
| 395 | + |
| 396 | + /* Get all existing entries and delete them */ |
| 397 | + dwLayoutSize = sizeof(data[0].szLayoutID); |
| 398 | + while (RegEnumValue(hKey, |
| 399 | + dwIndex, |
| 400 | + data[dwGot].szLayoutID, |
| 401 | + &dwLayoutSize, |
| 402 | + NULL, |
| 403 | + &data[dwGot].dwType, |
| 404 | + (PBYTE)data[dwGot].szData, |
| 405 | + &data[dwGot].dwDataSize) != ERROR_NO_MORE_ITEMS) |
| 406 | + { |
| 407 | + if (_tcslen(data[dwGot].szLayoutID) <= 2 && _tcslen(data[dwGot].szData) == CCH_LAYOUT_ID) |
| 408 | + { |
| 409 | + RegDeleteValue(hKey, data[dwGot].szLayoutID); |
| 410 | + dwGot++; |
| 411 | + if (dwGot == dwSets) |
| 412 | + { |
| 413 | + dwSets += 5; |
| 414 | + data = HeapReAlloc(GetProcessHeap(), 0, data, dwSets * sizeof(REG_KB_ENTRY)); |
| 415 | + } |
| 416 | + } |
| 417 | + dwIndex++; |
| 418 | + dwLayoutSize = sizeof(data[0].szLayoutID); |
| 419 | + } |
| 420 | + |
| 421 | + /* Set all entries with an updated value name */ |
| 422 | + for (dwIndex = 0; dwIndex < dwGot; dwIndex++) |
| 423 | + { |
| 424 | + TCHAR szNewLayoutID[3]; |
| 425 | + |
| 426 | + _stprintf(szNewLayoutID, TEXT("%u"), dwIndex + 1); |
| 427 | + RegSetValueEx(hKey, szNewLayoutID, 0, data[dwIndex].dwType, |
| 428 | + (PBYTE)data[dwIndex].szData, data[dwIndex].dwDataSize); |
| 429 | + } |
| 430 | + HeapFree(GetProcessHeap(), 0, data); |
| 431 | +} |
| 432 | + |
379 | 433 | static VOID
|
380 | 434 | DeleteLayout(VOID)
|
381 | 435 | {
|
@@ -430,6 +484,7 @@ DeleteLayout(VOID)
|
430 | 484 | if (RegDeleteValue(hKey, szLayoutNum) == ERROR_SUCCESS)
|
431 | 485 | {
|
432 | 486 | UpdateLayoutsList();
|
| 487 | + UpdateRegValueNames(hKey); |
433 | 488 | }
|
434 | 489 | }
|
435 | 490 | RegCloseKey(hKey);
|
|
0 commit comments