[ros-diffs] [jimtabor] 23169: User32 Implement MenuTrackKbdMenuBar, it does work but, alt f works but hit alt again goes into a message loop. So hit alt f than esc esc. If hit alt f than alt v or something else the popup menu stays displayed until the program has terminated.

jimtabor at svn.reactos.org jimtabor at svn.reactos.org
Wed Jul 19 09:10:57 CEST 2006


Author: jimtabor
Date: Wed Jul 19 11:10:56 2006
New Revision: 23169

URL: http://svn.reactos.org/svn/reactos?rev=23169&view=rev
Log:
User32 Implement MenuTrackKbdMenuBar, it does work but, alt f works but hit alt again goes into a message loop. So hit alt f than esc esc. If hit alt f than alt v or something else the popup menu stays displayed until the program has terminated.

Modified:
    trunk/reactos/dll/win32/user32/include/menu.h
    trunk/reactos/dll/win32/user32/windows/defwnd.c
    trunk/reactos/dll/win32/user32/windows/menu.c

Modified: trunk/reactos/dll/win32/user32/include/menu.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/user32/include/menu.h?rev=23169&r1=23168&r2=23169&view=diff
==============================================================================
--- trunk/reactos/dll/win32/user32/include/menu.h (original)
+++ trunk/reactos/dll/win32/user32/include/menu.h Wed Jul 19 11:10:56 2006
@@ -17,6 +17,6 @@
 VOID
 MenuTrackMouseMenuBar(HWND hWnd, ULONG Ht, POINT Pt);
 VOID
-MenuTrackKbdMenuBar(HWND hWnd, ULONG wParam, ULONG Key);
+MenuTrackKbdMenuBar(HWND hWnd, UINT wParam, WCHAR wChar);
 
 #endif /* __LIB_USER32_INCLUDE_MENU_H */

Modified: trunk/reactos/dll/win32/user32/windows/defwnd.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/user32/windows/defwnd.c?rev=23169&r1=23168&r2=23169&view=diff
==============================================================================
--- trunk/reactos/dll/win32/user32/windows/defwnd.c (original)
+++ trunk/reactos/dll/win32/user32/windows/defwnd.c Wed Jul 19 11:10:56 2006
@@ -766,9 +766,10 @@
 
 
 LRESULT
