Alexandre Julliard : user32: Fix GetKeyNameText returned length.

Alexandre Julliard julliard at winehq.org
Wed Feb 15 13:14:05 CST 2012


Module: wine
Branch: master
Commit: f87191815deb5675f20e06c6bfdae402342f9290
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=f87191815deb5675f20e06c6bfdae402342f9290

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed Feb 15 12:07:34 2012 +0100

user32: Fix GetKeyNameText returned length.

---

 dlls/user32/input.c         |    5 ++++-
 dlls/user32/tests/input.c   |   41 +++++++++++++++++++++++++++++++++++++++++
 dlls/winex11.drv/keyboard.c |   29 ++++++++++++++++-------------
 3 files changed, 61 insertions(+), 14 deletions(-)

diff --git a/dlls/user32/input.c b/dlls/user32/input.c
index abd382f..050fb2b 100644
--- a/dlls/user32/input.c
+++ b/dlls/user32/input.c
@@ -823,7 +823,7 @@ INT WINAPI GetKeyNameTextA(LONG lParam, LPSTR lpBuffer, INT nSize)
     WCHAR buf[256];
     INT ret;
 
-    if (!GetKeyNameTextW(lParam, buf, 256))
+    if (!nSize || !GetKeyNameTextW(lParam, buf, 256))
     {
         lpBuffer[0] = 0;
         return 0;
@@ -834,6 +834,8 @@ INT WINAPI GetKeyNameTextA(LONG lParam, LPSTR lpBuffer, INT nSize)
         ret = nSize - 1;
         lpBuffer[ret] = 0;
     }
+    else ret--;
+
     return ret;
 }
 
@@ -842,6 +844,7 @@ INT WINAPI GetKeyNameTextA(LONG lParam, LPSTR lpBuffer, INT nSize)
  */
 INT WINAPI GetKeyNameTextW(LONG lParam, LPWSTR lpBuffer, INT nSize)
 {
+    if (!lpBuffer || !nSize) return 0;
     return USER_Driver->pGetKeyNameText( lParam, lpBuffer, nSize );
 }
 
diff --git a/dlls/user32/tests/input.c b/dlls/user32/tests/input.c
index 748ed26..cb090dd 100644
--- a/dlls/user32/tests/input.c
+++ b/dlls/user32/tests/input.c
@@ -1603,6 +1603,46 @@ static void test_keyboard_layout_name(void)
     ok(!strcmp(klid, "00000409"), "expected 00000409, got %s\n", klid);
 }
 
