diff --git a/reactos/dll/win32/user32/controls/edit.c b/reactos/dll/win32/user32/controls/edit.c index bf7c3eec81d..410e486f159 100644 --- a/reactos/dll/win32/user32/controls/edit.c +++ b/reactos/dll/win32/user32/controls/edit.c @@ -426,8 +426,8 @@ static void EDIT_BuildLineDefs_ML(EDITSTATE *es, INT istart, INT iend, INT delta /* The buffer has been expanded, create a new line and insert it into the link list */ LINEDEF *new_line = HeapAlloc(GetProcessHeap(), 0, sizeof(LINEDEF)); - if (new_line == NULL) - break; + if (new_line == NULL) // reactos r33509 + break; // reactos r33509 new_line->next = previous_line->next; previous_line->next = new_line; current_line = new_line; @@ -1109,8 +1109,7 @@ static void EDIT_LockBuffer(EDITSTATE *es) if(textA) { HLOCAL hloc32W_new; - UINT countW_new = MultiByteToWideChar(CP_ACP, 0, textA, countA, NULL, 0); - TRACE("%d bytes translated to %d WCHARs\n", countA, countW_new); + UINT countW_new = MultiByteToWideChar(CP_ACP, 0, textA, -1, NULL, 0); if(countW_new > es->buffer_size + 1) { UINT alloc_size = ROUND_TO_GROW(countW_new * sizeof(WCHAR)); @@ -1125,14 +1124,11 @@ static void EDIT_LockBuffer(EDITSTATE *es) else WARN("FAILED! Will synchronize partially\n"); } + es->text = LocalLock(es->hloc32W); + MultiByteToWideChar(CP_ACP, 0, textA, -1, es->text, es->buffer_size + 1); + LocalUnlock(es->hloc32A); } - /*TRACE("Locking 32-bit UNICODE buffer\n");*/ - es->text = LocalLock(es->hloc32W); - if(textA) - { - MultiByteToWideChar(CP_ACP, 0, textA, countA, es->text, es->buffer_size + 1); - LocalUnlock(es->hloc32A); - } + else es->text = LocalLock(es->hloc32W); } if(es->flags & EF_APP_HAS_HANDLE) text_buffer_changed(es); es->lock_count++; @@ -1165,7 +1161,6 @@ static void EDIT_UnlockBuffer(EDITSTATE *es, BOOL force) if (force || (es->lock_count == 1)) { if (es->hloc32W) { - CHAR *textA = NULL; // ReactOS hacked! UINT countA = 0; UINT countW = get_text_length(es) + 1; @@ -1190,13 +1185,9 @@ static void EDIT_UnlockBuffer(EDITSTATE *es, BOOL force) else WARN("FAILED! Will synchronize partially\n"); } - textA = LocalLock(es->hloc32A); - } - - if(textA) - { - WideCharToMultiByte(CP_ACP, 0, es->text, countW, textA, countA, NULL, NULL); - LocalUnlock(es->hloc32A); + WideCharToMultiByte(CP_ACP, 0, es->text, countW, + LocalLock(es->hloc32A), countA, NULL, NULL); + LocalUnlock(es->hloc32A); } LocalUnlock(es->hloc32W); @@ -2799,11 +2790,11 @@ static BOOL EDIT_EM_SetTabStops(EDITSTATE *es, INT count, const INT *tabs) es->tabs = NULL; else { es->tabs = HeapAlloc(GetProcessHeap(), 0, count * sizeof(INT)); - if (es->tabs == NULL) + if (es->tabs == NULL) // reactos r33503 { es->tabs_count = 0; return FALSE; - } + } // reactos r33503 memcpy(es->tabs, tabs, count * sizeof(INT)); } return TRUE; @@ -2847,8 +2838,8 @@ static BOOL EDIT_EM_Undo(EDITSTATE *es) ulength = strlenW(es->undo_text); utext = HeapAlloc(GetProcessHeap(), 0, (ulength + 1) * sizeof(WCHAR)); - if (utext == NULL) - return FALSE; + if (utext == NULL) // reactos r33503 + return FALSE; // reactos r33503 strcpyW(utext, es->undo_text); @@ -2877,7 +2868,7 @@ static BOOL EDIT_EM_Undo(EDITSTATE *es) * controls without ES_WANTRETURN would attempt to detect whether it is inside * a dialog box or not. */ -static BOOL EDIT_IsInsideDialog(EDITSTATE *es) +static inline BOOL EDIT_IsInsideDialog(EDITSTATE *es) { return (es->flags & EF_DIALOGMODE); } @@ -3109,11 +3100,7 @@ static void EDIT_WM_Command(EDITSTATE *es, INT code, INT id, HWND control) */ static void EDIT_WM_ContextMenu(EDITSTATE *es, INT x, INT y) { -#ifdef __REACTOS__ - HMENU menu = LoadMenuA(User32Instance, "EDITMENU"); -#else HMENU menu = LoadMenuA(user32_module, "EDITMENU"); -#endif HMENU popup = GetSubMenu(menu, 0); UINT start = es->selection_start; UINT end = es->selection_end; @@ -3144,6 +3131,10 @@ static void EDIT_WM_ContextMenu(EDITSTATE *es, INT x, INT y) y = rc.top + (rc.bottom - rc.top) / 2; } + if (!(es->flags & EF_FOCUSED)) + SetFocus(es->hwndSelf); + +#ifdef __REACTOS__ selectedItem = TrackPopupMenu(popup, TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD, x, y, 0, es->hwndSelf, NULL); // Added see Revision 43925 comments. switch (selectedItem) { @@ -3170,7 +3161,7 @@ static void EDIT_WM_ContextMenu(EDITSTATE *es, INT x, INT y) ERR("unknown menu item, please report\n"); break; } - +#endif DestroyMenu(menu); } @@ -3682,7 +3673,7 @@ static void EDIT_WM_SetFont(EDITSTATE *es, HFONT font, BOOL redraw) EDIT_UpdateText(es, NULL, TRUE); if (es->flags & EF_FOCUSED) { DestroyCaret(); - CreateCaret(es->hwndSelf, 0, 2, es->line_height); + CreateCaret(es->hwndSelf, 0, 1, es->line_height); EDIT_SetCaretPos(es, es->selection_end, es->flags & EF_AFTER_WRAP); ShowCaret(es->hwndSelf); @@ -4428,10 +4419,10 @@ static LRESULT EDIT_WM_Create(EDITSTATE *es, LPCWSTR name) /********************************************************************* * - * WM_DESTROY + * WM_NCDESTROY * */ -static LRESULT EDIT_WM_Destroy(EDITSTATE *es) +static LRESULT EDIT_WM_NCDestroy(EDITSTATE *es) { LINEDEF *pc, *pp; @@ -4472,8 +4463,7 @@ static inline LRESULT DefWindowProcT(HWND hwnd, UINT msg, WPARAM wParam, LPARAM * The messages are in the order of the actual integer values * (which can be found in include/windows.h) */ -LRESULT WINAPI EditWndProc_common( HWND hwnd, UINT msg, - WPARAM wParam, LPARAM lParam, BOOL unicode ) +LRESULT WINAPI EditWndProc_common( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam, BOOL unicode ) { EDITSTATE *es = (EDITSTATE *)GetWindowLongPtrW( hwnd, 0 ); LRESULT result = 0; @@ -4495,7 +4485,7 @@ LRESULT WINAPI EditWndProc_common( HWND hwnd, UINT msg, if (!es && msg != WM_NCCREATE) return DefWindowProcT(hwnd, msg, wParam, lParam, unicode); - if (es && (msg != WM_DESTROY)) EDIT_LockBuffer(es); + if (es && (msg != WM_NCDESTROY)) EDIT_LockBuffer(es); switch (msg) { case EM_GETSEL: @@ -4570,13 +4560,9 @@ LRESULT WINAPI EditWndProc_common( HWND hwnd, UINT msg, break; /* these messages missing from specs */ - case WM_USER+15: case 0x00bf: - case WM_USER+16: case 0x00c0: - case WM_USER+19: case 0x00c3: - case WM_USER+26: case 0x00ca: FIXME("undocumented message 0x%x, please report\n", msg); result = DefWindowProcW(hwnd, msg, wParam, lParam); @@ -4733,8 +4719,8 @@ LRESULT WINAPI EditWndProc_common( HWND hwnd, UINT msg, result = EDIT_WM_NCCreate(hwnd, (LPCREATESTRUCTW)lParam, unicode); break; - case WM_DESTROY: - result = EDIT_WM_Destroy(es); + case WM_NCDESTROY: + result = EDIT_WM_NCDestroy(es); es = NULL; #ifdef __REACTOS__ NtUserSetWindowFNID(hwnd, FNID_DESTROY); @@ -5058,10 +5044,10 @@ const struct builtin_class_descr EDIT_builtin_class = CS_DBLCLKS | CS_PARENTDC, /* style */ EditWndProcA, /* procA */ EditWndProcW, /* procW */ -#ifdef _WIN64 - sizeof(EDITSTATE *), /* extra */ -#else +#ifndef _WIN64 sizeof(EDITSTATE *) + sizeof(WORD), /* extra */ +#else + sizeof(EDITSTATE *), /* extra */ #endif IDC_IBEAM, /* cursor */ 0 /* brush */ diff --git a/reactos/dll/win32/user32/include/user32p.h b/reactos/dll/win32/user32/include/user32p.h index 9a27bbc19ac..9dd8ae2860e 100644 --- a/reactos/dll/win32/user32/include/user32p.h +++ b/reactos/dll/win32/user32/include/user32p.h @@ -106,6 +106,7 @@ /* Internal Thread Data */ extern HINSTANCE User32Instance; +#define user32_module User32Instance extern HINSTANCE hImmInstance; /* Critical Section*/