Rebase against 2deb8c2825afcb88a9f106b73aa1f4da9253fb87.

This commit is contained in:
Zebediah Figura
2021-04-30 17:50:37 -05:00
parent 4d8896cc35
commit 7d496bf02c
10 changed files with 134 additions and 132 deletions

View File

@@ -1,64 +1,76 @@
From dd0c922c02e793aba906cfad855c2474a3c2fe3b Mon Sep 17 00:00:00 2001
From 0572bef41d224ebb69c6c3fd647bddf844a3a29d Mon Sep 17 00:00:00 2001
From: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
Date: Tue, 9 Jul 2019 14:13:28 +1000
Subject: [PATCH] user32: Improve GetKeyboardLayoutList
Subject: [PATCH] user32: Do not enumerate the registry in
GetKeyboardLayoutList().
This function returns the current list of *installed* Keyboard layouts
not the complete list from the registry.
---
dlls/user32/driver.c | 26 --------------------------
dlls/user32/input.c | 32 +++-----------------------------
dlls/user32/tests/input.c | 35 +++++++++++++++++++++++++++++++++++
2 files changed, 35 insertions(+), 26 deletions(-)
2 files changed, 38 insertions(+), 29 deletions(-)
diff --git a/dlls/user32/driver.c b/dlls/user32/driver.c
index 7ac77141696..56009667b00 100644
--- a/dlls/user32/driver.c
+++ b/dlls/user32/driver.c
@@ -198,8 +198,6 @@ static void CDECL nulldrv_Beep(void)
static UINT CDECL nulldrv_GetKeyboardLayoutList( INT size, HKL *layouts )
diff --git a/dlls/user32/input.c b/dlls/user32/input.c
index 97be83369d9..42145c13105 100644
--- a/dlls/user32/input.c
+++ b/dlls/user32/input.c
@@ -1336,9 +1336,7 @@ BOOL WINAPI BlockInput(BOOL fBlockIt)
*/
UINT WINAPI GetKeyboardLayoutList( INT size, HKL *layouts )
{
- HKEY hKeyKeyboard;
- DWORD rc;
INT count = 0;
ULONG_PTR baselayout;
LANGID langid;
@@ -211,30 +209,6 @@ static UINT CDECL nulldrv_GetKeyboardLayoutList( INT size, HKL *layouts )
else
baselayout |= baselayout << 16;
- WCHAR klid[KL_NAMELENGTH], value[5];
- DWORD value_size, count, tmp, i = 0;
- HKEY hkey;
+ DWORD count;
HKL layout;
- /* Enumerate the Registry */
- rc = RegOpenKeyW(HKEY_LOCAL_MACHINE,L"System\\CurrentControlSet\\Control\\Keyboard Layouts",&hKeyKeyboard);
- if (rc == ERROR_SUCCESS)
TRACE_(keyboard)( "size %d, layouts %p.\n", size, layouts );
@@ -1346,37 +1344,13 @@ UINT WINAPI GetKeyboardLayoutList( INT size, HKL *layouts )
if ((count = USER_Driver->pGetKeyboardLayoutList( size, layouts )) != ~0) return count;
layout = get_locale_kbd_layout();
- count = 0;
- count++;
if (size && layouts)
{
- layouts[count - 1] = layout;
- if (count == size) return count;
+ layouts[0] = layout;
}
- if (!RegOpenKeyW( HKEY_LOCAL_MACHINE, L"System\\CurrentControlSet\\Control\\Keyboard Layouts", &hkey ))
- {
- do {
- WCHAR szKeyName[9];
- HKL layout;
- rc = RegEnumKeyW(hKeyKeyboard, count, szKeyName, 9);
- if (rc == ERROR_SUCCESS)
- while (!RegEnumKeyW( hkey, i++, klid, ARRAY_SIZE(klid) ))
- {
- tmp = wcstoul( klid, NULL, 16 );
- value_size = sizeof(value);
- if (!RegGetValueW( hkey, klid, L"Layout Id", RRF_RT_REG_SZ, NULL, (void *)&value, &value_size ))
- tmp = MAKELONG( LOWORD( tmp ), 0xf000 | (wcstoul( value, NULL, 16 ) & 0xfff) );
-
- if (layout == UlongToHandle( tmp )) continue;
-
- count++;
- if (size && layouts)
- {
- layout = (HKL)(ULONG_PTR)wcstoul(szKeyName,NULL,16);
- if (baselayout != 0 && layout == (HKL)baselayout)
- baselayout = 0; /* found in the registry do not add again */
- if (size && layouts)
- {
- if (count >= size ) break;
- layouts[count] = layout;
- }
- count ++;
- layouts[count - 1] = UlongToHandle( tmp );
- if (count == size) break;
- }
- } while (rc == ERROR_SUCCESS);
- RegCloseKey(hKeyKeyboard);
- }
- RegCloseKey( hkey );
- }
-
/* make sure our base layout is on the list */
if (baselayout != 0)
{
- return count;
+ return 1;
}
diff --git a/dlls/user32/tests/input.c b/dlls/user32/tests/input.c
index 2397b4104e4..a5c8521c0e9 100644
index c4c361575cd..070c22a4349 100644
--- a/dlls/user32/tests/input.c
+++ b/dlls/user32/tests/input.c
@@ -4322,6 +4322,40 @@ static void test_SendInput(void)
@@ -4363,6 +4363,40 @@ static void test_SendInput(void)
DestroyWindow( hwnd );
}
@@ -99,7 +111,7 @@ index 2397b4104e4..a5c8521c0e9 100644
START_TEST(input)
{
char **argv;
@@ -4364,6 +4398,7 @@ START_TEST(input)
@@ -4405,6 +4439,7 @@ START_TEST(input)
test_GetRawInputBuffer();
test_RegisterRawInputDevices();
test_rawinput(argv[0]);