From 78ce662964af724668c4f939b9defc93b043067e Mon Sep 17 00:00:00 2001 From: Michael Martin Date: Mon, 2 Nov 2009 21:17:50 +0000 Subject: [PATCH] [user32] - Reapply changes from 40677 as the edit control does not receive the WM_COMMAND message from its context menu when doing clipboard ops. - Fixes crashes in applications created with visual basic when using edit controls context menu. - If we lose this in next sync, ill grovel and beg. svn path=/trunk/; revision=43925 --- reactos/dll/win32/user32/controls/edit.c | 72 ++++++++++-------------- 1 file changed, 29 insertions(+), 43 deletions(-) diff --git a/reactos/dll/win32/user32/controls/edit.c b/reactos/dll/win32/user32/controls/edit.c index 4ac3e451b66..c7ea5b27859 100644 --- a/reactos/dll/win32/user32/controls/edit.c +++ b/reactos/dll/win32/user32/controls/edit.c @@ -3381,43 +3381,6 @@ static LRESULT EDIT_WM_Char(EDITSTATE *es, WCHAR c) } -/********************************************************************* - * - * WM_COMMAND - * - */ -static void EDIT_WM_Command(EDITSTATE *es, INT code, INT id, HWND control) -{ - if (code || control) - return; - - switch (id) { - case EM_UNDO: - SendMessageW(es->hwndSelf, WM_UNDO, 0, 0); - break; - case WM_CUT: - SendMessageW(es->hwndSelf, WM_CUT, 0, 0); - break; - case WM_COPY: - SendMessageW(es->hwndSelf, WM_COPY, 0, 0); - break; - case WM_PASTE: - SendMessageW(es->hwndSelf, WM_PASTE, 0, 0); - break; - case WM_CLEAR: - SendMessageW(es->hwndSelf, WM_CLEAR, 0, 0); - break; - case EM_SETSEL: - EDIT_EM_SetSel(es, 0, (UINT)-1, FALSE); - EDIT_EM_ScrollCaret(es); - break; - default: - ERR("unknown menu item, please report\n"); - break; - } -} - - /********************************************************************* * * WM_CONTEXTMENU @@ -3445,6 +3408,7 @@ static void EDIT_WM_ContextMenu(EDITSTATE *es, INT x, INT y) UINT start = es->selection_start; UINT end = es->selection_end; + BOOL selectedItem; ORDER_UINT(start, end); /* undo */ @@ -3470,7 +3434,33 @@ static void EDIT_WM_ContextMenu(EDITSTATE *es, INT x, INT y) y = rc.top + (rc.bottom - rc.top) / 2; } - TrackPopupMenu(popup, TPM_LEFTALIGN | TPM_RIGHTBUTTON, x, y, 0, es->hwndSelf, NULL); + selectedItem = TrackPopupMenu(popup, TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD, x, y, 0, es->hwndSelf, NULL); + + switch (selectedItem) { + case EM_UNDO: + SendMessageW(es->hwndSelf, WM_UNDO, 0, 0); + break; + case WM_CUT: + SendMessageW(es->hwndSelf, WM_CUT, 0, 0); + break; + case WM_COPY: + SendMessageW(es->hwndSelf, WM_COPY, 0, 0); + break; + case WM_PASTE: + SendMessageW(es->hwndSelf, WM_PASTE, 0, 0); + break; + case WM_CLEAR: + SendMessageW(es->hwndSelf, WM_CLEAR, 0, 0); + break; + case EM_SETSEL: + EDIT_EM_SetSel(es, 0, (UINT)-1, FALSE); + EDIT_EM_ScrollCaret(es); + break; + default: + ERR("unknown menu item, please report\n"); + break; + } + DestroyMenu(menu); } @@ -5300,11 +5290,7 @@ LRESULT WINAPI EditWndProc_common( HWND hwnd, UINT msg, EDIT_WM_Clear(es); break; - case WM_COMMAND: - EDIT_WM_Command(es, HIWORD(wParam), LOWORD(wParam), (HWND)lParam); - break; - - case WM_CONTEXTMENU: + case WM_CONTEXTMENU: EDIT_WM_ContextMenu(es, (short)LOWORD(lParam), (short)HIWORD(lParam)); break;