Module: wine Branch: refs/heads/master Commit: 899133d7f726d9350ace45c5fc3d5e914e1de19c URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=899133d7f726d9350ace45c5...
Author: Alexandre Julliard julliard@winehq.org Date: Sat May 20 18:48:04 2006 +0200
user: Added fast A->W mapping for WM_CREATE and WM_NCCREATE.
---
dlls/user/winproc.c | 158 +++++++++++++++++++++++---------------------------- 1 files changed, 71 insertions(+), 87 deletions(-)
diff --git a/dlls/user/winproc.c b/dlls/user/winproc.c index 0289664..5a5532c 100644 --- a/dlls/user/winproc.c +++ b/dlls/user/winproc.c @@ -67,6 +67,17 @@ static CRITICAL_SECTION_DEBUG critsect_d }; static CRITICAL_SECTION winproc_cs = { &critsect_debug, -1, 0, 0, 0, 0 };
+static inline void *get_buffer( void *static_buffer, size_t size, size_t need ) +{ + if (size >= need) return static_buffer; + return HeapAlloc( GetProcessHeap(), 0, need ); +} + +static inline void free_buffer( void *static_buffer, void *buffer ) +{ + if (buffer != static_buffer) HeapFree( GetProcessHeap(), 0, buffer ); +} + /* map a Unicode string to a 16-bit pointer */ inline static SEGPTR map_str_32W_to_16( LPCWSTR str ) { @@ -763,50 +774,6 @@ static INT WINPROC_MapMsg32ATo32W( HWND case CB_GETLBTEXTLEN: case LB_GETTEXTLEN: return 1; /* need to map result */ - case WM_NCCREATE: - case WM_CREATE: - { - UNICODE_STRING usBuffer; - struct s - { CREATESTRUCTW cs; /* new structure */ - LPCWSTR lpszName; /* allocated Name */ - LPCWSTR lpszClass; /* allocated Class */ - }; - - struct s *xs = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(struct s)); - if (!xs) return -1; - xs->cs = *(CREATESTRUCTW *)*plparam; - if (HIWORD(xs->cs.lpszName)) - { - RtlCreateUnicodeStringFromAsciiz(&usBuffer,(LPCSTR)xs->cs.lpszName); - xs->lpszName = xs->cs.lpszName = usBuffer.Buffer; - } - if (HIWORD(xs->cs.lpszClass)) - { - RtlCreateUnicodeStringFromAsciiz(&usBuffer,(LPCSTR)xs->cs.lpszClass); - xs->lpszClass = xs->cs.lpszClass = usBuffer.Buffer; - } - - if (GetWindowLongW(hwnd, GWL_EXSTYLE) & WS_EX_MDICHILD) - { - MDICREATESTRUCTW *mdi_cs = HeapAlloc(GetProcessHeap(), 0, sizeof(*mdi_cs)); - *mdi_cs = *(MDICREATESTRUCTW *)xs->cs.lpCreateParams; - if (HIWORD(mdi_cs->szTitle)) - { - RtlCreateUnicodeStringFromAsciiz(&usBuffer, (LPCSTR)mdi_cs->szTitle); - mdi_cs->szTitle = usBuffer.Buffer; - } - if (HIWORD(mdi_cs->szClass)) - { - RtlCreateUnicodeStringFromAsciiz(&usBuffer, (LPCSTR)mdi_cs->szClass); - mdi_cs->szClass = usBuffer.Buffer; - } - xs->cs.lpCreateParams = mdi_cs; - } - - *plparam = (LPARAM)xs; - } - return 1; case WM_MDICREATE: { MDICREATESTRUCTW *cs = HeapAlloc( GetProcessHeap(), 0, sizeof(*cs) ); @@ -947,30 +914,6 @@ static LRESULT WINPROC_UnmapMsg32ATo32W( } } break; - case WM_NCCREATE: - case WM_CREATE: - { - struct s - { CREATESTRUCTW cs; /* new structure */ - LPWSTR lpszName; /* allocated Name */ - LPWSTR lpszClass; /* allocated Class */ - }; - struct s *xs = (struct s *)lParam; - HeapFree( GetProcessHeap(), 0, xs->lpszName ); - HeapFree( GetProcessHeap(), 0, xs->lpszClass ); - - if (GetWindowLongW(hwnd, GWL_EXSTYLE) & WS_EX_MDICHILD) - { - MDICREATESTRUCTW *mdi_cs = (MDICREATESTRUCTW *)xs->cs.lpCreateParams; - if (HIWORD(mdi_cs->szTitle)) - HeapFree(GetProcessHeap(), 0, (LPVOID)mdi_cs->szTitle); - if (HIWORD(mdi_cs->szClass)) - HeapFree(GetProcessHeap(), 0, (LPVOID)mdi_cs->szClass); - HeapFree(GetProcessHeap(), 0, mdi_cs); - } - HeapFree( GetProcessHeap(), 0, xs ); - } - break;
case WM_MDICREATE: { @@ -2684,36 +2627,77 @@ static void WINPROC_UnmapMsg32WTo16( HWN LRESULT WINPROC_CallProcAtoW( winproc_callback_t callback, HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam, LRESULT *result, void *arg ) { - LRESULT ret; + LRESULT ret = 0; int unmap;
TRACE_(msg)("(hwnd=%p,msg=%s,wp=%08x,lp=%08lx)\n", hwnd, SPY_GetMsgName(msg, hwnd), wParam, lParam);
- if( (unmap = WINPROC_MapMsg32ATo32W( hwnd, msg, &wParam, &lParam )) == -1) { - ERR_(msg)("Message translation failed. (msg=%s,wp=%08x,lp=%08lx)\n", - SPY_GetMsgName(msg, hwnd), wParam, lParam ); - return 0; - } - ret = callback( hwnd, msg, wParam, lParam, result, arg ); - if (unmap) + switch(msg) + { + case WM_NCCREATE: + case WM_CREATE: + { + WCHAR *ptr, buffer[512]; + CREATESTRUCTA *csA = (CREATESTRUCTA *)lParam; + CREATESTRUCTW csW = *(CREATESTRUCTW *)csA; + MDICREATESTRUCTW mdi_cs; + DWORD name_lenA = 0, name_lenW = 0, class_lenA = 0, class_lenW = 0; + + if (HIWORD(csA->lpszClass)) + { + class_lenA = strlen(csA->lpszClass) + 1; + RtlMultiByteToUnicodeSize( &class_lenW, csA->lpszClass, class_lenA ); + } + if (HIWORD(csA->lpszName)) + { + name_lenA = strlen(csA->lpszName) + 1; + RtlMultiByteToUnicodeSize( &name_lenW, csA->lpszName, name_lenA ); + } + + if (!(ptr = get_buffer( buffer, sizeof(buffer), class_lenW + name_lenW ))) break; + + if (class_lenW) + { + csW.lpszClass = ptr; + RtlMultiByteToUnicodeN( ptr, class_lenW, NULL, csA->lpszClass, class_lenA ); + } + if (name_lenW) + { + csW.lpszName = ptr + class_lenW/sizeof(WCHAR); + RtlMultiByteToUnicodeN( ptr + class_lenW/sizeof(WCHAR), name_lenW, NULL, + csA->lpszName, name_lenA ); + } + + if (GetWindowLongW(hwnd, GWL_EXSTYLE) & WS_EX_MDICHILD) + { + mdi_cs = *(MDICREATESTRUCTW *)csA->lpCreateParams; + mdi_cs.szTitle = csW.lpszName; + mdi_cs.szClass = csW.lpszClass; + csW.lpCreateParams = &mdi_cs; + } + + 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", + SPY_GetMsgName(msg, hwnd), wParam, lParam ); + return 0; + } + ret = callback( hwnd, msg, wParam, lParam, result, arg ); + if (!unmap) break; *result = WINPROC_UnmapMsg32ATo32W( hwnd, msg, wParam, lParam, *result, (callback == call_window_proc) ? arg : NULL /*FIXME: hack*/ ); + break; + } return ret; }
-static inline void *get_buffer( void *static_buffer, size_t size, size_t need ) -{ - if (size >= need) return static_buffer; - return HeapAlloc( GetProcessHeap(), 0, need ); -} - -static inline void free_buffer( void *static_buffer, void *buffer ) -{ - if (buffer != static_buffer) HeapFree( GetProcessHeap(), 0, buffer ); -} - /********************************************************************** * WINPROC_CallProcWtoA *