Rémi Bernon : user32: Read "Layout Id" from registry in GetKeyboardLayoutNameW.

Alexandre Julliard julliard at winehq.org
Thu May 6 14:56:20 CDT 2021


Module: wine
Branch: master
Commit: 8ec1206ba011554608b0ef4448e6a04deaca551f
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=8ec1206ba011554608b0ef4448e6a04deaca551f

Author: Rémi Bernon <rbernon at codeweavers.com>
Date:   Thu May  6 12:03:13 2021 +0200

user32: Read "Layout Id" from registry in GetKeyboardLayoutNameW.

Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/user32/input.c | 23 ++++++++++++++++++++++-
 1 file changed, 22 insertions(+), 1 deletion(-)

diff --git a/dlls/user32/input.c b/dlls/user32/input.c
index 70eca90b425..c447cb4b407 100644
--- a/dlls/user32/input.c
+++ b/dlls/user32/input.c
@@ -1110,7 +1110,9 @@ BOOL WINAPI GetKeyboardLayoutNameA(LPSTR pszKLID)
  */
 BOOL WINAPI GetKeyboardLayoutNameW( WCHAR *name )
 {
-    DWORD tmp;
+    WCHAR klid[KL_NAMELENGTH], value[5];
+    DWORD value_size, tmp, i = 0;
+    HKEY hkey;
     HKL layout;
 
     TRACE_(keyboard)( "name %p\n", name );
@@ -1126,6 +1128,25 @@ BOOL WINAPI GetKeyboardLayoutNameW( WCHAR *name )
     if (HIWORD( tmp ) == LOWORD( tmp )) tmp = LOWORD( tmp );
     swprintf( name, KL_NAMELENGTH, L"%08X", tmp );
 
+    if (!RegOpenKeyW( HKEY_LOCAL_MACHINE, L"System\\CurrentControlSet\\Control\\Keyboard Layouts", &hkey ))
+    {
+        while (!RegEnumKeyW( hkey, i++, klid, ARRAY_SIZE(klid) ))
+        {
+            value_size = sizeof(value);
+            if (!RegGetValueW( hkey, klid, L"Layout Id", RRF_RT_REG_SZ, NULL, (void *)&value, &value_size ))
+                tmp = 0xf000 | (wcstoul( value, NULL, 16 ) & 0xfff);
+            else
+                tmp = wcstoul( klid, NULL, 16 );
+
+            if (HIWORD( layout ) == tmp)
+            {
+                lstrcpynW( name, klid, KL_NAMELENGTH );
+                break;
+            }
+        }
+        RegCloseKey( hkey );
+    }
+
     TRACE_(keyboard)( "ret %s\n", debugstr_w( name ) );
     return TRUE;
 }




More information about the wine-cvs mailing list