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

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


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

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

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

---

 dlls/user/winproc.c |  141 +++++++++++++++++++++++----------------------------
 1 files changed, 64 insertions(+), 77 deletions(-)

diff --git a/dlls/user/winproc.c b/dlls/user/winproc.c
index 64a5a7c..5114fe8 100644
--- a/dlls/user/winproc.c
+++ b/dlls/user/winproc.c
@@ -1057,18 +1057,6 @@ static INT WINPROC_MapMsg32ATo16( HWND h
             *plparam = MapLS( str );
         }
         return 1;
-    case WM_MDICREATE:
-        {
-            MDICREATESTRUCT16 *cs;
-            MDICREATESTRUCTA *cs32 = (MDICREATESTRUCTA *)*plparam;
-
-            if (!(cs = HeapAlloc( GetProcessHeap(), 0, sizeof(MDICREATESTRUCT16) ))) return -1;
-            MDICREATESTRUCT32Ato16( cs32, cs );
-            cs->szTitle = MapLS( cs32->szTitle );
-            cs->szClass = MapLS( cs32->szClass );
-            *plparam = MapLS( cs );
-        }
-        return 1;
     case WM_MDIGETACTIVE:
         return 1;
     case WM_MDISETMENU:
@@ -1136,35 +1124,6 @@ static INT WINPROC_MapMsg32ATo16( HWND h
             *plparam = MapLS( nc );
         }
         return 1;
-    case WM_NCCREATE:
-    case WM_CREATE:
-        {
-            CREATESTRUCT16 *cs;
-            CREATESTRUCTA *cs32 = (CREATESTRUCTA *)*plparam;
-
-            if (!(cs = HeapAlloc( GetProcessHeap(), 0, sizeof(CREATESTRUCT16) ))) return -1;
-            CREATESTRUCT32Ato16( cs32, cs );
-            cs->lpszName  = MapLS( cs32->lpszName );
-            cs->lpszClass = MapLS( cs32->lpszClass );
-
-            if (GetWindowLongW(hwnd, GWL_EXSTYLE) & WS_EX_MDICHILD)
-            {
-                MDICREATESTRUCT16 *mdi_cs16;
-                MDICREATESTRUCTA *mdi_cs = (MDICREATESTRUCTA *)cs32->lpCreateParams;
-                mdi_cs16 = HeapAlloc(GetProcessHeap(), 0, sizeof(*mdi_cs16));
-                if (!mdi_cs16)
-                {
-                    HeapFree(GetProcessHeap(), 0, cs);
-                    return -1;
-                }
-                MDICREATESTRUCT32Ato16(mdi_cs, mdi_cs16);
-                mdi_cs16->szTitle = MapLS( mdi_cs->szTitle );
-                mdi_cs16->szClass = MapLS( mdi_cs->szClass );
-                cs->lpCreateParams = MapLS( mdi_cs16 );
-            }
-            *plparam = MapLS( cs );
-        }
-        return 1;
     case WM_PARENTNOTIFY:
         if ((LOWORD(wParam32)==WM_CREATE) || (LOWORD(wParam32)==WM_DESTROY))
             *plparam = MAKELPARAM( (HWND16)*plparam, HIWORD(wParam32));
@@ -1414,15 +1373,6 @@ static void WINPROC_UnmapMsg32ATo16( HWN
             HeapFree( GetProcessHeap(), 0, (LPARAM *)str - 1 );
         }
         break;
-    case WM_MDICREATE:
-        {
-            MDICREATESTRUCT16 *cs = MapSL(lParam16);
-            UnMapLS( cs->szTitle );
-            UnMapLS( cs->szClass );
-            UnMapLS( lParam16 );
-            HeapFree( GetProcessHeap(), 0, cs );
-        }
-        break;
     case WM_MDIGETACTIVE:
         if (lParam) *(BOOL *)lParam = (BOOL16)HIWORD(*result);
         *result = (LRESULT)WIN_Handle32( LOWORD(*result) );
@@ -1456,24 +1406,6 @@ static void WINPROC_UnmapMsg32ATo16( HWN
             HeapFree( GetProcessHeap(), 0, nc );
         }
         break;
