Jason Edmeades : user32: Skip system menu entries when using keyboard.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Aug 9 08:23:18 CDT 2007


Module: wine
Branch: master
Commit: 39d615eeed7f63b63beca600871f1666bd318484
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=39d615eeed7f63b63beca600871f1666bd318484

Author: Jason Edmeades <jason.edmeades at googlemail.com>
Date:   Mon Aug  6 22:51:01 2007 +0100

user32: Skip system menu entries when using keyboard.

---

 dlls/user32/menu.c |   40 ++++++++++++++++++++++++++++++++++++++--
 1 files changed, 38 insertions(+), 2 deletions(-)

diff --git a/dlls/user32/menu.c b/dlls/user32/menu.c
index 1660c20..2f57779 100644
--- a/dlls/user32/menu.c
+++ b/dlls/user32/menu.c
@@ -2668,9 +2668,39 @@ static void MENU_SetCapture( HWND hwnd )
 static LRESULT MENU_DoNextMenu( MTRACKER* pmt, UINT vk )
 {
     POPUPMENU *menu = MENU_GetMenu( pmt->hTopMenu );
+    BOOL atEnd = FALSE;
 
-    if( (vk == VK_LEFT &&  menu->FocusedItem == 0 ) ||
-        (vk == VK_RIGHT && menu->FocusedItem == menu->nItems - 1))
+    /* When skipping left, we need to do something special after the
+       first menu.                                                  */
+    if (vk == VK_LEFT && menu->FocusedItem == 0)
+    {
+        atEnd = TRUE;
+    }
+    /* When skipping right, for the non-system menu, we need to
+       handle the last non-special menu item (ie skip any window
+       icons such as MDI maximize, restore or close)             */
+    else if ((vk == VK_RIGHT) && !IS_SYSTEM_MENU(menu))
+    {
+        int i = menu->FocusedItem + 1;
+        while (i < (menu->nItems - 1)) {
+            if ((menu->items[i].wID >= SC_SIZE &&
+                 menu->items[i].wID <= SC_RESTORE)) {
+                i++;
+            } else break;
+        }
+        if (i == (menu->nItems - 1)) {
+            atEnd = TRUE;
+        }
+    }
+    /* When skipping right, we need to cater for the system menu */
+    else if ((vk == VK_RIGHT) && IS_SYSTEM_MENU(menu))
+    {
+        if (menu->FocusedItem == (menu->nItems - 1)) {
+            atEnd = TRUE;
+        }
+    }
+
+    if( atEnd )
     {
         MDINEXTMENU next_menu;
 	HMENU hNewMenu;
@@ -2699,6 +2729,12 @@ static LRESULT MENU_DoNextMenu( MTRACKER* pmt, UINT vk )
 	        {
 		    menu = MENU_GetMenu( hNewMenu );
 		    id = menu->nItems - 1;
+
+                    /* Skip backwards over any system predefined icons,
+                       eg. MDI close, restore etc icons                 */
+                    while ((id > 0) &&
+                           (menu->items[id].wID >= SC_SIZE &&
+                            menu->items[id].wID <= SC_RESTORE)) id--;
 	        }
 	    }
 	    else if (style & WS_SYSMENU )




More information about the wine-cvs mailing list