[WIN32K]
[reactos.git] / reactos / win32ss / user / ntuser / kbdlayout.c
index 3f6f434..5d3c633 100644 (file)
@@ -9,6 +9,9 @@
  */
 
 #include <win32k.h>
+
+#include <winnls.h>
+
 DBG_DEFAULT_CHANNEL(UserKbdLayout);
 
 PKL gspklBaseLayout = NULL;
@@ -131,7 +134,7 @@ UserLoadKbdFile(PUNICODE_STRING pwszKLID)
                                  L"Control\\Keyboard Layouts\\";
 
     /* Create keyboard layout file object */
-    pkf = UserCreateObject(gHandleTable, NULL, NULL, otKBDfile, sizeof(KBDFILE));
+    pkf = UserCreateObject(gHandleTable, NULL, NULL, NULL, TYPE_KBDFILE, sizeof(KBDFILE));
     if (!pkf)
     {
         ERR("Failed to create object!\n");
@@ -187,7 +190,7 @@ cleanup:
     {
         /* We have failed - destroy created object */
         if (pkf)
-            UserDeleteObject(pkf->head.h, otKBDfile);
+            UserDeleteObject(pkf->head.h, TYPE_KBDFILE);
     }
 
     return pRet;
@@ -201,10 +204,12 @@ cleanup:
 static PKL
 UserLoadKbdLayout(PUNICODE_STRING pwszKLID, HKL hKL)
 {
+    LCID lCid;
+    CHARSETINFO cs;
     PKL pKl;
 
     /* Create keyboard layout object */
-    pKl = UserCreateObject(gHandleTable, NULL, NULL, otKBDlayout, sizeof(KL));
+    pKl = UserCreateObject(gHandleTable, NULL, NULL, NULL, TYPE_KBDLAYOUT, sizeof(KL));
     if (!pKl)
     {
         ERR("Failed to create object!\n");
@@ -221,10 +226,27 @@ UserLoadKbdLayout(PUNICODE_STRING pwszKLID, HKL hKL)
     if (!pKl->spkf)
     {
         ERR("UserLoadKbdFile(%wZ) failed!\n", pwszKLID);
-        UserDeleteObject(pKl->head.h, otKBDlayout);
+        UserDeleteObject(pKl->head.h, TYPE_KBDLAYOUT);
         return NULL;
     }
 
+    // Up to Language Identifiers..
+    RtlUnicodeStringToInteger(pwszKLID, (ULONG)16, (PULONG)&lCid);
+    TRACE("Language Identifiers %wZ LCID 0x%x\n", pwszKLID, lCid);
+    if (co_IntGetCharsetInfo(lCid, &cs))
+    {
+       pKl->iBaseCharset = cs.ciCharset;
+       pKl->dwFontSigs = cs.fs.fsCsb[0];
+       pKl->CodePage = (USHORT)cs.ciACP;
+       TRACE("Charset %u Font Sig %lu CodePage %u\n", pKl->iBaseCharset, pKl->dwFontSigs, pKl->CodePage);
+    }
+    else
+    {
+       pKl->iBaseCharset = ANSI_CHARSET;
+       pKl->dwFontSigs = FS_LATIN1;
+       pKl->CodePage = CP_ACP;
+    }
+
     return pKl;
 }
 
@@ -235,9 +257,10 @@ UserLoadKbdLayout(PUNICODE_STRING pwszKLID, HKL hKL)
  */
 static
 VOID
-UnloadKbdFile(PKBDFILE pkf)
+UnloadKbdFile(_In_ PKBDFILE pkf)
 {
     PKBDFILE *ppkfLink = &gpkfList;
+    NT_ASSERT(pkf != NULL);
 
     /* Find previous object */
     while (*ppkfLink)
@@ -252,7 +275,7 @@ UnloadKbdFile(PKBDFILE pkf)
         *ppkfLink = pkf->pkfNext;
 
     EngUnloadImage(pkf->hBase);
-    UserDeleteObject(pkf->head.h, otKBDfile);
+    UserDeleteObject(pkf->head.h, TYPE_KBDFILE);
 }
 
 /*
@@ -288,7 +311,7 @@ UserUnloadKbl(PKL pKl)
     pKl->pklPrev->pklNext = pKl->pklNext;
     pKl->pklNext->pklPrev = pKl->pklPrev;
     UnloadKbdFile(pKl->spkf);
-    UserDeleteObject(pKl->head.h, otKBDlayout);
+    UserDeleteObject(pKl->head.h, TYPE_KBDLAYOUT);
     return TRUE;
 }
 
@@ -452,7 +475,10 @@ NtUserGetKeyboardLayoutList(
     UserEnterShared();
 
     if (!gspklBaseLayout)
+    {
+        UserLeave();
         return 0;
+    }
     pKl = gspklBaseLayout;
 
     if (nBuff == 0)
@@ -625,7 +651,7 @@ NtUserLoadKeyboardLayoutEx(
 
     /* Send shell message */
     if (!(Flags & KLF_NOTELLSHELL))
-        co_IntShellHookNotify(HSHELL_LANGUAGE, (LPARAM)hkl);
+        co_IntShellHookNotify(HSHELL_LANGUAGE, 0, (LPARAM)hkl);
 
     /* Return hkl on success */
     hklRet = (HKL)hkl;
@@ -675,7 +701,7 @@ NtUserActivateKeyboardLayout(
 
     if (!pKl)
     {
-        ERR("Invalid HKL %x!\n", hKl);
+        ERR("Invalid HKL %p!\n", hKl);
         goto cleanup;
     }
 
@@ -694,7 +720,7 @@ NtUserActivateKeyboardLayout(
 
         /* Send shell message */
         if (!(Flags & KLF_NOTELLSHELL))
-            co_IntShellHookNotify(HSHELL_LANGUAGE, (LPARAM)hkl);
+            co_IntShellHookNotify(HSHELL_LANGUAGE, 0, (LPARAM)hkl);
     }
 
 cleanup:
@@ -721,7 +747,7 @@ NtUserUnloadKeyboardLayout(
     if (pKl)
         bRet = UserUnloadKbl(pKl);
     else
-        ERR("Invalid HKL %x!\n", hKl);
+        ERR("Invalid HKL %p!\n", hKl);
 
     UserLeave();
     return bRet;