+static void test_key_names(void)
+{
+    char buffer[40];
+    WCHAR bufferW[40];
+    int ret, prev;
+    LONG lparam = 0x1d << 16;
+
+    memset( buffer, 0xcc, sizeof(buffer) );
+    ret = GetKeyNameTextA( lparam, buffer, sizeof(buffer) );
+    ok( ret > 0, "wrong len %u for '%s'\n", ret, buffer );
+    ok( ret == strlen(buffer), "wrong len %u for '%s'\n", ret, buffer );
+
+    memset( buffer, 0xcc, sizeof(buffer) );
+    prev = ret;
+    ret = GetKeyNameTextA( lparam, buffer, prev );
+    ok( ret == prev - 1, "wrong len %u for '%s'\n", ret, buffer );
+    ok( ret == strlen(buffer), "wrong len %u for '%s'\n", ret, buffer );
+
+    memset( buffer, 0xcc, sizeof(buffer) );
+    ret = GetKeyNameTextA( lparam, buffer, 0 );
+    ok( ret == 0, "wrong len %u for '%s'\n", ret, buffer );
+    ok( buffer[0] == 0, "wrong string '%s'\n", buffer );
+
+    memset( bufferW, 0xcc, sizeof(bufferW) );
+    ret = GetKeyNameTextW( lparam, bufferW, sizeof(bufferW)/sizeof(WCHAR) );
+    ok( ret > 0, "wrong len %u for %s\n", ret, wine_dbgstr_w(bufferW) );
+    ok( ret == lstrlenW(bufferW), "wrong len %u for %s\n", ret, wine_dbgstr_w(bufferW) );
+
+    memset( bufferW, 0xcc, sizeof(bufferW) );
+    prev = ret;
+    ret = GetKeyNameTextW( lparam, bufferW, prev );
+    ok( ret == prev - 1, "wrong len %u for %s\n", ret, wine_dbgstr_w(bufferW) );
+    ok( ret == lstrlenW(bufferW), "wrong len %u for %s\n", ret, wine_dbgstr_w(bufferW) );
+
+    memset( bufferW, 0xcc, sizeof(bufferW) );
+    ret = GetKeyNameTextW( lparam, bufferW, 0 );
+    ok( ret == 0, "wrong len %u for %s\n", ret, wine_dbgstr_w(bufferW) );
+    ok( bufferW[0] == 0xcccc, "wrong string %s\n", wine_dbgstr_w(bufferW) );
+}
+
 START_TEST(input)
 {
     init_function_pointers();
@@ -1621,6 +1661,7 @@ START_TEST(input)
     test_ToUnicode();
     test_get_async_key_state();
     test_keyboard_layout_name();
+    test_key_names();
 
     if(pGetMouseMovePointsEx)
         test_GetMouseMovePointsEx();
diff --git a/dlls/winex11.drv/keyboard.c b/dlls/winex11.drv/keyboard.c
index 57deb59..3b91d8f 100644
--- a/dlls/winex11.drv/keyboard.c
+++ b/dlls/winex11.drv/keyboard.c
@@ -2291,7 +2291,7 @@ INT CDECL X11DRV_GetKeyNameText(LONG lParam, LPWSTR lpBuffer, INT nSize)
        (scanCode != 0x4a ) &&   /* numpad - */
        (scanCode != 0x4e ) )    /* numpad + */
       {
-        if ((nSize >= 2) && lpBuffer)
+        if (nSize >= 2)
 	{
           *lpBuffer = toupperW((WCHAR)ansi);
           *(lpBuffer+1) = 0;
@@ -2318,6 +2318,8 @@ INT CDECL X11DRV_GetKeyNameText(LONG lParam, LPWSTR lpBuffer, INT nSize)
          break;
   if (keyi <= max_keycode)
   {
+      INT rc;
+
       wine_tsx11_lock();
       keyc = (KeyCode) keyi;
       keys = keycode_to_keysym(display, keyc, 0);
@@ -2329,29 +2331,30 @@ INT CDECL X11DRV_GetKeyNameText(LONG lParam, LPWSTR lpBuffer, INT nSize)
           char* idx = strrchr(name, '_');
           if (idx && (strcasecmp(idx, "_r") == 0 || strcasecmp(idx, "_l") == 0))
           {
-              INT rc = 0;
               TRACE("found scan=%04x keyc=%u keysym=%lx modified_string=%s\n",
                     scanCode, keyc, keys, debugstr_an(name,idx-name));
-              if (lpBuffer && nSize)
-              {
-                  rc = MultiByteToWideChar(CP_UNIXCP, 0, name, idx-name+1, lpBuffer, nSize);
-                  if (rc > 0) lpBuffer[rc - 1] = 0;
-              }
+              rc = MultiByteToWideChar(CP_UNIXCP, 0, name, idx-name+1, lpBuffer, nSize);
+              if (!rc) rc = nSize;
+              lpBuffer[--rc] = 0;
               return rc;
           }
       }
 
-      TRACE("found scan=%04x keyc=%u keysym=%04x string=%s\n",
-            scanCode, keyc, (int)keys, debugstr_a(name));
-      if (lpBuffer && nSize && name)
-          return MultiByteToWideChar(CP_UNIXCP, 0, name, -1, lpBuffer, nSize);
+      if (name)
+      {
+          TRACE("found scan=%04x keyc=%u keysym=%04x vkey=%04x string=%s\n",
+                scanCode, keyc, (int)keys, vkey, debugstr_a(name));
+          rc = MultiByteToWideChar(CP_UNIXCP, 0, name, -1, lpBuffer, nSize);
+          if (!rc) rc = nSize;
+          lpBuffer[--rc] = 0;
+          return rc;
+      }
   }
 
   /* Finally issue WARN for unknown keys   */
 
   WARN("(%08x,%p,%d): unsupported key, vkey=%04X, ansi=%04x\n",lParam,lpBuffer,nSize,vkey,ansi);
-  if (lpBuffer && nSize)
-    *lpBuffer = 0;
+  *lpBuffer = 0;
   return 0;
 }
 




More information about the wine-cvs mailing list