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