-DefWndHandleSysCommand(HWND hWnd, WPARAM wParam, POINT Pt)
+DefWndHandleSysCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
 {
   WINDOWPLACEMENT wp;
+  POINT Pt;
 
   switch (wParam & 0xfff0)
     {
@@ -804,16 +805,24 @@
         SendMessageA(hWnd, WM_CLOSE, 0, 0);
         break;
       case SC_MOUSEMENU:
-        MenuTrackMouseMenuBar(hWnd, wParam & 0x000f, Pt);
+        {
+          Pt.x = (short)LOWORD(lParam);
+          Pt.y = (short)HIWORD(lParam);
+          MenuTrackMouseMenuBar(hWnd, wParam & 0x000f, Pt);
+        }
 	break;
       case SC_KEYMENU:
-        MenuTrackKbdMenuBar(hWnd, wParam, Pt.x);
+        MenuTrackKbdMenuBar(hWnd, wParam, (WCHAR)lParam);
 	break;
       case SC_VSCROLL:
       case SC_HSCROLL:
-        DefWndTrackScrollBar(hWnd, wParam, Pt);
+        {
+          Pt.x = (short)LOWORD(lParam);
+          Pt.y = (short)HIWORD(lParam);
+          DefWndTrackScrollBar(hWnd, wParam, Pt);
+        }
 	break;
-
+        
       default:
 	/* FIXME: Implement */
         UNIMPLEMENTED;
@@ -1305,13 +1314,7 @@
         }
 
         case WM_SYSCOMMAND:
-        {
-            POINT Pt;
-            Pt.x = GET_X_LPARAM(lParam);
-            Pt.y = GET_Y_LPARAM(lParam);
-            return (DefWndHandleSysCommand(hWnd, wParam, Pt));
-        }
-
+            return (DefWndHandleSysCommand(hWnd, wParam, lParam));
 
         case WM_KEYDOWN:
             if(wParam == VK_F10) iF10Key = VK_F10;

Modified: trunk/reactos/dll/win32/user32/windows/menu.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/user32/windows/menu.c?rev=23169&r1=23168&r2=23169&view=diff
==============================================================================
--- trunk/reactos/dll/win32/user32/windows/menu.c (original)
+++ trunk/reactos/dll/win32/user32/windows/menu.c Wed Jul 19 11:10:56 2006
@@ -3320,9 +3320,13 @@
           fRemove = TRUE;  /* Keyboard messages are always removed */
           switch(Msg.message)
             {
+              case WM_SYSKEYDOWN:
               case WM_KEYDOWN:
                 switch(Msg.wParam)
                   {
+                    case VK_MENU:
+                      fEndMenu = TRUE;
+                      break;
                     case VK_HOME:
                     case VK_END:
                       if (MenuGetRosMenuInfo(&MenuInfo, Mt.CurrentMenu))
@@ -3408,20 +3412,6 @@
                       break;
                   }
                 break;  /* WM_KEYDOWN */
-
-              case WM_SYSKEYDOWN:
-                switch (Msg.wParam)
-                  {
-                    DbgPrint("Menu.c WM_SYSKEYDOWN wPram %d\n",Msg.wParam);
-                    case VK_MENU:
-                      fEndMenu = TRUE;
-                      break;
-                    case VK_LMENU:
-                      fEndMenu = TRUE;
-                      break;
-                  }
-                break;  /* WM_SYSKEYDOWN */
-
               case WM_CHAR:
               case WM_SYSCHAR:
                 {
@@ -3566,8 +3556,73 @@
 
 
 VOID
-MenuTrackKbdMenuBar(HWND hWnd, ULONG wParam, ULONG Key)
-{
+MenuTrackKbdMenuBar(HWND hWnd, UINT wParam, WCHAR wChar)
+{
+    UINT uItem = NO_SELECTED_ITEM;
+    HMENU hTrackMenu;
+    ROSMENUINFO MenuInfo;
+    UINT wFlags = TPM_ENTERIDLEEX | TPM_LEFTALIGN | TPM_LEFTBUTTON;
+
+    DPRINT("hwnd %p wParam 0x%04x wChar 0x%04x\n", hWnd, wParam, wChar);
+
+    /* find window that has a menu */
+
+    while (!((GetWindowLongW( hWnd, GWL_STYLE ) &
+                                         (WS_CHILD | WS_POPUP)) != WS_CHILD))
+        if (!(hWnd = GetAncestor( hWnd, GA_PARENT ))) return;
+
+    /* check if we have to track a system menu */
+
+    hTrackMenu = GetMenu( hWnd );
+    if (!hTrackMenu || IsIconic(hWnd) || wChar == ' ' )
+    {
+        if (!(GetWindowLongW( hWnd, GWL_STYLE ) & WS_SYSMENU)) return;
+        hTrackMenu = NtUserGetSystemMenu(hWnd, FALSE);
+        uItem = 0;
+        wParam |= HTSYSMENU; /* prevent item lookup */
+    }
+
+    if (!IsMenu( hTrackMenu )) return;
+
+    MenuInitTracking( hWnd, hTrackMenu, FALSE, wFlags );
+
+    if (! MenuGetRosMenuInfo(&MenuInfo, hTrackMenu))
+    {
+      goto track_menu;
+    }
+
+    if( wChar && wChar != ' ' )
+    {
+        uItem = MenuFindItemByKey( hWnd, &MenuInfo, wChar, (wParam & HTSYSMENU) );
+        if ( uItem >= (UINT)(-2) )
+        {
+            if( uItem == (UINT)(-1) ) MessageBeep(0);
+            /* schedule end of menu tracking */
+            wFlags |= TF_ENDMENU;
+            goto track_menu;
+        }
+    }
+
+    MenuSelectItem( hWnd, &MenuInfo, uItem, TRUE, 0 );
+
+    if (wParam & HTSYSMENU)
+    {
+        /* prevent sysmenu activation for managed windows on Alt down/up */
+//        if (GetPropA( hwnd, "__wine_x11_managed" ))
+            wFlags |= TF_ENDMENU; /* schedule end of menu tracking */
+    }
+    else
+    {
+        if( uItem == NO_SELECTED_ITEM )
+            MenuMoveSelection( hWnd, &MenuInfo, ITEM_NEXT );
+        else
+            PostMessageW( hWnd, WM_KEYDOWN, VK_DOWN, 0L );
+    }
+
+track_menu:
+    MenuTrackMenu( hTrackMenu, wFlags, 0, 0, hWnd, NULL );
+    MenuExitTracking( hWnd );
+
 }
 
 




More information about the Ros-diffs mailing list