Module: wine Branch: refs/heads/master Commit: 19b428755cccd3b70513e36a4680ad9c81f575ae URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=19b428755cccd3b70513e36a...
Author: Alexandre Julliard julliard@winehq.org Date: Sat May 20 18:55:34 2006 +0200
user: Added fast A->W mapping for LB_GETTEXT and CB_GETLBTEXT.
---
dlls/user/winproc.c | 41 ++++++++++++++++++----------------------- 1 files changed, 18 insertions(+), 23 deletions(-)
diff --git a/dlls/user/winproc.c b/dlls/user/winproc.c index 8e71bfc..470bbce 100644 --- a/dlls/user/winproc.c +++ b/dlls/user/winproc.c @@ -775,17 +775,6 @@ static INT WINPROC_MapMsg32ATo32W( HWND case LB_GETTEXTLEN: return 1; /* need to map result */
- case LB_GETTEXT: /* FIXME: fixed sized buffer */ - case CB_GETLBTEXT: - if ( WINPROC_TestLBForStr( hwnd, msg )) - { - LPARAM *ptr = HeapAlloc( GetProcessHeap(), 0, 512 * sizeof(WCHAR) + sizeof(LPARAM) ); - if (!ptr) return -1; - *ptr++ = *plparam; /* Store previous lParam */ - *plparam = (LPARAM)ptr; - } - return 1; - /* Multiline edit */ case EM_GETLINE: { WORD len = (WORD)*plparam; @@ -885,18 +874,6 @@ static LRESULT WINPROC_UnmapMsg32ATo32W( HeapFree( GetProcessHeap(), 0, (void *)lParam ); break;
- case LB_GETTEXT: - case CB_GETLBTEXT: - if ( WINPROC_TestLBForStr( hwnd, msg )) - { - LPARAM *ptr = (LPARAM *)lParam - 1; - if (result >= 0) - result = WideCharToMultiByte( CP_ACP, 0, (LPWSTR)lParam, -1, - (LPSTR)*ptr, 0x7fffffff, NULL, NULL ) - 1; - HeapFree( GetProcessHeap(), 0, ptr ); - } - break; - /* Multiline edit */ case EM_GETLINE: { @@ -2713,6 +2690,24 @@ LRESULT WINPROC_CallProcAtoW( winproc_ca } break;
+ case LB_GETTEXT: + case CB_GETLBTEXT: + if (lParam && WINPROC_TestLBForStr( hwnd, msg )) + { + WCHAR buffer[512]; /* FIXME: fixed sized buffer */ + + ret = callback( hwnd, msg, wParam, (LPARAM)buffer, result, arg ); + if (*result >= 0) + { + DWORD len; + RtlUnicodeToMultiByteN( (LPSTR)lParam, ~0u, &len, + buffer, (strlenW(buffer) + 1) * sizeof(WCHAR) ); + *result = len - 1; + } + } + else ret = callback( hwnd, msg, wParam, lParam, result, arg ); + break; + default: if( (unmap = WINPROC_MapMsg32ATo32W( hwnd, msg, &wParam, &lParam )) == -1) { ERR_(msg)("Message translation failed. (msg=%s,wp=%08x,lp=%08lx)\n",