-    case WM_NCCREATE:
-    case WM_CREATE:
-        {
-            CREATESTRUCT16 *cs = MapSL(lParam16);
-            UnMapLS( lParam16 );
-            UnMapLS( cs->lpszName );
-            UnMapLS( cs->lpszClass );
-            if (GetWindowLongW(hwnd, GWL_EXSTYLE) & WS_EX_MDICHILD)
-            {
-                MDICREATESTRUCT16 *mdi_cs16 = (MDICREATESTRUCT16 *)MapSL(cs->lpCreateParams);
-                UnMapLS( cs->lpCreateParams );
-                UnMapLS( mdi_cs16->szTitle );
-                UnMapLS( mdi_cs16->szClass );
-                HeapFree(GetProcessHeap(), 0, mdi_cs16);
-            }
-            HeapFree( GetProcessHeap(), 0, cs );
-        }
-        break;
     case WM_WINDOWPOSCHANGING:
     case WM_WINDOWPOSCHANGED:
         {
@@ -2370,19 +2302,74 @@ LRESULT WINAPI __wine_call_wndproc( HWND
 LRESULT WINPROC_CallProc32ATo16( winproc_callback16_t callback, HWND hwnd, UINT msg,
                                  WPARAM wParam, LPARAM lParam, LRESULT *result, void *arg )
 {
-    LRESULT ret;
-    UINT16 msg16;
-    WPARAM16 wParam16;
-    LPARAM lParam16;
+    LRESULT ret = 0;
 
     TRACE_(msg)("(hwnd=%p,msg=%s,wp=%08x,lp=%08lx)\n",
                 hwnd, SPY_GetMsgName(msg, hwnd), wParam, lParam);
 
-    lParam16 = lParam;
-    if (WINPROC_MapMsg32ATo16( hwnd, msg, wParam, &msg16, &wParam16, &lParam16 ) == -1)
-        return 0;
-    ret = callback( HWND_16(hwnd), msg16, wParam16, lParam16, result, arg );
-    WINPROC_UnmapMsg32ATo16( hwnd, msg, wParam, lParam, wParam16, lParam16, result );
+    switch(msg)
+    {
+    case WM_NCCREATE:
+    case WM_CREATE:
+        {
+            CREATESTRUCTA *cs32 = (CREATESTRUCTA *)lParam;
+            CREATESTRUCT16 cs;
+            MDICREATESTRUCT16 mdi_cs16;
+            BOOL mdi_child = (GetWindowLongW(hwnd, GWL_EXSTYLE) & WS_EX_MDICHILD);
+
+            CREATESTRUCT32Ato16( cs32, &cs );
+            cs.lpszName  = MapLS( cs32->lpszName );
+            cs.lpszClass = MapLS( cs32->lpszClass );
+
+            if (mdi_child)
+            {
+                MDICREATESTRUCTA *mdi_cs = (MDICREATESTRUCTA *)cs32->lpCreateParams;
+                MDICREATESTRUCT32Ato16( mdi_cs, &mdi_cs16 );
+                mdi_cs16.szTitle = MapLS( mdi_cs->szTitle );
+                mdi_cs16.szClass = MapLS( mdi_cs->szClass );
+                cs.lpCreateParams = MapLS( &mdi_cs16 );
+            }
+            lParam = MapLS( &cs );
+            ret = callback( HWND_16(hwnd), msg, wParam, lParam, result, arg );
+            UnMapLS( lParam );
+            UnMapLS( cs.lpszName );
+            UnMapLS( cs.lpszClass );
+            if (mdi_child)
+            {
+                UnMapLS( cs.lpCreateParams );
+                UnMapLS( mdi_cs16.szTitle );
+                UnMapLS( mdi_cs16.szClass );
+            }
+        }
+        break;
+    case WM_MDICREATE:
+        {
+            MDICREATESTRUCTA *cs32 = (MDICREATESTRUCTA *)lParam;
+            MDICREATESTRUCT16 cs;
+
+            MDICREATESTRUCT32Ato16( cs32, &cs );
+            cs.szTitle = MapLS( cs32->szTitle );
+            cs.szClass = MapLS( cs32->szClass );
+            lParam = MapLS( &cs );
+            ret = callback( HWND_16(hwnd), msg, wParam, lParam, result, arg );
+            UnMapLS( lParam );
+            UnMapLS( cs.szTitle );
+            UnMapLS( cs.szClass );
+        }
+        break;
+    default:
+        {
+            UINT16 msg16;
+            WPARAM16 wParam16;
+            LPARAM lParam16 = lParam;
+            if (WINPROC_MapMsg32ATo16( hwnd, msg, wParam, &msg16, &wParam16, &lParam16 ) != -1)
+            {
+                ret = callback( HWND_16(hwnd), msg16, wParam16, lParam16, result, arg );
+                WINPROC_UnmapMsg32ATo16( hwnd, msg, wParam, lParam, wParam16, lParam16, result );
+            }
+        }
+        break;
+    }
     return ret;
 }
 




More information about the wine-cvs mailing list