Alexandre Julliard : user: Added fast A->
W mapping for WM_CREATE and WM_NCCREATE.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon May 22 05:19:05 CDT 2006
Module: wine
Branch: refs/heads/master
Commit: 899133d7f726d9350ace45c5fc3d5e914e1de19c
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=899133d7f726d9350ace45c5fc3d5e914e1de19c
Author: Alexandre Julliard <julliard at 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
*
More information about the wine-cvs
mailing list