Replace GetModuleHandle("user32.dll") with User32Instance.
[reactos.git] / reactos / lib / user32 / windows / menu.c
index bc70301..6eeb3b0 100644 (file)
@@ -1043,9 +1043,7 @@ NTSTATUS STDCALL
 User32LoadSysMenuTemplateForKernel(PVOID Arguments, ULONG ArgumentLength)
 {
   LRESULT Result;
-  HMODULE hUser32;
-  hUser32 = GetModuleHandleW(L"USER32");
-  Result = (LRESULT)LoadMenuW(hUser32, L"SYSMENU");
+  Result = (LRESULT)LoadMenuW(User32Instance, L"SYSMENU");
   return(ZwCallbackReturn(&Result, sizeof(LRESULT), STATUS_SUCCESS));
 }
 
@@ -1077,6 +1075,8 @@ MenuInit(VOID)
     if(hMenuFontBold == NULL)
     {
       DbgPrint("MenuInit(): CreateFontIndirectW(hMenuFontBold) failed!\n");
+      DeleteObject(hMenuFont);
+      hMenuFont = NULL;
       return FALSE;
     }
   }
@@ -1085,6 +1085,24 @@ MenuInit(VOID)
 }
 
 
+VOID
+MenuCleanup(VOID)
+{
+  if (hMenuFont)
+  {
+    DeleteObject(hMenuFont);
+    hMenuFont = NULL;
+  }
+
+  if (hMenuFontBold)
+  {
+    DeleteObject(hMenuFontBold);
+    hMenuFontBold = NULL;
+  }
+}
+
+
+
 /***********************************************************************
  *           MenuCalcItemSize
  *
@@ -3275,9 +3293,13 @@ MenuTrackMenu(HMENU Menu, UINT Flags, INT x, INT y,
               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 */
 
@@ -4026,7 +4048,7 @@ InsertMenuA(
     mii.fMask |= MIIM_ID;
     mii.wID = (UINT)uIDNewItem;
   }
-  return InsertMenuItemA(hMenu, uPosition, (BOOL)!(MF_BYPOSITION & uFlags), &mii);
+  return InsertMenuItemA(hMenu, uPosition, (BOOL)((MF_BYPOSITION & uFlags) > 0), &mii);
 }
 
 
@@ -4185,7 +4207,7 @@ InsertMenuW(
     mii.fMask |= MIIM_ID;
     mii.wID = (UINT)uIDNewItem;
   }
-  return InsertMenuItemW(hMenu, uPosition, (BOOL)!(MF_BYPOSITION & uFlags), &mii);
+  return InsertMenuItemW(hMenu, uPosition, (BOOL)((MF_BYPOSITION & uFlags) > 0), &mii);
 }
 
 
@@ -4314,6 +4336,7 @@ ModifyMenuA(
   LPCSTR lpNewItem)
 {
   MENUITEMINFOA mii;
+  memset( &mii, 0, sizeof(mii) );
   mii.cbSize = sizeof(MENUITEMINFOA);
   mii.fMask = MIIM_FTYPE | MIIM_STRING | MIIM_STATE;
   mii.fType = 0;
@@ -4323,7 +4346,7 @@ ModifyMenuA(
 
   if(!GetMenuItemInfoA( hMnu,
                         uPosition,
-                       (BOOL)!(MF_BYPOSITION & uFlags),
+                       (BOOL)(MF_BYPOSITION & uFlags),
                         &mii)) return FALSE;
 
   if(uFlags & MF_BITMAP)
@@ -4393,7 +4416,7 @@ ModifyMenuA(
 
   return SetMenuItemInfoA( hMnu,
                            uPosition,
-                          (BOOL)!(MF_BYPOSITION & uFlags),
+                          (BOOL)(MF_BYPOSITION & uFlags),
                            &mii);
 }
 
@@ -4411,16 +4434,16 @@ ModifyMenuW(
   LPCWSTR lpNewItem)
 {
   MENUITEMINFOW mii;
+  memset ( &mii, 0, sizeof(mii) );
   mii.cbSize = sizeof(MENUITEMINFOW);
   mii.fMask = MIIM_FTYPE | MIIM_STRING | MIIM_STATE;
-  mii.fType = 0;
   mii.fState = MFS_ENABLED;
 
   UNIMPLEMENTED;
 
   if(!NtUserMenuItemInfo( hMnu,
                           uPosition,
-                         (BOOL)!(MF_BYPOSITION & uFlags),
+                         (BOOL)(MF_BYPOSITION & uFlags),
                          (PROSMENUITEMINFO) &mii,
                           FALSE)) return FALSE;
 
@@ -4438,10 +4461,10 @@ ModifyMenuW(
   }
   else
   {
-    if(mii.dwTypeData != NULL)
+    /*if(mii.dwTypeData != NULL)
     {
       HeapFree(GetProcessHeap(),0, mii.dwTypeData);
-    }
+    }*/
     if (*lpNewItem == '\b')
     {
        mii.fType |= MF_HELP;
@@ -4490,7 +4513,7 @@ ModifyMenuW(
 
   return SetMenuItemInfoW( hMnu,
                            uPosition,
-                           (BOOL)!(MF_BYPOSITION & uFlags),
+                           (BOOL)(MF_BYPOSITION & uFlags),
                            &mii);
 }
 
@@ -4554,7 +4577,7 @@ SetMenuInfo(
 
 
 /*
- * @unimplemented
+ * @implemented
  */
 BOOL
 STDCALL
@@ -4565,13 +4588,28 @@ SetMenuItemBitmaps(
   HBITMAP hBitmapUnchecked,
   HBITMAP hBitmapChecked)
 {
-  UNIMPLEMENTED;
-  return FALSE;
+  ROSMENUITEMINFO uItem;
+
+  if(!(NtUserMenuItemInfo(hMenu, uPosition, 
+                 (BOOL)(MF_BYPOSITION & uFlags), &uItem, FALSE))) return FALSE;
+
+  if (!hBitmapChecked && !hBitmapUnchecked)
+  {
+    uItem.fState &= ~MF_USECHECKBITMAPS;
+  }
+  else  /* Install new bitmaps */
+  {
+    uItem.hbmpChecked = hBitmapChecked;
+    uItem.hbmpUnchecked = hBitmapUnchecked;
+    uItem.fState |= MF_USECHECKBITMAPS;
+  }
+ return NtUserMenuItemInfo(hMenu, uPosition,
+                                 (BOOL)(MF_BYPOSITION & uFlags), &uItem, TRUE);
 }
 
 
 /*
- * @unimplemented
+ * @implemented
  */
 BOOL
 STDCALL
@@ -4614,7 +4652,7 @@ SetMenuItemInfoA(
 
 
 /*
- * @unimplemented
+ * @implemented
  */
 BOOL
 STDCALL
@@ -4627,7 +4665,10 @@ SetMenuItemInfoW(
   MENUITEMINFOW MenuItemInfoW;
 
   RtlCopyMemory(&MenuItemInfoW, lpmii, min(lpmii->cbSize, sizeof(MENUITEMINFOW)));
-  MenuItemInfoW.cch = wcslen(MenuItemInfoW.dwTypeData);
+  if (0 != (MenuItemInfoW.fMask & MIIM_STRING))
+  {
+    MenuItemInfoW.cch = wcslen(MenuItemInfoW.dwTypeData);
+  }
 
   return NtUserMenuItemInfo(hMenu, uItem, fByPosition,
                             (PROSMENUITEMINFO)&MenuItemInfoW, TRUE);