[ros-diffs] [mjmartin] 43925: [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.

mjmartin at svn.reactos.org mjmartin at svn.reactos.org
Mon Nov 2 22:17:50 CET 2009


Author: mjmartin
Date: Mon Nov  2 22:17:50 2009
New Revision: 43925

URL: http://svn.reactos.org/svn/reactos?rev=43925&view=rev
Log:
[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.

Modified:
    trunk/reactos/dll/win32/user32/controls/edit.c

Modified: trunk/reactos/dll/win32/user32/controls/edit.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/user32/controls/edit.c?rev=43925&r1=43924&r2=43925&view=diff
==============================================================================
--- trunk/reactos/dll/win32/user32/controls/edit.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/user32/controls/edit.c [iso-8859-1] Mon Nov  2 22:17:50 2009
@@ -3383,15 +3383,60 @@
 
 /*********************************************************************
  *
- *	WM_COMMAND
- *
- */
-static void EDIT_WM_Command(EDITSTATE *es, INT code, INT id, HWND control)
-{
-	if (code || control)
-		return;
-
-	switch (id) {
+ *	WM_CONTEXTMENU
+ *
+ *	Note: the resource files resource/sysres_??.rc cannot define a
+ *		single popup menu.  Hence we use a (dummy) menubar
+ *		containing the single popup menu as its first item.
+ *
+ *	FIXME: the message identifiers have been chosen arbitrarily,
+ *		hence we use MF_BYPOSITION.
+ *		We might as well use the "real" values (anybody knows ?)
+ *		The menu definition is in resources/sysres_??.rc.
+ *		Once these are OK, we better use MF_BYCOMMAND here
+ *		(as we do in EDIT_WM_Command()).
+ *
+ */
+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;
+
+    BOOL selectedItem;
+	ORDER_UINT(start, end);
+
+	/* undo */
+	EnableMenuItem(popup, 0, MF_BYPOSITION | (EDIT_EM_CanUndo(es) && !(es->style & ES_READONLY) ? MF_ENABLED : MF_GRAYED));
+	/* cut */
+	EnableMenuItem(popup, 2, MF_BYPOSITION | ((end - start) && !(es->style & ES_PASSWORD) && !(es->style & ES_READONLY) ? MF_ENABLED : MF_GRAYED));
+	/* copy */
+	EnableMenuItem(popup, 3, MF_BYPOSITION | ((end - start) && !(es->style & ES_PASSWORD) ? MF_ENABLED : MF_GRAYED));
+	/* paste */
+	EnableMenuItem(popup, 4, MF_BYPOSITION | (IsClipboardFormatAvailable(CF_UNICODETEXT) && !(es->style & ES_READONLY) ? MF_ENABLED : MF_GRAYED));
+	/* delete */
+	EnableMenuItem(popup, 5, MF_BYPOSITION | ((end - start) && !(es->style & ES_READONLY) ? MF_ENABLED : MF_GRAYED));
+	/* select all */
+	EnableMenuItem(popup, 7, MF_BYPOSITION | (start || (end != get_text_length(es)) ? MF_ENABLED : MF_GRAYED));
+
+        if (x == -1 && y == -1) /* passed via VK_APPS press/release */
+        {
+            RECT rc;
+            /* Windows places the menu at the edit's center in this case */
+            GetClientRect(es->hwndSelf, &rc);
+            MapWindowPoints(es->hwndSelf, 0, (POINT *)&rc, 2);
+            x = rc.left + (rc.right - rc.left) / 2;
+            y = rc.top + (rc.bottom - rc.top) / 2;
+        }
+
+	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;
@@ -3415,62 +3460,7 @@
 			ERR("unknown menu item, please report\n");
 			break;
 	}
-}
-
-
-/*********************************************************************
- *
- *	WM_CONTEXTMENU
- *
- *	Note: the resource files resource/sysres_??.rc cannot define a
- *		single popup menu.  Hence we use a (dummy) menubar
- *		containing the single popup menu as its first item.
- *
- *	FIXME: the message identifiers have been chosen arbitrarily,
- *		hence we use MF_BYPOSITION.
- *		We might as well use the "real" values (anybody knows ?)
- *		The menu definition is in resources/sysres_??.rc.
- *		Once these are OK, we better use MF_BYCOMMAND here
- *		(as we do in EDIT_WM_Command()).
- *
- */
-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;
-
-	ORDER_UINT(start, end);
-
-	/* undo */
-	EnableMenuItem(popup, 0, MF_BYPOSITION | (EDIT_EM_CanUndo(es) && !(es->style & ES_READONLY) ? MF_ENABLED : MF_GRAYED));
-	/* cut */
-	EnableMenuItem(popup, 2, MF_BYPOSITION | ((end - start) && !(es->style & ES_PASSWORD) && !(es->style & ES_READONLY) ? MF_ENABLED : MF_GRAYED));
-	/* copy */
-	EnableMenuItem(popup, 3, MF_BYPOSITION | ((end - start) && !(es->style & ES_PASSWORD) ? MF_ENABLED : MF_GRAYED));
-	/* paste */
-	EnableMenuItem(popup, 4, MF_BYPOSITION | (IsClipboardFormatAvailable(CF_UNICODETEXT) && !(es->style & ES_READONLY) ? MF_ENABLED : MF_GRAYED));
-	/* delete */
-	EnableMenuItem(popup, 5, MF_BYPOSITION | ((end - start) && !(es->style & ES_READONLY) ? MF_ENABLED : MF_GRAYED));
-	/* select all */
-	EnableMenuItem(popup, 7, MF_BYPOSITION | (start || (end != get_text_length(es)) ? MF_ENABLED : MF_GRAYED));
-
-        if (x == -1 && y == -1) /* passed via VK_APPS press/release */
-        {
-            RECT rc;
-            /* Windows places the menu at the edit's center in this case */
-            GetClientRect(es->hwndSelf, &rc);
-            MapWindowPoints(es->hwndSelf, 0, (POINT *)&rc, 2);
-            x = rc.left + (rc.right - rc.left) / 2;
-            y = rc.top + (rc.bottom - rc.top) / 2;
-        }
-
-	TrackPopupMenu(popup, TPM_LEFTALIGN | TPM_RIGHTBUTTON, x, y, 0, es->hwndSelf, NULL);
+
 	DestroyMenu(menu);
 }
 
@@ -5300,11 +5290,7 @@
 		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;
 




More information about the Ros-diffs mailing list