From 611722a3255d6e693d0360630df7ba963c7cacff Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Fri, 26 May 2006 13:53:15 +0200 Subject: [PATCH] user: Added fast 32->16 mapping for WM_CREATE, WM_NCCREATE and WM_MDICREATE. --- dlls/user/winproc.c | 141 ++++++++++++++++++++------------------------ 1 file changed, 64 insertions(+), 77 deletions(-) diff --git a/dlls/user/winproc.c b/dlls/user/winproc.c index 64a5a7c7d3c..5114fe8020d 100644 --- a/dlls/user/winproc.c +++ b/dlls/user/winproc.c @@ -1057,18 +1057,6 @@ static INT WINPROC_MapMsg32ATo16( HWND hwnd, UINT msg32, WPARAM wParam32, *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 hwnd, UINT msg32, WPARAM wParam32, *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( HWND hwnd, UINT msg, WPARAM wParam, LPARAM 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( HWND hwnd, UINT msg, WPARAM wParam, LPARAM 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( HWND16 hwnd, UINT16 msg, WPARAM16 wParam, LP 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; }