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

Alexandre Julliard julliard at wine.codeweavers.com
Mon May 22 05:19:05 CDT 2006


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Sat May 20 18:49:40 2006 +0200

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

---

 dlls/user/winproc.c |   69 ++++++++++++++++++++++++++++-----------------------
 1 files changed, 38 insertions(+), 31 deletions(-)

diff --git a/dlls/user/winproc.c b/dlls/user/winproc.c
index 5a5532c..0dfdf77 100644
--- a/dlls/user/winproc.c
+++ b/dlls/user/winproc.c
@@ -774,26 +774,6 @@ static INT WINPROC_MapMsg32ATo32W( HWND 
     case CB_GETLBTEXTLEN:
     case LB_GETTEXTLEN:
         return 1;  /* need to map result */
-    case WM_MDICREATE:
-        {
-            MDICREATESTRUCTW *cs = HeapAlloc( GetProcessHeap(), 0, sizeof(*cs) );
-            if (!cs) return -1;
-            *cs = *(MDICREATESTRUCTW *)*plparam;
-            if (HIWORD(cs->szClass))
-            {
-                UNICODE_STRING usBuffer;
-                RtlCreateUnicodeStringFromAsciiz(&usBuffer,(LPCSTR)cs->szClass);
-                cs->szClass = usBuffer.Buffer;
-            }
-            if (HIWORD(cs->szTitle))
-            {
-                UNICODE_STRING usBuffer;
-                RtlCreateUnicodeStringFromAsciiz(&usBuffer,(LPCSTR)cs->szTitle);
-                cs->szTitle = usBuffer.Buffer;
-            }
-            *plparam = (LPARAM)cs;
-        }
-        return 1;
 
 /* Listbox / Combobox */
     case LB_ADDSTRING:
@@ -915,17 +895,6 @@ static LRESULT WINPROC_UnmapMsg32ATo32W(
         }
         break;
 
-    case WM_MDICREATE:
-        {
-            MDICREATESTRUCTW *cs = (MDICREATESTRUCTW *)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;
-
     case WM_SETTEXT:
     case WM_WININICHANGE:
     case WM_DEVMODECHANGE:
@@ -2682,6 +2651,44 @@ LRESULT WINPROC_CallProcAtoW( winproc_ca
         }
         break;
 
+    case WM_MDICREATE:
+        {
+            WCHAR *ptr, buffer[512];
+            DWORD title_lenA = 0, title_lenW = 0, class_lenA = 0, class_lenW = 0;
+            MDICREATESTRUCTA *csA = (MDICREATESTRUCTA *)lParam;
+            MDICREATESTRUCTW csW;
+
+            memcpy( &csW, csA, sizeof(csW) );
+
+            if (HIWORD(csA->szTitle))
+            {
+                title_lenA = strlen(csA->szTitle) + 1;
+                RtlMultiByteToUnicodeSize( &title_lenW, csA->szTitle, title_lenA );
+            }
+            if (HIWORD(csA->szClass))
+            {
+                class_lenA = strlen(csA->szClass) + 1;
+                RtlMultiByteToUnicodeSize( &class_lenW, csA->szClass, class_lenA );
+            }
+
+            if (!(ptr = get_buffer( buffer, sizeof(buffer), title_lenW + class_lenW ))) break;
+
+            if (title_lenW)
+            {
+                csW.szTitle = ptr;
+                RtlMultiByteToUnicodeN( ptr, title_lenW, NULL, csA->szTitle, title_lenA );
+            }
+            if (class_lenW)
+            {
+                csW.szClass = ptr + title_lenW/sizeof(WCHAR);
+                RtlMultiByteToUnicodeN( ptr + title_lenW/sizeof(WCHAR), class_lenW, NULL,
+                                        csA->szClass, class_lenA );
+            }
+            ret = callback( hwnd, msg, wParam, (LPARAM)&csW, result, arg );
+            free_buffer( buffer, ptr );
+        }
+        break;
+
     default:
         if( (unmap = WINPROC_MapMsg32ATo32W( 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