Alexandre Julliard : user: Added fast W->A mapping for WM_MDICREATE.

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


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

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

user: Added fast W->A mapping for WM_MDICREATE.

---

 dlls/user/winproc.c |   71 +++++++++++++++++++++++++++------------------------
 1 files changed, 37 insertions(+), 34 deletions(-)

diff --git a/dlls/user/winproc.c b/dlls/user/winproc.c
index 15b00ee..b852fb5 100644
--- a/dlls/user/winproc.c
+++ b/dlls/user/winproc.c
@@ -992,29 +992,6 @@ static INT WINPROC_MapMsg32WTo32A( HWND 
 {
     switch(msg)
     {
-    case WM_MDICREATE:
-        {
-            MDICREATESTRUCTA *cs = HeapAlloc( GetProcessHeap(), 0, sizeof(*cs) );
-            if (!cs) return -1;
-            *cs = *(MDICREATESTRUCTA *)*plparam;
-            if (HIWORD(cs->szTitle))
-            {
-                int len = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)cs->szTitle, -1, NULL, 0, 0, 0);
-                LPSTR buf = HeapAlloc(GetProcessHeap(), 0, len);
-                if (buf) WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)cs->szTitle, -1, buf, len, 0, 0);
-                cs->szTitle = buf;
-            }
-            if (HIWORD(cs->szClass))
-            {
-                int len = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)cs->szClass, -1, NULL, 0, 0, 0);
-                LPSTR buf = HeapAlloc(GetProcessHeap(), 0, len);
-                if (buf) WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)cs->szClass, -1, buf, len, 0, 0);
-                cs->szClass = buf;
-            }
-            *plparam = (LPARAM)cs;
-        }
-        return 1;
-
 /* Listbox */
     case LB_ADDSTRING:
     case LB_INSERTSTRING:
@@ -1124,17 +1101,6 @@ static LRESULT WINPROC_UnmapMsg32WTo32A(
 {
     switch(msg)
     {
-    case WM_MDICREATE:
-        {
-            MDICREATESTRUCTA *cs = (MDICREATESTRUCTA *)lParam;
-            if (HIWORD(cs->szTitle))
-                HeapFree( GetProcessHeap(), 0, (LPVOID)cs->szTitle );
-            if (HIWORD(cs->szClass))
-                HeapFree( GetProcessHeap(), 0, (LPVOID)cs->szClass );
-            HeapFree( GetProcessHeap(), 0, cs );
-        }
-        break;
-
 /* Listbox */
     case LB_ADDSTRING:
     case LB_INSERTSTRING:
@@ -3053,6 +3019,43 @@ static LRESULT WINPROC_CallProc32WTo32A(
         }
         break;
 
+    case WM_MDICREATE:
+        {
+            char *ptr, buffer[1024];
+            DWORD title_lenA = 0, title_lenW = 0, class_lenA = 0, class_lenW = 0;
+            MDICREATESTRUCTW *csW = (MDICREATESTRUCTW *)lParam;
+            MDICREATESTRUCTA csA;
+
+            memcpy( &csA, csW, sizeof(csA) );
+
+            if (HIWORD(csW->szTitle))
+            {
+                title_lenW = (strlenW(csW->szTitle) + 1) * sizeof(WCHAR);
+                RtlUnicodeToMultiByteSize( &title_lenA, csW->szTitle, title_lenW );
+            }
+            if (HIWORD(csW->szClass))
+            {
+                class_lenW = (strlenW(csW->szClass) + 1) * sizeof(WCHAR);
+                RtlUnicodeToMultiByteSize( &class_lenA, csW->szClass, class_lenW );
+            }
+
+            if (!(ptr = get_buffer( buffer, sizeof(buffer), title_lenA + class_lenA ))) break;
+
+            if (title_lenA)
+            {
+                RtlUnicodeToMultiByteN( ptr, title_lenA, NULL, csW->szTitle, title_lenW );
+                csA.szTitle = ptr;
+            }
+            if (class_lenA)
+            {
+                RtlUnicodeToMultiByteN( ptr + title_lenA, class_lenA, NULL, csW->szClass, class_lenW );
+                csA.szClass = ptr + title_lenA;
+            }
+            ret = WINPROC_CallWndProc( func, hwnd, msg, wParam, (LPARAM)&csA );
+            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