Alexandre Julliard : user: Added fast 16->32 mapping for WM_CREATE, WM_NCCREATE and WM_MDICREATE.

Alexandre Julliard julliard at wine.codeweavers.com
Fri May 26 13:54:56 CDT 2006


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Fri May 26 13:21:31 2006 +0200

user: Added fast 16->32 mapping for WM_CREATE, WM_NCCREATE and WM_MDICREATE.

---

 dlls/user/winproc.c |  116 ++++++++++++++++++++-------------------------------
 1 files changed, 46 insertions(+), 70 deletions(-)

diff --git a/dlls/user/winproc.c b/dlls/user/winproc.c
index 9b658ed..63985d7 100644
--- a/dlls/user/winproc.c
+++ b/dlls/user/winproc.c
@@ -367,6 +367,8 @@ static void CREATESTRUCT16to32A( const C
     to->x              = from->x;
     to->style          = from->style;
     to->dwExStyle      = from->dwExStyle;
+    to->lpszName       = MapSL(from->lpszName);
+    to->lpszClass      = MapSL(from->lpszClass);
 }
 
 /* The strings are not copied */
@@ -390,6 +392,8 @@ static void MDICREATESTRUCT16to32A( cons
     to->cy     = from->cy;
     to->style  = from->style;
     to->lParam = from->lParam;
+    to->szTitle = MapSL(from->szTitle);
+    to->szClass = MapSL(from->szClass);
 }
 
 static WPARAM map_wparam_char_AtoW( WPARAM wParam, DWORD len )
