Alexandre Julliard : user: Added fast W-> A mapping for WM_GETTEXT and WM_ASKCBFORNAME.

Alexandre Julliard julliard at wine.codeweavers.com
Thu May 18 09:43:51 CDT 2006


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu May 18 11:22:55 2006 +0200

user: Added fast W->A mapping for WM_GETTEXT and WM_ASKCBFORNAME.

---

 dlls/user/winproc.c |   49 +++++++++++++++++++++++--------------------------
 1 files changed, 23 insertions(+), 26 deletions(-)

diff --git a/dlls/user/winproc.c b/dlls/user/winproc.c
index 5db5c90..be91e0f 100644
--- a/dlls/user/winproc.c
+++ b/dlls/user/winproc.c
@@ -992,16 +992,6 @@ static INT WINPROC_MapMsg32WTo32A( HWND 
 {
     switch(msg)
     {
-    case WM_GETTEXT:
-    case WM_ASKCBFORMATNAME:
-        {
-            LPARAM *ptr = HeapAlloc( GetProcessHeap(), 0, *pwparam + sizeof(LPARAM) );
-            if (!ptr) return -1;
-            *ptr++ = *plparam;  /* Store previous lParam */
-            *plparam = (LPARAM)ptr;
-        }
-        return 1;
-
     case WM_SETTEXT:
     case WM_WININICHANGE:
     case WM_DEVMODECHANGE:
@@ -1152,22 +1142,6 @@ static LRESULT WINPROC_UnmapMsg32WTo32A(
 {
     switch(msg)
     {
-    case WM_GETTEXT:
-    case WM_ASKCBFORMATNAME:
-        {
-            LPARAM *ptr = (LPARAM *)lParam - 1;
-            if (!wParam) result = 0;
-            else if (!(result = MultiByteToWideChar( CP_ACP, 0, (LPSTR)lParam, -1,
-                                                     (LPWSTR)*ptr, wParam )))
-            {
-                ((LPWSTR)*ptr)[wParam-1] = 0;
-                result = wParam - 1;
-            }
-            else result--;  /* do not count terminating null */
-            HeapFree( GetProcessHeap(), 0, ptr );
-        }
-        break;
-
     case WM_SETTEXT:
     case WM_WININICHANGE:
     case WM_DEVMODECHANGE:
@@ -3060,6 +3034,29 @@ static LRESULT WINPROC_CallProc32WTo32A(
         }
         break;
 
+    case WM_GETTEXT:
+    case WM_ASKCBFORMATNAME:
+        {
+            char *ptr, buffer[512];
+            DWORD len = wParam * 2;
+
+            if (!(ptr = get_buffer( buffer, sizeof(buffer), len ))) break;
+            ret = WINPROC_CallWndProc( func, hwnd, msg, len, (LPARAM)ptr );
+            if (ret && len)
+            {
+                RtlMultiByteToUnicodeN( (LPWSTR)lParam, wParam*sizeof(WCHAR), &len, ptr, strlen(ptr)+1 );
+                ret = len/sizeof(WCHAR) - 1;  /* do not count terminating null */
+                ((LPWSTR)lParam)[ret] = 0;
+                if (dialog)
+                {
+                    SetWindowLongPtrW( hwnd, DWLP_MSGRESULT, ret );
+                    ret = TRUE;
+                }
+            }
+            free_buffer( buffer, ptr );
+        }
+        break;
+
     default:
         if ((unmap = WINPROC_MapMsg32WTo32A( hwnd, msg, &wParam, &lParam )) == -1) {
             ERR_(msg)("Message translation failed. (msg=%s,wp=%08x,lp=%08lx)\n",




More information about the wine-cvs mailing list