@@ -832,18 +836,6 @@ static INT WINPROC_MapMsg16To32A( HWND h
     case WM_ASKCBFORMATNAME:
         *plparam = (LPARAM)MapSL(*plparam);
         return 0;
-    case WM_MDICREATE:
-        {
-            MDICREATESTRUCT16 *cs16 = MapSL(*plparam);
-            MDICREATESTRUCTA *cs = HeapAlloc( GetProcessHeap(), 0, sizeof(*cs) + sizeof(LPARAM) );
-            if (!cs) return -1;
-            MDICREATESTRUCT16to32A( cs16, cs );
-            cs->szTitle = MapSL(cs16->szTitle);
-            cs->szClass = MapSL(cs16->szClass);
-            *(LPARAM *)(cs + 1) = *plparam;  /* Store the previous lParam */
-            *plparam = (LPARAM)cs;
-        }
-        return 1;
     case WM_MDIGETACTIVE:
         *plparam = (LPARAM)HeapAlloc( GetProcessHeap(), 0, sizeof(BOOL) );
         *(BOOL*)(*plparam) = 0;
@@ -906,36 +898,6 @@ static INT WINPROC_MapMsg16To32A( HWND h
             *plparam = (LPARAM)nc;
         }
         return 1;
-    case WM_NCCREATE:
-    case WM_CREATE:
-        {
-            CREATESTRUCT16 *cs16 = MapSL(*plparam);
-            CREATESTRUCTA *cs = HeapAlloc( GetProcessHeap(), 0, sizeof(*cs) + sizeof(LPARAM) );
-            if (!cs) return -1;
-            CREATESTRUCT16to32A( cs16, cs );
-            cs->lpszName  = MapSL(cs16->lpszName);
-            cs->lpszClass = MapSL(cs16->lpszClass);
-
-            if (GetWindowLongW(hwnd, GWL_EXSTYLE) & WS_EX_MDICHILD)
-            {
-                MDICREATESTRUCT16 *mdi_cs16;
-                MDICREATESTRUCTA *mdi_cs = HeapAlloc(GetProcessHeap(), 0, sizeof(*mdi_cs));
-                if (!mdi_cs)
-                {
-                    HeapFree(GetProcessHeap(), 0, cs);
-                    return -1;
-                }
-                mdi_cs16 = (MDICREATESTRUCT16 *)MapSL(cs16->lpCreateParams);
-                MDICREATESTRUCT16to32A(mdi_cs16, mdi_cs);
-                mdi_cs->szTitle = MapSL(mdi_cs16->szTitle);
-                mdi_cs->szClass = MapSL(mdi_cs16->szClass);
-
-                cs->lpCreateParams = mdi_cs;
-            }
-            *(LPARAM *)(cs + 1) = *plparam;  /* Store the previous lParam */
-            *plparam = (LPARAM)cs;
-        }
-        return 1;
     case WM_PARENTNOTIFY:
         if ((wParam16 == WM_CREATE) || (wParam16 == WM_DESTROY))
         {
@@ -1094,14 +1056,6 @@ static LRESULT WINPROC_UnmapMsg16To32A( 
             HeapFree( GetProcessHeap(), 0, mmi );
         }
         break;
-    case WM_MDICREATE:
-        {
-            MDICREATESTRUCTA *cs = (MDICREATESTRUCTA *)lParam;
-            lParam = *(LPARAM *)(cs + 1);
-            MDICREATESTRUCT32Ato16( cs, MapSL(lParam) );
-            HeapFree( GetProcessHeap(), 0, cs );
-        }
-        break;
     case WM_MDIGETACTIVE:
         result = MAKELONG( LOWORD(result), (BOOL16)(*(BOOL *)lParam) );
         HeapFree( GetProcessHeap(), 0, (BOOL *)lParam );
@@ -1135,19 +1089,6 @@ static LRESULT WINPROC_UnmapMsg16To32A( 
             HeapFree( GetProcessHeap(), 0, nc );
         }
         break;
-    case WM_NCCREATE:
-    case WM_CREATE:
-        {
-            CREATESTRUCTA *cs = (CREATESTRUCTA *)lParam;
-            lParam = *(LPARAM *)(cs + 1);
-            CREATESTRUCT32Ato16( cs, MapSL(lParam) );
-
-            if (GetWindowLongW(hwnd, GWL_EXSTYLE) & WS_EX_MDICHILD)
-                HeapFree(GetProcessHeap(), 0, cs->lpCreateParams);
-
-            HeapFree( GetProcessHeap(), 0, cs );
-        }
-        break;
     case WM_WINDOWPOSCHANGING:
     case WM_WINDOWPOSCHANGED:
         {
@@ -2477,19 +2418,54 @@ static LRESULT WINPROC_CallProcWtoA( win
 LRESULT WINPROC_CallProc16To32A( winproc_callback_t callback, HWND16 hwnd, UINT16 msg,
                                  WPARAM16 wParam, LPARAM lParam, LRESULT *result, void *arg )
 {
-    LRESULT ret;
-    UINT msg32;
-    WPARAM wParam32;
+    LRESULT ret = 0;
     HWND hwnd32 = WIN_Handle32( hwnd );
 
     TRACE_(msg)("(hwnd=%p,msg=%s,wp=%08x,lp=%08lx)\n",
                  hwnd32, SPY_GetMsgName(msg, hwnd32), wParam, lParam);
 
-    if (WINPROC_MapMsg16To32A( hwnd32, msg, wParam, &msg32, &wParam32, &lParam ) == -1)
-        return 0;
+    switch(msg)
+    {
+    case WM_NCCREATE:
+    case WM_CREATE:
+        {
+            CREATESTRUCT16 *cs16 = MapSL(lParam);
+            CREATESTRUCTA cs;
+            MDICREATESTRUCTA mdi_cs;
 
-    ret = callback( hwnd32, msg32, wParam32, lParam, result, arg );
-    *result = WINPROC_UnmapMsg16To32A( hwnd32, msg32, wParam32, lParam, *result );
+            CREATESTRUCT16to32A( cs16, &cs );
+            if (GetWindowLongW(hwnd32, GWL_EXSTYLE) & WS_EX_MDICHILD)
+            {
+                MDICREATESTRUCT16 *mdi_cs16 = MapSL(cs16->lpCreateParams);
+                MDICREATESTRUCT16to32A(mdi_cs16, &mdi_cs);
+                cs.lpCreateParams = &mdi_cs;
+            }
+            ret = callback( hwnd32, msg, wParam, (LPARAM)&cs, result, arg );
+            CREATESTRUCT32Ato16( &cs, cs16 );
+        }
+        break;
+    case WM_MDICREATE:
+        {
+            MDICREATESTRUCT16 *cs16 = MapSL(lParam);
+            MDICREATESTRUCTA cs;
+
+            MDICREATESTRUCT16to32A( cs16, &cs );
+            ret = callback( hwnd32, msg, wParam, (LPARAM)&cs, result, arg );
+            MDICREATESTRUCT32Ato16( &cs, cs16 );
+        }
+        break;
+    default:
+        {
+            UINT msg32;
+            WPARAM wParam32;
+            if (WINPROC_MapMsg16To32A( hwnd32, msg, wParam, &msg32, &wParam32, &lParam ) != -1)
+            {
+                ret = callback( hwnd32, msg32, wParam32, lParam, result, arg );
+                *result = WINPROC_UnmapMsg16To32A( hwnd32, msg32, wParam32, lParam, *result );
+            }
+        }
+        break;
+    }
     return ret;
 }
 




More information about the wine-cvs mailing list