ReactOS  0.4.15-dev-3691-g3a4e5a6
menu.c File Reference
#include <win32k.h>
Include dependency graph for menu.c:

Go to the source code of this file.

Classes

struct  MTRACKER
 

Macros

#define MM_SETMENUHANDLE   (WM_USER + 0)
 
#define MM_GETMENUHANDLE   (WM_USER + 1)
 
#define TF_ENDMENU   0x10000
 
#define TF_SUSPENDPOPUP   0x20000
 
#define TF_SKIPREMOVE   0x40000
 
#define MAXMENUDEPTH   30
 
#define MNS_STYLE_MASK   (MNS_NOCHECK|MNS_MODELESS|MNS_DRAGDROP|MNS_AUTODISMISS|MNS_NOTIFYBYPOS|MNS_CHECKORBMP)
 
#define MENUITEMINFO_TYPE_MASK
 
#define TYPE_MASK   (MENUITEMINFO_TYPE_MASK | MF_POPUP | MF_SYSMENU)
 
#define STATE_MASK   (~TYPE_MASK)
 
#define MENUITEMINFO_STATE_MASK   (STATE_MASK & ~(MF_BYPOSITION | MF_MOUSESELECT))
 
#define MII_STATE_MASK   (MFS_GRAYED|MFS_CHECKED|MFS_HILITE|MFS_DEFAULT)
 
#define IS_SYSTEM_MENU(MenuInfo)   (!((MenuInfo)->fFlags & MNF_POPUP) && ((MenuInfo)->fFlags & MNF_SYSMENU))
 
#define IS_BITMAP_ITEM(flags)   (MF_BITMAP == MENU_ITEM_TYPE(flags))
 
#define IS_MAGIC_BITMAP(id)   ((id) && ((INT_PTR)(id) < 12) && ((INT_PTR)(id) >= -1))
 
#define IS_STRING_ITEM(flags)   (MF_STRING == MENU_ITEM_TYPE(flags))
 
#define MAX_MENU_ITEMS   (0x4000)
 
#define MAX_GOINTOSUBMENU   (0x10)
 
#define MENU_COL_SPACE   4
 
#define MENU_ITEM_HBMP_SPACE   (5)
 
#define MENU_BAR_ITEMS_SPACE   (12)
 
#define SEPARATOR_HEIGHT   (5)
 
#define MENU_TAB_SPACE   (8)
 
#define TPM_INTERNAL   0xF0000000
 
#define TPM_BUTTONDOWN   0x40000000 /* menu was clicked before tracking */
 
#define TPM_POPUPMENU   0x20000000 /* menu is a popup menu */
 
#define ITEM_PREV   -1
 
#define ITEM_NEXT   1
 
#define UpdateMenuItemState(state, change)
 
#define FreeMenuText(Menu, MenuItem)
 
#define SHOW_DEBUGRECT   0
 

Functions

 DBG_DEFAULT_CHANNEL (UserMenu)
 
PMENU FASTCALL IntGetMenuObject (HMENU hMenu)
 
PMENU FASTCALL VerifyMenu (PMENU pMenu)
 
BOOL FASTCALL IntIsMenu (HMENU Menu)
 
PMENU WINAPI IntGetMenu (HWND hWnd)
 
PMENU get_win_sys_menu (HWND hwnd)
 
BOOL IntDestroyMenu (PMENU pMenu, BOOL bRecurse)
 
BOOLEAN UserDestroyMenuObject (PVOID Object)
 
BOOL FASTCALL IntDestroyMenuObject (PMENU Menu, BOOL bRecurse)
 
BOOL MenuInit (VOID)
 
int FASTCALL MENU_depth (PMENU pmenu, int depth)
 
static UINT MENU_GetStartOfNextColumn (PMENU menu)
 
static UINT MENU_GetStartOfPrevColumn (PMENU menu)
 
PITEM FASTCALL MENU_FindItem (PMENU *pmenu, UINT *nPos, UINT wFlags)
 
static UINT FASTCALL MENU_FindSubMenu (PMENU *menu, PMENU SubTarget)
 
BOOL FASTCALL IntRemoveMenuItem (PMENU pMenu, UINT nPos, UINT wFlags, BOOL bRecurse)
 
ITEMMENU_InsertItem (PMENU menu, UINT pos, UINT flags, PMENU *submenu, UINT *npos)
 
BOOL FASTCALL IntInsertMenuItem (_In_ PMENU MenuObject, UINT uItem, BOOL fByPosition, PROSMENUITEMINFO ItemInfo, PUNICODE_STRING lpstr)
 
PMENU FASTCALL IntCreateMenu (_Out_ PHANDLE Handle, _In_ BOOL IsMenuBar, _In_ PDESKTOP Desktop, _In_ PPROCESSINFO ppi)
 
BOOL FASTCALL IntCloneMenuItems (PMENU Destination, PMENU Source)
 
PMENU FASTCALL IntCloneMenu (PMENU Source)
 
BOOL FASTCALL IntSetMenuFlagRtoL (PMENU Menu)
 
BOOL FASTCALL IntSetMenuContextHelpId (PMENU Menu, DWORD dwContextHelpId)
 
BOOL FASTCALL IntGetMenuInfo (PMENU Menu, PROSMENUINFO lpmi)
 
BOOL FASTCALL IntSetMenuInfo (PMENU Menu, PROSMENUINFO lpmi)
 
BOOL FASTCALL IntGetMenuItemInfo (PMENU Menu, PITEM MenuItem, PROSMENUITEMINFO lpmii)
 
BOOL FASTCALL IntSetMenuItemInfo (PMENU MenuObject, PITEM MenuItem, PROSMENUITEMINFO lpmii, PUNICODE_STRING lpstr)
 
UINT FASTCALL IntEnableMenuItem (PMENU MenuObject, UINT uIDEnableItem, UINT uEnable)
 
DWORD FASTCALL IntCheckMenuItem (PMENU MenuObject, UINT uIDCheckItem, UINT uCheck)
 
BOOL FASTCALL UserSetMenuDefaultItem (PMENU MenuObject, UINT uItem, UINT fByPos)
 
UINT FASTCALL IntGetMenuDefaultItem (PMENU MenuObject, UINT fByPos, UINT gmdiFlags, DWORD *gismc)
 
PMENU FASTCALL co_IntGetSubMenu (PMENU pMenu, int nPos)
 
void FASTCALL MENU_InitSysMenuPopup (PMENU menu, DWORD style, DWORD clsStyle, LONG HitTest)
 
static void FASTCALL MENU_DrawPopupGlyph (HDC dc, LPRECT r, INT_PTR popupMagic, BOOL inactive, BOOL hilite)
 
VOID FASTCALL MENU_AdjustMenuItemRect (PMENU menu, PRECTL rect)
 
static ITEMMENU_FindItemByCoords (MENU *menu, POINT pt, UINT *pos)
 
INT FASTCALL IntMenuItemFromPoint (PWND pWnd, HMENU hMenu, POINT ptScreen)
 
static UINT FASTCALL MENU_FindItemByKey (PWND WndOwner, PMENU menu, WCHAR Key, BOOL ForceMenuChar)
 
static void FASTCALL MENU_GetBitmapItemSize (PITEM lpitem, SIZE *size, PWND WndOwner)
 
static void FASTCALL MENU_DrawBitmapItem (HDC hdc, PITEM lpitem, const RECT *rect, PMENU Menu, PWND WndOwner, UINT odaction, BOOL MenuBar)
 
LONG IntGetDialogBaseUnits (VOID)
 
static void FASTCALL MENU_CalcItemSize (HDC hdc, PITEM lpitem, PMENU Menu, PWND pwndOwner, INT orgX, INT orgY, BOOL menuBar, BOOL textandbmp)
 
static UINT MENU_GetMaxPopupHeight (PMENU lppop)
 
static void FASTCALL MENU_PopupMenuCalcSize (PMENU Menu, PWND WndOwner)
 
static void MENU_MenuBarCalcSize (HDC hdc, LPRECT lprect, PMENU lppop, PWND pwndOwner)
 
static void MENU_DrawScrollArrows (PMENU lppop, HDC hdc)
 
static void FASTCALL MENU_DrawMenuItem (PWND Wnd, PMENU Menu, PWND WndOwner, HDC hdc, PITEM lpitem, UINT Height, BOOL menuBar, UINT odaction)
 
static void FASTCALL MENU_DrawPopupMenu (PWND wnd, HDC hdc, PMENU menu)
 
PWND MENU_IsMenuActive (VOID)
 
void MENU_EndMenu (PWND pwnd)
 
DWORD WINAPI IntDrawMenuBarTemp (PWND pWnd, HDC hDC, LPRECT Rect, PMENU pMenu, HFONT Font)
 
UINT MENU_DrawMenuBar (HDC hDC, LPRECT lprect, PWND pWnd, BOOL suppress_draw)
 
static BOOL MENU_InitPopup (PWND pWndOwner, PMENU menu, UINT flags)
 
static BOOL RECTL_Intersect (const RECT *pRect, INT x, INT y, UINT width, UINT height)
 
static BOOL MENU_MoveRect (UINT flags, INT *x, INT *y, INT width, INT height, const RECT *pExclude, PMONITOR monitor)
 
static BOOL FASTCALL MENU_ShowPopup (PWND pwndOwner, PMENU menu, UINT id, UINT flags, INT x, INT y, const RECT *pExclude)
 
void MENU_EnsureMenuItemVisible (PMENU lppop, UINT wIndex, HDC hdc)
 
static void FASTCALL MENU_SelectItem (PWND pwndOwner, PMENU menu, UINT wIndex, BOOL sendMenuSelect, PMENU topmenu)
 
static void FASTCALL MENU_MoveSelection (PWND pwndOwner, PMENU menu, INT offset)
 
static void FASTCALL MENU_HideSubPopups (PWND pWndOwner, PMENU Menu, BOOL SendMenuSelect, UINT wFlags)
 
static PMENU FASTCALL MENU_ShowSubPopup (PWND WndOwner, PMENU Menu, BOOL SelectFirst, UINT Flags)
 
static INT FASTCALL MENU_ExecFocusedItem (MTRACKER *pmt, PMENU Menu, UINT Flags)
 
static void FASTCALL MENU_SwitchTracking (MTRACKER *pmt, PMENU PtMenu, UINT Index, UINT wFlags)
 
static BOOL FASTCALL MENU_ButtonDown (MTRACKER *pmt, PMENU PtMenu, UINT Flags)
 
static INT FASTCALL MENU_ButtonUp (MTRACKER *pmt, PMENU PtMenu, UINT Flags)
 
static PMENU FASTCALL MENU_PtMenu (PMENU menu, POINT pt)
 
static BOOL FASTCALL MENU_MouseMove (MTRACKER *pmt, PMENU PtMenu, UINT Flags)
 
static PMENU MENU_GetSubPopup (PMENU menu)
 
static LRESULT FASTCALL MENU_DoNextMenu (MTRACKER *pmt, UINT Vk, UINT wFlags)
 
static BOOL FASTCALL MENU_SuspendPopup (MTRACKER *pmt, UINT uMsg)
 
static BOOL FASTCALL MENU_KeyEscape (MTRACKER *pmt, UINT Flags)
 
static void FASTCALL MENU_KeyLeft (MTRACKER *pmt, UINT Flags, UINT msg)
 
static void FASTCALL MENU_KeyRight (MTRACKER *pmt, UINT Flags, UINT msg)
 
static INT FASTCALL MENU_TrackMenu (PMENU pmenu, UINT wFlags, INT x, INT y, PWND pwnd)
 
static BOOL FASTCALL MENU_InitTracking (PWND pWnd, PMENU Menu, BOOL bPopup, UINT wFlags)
 
static BOOL FASTCALL MENU_ExitTracking (PWND pWnd, BOOL bPopup, UINT wFlags)
 
VOID MENU_TrackMouseMenuBar (PWND pWnd, ULONG ht, POINT pt)
 
VOID MENU_TrackKbdMenuBar (PWND pwnd, UINT wParam, WCHAR wChar)
 
BOOL WINAPI IntTrackPopupMenuEx (PMENU menu, UINT wFlags, int x, int y, PWND pWnd, LPTPMPARAMS lpTpm)
 
BOOL WINAPI PopupMenuWndProc (PWND Wnd, UINT Message, WPARAM wParam, LPARAM lParam, LRESULT *lResult)
 
BOOL FASTCALL IntHiliteMenuItem (PWND WindowObject, PMENU MenuObject, UINT uItemHilite, UINT uHilite)
 
BOOLEAN APIENTRY intGetTitleBarInfo (PWND pWindowObject, PTITLEBARINFO bti)
 
DWORD FASTCALL UserInsertMenuItem (PMENU Menu, UINT uItem, BOOL fByPosition, LPCMENUITEMINFOW UnsafeItemInfo, PUNICODE_STRING lpstr)
 
UINT FASTCALL IntGetMenuState (HMENU hMenu, UINT uId, UINT uFlags)
 
HMENU FASTCALL IntGetSubMenu (HMENU hMenu, int nPos)
 
UINT FASTCALL IntFindSubMenu (HMENU *hMenu, HMENU hSubTarget)
 
HMENU FASTCALL UserCreateMenu (PDESKTOP Desktop, BOOL PopupMenu)
 
BOOL FASTCALL IntMenuItemInfo (PMENU Menu, UINT Item, BOOL ByPosition, PROSMENUITEMINFO ItemInfo, BOOL SetOrGet, PUNICODE_STRING lpstr)
 
BOOL FASTCALL UserMenuItemInfo (PMENU Menu, UINT Item, BOOL ByPosition, PROSMENUITEMINFO UnsafeItemInfo, BOOL SetOrGet, PUNICODE_STRING lpstr)
 
BOOL FASTCALL UserMenuInfo (PMENU Menu, PROSMENUINFO UnsafeMenuInfo, BOOL SetOrGet)
 
BOOL FASTCALL IntGetMenuItemRect (PWND pWnd, PMENU Menu, UINT uItem, PRECTL Rect)
 
PMENU FASTCALL MENU_GetSystemMenu (PWND Window, PMENU Popup)
 
PMENU FASTCALL IntGetSystemMenu (PWND Window, BOOL bRevert)
 
BOOL FASTCALL IntSetSystemMenu (PWND Window, PMENU Menu)
 
BOOL FASTCALL IntSetMenu (PWND Wnd, HMENU Menu, BOOL *Changed)
 
DWORD APIENTRY NtUserCalcMenuBar (HWND hwnd, DWORD leftBorder, DWORD rightBorder, DWORD top, LPRECT prc)
 
DWORD APIENTRY NtUserCheckMenuItem (HMENU hMenu, UINT uIDCheckItem, UINT uCheck)
 
BOOL APIENTRY NtUserDeleteMenu (HMENU hMenu, UINT uPosition, UINT uFlags)
 
HMENU APIENTRY NtUserGetSystemMenu (HWND hWnd, BOOL bRevert)
 
BOOL APIENTRY NtUserSetSystemMenu (HWND hWnd, HMENU hMenu)
 
BOOLEAN APIENTRY NtUserGetTitleBarInfo (HWND hwnd, PTITLEBARINFO bti)
 
BOOL FASTCALL UserDestroyMenu (HMENU hMenu)
 
BOOL APIENTRY NtUserDestroyMenu (HMENU hMenu)
 
UINT APIENTRY NtUserEnableMenuItem (HMENU hMenu, UINT uIDEnableItem, UINT uEnable)
 
BOOL APIENTRY NtUserEndMenu (VOID)
 
BOOL APIENTRY NtUserGetMenuBarInfo (HWND hwnd, LONG idObject, LONG idItem, PMENUBARINFO pmbi)
 
UINT APIENTRY NtUserGetMenuIndex (HMENU hMenu, HMENU hSubMenu)
 
BOOL APIENTRY NtUserGetMenuItemRect (HWND hWnd, HMENU hMenu, UINT uItem, PRECTL lprcItem)
 
BOOL APIENTRY NtUserHiliteMenuItem (HWND hWnd, HMENU hMenu, UINT uItemHilite, UINT uHilite)
 
DWORD APIENTRY NtUserDrawMenuBarTemp (HWND hWnd, HDC hDC, PRECT pRect, HMENU hMenu, HFONT hFont)
 
int APIENTRY NtUserMenuItemFromPoint (HWND hWnd, HMENU hMenu, DWORD X, DWORD Y)
 
DWORD APIENTRY NtUserPaintMenuBar (HWND hWnd, HDC hDC, ULONG leftBorder, ULONG rightBorder, ULONG top, BOOL bActive)
 
BOOL APIENTRY NtUserRemoveMenu (HMENU hMenu, UINT uPosition, UINT uFlags)
 
BOOL APIENTRY NtUserSetMenu (HWND hWnd, HMENU Menu, BOOL Repaint)
 
BOOL APIENTRY NtUserSetMenuContextHelpId (HMENU hMenu, DWORD dwContextHelpId)
 
BOOL APIENTRY NtUserSetMenuDefaultItem (HMENU hMenu, UINT uItem, UINT fByPos)
 
BOOL APIENTRY NtUserSetMenuFlagRtoL (HMENU hMenu)
 
BOOL APIENTRY NtUserThunkedMenuInfo (HMENU hMenu, LPCMENUINFO lpcmi)
 
BOOL APIENTRY NtUserThunkedMenuItemInfo (HMENU hMenu, UINT uItem, BOOL fByPosition, BOOL bInsert, LPMENUITEMINFOW lpmii, PUNICODE_STRING lpszCaption)
 
BOOL APIENTRY NtUserTrackPopupMenuEx (HMENU hMenu, UINT fuFlags, int x, int y, HWND hWnd, LPTPMPARAMS lptpm)
 

Variables

HFONT ghMenuFont = NULL
 
HFONT ghMenuFontBold = NULL
 
static SIZE MenuCharSize
 
static HWND top_popup = NULL
 
static HMENU top_popup_hmenu = NULL
 
BOOL fInsideMenuLoop = FALSE
 
BOOL fInEndMenu = FALSE
 

Macro Definition Documentation

◆ FreeMenuText

#define FreeMenuText (   Menu,
  MenuItem 
)
Value:
{ \
if((MENU_ITEM_TYPE((MenuItem)->fType) == MF_STRING) && \
(MenuItem)->lpstr.Length) { \
DesktopHeapFree(((PMENU)Menu)->head.rpdesk, (MenuItem)->lpstr.Buffer); \
} \
}
struct outqueuenode * head
Definition: adnsresfilter.c:66
#define MF_STRING
Definition: winuser.h:138
#define MENU_ITEM_TYPE(flags)
Definition: menu.c:24
static LPCSTR lpstr
Definition: font.c:51

Definition at line 183 of file menu.c.

◆ IS_BITMAP_ITEM

#define IS_BITMAP_ITEM (   flags)    (MF_BITMAP == MENU_ITEM_TYPE(flags))

Definition at line 61 of file menu.c.

◆ IS_MAGIC_BITMAP

#define IS_MAGIC_BITMAP (   id)    ((id) && ((INT_PTR)(id) < 12) && ((INT_PTR)(id) >= -1))

Definition at line 63 of file menu.c.

◆ IS_STRING_ITEM

#define IS_STRING_ITEM (   flags)    (MF_STRING == MENU_ITEM_TYPE(flags))

Definition at line 64 of file menu.c.

◆ IS_SYSTEM_MENU

#define IS_SYSTEM_MENU (   MenuInfo)    (!((MenuInfo)->fFlags & MNF_POPUP) && ((MenuInfo)->fFlags & MNF_SYSMENU))

Definition at line 58 of file menu.c.

◆ ITEM_NEXT

#define ITEM_NEXT   1

Definition at line 93 of file menu.c.

◆ ITEM_PREV

#define ITEM_PREV   -1

Definition at line 92 of file menu.c.

◆ MAX_GOINTOSUBMENU

#define MAX_GOINTOSUBMENU   (0x10)

Definition at line 68 of file menu.c.

◆ MAX_MENU_ITEMS

#define MAX_MENU_ITEMS   (0x4000)

Definition at line 67 of file menu.c.

◆ MAXMENUDEPTH

#define MAXMENUDEPTH   30

Definition at line 41 of file menu.c.

◆ MENU_BAR_ITEMS_SPACE

#define MENU_BAR_ITEMS_SPACE   (12)

Definition at line 74 of file menu.c.

◆ MENU_COL_SPACE

#define MENU_COL_SPACE   4

Definition at line 71 of file menu.c.

◆ MENU_ITEM_HBMP_SPACE

#define MENU_ITEM_HBMP_SPACE   (5)

Definition at line 73 of file menu.c.

◆ MENU_TAB_SPACE

#define MENU_TAB_SPACE   (8)

Definition at line 76 of file menu.c.

◆ MENUITEMINFO_STATE_MASK

#define MENUITEMINFO_STATE_MASK   (STATE_MASK & ~(MF_BYPOSITION | MF_MOUSESELECT))

Definition at line 54 of file menu.c.

◆ MENUITEMINFO_TYPE_MASK

#define MENUITEMINFO_TYPE_MASK
Value:
MFT_MENUBARBREAK | MFT_MENUBREAK | MFT_RADIOCHECK | \
MFT_RIGHTORDER | MFT_RIGHTJUSTIFY /* same as MF_HELP */ )
#define MFT_RIGHTJUSTIFY
Definition: winuser.h:738
#define MFT_STRING
Definition: winuser.h:741
#define MFT_RADIOCHECK
Definition: winuser.h:737
#define MFT_BITMAP
Definition: winuser.h:733
#define MFT_SEPARATOR
Definition: winuser.h:739
#define MFT_MENUBREAK
Definition: winuser.h:735
#define MFT_OWNERDRAW
Definition: winuser.h:736

Definition at line 45 of file menu.c.

◆ MII_STATE_MASK

Definition at line 56 of file menu.c.

◆ MM_GETMENUHANDLE

#define MM_GETMENUHANDLE   (WM_USER + 1)

Definition at line 29 of file menu.c.

◆ MM_SETMENUHANDLE

#define MM_SETMENUHANDLE   (WM_USER + 0)

Definition at line 28 of file menu.c.

◆ MNS_STYLE_MASK

◆ SEPARATOR_HEIGHT

#define SEPARATOR_HEIGHT   (5)

Definition at line 75 of file menu.c.

◆ SHOW_DEBUGRECT

#define SHOW_DEBUGRECT   0

Definition at line 2846 of file menu.c.

◆ STATE_MASK

#define STATE_MASK   (~TYPE_MASK)

Definition at line 52 of file menu.c.

◆ TF_ENDMENU

#define TF_ENDMENU   0x10000

Definition at line 33 of file menu.c.

◆ TF_SKIPREMOVE

#define TF_SKIPREMOVE   0x40000

Definition at line 35 of file menu.c.

◆ TF_SUSPENDPOPUP

#define TF_SUSPENDPOPUP   0x20000

Definition at line 34 of file menu.c.

◆ TPM_BUTTONDOWN

#define TPM_BUTTONDOWN   0x40000000 /* menu was clicked before tracking */

Definition at line 89 of file menu.c.

◆ TPM_INTERNAL

#define TPM_INTERNAL   0xF0000000

Definition at line 88 of file menu.c.

◆ TPM_POPUPMENU

#define TPM_POPUPMENU   0x20000000 /* menu is a popup menu */

Definition at line 90 of file menu.c.

◆ TYPE_MASK

Definition at line 50 of file menu.c.

◆ UpdateMenuItemState

#define UpdateMenuItemState (   state,
  change 
)

Definition at line 95 of file menu.c.

Function Documentation

◆ co_IntGetSubMenu()

PMENU FASTCALL co_IntGetSubMenu ( PMENU  pMenu,
int  nPos 
)

Definition at line 1348 of file menu.c.

1351 {
1352  PITEM pItem;
1353  if (!(pItem = MENU_FindItem( &pMenu, (UINT*)&nPos, MF_BYPOSITION ))) return NULL;
1354  return pItem->spSubMenu;
1355 }
PITEM FASTCALL MENU_FindItem(PMENU *pmenu, UINT *nPos, UINT wFlags)
Definition: menu.c:507
#define MF_BYPOSITION
Definition: winuser.h:203
struct tagMENU * spSubMenu
Definition: ntuser.h:349
unsigned int UINT
Definition: ndis.h:50
#define NULL
Definition: types.h:112

Referenced by MENU_DoNextMenu(), and MENU_FindItemByKey().

◆ DBG_DEFAULT_CHANNEL()

DBG_DEFAULT_CHANNEL ( UserMenu  )

◆ get_win_sys_menu()

PMENU get_win_sys_menu ( HWND  hwnd)

Definition at line 258 of file menu.c.

259 {
260  PMENU ret = 0;
261  WND *win = ValidateHwndNoErr( hwnd );
262  if (win)
263  {
264  ret = UserGetMenuObject(win->SystemMenu);
265  }
266  return ret;
267 }
FORCEINLINE PMENU UserGetMenuObject(HMENU hMenu)
Definition: userfuncs.h:3
int ret
PWND FASTCALL ValidateHwndNoErr(HWND hwnd)
Definition: utils.c:171
Definition: ntuser.h:663
static real win[4][36]
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4022

Referenced by MENU_DoNextMenu(), MENU_PtMenu(), MENU_TrackKbdMenuBar(), and MENU_TrackMouseMenuBar().

◆ IntCheckMenuItem()

DWORD FASTCALL IntCheckMenuItem ( PMENU  MenuObject,
UINT  uIDCheckItem,
UINT  uCheck 
)

Definition at line 1259 of file menu.c.

1260 {
1261  PITEM MenuItem;
1262  DWORD res;
1263 
1264  if (!(MenuItem = MENU_FindItem( &MenuObject, &uIDCheckItem, uCheck ))) return -1;
1265 
1266  res = (DWORD)(MenuItem->fState & MF_CHECKED);
1267 
1268  MenuItem->fState ^= (res ^ uCheck) & MF_CHECKED;
1269 
1270  return res;
1271 }
UINT fState
Definition: ntuser.h:347
PITEM FASTCALL MENU_FindItem(PMENU *pmenu, UINT *nPos, UINT wFlags)
Definition: menu.c:507
#define DWORD
Definition: nt_native.h:44
#define MF_CHECKED
Definition: winuser.h:132
unsigned long DWORD
Definition: ntddk_ex.h:95
GLuint res
Definition: glext.h:9613

Referenced by NtUserCheckMenuItem().

◆ IntCloneMenu()

PMENU FASTCALL IntCloneMenu ( PMENU  Source)

Definition at line 822 of file menu.c.

823 {
824  HANDLE hMenu;
825  PMENU Menu;
826 
827  if(!Source)
828  return NULL;
829 
830  /* A menu is valid process wide. We can pass to the object manager any thread ptr */
832  Source->head.rpdesk,
833  ((PPROCESSINFO)Source->head.hTaskWow)->ptiList,
834  &hMenu,
835  TYPE_MENU,
836  sizeof(MENU));
837  if(!Menu)
838  return NULL;
839 
840  Menu->fFlags = Source->fFlags;
841  Menu->cyMax = Source->cyMax;
842  Menu->hbrBack = Source->hbrBack;
843  Menu->dwContextHelpId = Source->dwContextHelpId;
844  Menu->dwMenuData = Source->dwMenuData;
845  Menu->iItem = NO_SELECTED_ITEM;
846  Menu->spwndNotify = NULL;
847  Menu->cyMenu = 0;
848  Menu->cxMenu = 0;
849  Menu->cItems = 0;
850  Menu->iTop = 0;
851  Menu->iMaxTop = 0;
852  Menu->cxTextAlign = 0;
853  Menu->rgItems = NULL;
854 
855  Menu->hWnd = NULL;
856  Menu->TimeToHide = FALSE;
857 
858  IntCloneMenuItems(Menu, Source);
859 
860  return Menu;
861 }
DWORD_PTR dwMenuData
Definition: ntuser.h:404
HWND hWnd
Definition: ntuser.h:411
HBRUSH hbrBack
Definition: ntuser.h:405
struct _WND * spwndNotify
Definition: ntuser.h:399
BOOL TimeToHide
Definition: ntuser.h:412
PVOID FASTCALL UserCreateObject(PUSER_HANDLE_TABLE ht, PDESKTOP pDesktop, PTHREADINFO pti, HANDLE *h, HANDLE_TYPE type, ULONG size)
Definition: object.c:535
struct tagMENU MENU
ULONG cxTextAlign
Definition: ntuser.h:398
#define FALSE
Definition: types.h:117
ULONG cyMenu
Definition: ntuser.h:397
INT iTop
Definition: ntuser.h:406
DWORD dwContextHelpId
Definition: ntuser.h:402
#define NO_SELECTED_ITEM
Definition: ntuser.h:387
ULONG cyMax
Definition: ntuser.h:403
UINT cItems
Definition: ntuser.h:395
struct tagMENU * PMENU
PITEM rgItems
Definition: ntuser.h:400
BOOL FASTCALL IntCloneMenuItems(PMENU Destination, PMENU Source)
Definition: menu.c:771
INT iMaxTop
Definition: ntuser.h:407
#define NULL
Definition: types.h:112
_In_ UINT _In_ UINT _In_ PNDIS_PACKET Source
Definition: ndis.h:3167
ULONG fFlags
Definition: ntuser.h:392
PUSER_HANDLE_TABLE gHandleTable
Definition: object.c:13
ULONG cxMenu
Definition: ntuser.h:396
INT iItem
Definition: ntuser.h:393

Referenced by MENU_GetSystemMenu().

◆ IntCloneMenuItems()

BOOL FASTCALL IntCloneMenuItems ( PMENU  Destination,
PMENU  Source 
)

Definition at line 771 of file menu.c.

772 {
773  PITEM MenuItem, NewMenuItem = NULL;
774  UINT i;
775 
776  if(!Source->cItems)
777  return FALSE;
778 
779  NewMenuItem = DesktopHeapAlloc(Destination->head.rpdesk, Source->cItems * sizeof(ITEM));
780  if(!NewMenuItem) return FALSE;
781 
782  RtlZeroMemory(NewMenuItem, Source->cItems * sizeof(ITEM));
783 
784  Destination->rgItems = NewMenuItem;
785 
786  MenuItem = Source->rgItems;
787  for (i = 0; i < Source->cItems; i++, MenuItem++, NewMenuItem++)
788  {
789  NewMenuItem->fType = MenuItem->fType;
790  NewMenuItem->fState = MenuItem->fState;
791  NewMenuItem->wID = MenuItem->wID;
792  NewMenuItem->spSubMenu = MenuItem->spSubMenu;
793  NewMenuItem->hbmpChecked = MenuItem->hbmpChecked;
794  NewMenuItem->hbmpUnchecked = MenuItem->hbmpUnchecked;
795  NewMenuItem->dwItemData = MenuItem->dwItemData;
796  if (MenuItem->lpstr.Length)
797  {
798  NewMenuItem->lpstr.Length = 0;
799  NewMenuItem->lpstr.MaximumLength = MenuItem->lpstr.MaximumLength;
800  NewMenuItem->lpstr.Buffer = DesktopHeapAlloc(Destination->head.rpdesk, MenuItem->lpstr.MaximumLength);
801  if (!NewMenuItem->lpstr.Buffer)
802  {
803  DesktopHeapFree(Destination->head.rpdesk, NewMenuItem);
804  break;
805  }
806  RtlCopyUnicodeString(&NewMenuItem->lpstr, &MenuItem->lpstr);
807  NewMenuItem->lpstr.Buffer[MenuItem->lpstr.Length / sizeof(WCHAR)] = 0;
808  NewMenuItem->Xlpstr = NewMenuItem->lpstr.Buffer;
809  }
810  else
811  {
812  NewMenuItem->lpstr.Buffer = MenuItem->lpstr.Buffer;
813  NewMenuItem->Xlpstr = NewMenuItem->lpstr.Buffer;
814  }
815  NewMenuItem->hbmp = MenuItem->hbmp;
816  Destination->cItems = i + 1;
817  }
818  return TRUE;
819 }
DWORD_PTR dwItemData
Definition: ntuser.h:354
UINT wID
Definition: ntuser.h:348
USHORT MaximumLength
Definition: env_spec_w32.h:370
#define TRUE
Definition: types.h:120
UINT fState
Definition: ntuser.h:347
UNICODE_STRING lpstr
Definition: ntuser.h:366
NTSYSAPI VOID NTAPI RtlCopyUnicodeString(PUNICODE_STRING DestinationString, PUNICODE_STRING SourceString)
static __inline PVOID DesktopHeapAlloc(IN PDESKTOP Desktop, IN SIZE_T Bytes)
Definition: desktop.h:230
#define FALSE
Definition: types.h:117
__wchar_t WCHAR
Definition: xmlstorage.h:180
HANDLE hbmpUnchecked
Definition: ntuser.h:351
HBITMAP hbmp
Definition: ntuser.h:362
_In_ PUNICODE_STRING _Inout_ PUNICODE_STRING Destination
Definition: rtlfuncs.h:2950
struct tagMENU * spSubMenu
Definition: ntuser.h:349
HANDLE hbmpChecked
Definition: ntuser.h:350
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
unsigned int UINT
Definition: ndis.h:50
#define NULL
Definition: types.h:112
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
_In_ UINT _In_ UINT _In_ PNDIS_PACKET Source
Definition: ndis.h:3167
static __inline BOOL DesktopHeapFree(IN PDESKTOP Desktop, IN PVOID lpMem)
Definition: desktop.h:241
USHORT * Xlpstr
Definition: ntuser.h:352
UINT fType
Definition: ntuser.h:346

Referenced by IntCloneMenu().

◆ IntCreateMenu()

PMENU FASTCALL IntCreateMenu ( _Out_ PHANDLE  Handle,
_In_ BOOL  IsMenuBar,
_In_ PDESKTOP  Desktop,
_In_ PPROCESSINFO  ppi 
)

Definition at line 729 of file menu.c.

734 {
735  PMENU Menu;
736 
738  Desktop,
739  ppi->ptiList,
740  Handle,
741  TYPE_MENU,
742  sizeof(MENU));
743  if(!Menu)
744  {
745  *Handle = 0;
746  return NULL;
747  }
748 
749  Menu->cyMax = 0; /* Default */
750  Menu->hbrBack = NULL; /* No brush */
751  Menu->dwContextHelpId = 0; /* Default */
752  Menu->dwMenuData = 0; /* Default */
753  Menu->iItem = NO_SELECTED_ITEM; // Focused item
754  Menu->fFlags = (IsMenuBar ? 0 : MNF_POPUP);
755  Menu->spwndNotify = NULL;
756  Menu->cyMenu = 0; // Height
757  Menu->cxMenu = 0; // Width
758  Menu->cItems = 0; // Item count
759  Menu->iTop = 0;
760  Menu->iMaxTop = 0;
761  Menu->cxTextAlign = 0;
762  Menu->rgItems = NULL;
763 
764  Menu->hWnd = NULL;
765  Menu->TimeToHide = FALSE;
766 
767  return Menu;
768 }
DWORD_PTR dwMenuData
Definition: ntuser.h:404
HWND hWnd
Definition: ntuser.h:411
HBRUSH hbrBack
Definition: ntuser.h:405
struct _WND * spwndNotify
Definition: ntuser.h:399
BOOL TimeToHide
Definition: ntuser.h:412
PVOID FASTCALL UserCreateObject(PUSER_HANDLE_TABLE ht, PDESKTOP pDesktop, PTHREADINFO pti, HANDLE *h, HANDLE_TYPE type, ULONG size)
Definition: object.c:535
ULONG cxTextAlign
Definition: ntuser.h:398
#define FALSE
Definition: types.h:117
ULONG cyMenu
Definition: ntuser.h:397
INT iTop
Definition: ntuser.h:406
DWORD dwContextHelpId
Definition: ntuser.h:402
#define NO_SELECTED_ITEM
Definition: ntuser.h:387
ULONG cyMax
Definition: ntuser.h:403
UINT cItems
Definition: ntuser.h:395
struct tagMENU * PMENU
PITEM rgItems
Definition: ntuser.h:400
INT iMaxTop
Definition: ntuser.h:407
#define NULL
Definition: types.h:112
_In_ HANDLE Handle
Definition: extypes.h:390
#define MNF_POPUP
Definition: ntuser.h:376
ULONG fFlags
Definition: ntuser.h:392
PUSER_HANDLE_TABLE gHandleTable
Definition: object.c:13
ULONG cxMenu
Definition: ntuser.h:396
INT iItem
Definition: ntuser.h:393

Referenced by IntSetMenuItemInfo(), and UserCreateMenu().

◆ IntDestroyMenu()

BOOL IntDestroyMenu ( PMENU  pMenu,
BOOL  bRecurse 
)

Definition at line 269 of file menu.c.

270 {
271  PMENU SubMenu;
272 
274  if (pMenu->rgItems) /* recursively destroy submenus */
275  {
276  int i;
277  ITEM *item = pMenu->rgItems;
278  for (i = pMenu->cItems; i > 0; i--, item++)
279  {
280  SubMenu = item->spSubMenu;
281  item->spSubMenu = NULL;
282 
283  /* Remove Item Text */
284  FreeMenuText(pMenu,item);
285 
286  /* Remove Item Bitmap and set it for this process */
287  if (item->hbmp && !(item->fState & MFS_HBMMENUBMP))
288  {
290  item->hbmp = NULL;
291  }
292 
293  /* Remove Item submenu */
294  if (bRecurse && SubMenu)//VerifyMenu(SubMenu))
295  {
296  /* Release submenu since it was referenced when inserted */
297  IntReleaseMenuObject(SubMenu);
298  IntDestroyMenuObject(SubMenu, bRecurse);
299  }
300  }
301  /* Free the Item */
302  DesktopHeapFree(pMenu->head.rpdesk, pMenu->rgItems );
303  pMenu->rgItems = NULL;
304  pMenu->cItems = 0;
305  }
306  return TRUE;
307 }
BOOL NTAPI GreSetObjectOwner(HGDIOBJ hobj, ULONG ulOwner)
Definition: gdiobj.c:1255
#define TRUE
Definition: types.h:120
BOOL FASTCALL IntDestroyMenuObject(PMENU Menu, BOOL bRecurse)
Definition: menu.c:317
PROCDESKHEAD head
Definition: ntuser.h:391
#define ASSERT(a)
Definition: mode.c:44
UINT cItems
Definition: ntuser.h:395
PITEM rgItems
Definition: ntuser.h:400
#define GDI_OBJ_HMGR_POWNED
Definition: ntgdihdl.h:117
static ATOM item
Definition: dde.c:856
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define NULL
Definition: types.h:112
BOOL FASTCALL UserIsEnteredExclusive(VOID)
Definition: ntuser.c:229
#define MFS_HBMMENUBMP
Definition: ntuser.h:342
static __inline BOOL DesktopHeapFree(IN PDESKTOP Desktop, IN PVOID lpMem)
Definition: desktop.h:241
struct _DESKTOP * rpdesk
Definition: ntuser.h:202
#define FreeMenuText(Menu, MenuItem)
Definition: menu.c:183

Referenced by IntDestroyMenuObject().

◆ IntDestroyMenuObject()

BOOL FASTCALL IntDestroyMenuObject ( PMENU  Menu,
BOOL  bRecurse 
)

Definition at line 317 of file menu.c.

318 {
320  if (Menu)
321  {
322  PWND Window;
323 
324  if (PsGetCurrentProcessSessionId() == Menu->head.rpdesk->rpwinstaParent->dwSessionId)
325  {
326  BOOL ret;
327  if (Menu->hWnd)
328  {
329  Window = ValidateHwndNoErr(Menu->hWnd);
330  if (Window)
331  {
332  //Window->IDMenu = 0; Only in Win9x!! wine win test_SetMenu test...
333 
334  /* DestroyMenu should not destroy system menu popup owner */
335  if ((Menu->fFlags & (MNF_POPUP | MNF_SYSSUBMENU)) == MNF_POPUP)
336  {
337  // Should we check it to see if it has Class?
338  ERR("FIXME Pop up menu window thing'ie\n");
339  //co_UserDestroyWindow( Window );
340  //Menu->hWnd = 0;
341  }
342  }
343  }
344 
345  if (!UserMarkObjectDestroy(Menu)) return TRUE;
346 
347  /* Remove all menu items */
348  IntDestroyMenu( Menu, bRecurse);
349 
350  ret = UserDeleteObject(Menu->head.h, TYPE_MENU);
351  TRACE("IntDestroyMenuObject %d\n",ret);
352  return ret;
353  }
354  }
355  return FALSE;
356 }
HWND hWnd
Definition: ntuser.h:411
BOOL FASTCALL UserDeleteObject(HANDLE h, HANDLE_TYPE type)
Definition: object.c:683
#define TRUE
Definition: types.h:120
Definition: window.c:28
#define FALSE
Definition: types.h:117
PROCDESKHEAD head
Definition: ntuser.h:391
unsigned int BOOL
Definition: ntddk_ex.h:94
ULONG NTAPI PsGetCurrentProcessSessionId(VOID)
Definition: process.c:1133
#define TRACE(s)
Definition: solgame.cpp:4
#define ASSERT(a)
Definition: mode.c:44
int Window
Definition: x11stubs.h:26
int ret
PWND FASTCALL ValidateHwndNoErr(HWND hwnd)
Definition: utils.c:171
#define ERR(fmt,...)
Definition: debug.h:110
Definition: ntuser.h:663
BOOL FASTCALL UserIsEnteredExclusive(VOID)
Definition: ntuser.c:229
#define MNF_POPUP
Definition: ntuser.h:376
BOOL IntDestroyMenu(PMENU pMenu, BOOL bRecurse)
Definition: menu.c:269
#define MNF_SYSSUBMENU
Definition: ntuser.h:382
ULONG fFlags
Definition: ntuser.h:392
struct _DESKTOP * rpdesk
Definition: ntuser.h:202
BOOL FASTCALL UserMarkObjectDestroy(PVOID Object)
Definition: object.c:587

Referenced by co_UserFreeWindow(), IntDestroyMenu(), IntGetSystemMenu(), IntRemoveMenuItem(), IntSetMenuItemInfo(), IntSetSystemMenu(), MENU_GetSystemMenu(), NtUserDestroyMenu(), UserDestroyMenu(), and UserDestroyMenuObject().

◆ IntDrawMenuBarTemp()

DWORD WINAPI IntDrawMenuBarTemp ( PWND  pWnd,
HDC  hDC,
LPRECT  Rect,
PMENU  pMenu,
HFONT  Font 
)

Definition at line 2685 of file menu.c.

2686 {
2687  UINT i;
2688  HFONT FontOld = NULL;
2689  BOOL flat_menu = FALSE;
2690 
2691  UserSystemParametersInfo(SPI_GETFLATMENU, 0, &flat_menu, 0);
2692 
2693  if (!pMenu)
2694  {
2695  pMenu = UserGetMenuObject(UlongToHandle(pWnd->IDMenu));
2696  }
2697 
2698  if (!Font)
2699  {
2700  Font = ghMenuFont;
2701  }
2702 
2703  if (Rect == NULL || !pMenu)
2704  {
2706  }
2707 
2708  TRACE("(%x, %x, %p, %x, %x)\n", pWnd, hDC, Rect, pMenu, Font);
2709 
2710  FontOld = NtGdiSelectFont(hDC, Font);
2711 
2712  if (pMenu->cyMenu == 0)
2713  {
2714  MENU_MenuBarCalcSize(hDC, Rect, pMenu, pWnd);
2715  }
2716 
2717  Rect->bottom = Rect->top + pMenu->cyMenu;
2718 
2719  FillRect(hDC, Rect, IntGetSysColorBrush(flat_menu ? COLOR_MENUBAR : COLOR_MENU));
2720 
2723  GreMoveTo(hDC, Rect->left, Rect->bottom - 1, NULL);
2724  NtGdiLineTo(hDC, Rect->right, Rect->bottom - 1);
2725 
2726  if (pMenu->cItems == 0)
2727  {
2728  NtGdiSelectFont(hDC, FontOld);
2730  }
2731 
2732  for (i = 0; i < pMenu->cItems; i++)
2733  {
2734  MENU_DrawMenuItem(pWnd, pMenu, pWnd, hDC, &pMenu->rgItems[i], pMenu->cyMenu, TRUE, ODA_DRAWENTIRE);
2735  }
2736 
2737  NtGdiSelectFont(hDC, FontOld);
2738 
2739  return pMenu->cyMenu;
2740 }
HFONT ghMenuFont
Definition: menu.c:14
HGDIOBJ FASTCALL IntGetSysColorBrush(INT Object)
Definition: stockobj.c:317
#define TRUE
Definition: types.h:120
__kernel_entry W32KAPI HANDLE APIENTRY NtGdiGetStockObject(_In_ INT iObject)
FORCEINLINE PMENU UserGetMenuObject(HMENU hMenu)
Definition: userfuncs.h:3
__kernel_entry W32KAPI BOOL APIENTRY NtGdiLineTo(_In_ HDC hdc, _In_ INT x, _In_ INT y)
__kernel_entry W32KAPI HPEN APIENTRY NtGdiSelectPen(_In_ HDC hdc, _In_ HPEN hpen)
#define COLOR_3DFACE
Definition: winuser.h:923
#define FALSE
Definition: types.h:117
unsigned int BOOL
Definition: ntddk_ex.h:94
ULONG cyMenu
Definition: ntuser.h:397
static void FASTCALL MENU_DrawMenuItem(PWND Wnd, PMENU Menu, PWND WndOwner, HDC hdc, PITEM lpitem, UINT Height, BOOL menuBar, UINT odaction)
Definition: menu.c:2204
#define COLOR_MENU
Definition: winuser.h:911
LONG NTAPI UserGetSystemMetrics(ULONG Index)
Definition: metric.c:180
__kernel_entry W32KAPI HFONT APIENTRY NtGdiSelectFont(_In_ HDC hdc, _In_ HFONT hf)
Definition: dcobjs.c:597
#define ODA_DRAWENTIRE
Definition: winuser.h:2522
UINT_PTR IDMenu
Definition: ntuser.h:701
#define TRACE(s)
Definition: solgame.cpp:4
#define UlongToHandle(ul)
Definition: basetsd.h:97
UINT cItems
Definition: ntuser.h:395
DWORD FASTCALL IntGetSysColor(INT nIndex)
Definition: stockobj.c:323
PITEM rgItems
Definition: ntuser.h:400
COLORREF FASTCALL IntSetDCPenColor(HDC, COLORREF)
Definition: dcutil.c:259
BOOL FASTCALL GreMoveTo(HDC hdc, INT x, INT y, LPPOINT pptOut)
Definition: line.c:108
static HDC hDC
Definition: 3dtext.c:33
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
unsigned int UINT
Definition: ndis.h:50
#define NULL
Definition: types.h:112
static DWORD *static HFONT(WINAPI *pCreateFontIndirectExA)(const ENUMLOGFONTEXDVA *)
static void MENU_MenuBarCalcSize(HDC hdc, LPRECT lprect, PMENU lppop, PWND pwndOwner)
Definition: menu.c:2101
#define SM_CYMENU
Definition: winuser.h:970
BOOL FASTCALL UserSystemParametersInfo(UINT uiAction, UINT uiParam, PVOID pvParam, UINT fWinIni)
Definition: sysparams.c:2088
int WINAPI FillRect(HDC, LPCRECT, HBRUSH)

Referenced by MENU_DrawMenuBar(), and NtUserDrawMenuBarTemp().

◆ IntEnableMenuItem()

UINT FASTCALL IntEnableMenuItem ( PMENU  MenuObject,
UINT  uIDEnableItem,
UINT  uEnable 
)

Definition at line 1217 of file menu.c.

1218 {
1219  PITEM MenuItem;
1220  UINT res;
1221 
1222  if (!(MenuItem = MENU_FindItem( &MenuObject, &uIDEnableItem, uEnable ))) return (UINT)-1;
1223 
1224  res = MenuItem->fState & (MF_GRAYED | MF_DISABLED);
1225 
1226  MenuItem->fState ^= (res ^ uEnable) & (MF_GRAYED | MF_DISABLED);
1227 
1228  /* If the close item in the system menu change update the close button */
1229  if (res != uEnable)
1230  {
1231  switch (MenuItem->wID) // More than just close.
1232  {
1233  case SC_CLOSE:
1234  case SC_MAXIMIZE:
1235  case SC_MINIMIZE:
1236  case SC_MOVE:
1237  case SC_RESTORE:
1238  case SC_SIZE:
1239  if (MenuObject->fFlags & MNF_SYSSUBMENU && MenuObject->spwndNotify != 0)
1240  {
1241  //RECTL rc = MenuObject->spwndNotify->rcWindow;
1242 
1243  /* Refresh the frame to reflect the change */
1244  //IntMapWindowPoints(0, MenuObject->spwndNotify, (POINT *)&rc, 2);
1245  //rc.bottom = 0;
1246  //co_UserRedrawWindow(MenuObject->spwndNotify, &rc, 0, RDW_FRAME | RDW_INVALIDATE | RDW_NOCHILDREN);
1247 
1248  // Allow UxTheme!
1249  UserPaintCaption(MenuObject->spwndNotify, DC_BUTTONS);
1250  }
1251  default:
1252  break;
1253  }
1254  }
1255  return res;
1256 }
UINT wID
Definition: ntuser.h:348
#define MF_DISABLED
Definition: winuser.h:130
#define SC_RESTORE
Definition: winuser.h:2578
UINT fState
Definition: ntuser.h:347
PITEM FASTCALL MENU_FindItem(PMENU *pmenu, UINT *nPos, UINT wFlags)
Definition: menu.c:507
struct _WND * spwndNotify
Definition: ntuser.h:399
#define SC_MAXIMIZE
Definition: winuser.h:2568
#define SC_MINIMIZE
Definition: winuser.h:2566
#define SC_SIZE
Definition: winuser.h:2564
unsigned int UINT
Definition: ndis.h:50
BOOL UserPaintCaption(PWND pWnd, INT Flags)
Definition: defwnd.c:396
#define SC_MOVE
Definition: winuser.h:2565
#define SC_CLOSE
Definition: winuser.h:2572
GLuint res
Definition: glext.h:9613
#define MF_GRAYED
Definition: winuser.h:129
#define MNF_SYSSUBMENU
Definition: ntuser.h:382
ULONG fFlags
Definition: ntuser.h:392

Referenced by MENU_InitSysMenuPopup(), and NtUserEnableMenuItem().

◆ IntFindSubMenu()

UINT FASTCALL IntFindSubMenu ( HMENU hMenu,
HMENU  hSubTarget 
)

Definition at line 5013 of file menu.c.

5014 {
5015  PMENU menu, pSubTarget;
5016  UINT Pos;
5017  if (((*hMenu)==(HMENU)0xffff) ||(!(menu = UserGetMenuObject(*hMenu))))
5018  return NO_SELECTED_ITEM;
5019 
5020  pSubTarget = UserGetMenuObject(hSubTarget);
5021 
5022  Pos = MENU_FindSubMenu(&menu, pSubTarget );
5023 
5024  *hMenu = (menu ? UserHMGetHandle(menu) : NULL);
5025 
5026  return Pos;
5027 }
static UINT FASTCALL MENU_FindSubMenu(PMENU *menu, PMENU SubTarget)
Definition: menu.c:564
ush Pos
Definition: deflate.h:92
FORCEINLINE PMENU UserGetMenuObject(HMENU hMenu)
Definition: userfuncs.h:3
#define UserHMGetHandle(obj)
Definition: ntuser.h:213
#define NO_SELECTED_ITEM
Definition: ntuser.h:387
unsigned int UINT
Definition: ndis.h:50
#define NULL
Definition: types.h:112
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:60

Referenced by co_IntTranslateAccelerator().

◆ IntGetDialogBaseUnits()

LONG IntGetDialogBaseUnits ( VOID  )

Definition at line 1800 of file menu.c.

1801 {
1802  static DWORD units;
1803 
1804  if (!units)
1805  {
1806  HDC hdc;
1807  SIZE size;
1808 
1809  if ((hdc = UserGetDCEx(NULL, NULL, DCX_CACHE)))
1810  {
1812  if (size.cx) units = MAKELONG( size.cx, size.cy );
1813  UserReleaseDC( 0, hdc, FALSE);
1814  }
1815  }
1816  return units;
1817 }
static HDC
Definition: imagelist.c:92
HDC FASTCALL UserGetDCEx(PWND Window OPTIONAL, HANDLE ClipRegion, ULONG Flags)
#define FALSE
Definition: types.h:117
DWORD FASTCALL IntGetCharDimensions(HDC hdc, PTEXTMETRICW ptm, PDWORD height)
Definition: font.c:329
SIZE size
Definition: menu.c:78
#define MAKELONG(a, b)
Definition: typedefs.h:249
LONG cx
Definition: windef.h:334
GLsizeiptr size
Definition: glext.h:5919
unsigned long DWORD
Definition: ntddk_ex.h:95
HDC hdc
Definition: main.c:9
#define DCX_CACHE
Definition: winuser.h:2101
#define NULL
Definition: types.h:112
INT FASTCALL UserReleaseDC(PWND Window, HDC hDc, BOOL EndPaint)
Definition: windc.c:917
DWORD * PDWORD
Definition: pedump.c:68
GLfloat units
Definition: glext.h:11727

Referenced by MENU_CalcItemSize().

◆ IntGetMenu()

PMENU WINAPI IntGetMenu ( HWND  hWnd)

Definition at line 248 of file menu.c.

249 {
250  PWND Wnd = ValidateHwndNoErr(hWnd);
251 
252  if (!Wnd)
253  return NULL;
254 
255  return UserGetMenuObject(UlongToHandle(Wnd->IDMenu));
256 }
HWND hWnd
Definition: settings.c:17
FORCEINLINE PMENU UserGetMenuObject(HMENU hMenu)
Definition: userfuncs.h:3
UINT_PTR IDMenu
Definition: ntuser.h:701
#define UlongToHandle(ul)
Definition: basetsd.h:97
PWND FASTCALL ValidateHwndNoErr(HWND hwnd)
Definition: utils.c:171
Definition: ntuser.h:663
#define NULL
Definition: types.h:112

Referenced by MENU_ButtonUp(), MENU_DoNextMenu(), MENU_PtMenu(), MENU_TrackKbdMenuBar(), and MENU_TrackMouseMenuBar().

◆ IntGetMenuDefaultItem()

UINT FASTCALL IntGetMenuDefaultItem ( PMENU  MenuObject,
UINT  fByPos,
UINT  gmdiFlags,
DWORD gismc 
)

Definition at line 1315 of file menu.c.

1316 {
1317  UINT i = 0;
1318  PITEM MenuItem = MenuObject->rgItems;
1319 
1320  /* empty menu */
1321  if (!MenuItem) return -1;
1322 
1323  while ( !( MenuItem->fState & MFS_DEFAULT ) )
1324  {
1325  i++; MenuItem++;
1326  if (i >= MenuObject->cItems ) return -1;
1327  }
1328 
1329  /* default: don't return disabled items */
1330  if ( (!(GMDI_USEDISABLED & gmdiFlags)) && (MenuItem->fState & MFS_DISABLED )) return -1;
1331 
1332  /* search rekursiv when needed */
1333  if ( (gmdiFlags & GMDI_GOINTOPOPUPS) && MenuItem->spSubMenu )
1334  {
1335  UINT ret;
1336  (*gismc)++;
1337  ret = IntGetMenuDefaultItem( MenuItem->spSubMenu, fByPos, gmdiFlags, gismc );
1338  (*gismc)--;
1339  if ( -1 != ret ) return ret;
1340 
1341  /* when item not found in submenu, return the popup item */
1342  }
1343  return ( fByPos ) ? i : MenuItem->wID;
1344 }
UINT wID
Definition: ntuser.h:348
UINT fState
Definition: ntuser.h:347
#define MFS_DISABLED
Definition: winuser.h:744
#define MFS_DEFAULT
Definition: winuser.h:743
#define GMDI_GOINTOPOPUPS
Definition: winuser.h:2112
UINT FASTCALL IntGetMenuDefaultItem(PMENU MenuObject, UINT fByPos, UINT gmdiFlags, DWORD *gismc)
Definition: menu.c:1315
UINT cItems
Definition: ntuser.h:395
PITEM rgItems
Definition: ntuser.h:400
int ret
struct tagMENU * spSubMenu
Definition: ntuser.h:349
#define GMDI_USEDISABLED
Definition: winuser.h:2113
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
unsigned int UINT
Definition: ndis.h:50

Referenced by GetMenuDefaultItem(), and IntGetMenuDefaultItem().

◆ IntGetMenuInfo()

BOOL FASTCALL IntGetMenuInfo ( PMENU  Menu,
PROSMENUINFO  lpmi 
)

Definition at line 879 of file menu.c.

880 {
881  if(lpmi->fMask & MIM_BACKGROUND)
882  lpmi->hbrBack = Menu->hbrBack;
883  if(lpmi->fMask & MIM_HELPID)
884  lpmi->dwContextHelpID = Menu->dwContextHelpId;
885  if(lpmi->fMask & MIM_MAXHEIGHT)
886  lpmi->cyMax = Menu->cyMax;
887  if(lpmi->fMask & MIM_MENUDATA)
888  lpmi->dwMenuData = Menu->dwMenuData;
889  if(lpmi->fMask & MIM_STYLE)
890  lpmi->dwStyle = Menu->fFlags & MNS_STYLE_MASK;
891 
892  if (sizeof(MENUINFO) < lpmi->cbSize)
893  {
894  lpmi->cItems = Menu->cItems;
895 
896  lpmi->iItem = Menu->iItem;
897  lpmi->cxMenu = Menu->cxMenu;
898  lpmi->cyMenu = Menu->cyMenu;
899  lpmi->spwndNotify = Menu->spwndNotify;
900  lpmi->cxTextAlign = Menu->cxTextAlign;
901  lpmi->iTop = Menu->iTop;
902  lpmi->iMaxTop = Menu->iMaxTop;
903  lpmi->dwArrowsOn = Menu->dwArrowsOn;
904 
905  lpmi->fFlags = Menu->fFlags;
906  lpmi->Self = Menu->head.h;
907  lpmi->TimeToHide = Menu->TimeToHide;
908  lpmi->Wnd = Menu->hWnd;
909  }
910  return TRUE;
911 }
DWORD_PTR dwMenuData
Definition: ntuser.h:404
HWND hWnd
Definition: ntuser.h:411
INT iMaxTop
Definition: menu.h:92
HBRUSH hbrBack
Definition: ntuser.h:405
#define TRUE
Definition: types.h:120
#define MNS_STYLE_MASK
Definition: menu.c:43
WORD cyMenu
Definition: menu.h:88
UINT iItem
Definition: menu.h:85
PWND spwndNotify
Definition: menu.h:90
struct _WND * spwndNotify
Definition: ntuser.h:399
BOOL TimeToHide
Definition: ntuser.h:412
DWORD cbSize
Definition: menu.h:76
HBRUSH hbrBack
Definition: menu.h:80
ULONG cxTextAlign
Definition: menu.h:89
UINT cyMax
Definition: menu.h:79
ULONG cxTextAlign
Definition: ntuser.h:398
PROCDESKHEAD head
Definition: ntuser.h:391
ULONG cyMenu
Definition: ntuser.h:397
INT iTop
Definition: ntuser.h:406
DWORD dwContextHelpId
Definition: ntuser.h:402
HMENU Self
Definition: menu.h:95
INT iTop
Definition: menu.h:91
DWORD dwArrowsOn
Definition: ntuser.h:408
ULONG cyMax
Definition: ntuser.h:403
DWORD dwArrowsOn
Definition: menu.h:93
ULONG fFlags
Definition: menu.h:84
UINT cItems
Definition: ntuser.h:395
DWORD dwContextHelpID
Definition: menu.h:81
WORD cxMenu
Definition: menu.h:87
DWORD fMask
Definition: menu.h:77
INT iMaxTop
Definition: ntuser.h:407
ULONG_PTR dwMenuData
Definition: menu.h:82
BOOL TimeToHide
Definition: menu.h:97
HWND Wnd
Definition: menu.h:96
UINT cItems
Definition: menu.h:86
ULONG fFlags
Definition: ntuser.h:392
ULONG cxMenu
Definition: ntuser.h:396
INT iItem
Definition: ntuser.h:393
DWORD dwStyle
Definition: menu.h:78

Referenced by UserMenuInfo().

◆ IntGetMenuItemInfo()

BOOL FASTCALL IntGetMenuItemInfo ( PMENU  Menu,
PITEM  MenuItem,
PROSMENUITEMINFO  lpmii 
)

Definition at line 962 of file menu.c.

964 {
966 
967  if(lpmii->fMask & (MIIM_FTYPE | MIIM_TYPE))
968  {
969  lpmii->fType = MenuItem->fType;
970  }
971  if(lpmii->fMask & MIIM_BITMAP)
972  {
973  lpmii->hbmpItem = MenuItem->hbmp;
974  }
975  if(lpmii->fMask & MIIM_CHECKMARKS)
976  {
977  lpmii->hbmpChecked = MenuItem->hbmpChecked;
978  lpmii->hbmpUnchecked = MenuItem->hbmpUnchecked;
979  }
980  if(lpmii->fMask & MIIM_DATA)
981  {
982  lpmii->dwItemData = MenuItem->dwItemData;
983  }
984  if(lpmii->fMask & MIIM_ID)
985  {
986  lpmii->wID = MenuItem->wID;
987  }
988  if(lpmii->fMask & MIIM_STATE)
989  {
990  lpmii->fState = MenuItem->fState;
991  }
992  if(lpmii->fMask & MIIM_SUBMENU)
993  {
994  lpmii->hSubMenu = MenuItem->spSubMenu ? MenuItem->spSubMenu->head.h : NULL;
995  }
996 
997  if ((lpmii->fMask & MIIM_STRING) ||
998  ((lpmii->fMask & MIIM_TYPE) && (MENU_ITEM_TYPE(lpmii->fType) == MF_STRING)))
999  {
1000  if (lpmii->dwTypeData == NULL)
1001  {
1002  lpmii->cch = MenuItem->lpstr.Length / sizeof(WCHAR);
1003  }
1004  else
1005  {
1006  Status = MmCopyToCaller(lpmii->dwTypeData, MenuItem->lpstr.Buffer,
1007  min(lpmii->cch * sizeof(WCHAR),
1008  MenuItem->lpstr.MaximumLength));
1009  if (! NT_SUCCESS(Status))
1010  {
1012  return FALSE;
1013  }
1014  }
1015  }
1016 
1017  if (sizeof(ROSMENUITEMINFO) == lpmii->cbSize)
1018  {
1019  lpmii->Rect.left = MenuItem->xItem;
1020  lpmii->Rect.top = MenuItem->yItem;
1021  lpmii->Rect.right = MenuItem->cxItem; // Do this for now......
1022  lpmii->Rect.bottom = MenuItem->cyItem;
1023  lpmii->dxTab = MenuItem->dxTab;
1024  lpmii->lpstr = MenuItem->lpstr.Buffer;
1025  lpmii->maxBmpSize.cx = MenuItem->cxBmp;
1026  lpmii->maxBmpSize.cy = MenuItem->cyBmp;
1027  }
1028 
1029  return TRUE;
1030 }
INT cxBmp
Definition: ntuser.h:363
DWORD_PTR dwItemData
Definition: ntuser.h:354
LPWSTR lpstr
Definition: menu.h:118
UINT wID
Definition: ntuser.h:348
#define MIIM_FTYPE
Definition: winuser.h:724
USHORT MaximumLength
Definition: env_spec_w32.h:370
#define TRUE
Definition: types.h:120
UINT fState
Definition: ntuser.h:347
LONG NTSTATUS
Definition: precomp.h:26
#define MF_STRING
Definition: winuser.h:138
HBITMAP hbmpUnchecked
Definition: menu.h:110
LONG top
Definition: windef.h:307
ULONG cyItem
Definition: ntuser.h:358
ULONG yItem
Definition: ntuser.h:356
SIZE maxBmpSize
Definition: menu.h:119
#define MmCopyToCaller(x, y, z)
Definition: mmcopy.h:19
LONG left
Definition: windef.h:306
#define MENU_ITEM_TYPE(flags)
Definition: menu.c:24
LONG right
Definition: windef.h:308
UNICODE_STRING lpstr
Definition: ntuser.h:366
#define MIIM_BITMAP
Definition: winuser.h:723
#define MIIM_SUBMENU
Definition: winuser.h:718
#define FALSE
Definition: types.h:117
#define MIIM_STATE
Definition: winuser.h:716
ULONG cxItem
Definition: ntuser.h:357
LONG cx
Definition: windef.h:334
ULONG dxTab
Definition: ntuser.h:359
#define MIIM_ID
Definition: winuser.h:717
HBITMAP hbmpItem
Definition: menu.h:114
Status
Definition: gdiplustypes.h:24
DWORD dwItemData
Definition: menu.h:111
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
HANDLE hbmpUnchecked
Definition: ntuser.h:351
HBITMAP hbmp
Definition: ntuser.h:362
struct tagMENU * spSubMenu
Definition: ntuser.h:349
#define MIIM_TYPE
Definition: winuser.h:720
ULONG xItem
Definition: ntuser.h:355
HANDLE hbmpChecked
Definition: ntuser.h:350
#define MIIM_CHECKMARKS
Definition: winuser.h:719
VOID FASTCALL SetLastNtError(NTSTATUS Status)
Definition: error.c:36
#define MIIM_STRING
Definition: winuser.h:722
HMENU hSubMenu
Definition: menu.h:108
#define min(a, b)
Definition: monoChain.cc:55
#define NULL
Definition: types.h:112
LONG bottom
Definition: windef.h:309
HBITMAP hbmpChecked
Definition: menu.h:109
LPWSTR dwTypeData
Definition: menu.h:112
INT cyBmp
Definition: ntuser.h:364
#define MIIM_DATA
Definition: winuser.h:721
UINT fType
Definition: ntuser.h:346
LONG cy
Definition: windef.h:335

Referenced by IntMenuItemInfo(), and UserMenuItemInfo().

◆ IntGetMenuItemRect()

BOOL FASTCALL IntGetMenuItemRect ( PWND  pWnd,
PMENU  Menu,
UINT  uItem,
PRECTL  Rect 
)

Definition at line 5228 of file menu.c.

5233 {
5234  LONG XMove, YMove;
5235  PITEM MenuItem;
5236  UINT I = uItem;
5237 
5238  if ((MenuItem = MENU_FindItem (&Menu, &I, MF_BYPOSITION)))
5239  {
5240  Rect->left = MenuItem->xItem;
5241  Rect->top = MenuItem->yItem;
5242  Rect->right = MenuItem->cxItem; // Do this for now......
5243  Rect->bottom = MenuItem->cyItem;
5244  }
5245  else
5246  {
5247  ERR("Failed Item Lookup! %u\n", uItem);
5248  return FALSE;
5249  }
5250 
5251  if (!pWnd)
5252  {
5253  HWND hWnd = Menu->hWnd;
5254  if (!(pWnd = UserGetWindowObject(hWnd))) return FALSE;
5255  }
5256 
5257  if (Menu->fFlags & MNF_POPUP)
5258  {
5259  XMove = pWnd->rcClient.left;
5260  YMove = pWnd->rcClient.top;
5261  }
5262  else
5263  {
5264  XMove = pWnd->rcWindow.left;
5265  YMove = pWnd->rcWindow.top;
5266  }
5267 
5268  Rect->left += XMove;
5269  Rect->top += YMove;
5270  Rect->right += XMove;
5271  Rect->bottom += YMove;
5272 
5273  return TRUE;
5274 }
HWND hWnd
Definition: ntuser.h:411
#define TRUE
Definition: types.h:120
HWND hWnd
Definition: settings.c:17
LONG top
Definition: windef.h:307
PITEM FASTCALL MENU_FindItem(PMENU *pmenu, UINT *nPos, UINT wFlags)
Definition: menu.c:507
ULONG cyItem
Definition: ntuser.h:358
ULONG yItem
Definition: ntuser.h:356
RECT rcClient
Definition: ntuser.h:687
LONG left
Definition: windef.h:306
#define FALSE
Definition: types.h:117
long LONG
Definition: pedump.c:60
#define MF_BYPOSITION
Definition: winuser.h:203
ULONG cxItem
Definition: ntuser.h:357
PWND FASTCALL UserGetWindowObject(HWND hWnd)
Definition: window.c:103
ULONG xItem
Definition: ntuser.h:355
#define I(s)
RECT rcWindow
Definition: ntuser.h:686
#define ERR(fmt,...)
Definition: debug.h:110
unsigned int UINT
Definition: ndis.h:50
#define MNF_POPUP
Definition: ntuser.h:376
ULONG fFlags
Definition: ntuser.h:392

Referenced by NtUserGetMenuBarInfo().

◆ IntGetMenuObject()

PMENU FASTCALL IntGetMenuObject ( HMENU  hMenu)

Definition at line 192 of file menu.c.

193 {
194  PMENU Menu = UserGetMenuObject(hMenu);
195  if (Menu)
196  Menu->head.cLockObj++;
197 
198  return Menu;
199 }
FORCEINLINE PMENU UserGetMenuObject(HMENU hMenu)
Definition: userfuncs.h:3
PROCDESKHEAD head
Definition: ntuser.h:391

Referenced by IntSetMenu(), NtUserCallTwoParam(), and NtUserSetSystemMenu().

◆ IntGetMenuState()

UINT FASTCALL IntGetMenuState ( HMENU  hMenu,
UINT  uId,
UINT  uFlags 
)

Definition at line 4973 of file menu.c.

4974 {
4975  PMENU MenuObject;
4976  PITEM pItem;
4977 
4978  if (!(MenuObject = UserGetMenuObject(hMenu)))
4979  {
4980  return (UINT)-1;
4981  }
4982 
4983  if (!(pItem = MENU_FindItem( &MenuObject, &uId, uFlags ))) return -1;
4984 
4985  if (pItem->spSubMenu)
4986  {
4987  return (pItem->spSubMenu->cItems << 8) | ((pItem->fState|pItem->fType|MF_POPUP) & 0xff);
4988  }
4989  else
4990  return (pItem->fType | pItem->fState);
4991 }
UINT fState
Definition: ntuser.h:347
PITEM FASTCALL MENU_FindItem(PMENU *pmenu, UINT *nPos, UINT wFlags)
Definition: menu.c:507
UINT uFlags
Definition: api.c:59
FORCEINLINE PMENU UserGetMenuObject(HMENU hMenu)
Definition: userfuncs.h:3
struct tagMENU * spSubMenu
Definition: ntuser.h:349
#define MF_POPUP
Definition: winuser.h:136
unsigned int UINT
Definition: ndis.h:50
UINT fType
Definition: ntuser.h:346

Referenced by co_IntTranslateAccelerator(), NC_DoButton(), NC_HandleNCLButtonDblClk(), and UserDrawCaptionButton().

◆ IntGetSubMenu()

HMENU FASTCALL IntGetSubMenu ( HMENU  hMenu,
int  nPos 
)

Definition at line 4993 of file menu.c.

4994 {
4995  PMENU MenuObject;
4996  PITEM pItem;
4997 
4998  if (!(MenuObject = UserGetMenuObject(hMenu)))
4999  {
5000  return NULL;
5001  }
5002 
5003  if (!(pItem = MENU_FindItem( &MenuObject, (UINT*)&nPos, MF_BYPOSITION ))) return NULL;
5004 
5005  if (pItem->spSubMenu)
5006  {
5007  HMENU hsubmenu = UserHMGetHandle(pItem->spSubMenu);
5008  return hsubmenu;
5009  }
5010  return NULL;
5011 }
PITEM FASTCALL MENU_FindItem(PMENU *pmenu, UINT *nPos, UINT wFlags)
Definition: menu.c:507
FORCEINLINE PMENU UserGetMenuObject(HMENU hMenu)
Definition: userfuncs.h:3
#define MF_BYPOSITION
Definition: winuser.h:203
#define UserHMGetHandle(obj)
Definition: ntuser.h:213
struct tagMENU * spSubMenu
Definition: ntuser.h:349
unsigned int UINT
Definition: ndis.h:50
#define NULL
Definition: types.h:112
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:60

Referenced by IntGetSystemMenu().

◆ IntGetSystemMenu()

PMENU FASTCALL IntGetSystemMenu ( PWND  Window,
BOOL  bRevert 
)

Definition at line 5381 of file menu.c.

5382 {
5383  PMENU Menu;
5384 
5385  if (bRevert)
5386  {
5387  if (Window->SystemMenu)
5388  {
5389  Menu = UserGetMenuObject(Window->SystemMenu);
5390  if (Menu && !(Menu->fFlags & MNF_SYSDESKMN))
5391  {
5392  IntDestroyMenuObject(Menu, TRUE);
5393  Window->SystemMenu = NULL;
5394  }
5395  }
5396  }
5397  else
5398  {
5399  Menu = Window->SystemMenu ? UserGetMenuObject(Window->SystemMenu) : NULL;
5400  if ((!Menu || Menu->fFlags & MNF_SYSDESKMN) && Window->style & WS_SYSMENU)
5401  {
5402  Menu = MENU_GetSystemMenu(Window, NULL);
5403  Window->SystemMenu = Menu ? UserHMGetHandle(Menu) : NULL;
5404  }
5405  }
5406 
5407  if (Window->SystemMenu)
5408  {
5409  HMENU hMenu = IntGetSubMenu( Window->SystemMenu, 0);
5410  /* Store the dummy sysmenu handle to facilitate the refresh */
5411  /* of the close button if the SC_CLOSE item change */
5412  Menu = UserGetMenuObject(hMenu);
5413  if (Menu)
5414  {
5415  Menu->spwndNotify = Window;
5416  Menu->fFlags |= MNF_SYSSUBMENU;
5417  }
5418  return Menu;
5419  }
5420  return NULL;
5421 }
#define TRUE
Definition: types.h:120
struct _WND * spwndNotify
Definition: ntuser.h:399
BOOL FASTCALL IntDestroyMenuObject(PMENU Menu, BOOL bRecurse)
Definition: menu.c:317
FORCEINLINE PMENU UserGetMenuObject(HMENU hMenu)
Definition: userfuncs.h:3
Definition: window.c:28
#define UserHMGetHandle(obj)
Definition: ntuser.h:213
int Window
Definition: x11stubs.h:26
HMENU FASTCALL IntGetSubMenu(HMENU hMenu, int nPos)
Definition: menu.c:4993
#define MNF_SYSDESKMN
Definition: ntuser.h:381
#define NULL
Definition: types.h:112
#define MNF_SYSSUBMENU
Definition: ntuser.h:382
ULONG fFlags
Definition: ntuser.h:392
#define WS_SYSMENU
Definition: pedump.c:629
PMENU FASTCALL MENU_GetSystemMenu(PWND Window, PMENU Popup)
Definition: menu.c:5276
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:60

Referenced by IntDefWindowProc(), MENU_TrackMouseMenuBar(), NC_DoButton(), NC_HandleNCLButtonDblClk(), NC_HandleNCRButtonDown(), NtUserGetMenuBarInfo(), NtUserGetSystemMenu(), and UserDrawCaptionButton().

◆ intGetTitleBarInfo()

BOOLEAN APIENTRY intGetTitleBarInfo ( PWND  pWindowObject,
PTITLEBARINFO  bti 
)

Definition at line 4802 of file menu.c.

4803 {
4804 
4805  DWORD dwStyle = 0;
4806  DWORD dwExStyle = 0;
4807  BOOLEAN retValue = TRUE;
4808 
4809  if (bti->cbSize == sizeof(TITLEBARINFO))
4810  {
4811  RtlZeroMemory(&bti->rgstate[0],sizeof(DWORD)*(CCHILDREN_TITLEBAR+1));
4812 
4813  bti->rgstate[0] = STATE_SYSTEM_FOCUSABLE;
4814 
4815  dwStyle = pWindowObject->style;
4816  dwExStyle = pWindowObject->ExStyle;
4817 
4818  bti->rcTitleBar.top = 0;
4819  bti->rcTitleBar.left = 0;
4820  bti->rcTitleBar.right = pWindowObject->rcWindow.right - pWindowObject->rcWindow.left;
4821  bti->rcTitleBar.bottom = pWindowObject->rcWindow.bottom - pWindowObject->rcWindow.top;
4822 
4823  /* Is it iconiced ? */
4824  if ((dwStyle & WS_ICONIC)!=WS_ICONIC)
4825  {
4826  /* Remove frame from rectangle */
4827  if (HAS_THICKFRAME( dwStyle, dwExStyle ))
4828  {
4829  /* FIXME: Note this value should exists in pWindowObject for UserGetSystemMetrics(SM_CXFRAME) and UserGetSystemMetrics(SM_CYFRAME) */
4831  }
4832  else if (HAS_DLGFRAME( dwStyle, dwExStyle ))
4833  {
4834  /* FIXME: Note this value should exists in pWindowObject for UserGetSystemMetrics(SM_CXDLGFRAME) and UserGetSystemMetrics(SM_CYDLGFRAME) */
4836  }
4837  else if (HAS_THINFRAME( dwStyle, dwExStyle))
4838  {
4839  /* FIXME: Note this value should exists in pWindowObject for UserGetSystemMetrics(SM_CXBORDER) and UserGetSystemMetrics(SM_CYBORDER) */
4841  }
4842 
4843  /* We have additional border information if the window
4844  * is a child (but not an MDI child) */
4845  if ( (dwStyle & WS_CHILD) &&
4846  ((dwExStyle & WS_EX_MDICHILD) == 0 ) )
4847  {
4848  if (dwExStyle & WS_EX_CLIENTEDGE)
4849  {
4850  /* FIXME: Note this value should exists in pWindowObject for UserGetSystemMetrics(SM_CXEDGE) and UserGetSystemMetrics(SM_CYEDGE) */
4852  }
4853 
4854  if (dwExStyle & WS_EX_STATICEDGE)
4855  {
4856  /* FIXME: Note this value should exists in pWindowObject for UserGetSystemMetrics(SM_CXBORDER) and UserGetSystemMetrics(SM_CYBORDER) */
4858  }
4859  }
4860  }
4861 
4862  bti->rcTitleBar.top += pWindowObject->rcWindow.top;
4863  bti->rcTitleBar.left += pWindowObject->rcWindow.left;
4864  bti->rcTitleBar.right += pWindowObject->rcWindow.left;
4865 
4866  bti->rcTitleBar.bottom = bti->rcTitleBar.top;
4867  if (dwExStyle & WS_EX_TOOLWINDOW)
4868  {
4869  /* FIXME: Note this value should exists in pWindowObject for UserGetSystemMetrics(SM_CYSMCAPTION) */
4871  }
4872  else
4873  {
4874  /* FIXME: Note this value should exists in pWindowObject for UserGetSystemMetrics(SM_CYCAPTION) and UserGetSystemMetrics(SM_CXSIZE) */
4877  }
4878 
4879  if (dwStyle & WS_CAPTION)
4880  {
4881  bti->rgstate[1] = STATE_SYSTEM_INVISIBLE;
4882  if (dwStyle & WS_SYSMENU)
4883  {
4884  if (!(dwStyle & (WS_MINIMIZEBOX|WS_MAXIMIZEBOX)))
4885  {
4886  bti->rgstate[2] = STATE_SYSTEM_INVISIBLE;
4887  bti->rgstate[3] = STATE_SYSTEM_INVISIBLE;
4888  }
4889  else
4890  {
4891  if (!(dwStyle & WS_MINIMIZEBOX))
4892  {
4894  }
4895  if (!(dwStyle & WS_MAXIMIZEBOX))
4896  {
4898  }
4899  }
4900 
4901  if (!(dwExStyle & WS_EX_CONTEXTHELP))
4902  {
4903  bti->rgstate[4] = STATE_SYSTEM_INVISIBLE;
4904  }
4905  if (pWindowObject->pcls->style & CS_NOCLOSE)
4906  {
4908  }
4909  }
4910  else
4911  {
4912  bti->rgstate[2] = STATE_SYSTEM_INVISIBLE;
4913  bti->rgstate[3] = STATE_SYSTEM_INVISIBLE;
4914  bti->rgstate[4] = STATE_SYSTEM_INVISIBLE;
4915  bti->rgstate[5] = STATE_SYSTEM_INVISIBLE;
4916  }
4917  }
4918  else
4919  {
4920  bti->rgstate[0] |= STATE_SYSTEM_INVISIBLE;
4921  }
4922  }
4923  else
4924  {
4926  retValue = FALSE;
4927  }
4928 
4929  return retValue;
4930 }
#define CCHILDREN_TITLEBAR
Definition: winuser.h:3737
#define WS_EX_CONTEXTHELP
Definition: winuser.h:386
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
DWORD ExStyle
Definition: ntuser.h:674
#define STATE_SYSTEM_UNAVAILABLE
Definition: winuser.h:2842
#define STATE_SYSTEM_FOCUSABLE
Definition: winuser.h:2862
VOID FASTCALL RECTL_vInflateRect(_Inout_ RECTL *rect, _In_ INT dx, _In_ INT dy)
Definition: rect.c:101
#define TRUE
Definition: types.h:120
LONG top
Definition: windef.h:307
#define CS_NOCLOSE
Definition: winuser.h:649
#define SM_CXEDGE
Definition: winuser.h:1002
#define WS_CHILD
Definition: pedump.c:617
LONG left
Definition: windef.h:306
#define SM_CYFRAME
Definition: winuser.h:990
#define SM_CXFRAME
Definition: winuser.h:988
LONG right
Definition: windef.h:308
#define WS_EX_TOOLWINDOW
Definition: winuser.h:404
#define WS_EX_MDICHILD
Definition: winuser.h:394
UINT style
Definition: ntuser.h:554
#define FALSE
Definition: types.h:117
#define SM_CYDLGFRAME
Definition: winuser.h:962
unsigned char BOOLEAN
#define HAS_THINFRAME(Style, ExStyle)
Definition: window.h:16
#define HAS_THICKFRAME(Style, ExStyle)
Definition: window.h:12
#define SM_CYEDGE
Definition: winuser.h:1003
#define WS_MAXIMIZEBOX
Definition: pedump.c:632
LONG NTAPI UserGetSystemMetrics(ULONG Index)
Definition: metric.c:180
#define WS_CAPTION
Definition: pedump.c:624
#define SM_CYCAPTION
Definition: winuser.h:957
#define WS_ICONIC
Definition: pedump.c:641
#define SM_CXDLGFRAME
Definition: winuser.h:960
unsigned long DWORD
Definition: ntddk_ex.h:95
#define SM_CYBORDER
Definition: winuser.h:959
#define SM_CXBORDER
Definition: winuser.h:958
RECT rcWindow
Definition: ntuser.h:686
DWORD rgstate[CCHILDREN_TITLEBAR+1]
Definition: winuser.h:3742
#define WS_EX_CLIENTEDGE
Definition: winuser.h:384
#define WS_MINIMIZEBOX
Definition: pedump.c:631
#define SM_CXSIZE
Definition: winuser.h:985
#define HAS_DLGFRAME(Style, ExStyle)
Definition: window.h:8
LONG bottom
Definition: windef.h:309
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
#define WS_SYSMENU
Definition: pedump.c:629
#define SM_CYSMCAPTION
Definition: winuser.h:1008
#define WS_EX_STATICEDGE
Definition: winuser.h:403
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)
Definition: error.c:27
#define STATE_SYSTEM_INVISIBLE
Definition: winuser.h:2857
PCLS pcls
Definition: ntuser.h:690
DWORD style
Definition: ntuser.h:676

Referenced by NtUserGetTitleBarInfo().

◆ IntHiliteMenuItem()

BOOL FASTCALL IntHiliteMenuItem ( PWND  WindowObject,
PMENU  MenuObject,
UINT  uItemHilite,
UINT  uHilite 
)

Definition at line 4776 of file menu.c.

4780 {
4781  PITEM MenuItem;
4782  UINT uItem = uItemHilite;
4783 
4784  if (!(MenuItem = MENU_FindItem( &MenuObject, &uItem, uHilite ))) return TRUE;
4785 
4786  if (uHilite & MF_HILITE)
4787  {
4788  MenuItem->fState |= MF_HILITE;
4789  }
4790  else
4791  {
4792  MenuItem->fState &= ~MF_HILITE;
4793  }
4794  if (MenuObject->iItem == uItemHilite) return TRUE;
4795  MENU_HideSubPopups( WindowObject, MenuObject, FALSE, 0 );
4796  MENU_SelectItem( WindowObject, MenuObject, uItemHilite, TRUE, 0 );
4797 
4798  return TRUE; // Always returns true!!!!
4799 }
#define TRUE
Definition: types.h:120
UINT fState
Definition: ntuser.h:347
PITEM FASTCALL MENU_FindItem(PMENU *pmenu, UINT *nPos, UINT wFlags)
Definition: menu.c:507
#define FALSE
Definition: types.h:117
#define MF_HILITE
Definition: winuser.h:205
static void FASTCALL MENU_SelectItem(PWND pwndOwner, PMENU menu, UINT wIndex, BOOL sendMenuSelect, PMENU topmenu)
Definition: menu.c:3139
static void FASTCALL MENU_HideSubPopups(PWND pWndOwner, PMENU Menu, BOOL SendMenuSelect, UINT wFlags)
Definition: menu.c:3262
unsigned int UINT
Definition: ndis.h:50
INT iItem
Definition: ntuser.h:393

Referenced by NtUserHiliteMenuItem().

◆ IntInsertMenuItem()

BOOL FASTCALL IntInsertMenuItem ( _In_ PMENU  MenuObject,
UINT  uItem,
BOOL  fByPosition,
PROSMENUITEMINFO  ItemInfo,
PUNICODE_STRING  lpstr 
)

Definition at line 691 of file menu.c.

697 {
698  PITEM MenuItem;
699  PMENU SubMenu = NULL;
700 
701  NT_ASSERT(MenuObject != NULL);
702 
703  if (MAX_MENU_ITEMS <= MenuObject->cItems)
704  {
706  return FALSE;
707  }
708 
709  SubMenu = MenuObject;
710 
711  if(!(MenuItem = MENU_InsertItem( SubMenu, uItem, fByPosition ? MF_BYPOSITION : MF_BYCOMMAND, &SubMenu, &uItem ))) return FALSE;
712 
713  if(!IntSetMenuItemInfo(SubMenu, MenuItem, ItemInfo, lpstr))
714  {
715  IntRemoveMenuItem(SubMenu, uItem, fByPosition ? MF_BYPOSITION : MF_BYCOMMAND, FALSE);
716  return FALSE;
717  }
718 
719  /* Force size recalculation! */
720  SubMenu->cyMenu = 0;
721  MenuItem->hbmpChecked = MenuItem->hbmpUnchecked = 0;
722 
723  TRACE("IntInsertMenuItemToList = %u %i\n", uItem, (BOOL)((INT)uItem >= 0));
724 
725  return TRUE;
726 }
#define MF_BYCOMMAND
Definition: winuser.h:202
#define TRUE
Definition: types.h:120
BOOL FASTCALL IntSetMenuItemInfo(PMENU MenuObject, PITEM MenuItem, PROSMENUITEMINFO lpmii, PUNICODE_STRING lpstr)
Definition: menu.c:1033
#define ERROR_NOT_ENOUGH_MEMORY
Definition: dderror.h:7
BOOL FASTCALL IntRemoveMenuItem(PMENU pMenu, UINT nPos, UINT wFlags, BOOL bRecurse)
Definition: menu.c:596
int32_t INT
Definition: typedefs.h:58
#define FALSE
Definition: types.h:117
unsigned int BOOL
Definition: ntddk_ex.h:94
#define MF_BYPOSITION
Definition: winuser.h:203
ULONG cyMenu
Definition: ntuser.h:397
#define TRACE(s)
Definition: solgame.cpp:4
HANDLE hbmpUnchecked
Definition: ntuser.h:351
HANDLE hbmpChecked
Definition: ntuser.h:350
#define NULL
Definition: types.h:112
static LPCSTR lpstr
Definition: font.c:51
ITEM * MENU_InsertItem(PMENU menu, UINT pos, UINT flags, PMENU *submenu, UINT *npos)
Definition: menu.c:639
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)
Definition: error.c:27
#define NT_ASSERT
Definition: rtlfuncs.h:3310

Referenced by MENU_GetSystemMenu(), and UserInsertMenuItem().

◆ IntIsMenu()

BOOL FASTCALL IntIsMenu ( HMENU  Menu)

Definition at line 240 of file menu.c.

241 {
242  if (UserGetMenuObject(Menu)) return TRUE;
243  return FALSE;
244 }
#define TRUE
Definition: types.h:120
FORCEINLINE PMENU UserGetMenuObject(HMENU hMenu)
Definition: userfuncs.h:3
#define FALSE
Definition: types.h:117

◆ IntMenuItemFromPoint()

INT FASTCALL IntMenuItemFromPoint ( PWND  pWnd,
HMENU  hMenu,
POINT  ptScreen 
)

Definition at line 1518 of file menu.c.

1519 {
1520  MENU *menu = UserGetMenuObject(hMenu);
1521  UINT pos;
1522 
1523  /*FIXME: Do we have to handle hWnd here? */
1524  if (!menu) return -1;
1525  if (!MENU_FindItemByCoords(menu, ptScreen, &pos)) return -1;
1526  return pos;
1527 }
FORCEINLINE PMENU UserGetMenuObject(HMENU hMenu)
Definition: userfuncs.h:3
unsigned int UINT
Definition: ndis.h:50
static ITEM * MENU_FindItemByCoords(MENU *menu, POINT pt, UINT *pos)
Definition: menu.c:1480

Referenced by IntDefWindowProc().

◆ IntMenuItemInfo()

BOOL FASTCALL IntMenuItemInfo ( PMENU  Menu,
UINT  Item,
BOOL  ByPosition,
PROSMENUITEMINFO  ItemInfo,
BOOL  SetOrGet,
PUNICODE_STRING  lpstr 
)

Definition at line 5074 of file menu.c.

5081 {
5082  PITEM MenuItem;
5083  BOOL Ret;
5084 
5085  if (!(MenuItem = MENU_FindItem( &Menu, &Item, (ByPosition ? MF_BYPOSITION : MF_BYCOMMAND) )))
5086  {
5088  return( FALSE);
5089  }
5090  if (SetOrGet)
5091  {
5092  Ret = IntSetMenuItemInfo(Menu, MenuItem, ItemInfo, lpstr);
5093  }
5094  else
5095  {
5096  Ret = IntGetMenuItemInfo(Menu, MenuItem, ItemInfo);
5097  }
5098  return( Ret);
5099 }
#define MF_BYCOMMAND
Definition: winuser.h:202
PITEM FASTCALL MENU_FindItem(PMENU *pmenu, UINT *nPos, UINT wFlags)
Definition: menu.c:507
BOOL FASTCALL IntSetMenuItemInfo(PMENU MenuObject, PITEM MenuItem, PROSMENUITEMINFO lpmii, PUNICODE_STRING lpstr)
Definition: menu.c:1033
BOOL FASTCALL IntGetMenuItemInfo(PMENU Menu, PITEM MenuItem, PROSMENUITEMINFO lpmii)
Definition: menu.c:962
#define FALSE
Definition: types.h:117
unsigned int BOOL
Definition: ntddk_ex.h:94
#define MF_BYPOSITION
Definition: winuser.h:203
#define ERROR_MENU_ITEM_NOT_FOUND
Definition: winerror.h:937
_In_ WDFCOLLECTION _In_ WDFOBJECT Item
static LPCSTR lpstr
Definition: font.c:51
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)
Definition: error.c:27

Referenced by MENU_GetSystemMenu().

◆ IntRemoveMenuItem()

BOOL FASTCALL IntRemoveMenuItem ( PMENU  pMenu,
UINT  nPos,
UINT  wFlags,
BOOL  bRecurse 
)

Definition at line 596 of file menu.c.

597 {
598  PITEM item;
599  PITEM newItems;
600 
601  TRACE("(menu=%p pos=%04x flags=%04x)\n",pMenu, nPos, wFlags);
602  if (!(item = MENU_FindItem( &pMenu, &nPos, wFlags ))) return FALSE;
603 
604  /* Remove item */
605 
606  FreeMenuText(pMenu,item);
607  if (bRecurse && item->spSubMenu)
608  {
609  IntDestroyMenuObject(item->spSubMenu, bRecurse);
610  }
612  if (--pMenu->cItems == 0)
613  {
614  DesktopHeapFree(pMenu->head.rpdesk, pMenu->rgItems );
615  pMenu->rgItems = NULL;
616  }
617  else
618  {
619  while (nPos < pMenu->cItems)
620  {
621  *item = *(item+1);
622  item++;
623  nPos++;
624  }
625  newItems = DesktopHeapReAlloc(pMenu->head.rpdesk, pMenu->rgItems, pMenu->cItems * sizeof(ITEM));
626  if (newItems)
627  {
628  pMenu->rgItems = newItems;
629  }
630  }
631  return TRUE;
632 }
static __inline PVOID DesktopHeapReAlloc(IN PDESKTOP Desktop, IN PVOID lpMem, IN SIZE_T Bytes)
Definition: desktop.h:252
#define TRUE
Definition: types.h:120
PITEM FASTCALL MENU_FindItem(PMENU *pmenu, UINT *nPos, UINT wFlags)
Definition: menu.c:507
BOOL FASTCALL IntDestroyMenuObject(PMENU Menu, BOOL bRecurse)
Definition: menu.c:317
#define FALSE
Definition: types.h:117
PROCDESKHEAD head
Definition: ntuser.h:391
#define TRACE(s)
Definition: solgame.cpp:4
UINT cItems
Definition: ntuser.h:395
PITEM rgItems
Definition: ntuser.h:400
_In_ DWORD _Out_ _In_ WORD wFlags
Definition: wincon.h:531
static ATOM item
Definition: dde.c:856
#define NULL
Definition: types.h:112
static __inline BOOL DesktopHeapFree(IN PDESKTOP Desktop, IN PVOID lpMem)
Definition: desktop.h:241
struct _DESKTOP * rpdesk
Definition: ntuser.h:202
#define FreeMenuText(Menu, MenuItem)
Definition: menu.c:183

Referenced by IntInsertMenuItem(), MENU_GetSystemMenu(), NtUserDeleteMenu(), and NtUserRemoveMenu().

◆ IntSetMenu()

BOOL FASTCALL IntSetMenu ( PWND  Wnd,
HMENU  Menu,
BOOL Changed 
)

Definition at line 5457 of file menu.c.

5461 {
5462  PMENU OldMenu, NewMenu = NULL;
5463 
5464  if ((Wnd->style & (WS_CHILD | WS_POPUP)) == WS_CHILD)
5465  {
5466  ERR("SetMenu: Window is a Child 0x%p!\n",UserHMGetHandle(Wnd));
5468  return FALSE;
5469  }
5470 
5471  *Changed = (UlongToHandle(Wnd->IDMenu) != Menu);
5472  if (! *Changed)
5473  {
5474  return TRUE;
5475  }
5476 
5477  if (Wnd->IDMenu)
5478  {
5479  OldMenu = IntGetMenuObject(UlongToHandle(Wnd->IDMenu));
5480  ASSERT(NULL == OldMenu || OldMenu->hWnd == UserHMGetHandle(Wnd));
5481  }
5482  else
5483  {
5484  OldMenu = NULL;
5485  }
5486 
5487  if (NULL != Menu)
5488  {
5489  NewMenu = IntGetMenuObject(Menu);
5490  if (NULL == NewMenu)
5491  {
5492  if (NULL != OldMenu)
5493  {
5494  IntReleaseMenuObject(OldMenu);
5495  }
5497  return FALSE;
5498  }
5499  if (NULL != NewMenu->hWnd)
5500  {
5501  /* Can't use the same menu for two windows */
5502  if (NULL != OldMenu)
5503  {
5504  IntReleaseMenuObject(OldMenu);
5505  }
5507  return FALSE;
5508  }
5509 
5510  }
5511 
5512  Wnd->IDMenu = (UINT_PTR) Menu;
5513  if (NULL != NewMenu)
5514  {
5515  NewMenu->hWnd = UserHMGetHandle(Wnd);
5516  IntReleaseMenuObject(NewMenu);
5517  }
5518  if (NULL != OldMenu)
5519  {
5520  OldMenu->hWnd = NULL;
5521  IntReleaseMenuObject(OldMenu);
5522  }
5523 
5524  return TRUE;
5525 }
unsigned __int3264 UINT_PTR
Definition: activex.cpp:275
HWND hWnd
Definition: ntuser.h:411
#define TRUE
Definition: types.h:120
#define WS_CHILD
Definition: pedump.c:617
PMENU FASTCALL IntGetMenuObject(HMENU hMenu)
Definition: menu.c:192
#define FALSE
Definition: types.h:117
#define ERROR_INVALID_MENU_HANDLE
Definition: winerror.h:882
#define UserHMGetHandle(obj)
Definition: ntuser.h:213
UINT_PTR IDMenu
Definition: ntuser.h:701
#define ERROR_INVALID_WINDOW_HANDLE
Definition: winerror.h:881
#define ASSERT(a)
Definition: mode.c:44
#define UlongToHandle(ul)
Definition: basetsd.h:97
#define ERR(fmt,...)
Definition: debug.h:110
#define WS_POPUP
Definition: pedump.c:616
#define NULL
Definition: types.h:112
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)
Definition: error.c:27
DWORD style
Definition: ntuser.h:676

Referenced by IntCreateWindow(), and NtUserSetMenu().

◆ IntSetMenuContextHelpId()

BOOL FASTCALL IntSetMenuContextHelpId ( PMENU  Menu,
DWORD  dwContextHelpId 
)

Definition at line 872 of file menu.c.

873 {
874  Menu->dwContextHelpId = dwContextHelpId;
875  return TRUE;
876 }
#define TRUE
Definition: types.h:120
DWORD dwContextHelpId
Definition: ntuser.h:402

Referenced by NtUserSetMenuContextHelpId().

◆ IntSetMenuFlagRtoL()

BOOL FASTCALL IntSetMenuFlagRtoL ( PMENU  Menu)

Definition at line 864 of file menu.c.

865 {
866  ERR("SetMenuFlagRtoL\n");
867  Menu->fFlags |= MNF_RTOL;
868  return TRUE;
869 }
#define TRUE
Definition: types.h:120
#define ERR(fmt,...)
Definition: debug.h:110
#define MNF_RTOL
Definition: ntuser.h:379
ULONG fFlags
Definition: ntuser.h:392

Referenced by NtUserSetMenuFlagRtoL().

◆ IntSetMenuInfo()

BOOL FASTCALL IntSetMenuInfo ( PMENU  Menu,
PROSMENUINFO  lpmi 
)

Definition at line 914 of file menu.c.

915 {
916  if(lpmi->fMask & MIM_BACKGROUND)
917  Menu->hbrBack = lpmi->hbrBack;
918  if(lpmi->fMask & MIM_HELPID)
919  Menu->dwContextHelpId = lpmi->dwContextHelpID;
920  if(lpmi->fMask & MIM_MAXHEIGHT)
921  Menu->cyMax = lpmi->cyMax;
922  if(lpmi->fMask & MIM_MENUDATA)
923  Menu->dwMenuData = lpmi->dwMenuData;
924  if(lpmi->fMask & MIM_STYLE)
925  Menu->fFlags ^= (Menu->fFlags ^ lpmi->dwStyle) & MNS_STYLE_MASK;
926  if(lpmi->fMask & MIM_APPLYTOSUBMENUS)
927  {
928  int i;
929  PITEM item = Menu->rgItems;
930  for ( i = Menu->cItems; i; i--, item++)
931  {
932  if ( item->spSubMenu )
933  {
934  IntSetMenuInfo( item->spSubMenu, lpmi);
935  }
936  }
937  }
938  if (sizeof(MENUINFO) < lpmi->cbSize)
939  {
940  Menu->iItem = lpmi->iItem;
941  Menu->cyMenu = lpmi->cyMenu;
942  Menu->cxMenu = lpmi->cxMenu;
943  Menu->spwndNotify = lpmi->spwndNotify;
944  Menu->cxTextAlign = lpmi->cxTextAlign;
945  Menu->iTop = lpmi->iTop;
946  Menu->iMaxTop = lpmi->iMaxTop;
947  Menu->dwArrowsOn = lpmi->dwArrowsOn;
948 
949  Menu->TimeToHide = lpmi->TimeToHide;
950  Menu->hWnd = lpmi->Wnd;
951  }
952  if ( lpmi->fMask & MIM_STYLE)
953  {
954  if (lpmi->dwStyle & MNS_AUTODISMISS) FIXME("MNS_AUTODISMISS unimplemented wine\n");
955  if (lpmi->dwStyle & MNS_DRAGDROP) FIXME("MNS_DRAGDROP unimplemented wine\n");
956  if (lpmi->dwStyle & MNS_MODELESS) FIXME("MNS_MODELESS unimplemented wine\n");
957  }
958  return TRUE;
959 }
DWORD_PTR dwMenuData
Definition: ntuser.h:404
HWND hWnd
Definition: ntuser.h:411
#define MNS_MODELESS
Definition: winuser.h:751
INT iMaxTop
Definition: menu.h:92
HBRUSH hbrBack
Definition: ntuser.h:405
#define MNS_DRAGDROP
Definition: winuser.h:752
#define MNS_AUTODISMISS
Definition: winuser.h:753
#define TRUE
Definition: types.h:120
#define MNS_STYLE_MASK
Definition: menu.c:43
WORD cyMenu
Definition: menu.h:88
UINT iItem
Definition: menu.h:85
PWND spwndNotify
Definition: menu.h:90
struct _WND * spwndNotify
Definition: ntuser.h:399
BOOL TimeToHide
Definition: ntuser.h:412
DWORD cbSize
Definition: menu.h:76
HBRUSH hbrBack
Definition: menu.h:80
ULONG cxTextAlign
Definition: menu.h:89
UINT cyMax
Definition: menu.h:79
ULONG cxTextAlign
Definition: ntuser.h:398
#define FIXME(fmt,...)
Definition: debug.h:111
ULONG cyMenu
Definition: ntuser.h:397
INT iTop
Definition: ntuser.h:406
DWORD dwContextHelpId
Definition: ntuser.h:402
BOOL FASTCALL IntSetMenuInfo(PMENU Menu, PROSMENUINFO lpmi)
Definition: menu.c:914
INT iTop
Definition: menu.h:91
DWORD dwArrowsOn
Definition: ntuser.h:408
ULONG cyMax
Definition: ntuser.h:403
DWORD dwArrowsOn
Definition: menu.h:93
UINT cItems
Definition: ntuser.h:395
DWORD dwContextHelpID
Definition: menu.h:81
PITEM rgItems
Definition: ntuser.h:400
WORD cxMenu
Definition: menu.h:87
static ATOM item
Definition: dde.c:856
DWORD fMask
Definition: menu.h:77
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
INT iMaxTop
Definition: ntuser.h:407
ULONG_PTR dwMenuData
Definition: menu.h:82
BOOL TimeToHide
Definition: menu.h:97
HWND Wnd
Definition: menu.h:96
ULONG fFlags
Definition: ntuser.h:392
ULONG cxMenu
Definition: ntuser.h:396
INT iItem
Definition: ntuser.h:393
DWORD dwStyle
Definition: menu.h:78

Referenced by UserMenuInfo().

◆ IntSetMenuItemInfo()

BOOL FASTCALL IntSetMenuItemInfo ( PMENU  MenuObject,
PITEM  MenuItem,
PROSMENUITEMINFO  lpmii,
PUNICODE_STRING  lpstr 
)

Definition at line 1033 of file menu.c.

1034 {
1035  PMENU SubMenuObject;
1036  BOOL circref = FALSE;
1037 
1038  if(!MenuItem || !MenuObject || !lpmii)
1039  {
1040  return FALSE;
1041  }
1042  if ( lpmii->fMask & MIIM_FTYPE )
1043  {
1044  MenuItem->fType &= ~MENUITEMINFO_TYPE_MASK;
1045  MenuItem->fType |= lpmii->fType & MENUITEMINFO_TYPE_MASK;
1046  }
1047  if (lpmii->fMask & MIIM_TYPE)
1048  {
1049  #if 0
1050  if (lpmii->fMask & ( MIIM_STRING | MIIM_FTYPE | MIIM_BITMAP))
1051  {
1052  ERR("IntSetMenuItemInfo: Invalid combination of fMask bits used\n");
1054  /* This does not happen on Win9x/ME */
1056  return FALSE;
1057  }
1058  #endif
1059  /*
1060  * Delete the menu item type when changing type from
1061  * MF_STRING.
1062  */
1063  if (MenuItem->fType != lpmii->fType &&
1064  MENU_ITEM_TYPE(MenuItem->fType) == MFT_STRING)
1065  {
1066  FreeMenuText(MenuObject,MenuItem);
1067  RtlInitUnicodeString(&MenuItem->lpstr, NULL);
1068  MenuItem->Xlpstr = NULL;
1069  }
1070  if(lpmii->fType & MFT_BITMAP)
1071  {
1072  if(lpmii->hbmpItem)
1073  MenuItem->hbmp = lpmii->hbmpItem;
1074  else
1075  { /* Win 9x/Me stuff */
1076  MenuItem->hbmp = (HBITMAP)((ULONG_PTR)(LOWORD(lpmii->dwTypeData)));
1077  }
1078  lpmii->dwTypeData = 0;
1079  }
1080  }
1081  if(lpmii->fMask & MIIM_BITMAP)
1082  {
1083  MenuItem->hbmp = lpmii->hbmpItem;
1084  if (MenuItem->hbmp <= HBMMENU_POPUP_MINIMIZE && MenuItem->hbmp >= HBMMENU_CALLBACK)
1085  MenuItem->fState |= MFS_HBMMENUBMP;
1086  else
1087  MenuItem->fState &= ~MFS_HBMMENUBMP;
1088  }
1089  if(lpmii->fMask & MIIM_CHECKMARKS)
1090  {
1091  MenuItem->hbmpChecked = lpmii->hbmpChecked;
1092  MenuItem->hbmpUnchecked = lpmii->hbmpUnchecked;
1093  }
1094  if(lpmii->fMask & MIIM_DATA)
1095  {
1096  MenuItem->dwItemData = lpmii->dwItemData;
1097  }
1098  if(lpmii->fMask & MIIM_ID)
1099  {
1100  MenuItem->wID = lpmii->wID;
1101  }
1102  if(lpmii->fMask & MIIM_STATE)
1103  {
1104  /* Remove MFS_DEFAULT flag from all other menu items if this item
1105  has the MFS_DEFAULT state */
1106  if(lpmii->fState & MFS_DEFAULT)
1107  UserSetMenuDefaultItem(MenuObject, -1, 0);
1108  /* Update the menu item state flags */
1109  UpdateMenuItemState(MenuItem->fState, lpmii->fState);
1110  }
1111 
1112  if(lpmii->fMask & MIIM_SUBMENU)
1113  {
1114  if (lpmii->hSubMenu)
1115  {
1116  SubMenuObject = UserGetMenuObject(lpmii->hSubMenu);
1117  if ( SubMenuObject && !(UserObjectInDestroy(lpmii->hSubMenu)) )
1118  {
1121  if (MenuObject == SubMenuObject)
1122  {
1123  HANDLE hMenu;
1124  ERR("Pop Up Menu Double Trouble!\n");
1125  SubMenuObject = IntCreateMenu(&hMenu,
1126  FALSE,
1127  MenuObject->head.rpdesk,
1128  (PPROCESSINFO)MenuObject->head.hTaskWow); // It will be marked.
1129  if (!SubMenuObject) return FALSE;
1130  IntReleaseMenuObject(SubMenuObject); // This will be referenced again after insertion.
1131  circref = TRUE;
1132  }
1133  if ( MENU_depth( SubMenuObject, 0) > MAXMENUDEPTH )
1134  {
1135  ERR( "Loop detected in menu hierarchy or maximum menu depth exceeded!\n");
1136  if (circref) IntDestroyMenuObject(SubMenuObject, FALSE);
1137  return FALSE;
1138  }
1139  /* Make sure the submenu is marked as a popup menu */
1140  SubMenuObject->fFlags |= MNF_POPUP;
1141  // Now fix the test_subpopup_locked_by_menu tests....
1142  if (MenuItem->spSubMenu) IntReleaseMenuObject(MenuItem->spSubMenu);
1143  MenuItem->spSubMenu = SubMenuObject;
1144  UserReferenceObject(SubMenuObject);
1145  }
1146  else
1147  {
1149  return FALSE;
1150  }
1151  }
1152  else
1153  { // If submenu just dereference it.
1154  if (MenuItem->spSubMenu) IntReleaseMenuObject(MenuItem->spSubMenu);
1155  MenuItem->spSubMenu = NULL;
1156  }
1157  }
1158 
1159  if ((lpmii->fMask & MIIM_STRING) ||
1160  ((lpmii->fMask & MIIM_TYPE) && (MENU_ITEM_TYPE(lpmii->fType) == MF_STRING)))
1161  {
1162  /* free the string when used */
1163  FreeMenuText(MenuObject,MenuItem);
1164  RtlInitUnicodeString(&MenuItem->lpstr, NULL);
1165  MenuItem->Xlpstr = NULL;
1166 
1167  if(lpmii->dwTypeData && lpmii->cch && lpstr && lpstr->Buffer)
1168  {
1170 
1171  if (!NT_VERIFY(lpmii->cch <= UNICODE_STRING_MAX_CHARS))
1172  {
1173  return FALSE;
1174  }
1175 
1176  Source.Length = Source.MaximumLength = (USHORT)(lpmii->cch * sizeof(WCHAR));
1177  Source.Buffer = lpmii->dwTypeData;
1178 
1179  MenuItem->lpstr.Buffer = DesktopHeapAlloc( MenuObject->head.rpdesk, Source.Length + sizeof(WCHAR));
1180  if(MenuItem->lpstr.Buffer != NULL)
1181  {
1182  MenuItem->lpstr.Length = 0;
1183  MenuItem->lpstr.MaximumLength = Source.Length + sizeof(WCHAR);
1184  RtlCopyUnicodeString(&MenuItem->lpstr, &Source);
1185  MenuItem->lpstr.Buffer[MenuItem->lpstr.Length / sizeof(WCHAR)] = 0;
1186 
1187  MenuItem->cch = MenuItem->lpstr.Length / sizeof(WCHAR);
1188  MenuItem->Xlpstr = (USHORT*)MenuItem->lpstr.Buffer;
1189  }
1190  }
1191  }
1192 
1193  if( !(MenuObject->fFlags & MNF_SYSMENU) &&
1194  !MenuItem->Xlpstr &&
1195  !lpmii->dwTypeData &&
1196  !(MenuItem->fType & MFT_OWNERDRAW) &&
1197  !MenuItem->hbmp)
1198  MenuItem->fType |= MFT_SEPARATOR;
1199 
1200  if (sizeof(ROSMENUITEMINFO) == lpmii->cbSize)
1201  {
1202  MenuItem->xItem = lpmii->Rect.left;
1203  MenuItem->yItem = lpmii->Rect.top;
1204  MenuItem->cxItem = lpmii->Rect.right; // Do this for now......
1205  MenuItem->cyItem = lpmii->Rect.bottom;
1206  MenuItem->dxTab = lpmii->dxTab;
1207  lpmii->lpstr = MenuItem->lpstr.Buffer; /* Send back new allocated string or zero */
1208  MenuItem->cxBmp = lpmii->maxBmpSize.cx;
1209  MenuItem->cyBmp = lpmii->maxBmpSize.cy;
1210  }
1211 
1212  return TRUE;
1213 }
#define MNF_SYSMENU
Definition: ntuser.h:384
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
INT cxBmp
Definition: ntuser.h:363
#define KeRosDumpStackFrames(Frames, Count)
Definition: gdidebug.h:11
DWORD_PTR dwItemData
Definition: ntuser.h:354
LPWSTR lpstr
Definition: menu.h:118
UINT wID
Definition: ntuser.h:348
#define MFT_STRING
Definition: winuser.h:741
#define MIIM_FTYPE
Definition: winuser.h:724
USHORT MaximumLength
Definition: env_spec_w32.h:370
#define TRUE
Definition: types.h:120
BOOL FASTCALL UserSetMenuDefaultItem(PMENU MenuObject, UINT uItem, UINT fByPos)
Definition: menu.c:1274
UINT fState
Definition: ntuser.h:347
#define MF_STRING
Definition: winuser.h:138
ULONG cch
Definition: ntuser.h:353
HBITMAP hbmpUnchecked
Definition: menu.h:110
LONG top
Definition: windef.h:307
ULONG cyItem
Definition: ntuser.h:358
ULONG yItem
Definition: ntuser.h:356
BOOL FASTCALL IntDestroyMenuObject(PMENU Menu, BOOL bRecurse)
Definition: menu.c:317
SIZE maxBmpSize
Definition: menu.h:119
#define MFT_BITMAP
Definition: winuser.h:733
LONG left
Definition: windef.h:306
#define NT_VERIFY(exp)
Definition: rtlfuncs.h:3287
#define MENU_ITEM_TYPE(flags)
Definition: menu.c:24
#define MFS_DEFAULT
Definition: winuser.h:743
#define MAXMENUDEPTH
Definition: menu.c:41
LONG right
Definition: windef.h:308
UNICODE_STRING lpstr
Definition: ntuser.h:366
#define MIIM_BITMAP
Definition: winuser.h:723
NTSYSAPI VOID NTAPI RtlCopyUnicodeString(PUNICODE_STRING DestinationString, PUNICODE_STRING SourceString)
int FASTCALL MENU_depth(PMENU pmenu, int depth)
Definition: menu.c:404
uint32_t ULONG_PTR
Definition: typedefs.h:65
FORCEINLINE PMENU UserGetMenuObject(HMENU hMenu)
Definition: userfuncs.h:3
#define MIIM_SUBMENU
Definition: winuser.h:718
static __inline PVOID DesktopHeapAlloc(IN PDESKTOP Desktop, IN SIZE_T Bytes)
Definition: desktop.h:230
#define FALSE
Definition: types.h:117
PROCDESKHEAD head
Definition: ntuser.h:391
#define MIIM_STATE
Definition: winuser.h:716
unsigned int BOOL
Definition: ntddk_ex.h:94
ULONG cxItem
Definition: ntuser.h:357
LONG cx
Definition: windef.h:334
#define UpdateMenuItemState(state, change)
Definition: menu.c:95
BOOL FASTCALL UserObjectInDestroy(HANDLE h)
Definition: object.c:669
ULONG dxTab
Definition: ntuser.h:359
#define MIIM_ID
Definition: winuser.h:717
HBITMAP hbmpItem
Definition: menu.h:114
#define HBMMENU_CALLBACK
Definition: winuser.h:2610
#define UNICODE_STRING_MAX_CHARS
DWORD dwItemData
Definition: menu.h:111
__wchar_t WCHAR
Definition: xmlstorage.h:180
HANDLE hbmpUnchecked
Definition: ntuser.h:351
HBITMAP hbmp
Definition: ntuser.h:362
#define HBMMENU_POPUP_MINIMIZE
Definition: winuser.h:2620
#define MFT_SEPARATOR
Definition: winuser.h:739
struct tagMENU * spSubMenu
Definition: ntuser.h:349
#define MIIM_TYPE
Definition: winuser.h:720
ULONG xItem
Definition: ntuser.h:355
HANDLE hbmpChecked
Definition: ntuser.h:350
#define MIIM_CHECKMARKS
Definition: winuser.h:719
VOID FASTCALL SetLastNtError(NTSTATUS Status)
Definition: error.c:36
#define ERR(fmt,...)
Definition: debug.h:110
#define MIIM_STRING
Definition: winuser.h:722
HMENU hSubMenu
Definition: menu.h:108
unsigned short USHORT
Definition: pedump.c:61
#define NULL
Definition: types.h:112
#define MFS_HBMMENUBMP
Definition: ntuser.h:342
DWORD_PTR hTaskWow
Definition: ntuser.h:201
#define MNF_POPUP
Definition: ntuser.h:376
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
LONG bottom
Definition: windef.h:309
HBITMAP hbmpChecked
Definition: menu.h:109
LPWSTR dwTypeData
Definition: menu.h:112
static LPCSTR lpstr
Definition: font.c:51
_In_ UINT _In_ UINT _In_ PNDIS_PACKET Source
Definition: ndis.h:3167
static HBITMAP
Definition: button.c:44
INT cyBmp
Definition: ntuser.h:364
#define MFT_OWNERDRAW
Definition: winuser.h:736
USHORT * Xlpstr
Definition: ntuser.h:352
#define MIIM_DATA
Definition: winuser.h:721
ULONG fFlags
Definition: ntuser.h:392
struct _DESKTOP * rpdesk
Definition: ntuser.h:202
PMENU FASTCALL IntCreateMenu(_Out_ PHANDLE Handle, _In_ BOOL IsMenuBar, _In_ PDESKTOP Desktop, _In_ PPROCESSINFO ppi)
Definition: menu.c:729
UINT fType
Definition: ntuser.h:346
LONG cy
Definition: windef.h:335
#define LOWORD(l)
Definition: pedump.c:82
#define MENUITEMINFO_TYPE_MASK
Definition: menu.c:45
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)
Definition: error.c:27
#define FreeMenuText(Menu, MenuItem)
Definition: menu.c:183
VOID FASTCALL UserReferenceObject(PVOID obj)
Definition: object.c:697

Referenced by IntInsertMenuItem(), IntMenuItemInfo(), and UserMenuItemInfo().

◆ IntSetSystemMenu()

BOOL FASTCALL IntSetSystemMenu ( PWND  Window,
PMENU  Menu 
)

Definition at line 5424 of file menu.c.

5425 {
5426  PMENU OldMenu;
5427 
5428  if (!(Window->style & WS_SYSMENU)) return FALSE;
5429 
5430  if (Window->SystemMenu)
5431  {
5432  OldMenu = UserGetMenuObject(Window->SystemMenu);
5433  if (OldMenu)
5434  {
5435  OldMenu->fFlags &= ~MNF_SYSMENU;
5436  IntDestroyMenuObject(OldMenu, TRUE);
5437  }
5438  }
5439 
5440  OldMenu = MENU_GetSystemMenu(Window, Menu);
5441  if (OldMenu)
5442  { // Use spmenuSys too!
5443  Window->SystemMenu = UserHMGetHandle(OldMenu);
5444  }
5445  else
5446  Window->SystemMenu = NULL;
5447 
5448  if (Menu && Window != Menu->spwndNotify)
5449  {
5450  Menu->spwndNotify = Window;
5451  }
5452 
5453  return TRUE;
5454 }
#define MNF_SYSMENU
Definition: ntuser.h:384
#define TRUE
Definition: types.h:120
struct _WND * spwndNotify
Definition: ntuser.h:399
BOOL FASTCALL IntDestroyMenuObject(PMENU Menu, BOOL bRecurse)
Definition: menu.c:317
FORCEINLINE PMENU UserGetMenuObject(HMENU hMenu)
Definition: userfuncs.h:3
Definition: window.c:28
#define FALSE
Definition: types.h:117
#define UserHMGetHandle(obj)
Definition: ntuser.h:213
int Window
Definition: x11stubs.h:26
#define NULL
Definition: types.h:112
ULONG fFlags
Definition: ntuser.h:392
#define WS_SYSMENU
Definition: pedump.c:629
PMENU FASTCALL MENU_GetSystemMenu(PWND Window, PMENU Popup)
Definition: menu.c:5276

Referenced by NtUserSetSystemMenu().

◆ IntTrackPopupMenuEx()

BOOL WINAPI IntTrackPopupMenuEx ( PMENU  menu,
UINT  wFlags,
int  x,
int  y,
PWND  pWnd,
LPTPMPARAMS  lpTpm 
)

Definition at line 4559 of file menu.c.

4561 {
4562  BOOL ret = FALSE;
4564 
4565  if (pti != pWnd->head.pti)
4566  {
4567  ERR("Must be the same pti!\n");
4568  return ret;
4569  }
4570 
4571  TRACE("hmenu %p flags %04x (%d,%d) hwnd %p lpTpm %p \n", //rect %s\n",
4572  UserHMGetHandle(menu), wFlags, x, y, UserHMGetHandle(pWnd), lpTpm); //,
4573  //lpTpm ? wine_dbgstr_rect( &lpTpm->rcExclude) : "-" );
4574 
4575  if (menu->hWnd && IntIsWindow(menu->hWnd))
4576  {
4578  return FALSE;
4579  }
4580 
4581  if (MENU_InitPopup( pWnd, menu, wFlags ))
4582  {
4583  MENU_InitTracking(pWnd, menu, TRUE, wFlags);
4584 
4585  /* Send WM_INITMENUPOPUP message only if TPM_NONOTIFY flag is not specified */
4586  if (!(wFlags & TPM_NONOTIFY))
4587  {
4589  }
4590 
4591  if (menu->fFlags & MNF_SYSMENU)
4592  MENU_InitSysMenuPopup( menu, pWnd->style, pWnd->pcls->style, HTSYSMENU);
4593 
4594  if (MENU_ShowPopup(pWnd, menu, 0, wFlags | TPM_POPUPMENU, x, y, lpTpm ? &lpTpm->rcExclude : NULL))
4595  ret = MENU_TrackMenu( menu, wFlags | TPM_POPUPMENU, 0, 0, pWnd);
4596  else
4597  {
4599  pti->MessageQueue->QF_flags &= ~QF_CAPTURELOCKED;
4600  co_UserSetCapture(NULL); /* release the capture */
4601  }
4602 
4603  MENU_ExitTracking(pWnd, TRUE, wFlags);
4604 
4605  if (menu->hWnd)
4606  {
4607  PWND pwndM = ValidateHwndNoErr( menu->hWnd );
4608  if (pwndM) // wine hack around this with their destroy function.
4609  {
4610  if (!(pWnd->state & WNDS_DESTROYED))
4611  co_UserDestroyWindow( pwndM ); // Fix wrong error return.
4612  }
4613  menu->hWnd = 0;
4614 
4615  if (!(wFlags & TPM_NONOTIFY))
4616  {
4617  co_IntSendMessage( UserHMGetHandle(pWnd), WM_UNINITMENUPOPUP, (WPARAM)UserHMGetHandle(menu),
4618  MAKELPARAM(0, IS_SYSTEM_MENU(menu)) );
4619  }
4620  }
4621  }
4622  return ret;
4623 }
#define MNF_SYSMENU
Definition: ntuser.h:384
HWND hWnd
Definition: ntuser.h:411
void FASTCALL MENU_InitSysMenuPopup(PMENU menu, DWORD style, DWORD clsStyle, LONG HitTest)
Definition: menu.c:1362
static INT FASTCALL MENU_TrackMenu(PMENU pmenu, UINT wFlags, INT x, INT y, PWND pwnd)
Definition: menu.c:4052
static BOOL MENU_InitPopup(PWND pWndOwner, PMENU menu, UINT flags)
Definition: menu.c:2781
#define TRUE
Definition: types.h:120
#define WM_INITMENUPOPUP
Definition: winuser.h:1733
#define TPM_POPUPMENU
Definition: menu.c:90
#define MAKELPARAM(l, h)
Definition: winuser.h:3988
PVOID NTAPI PsGetCurrentThreadWin32Thread(VOID)
Definition: thread.c:805
static BOOL FASTCALL MENU_ShowPopup(PWND pwndOwner, PMENU menu, UINT id, UINT flags, INT x, INT y, const RECT *pExclude)
Definition: menu.c:2939
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
UINT_PTR WPARAM
Definition: windef.h:207
static BOOL FASTCALL MENU_ExitTracking(PWND pWnd, BOOL bPopup, UINT wFlags)
Definition: menu.c:4446
#define HTSYSMENU
Definition: winuser.h:2457
UINT style
Definition: ntuser.h:554
#define FALSE
Definition: types.h:117
unsigned int BOOL
Definition: ntddk_ex.h:94
BOOLEAN co_UserDestroyWindow(PVOID Object)
Definition: window.c:2594
#define ERROR_POPUP_ALREADY_ACTIVE
Definition: winerror.h:927
#define QF_CAPTURELOCKED
Definition: msgqueue.h:111
THRDESKHEAD head
Definition: ntuser.h:665
#define UserHMGetHandle(obj)
Definition: ntuser.h:213
HWND FASTCALL MsqSetStateWindow(PTHREADINFO pti, ULONG Type, HWND hWnd)
Definition: msgqueue.c:2552
#define TRACE(s)
Definition: solgame.cpp:4
HWND FASTCALL co_UserSetCapture(HWND hWnd)
Definition: focus.c:1389
BOOL FASTCALL IntIsWindow(HWND hWnd)
Definition: window.c:157
#define TPM_NONOTIFY
Definition: winuser.h:2366
int ret
LRESULT FASTCALL co_IntSendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1446
PWND FASTCALL ValidateHwndNoErr(HWND hwnd)
Definition: utils.c:171
_In_ DWORD _Out_ _In_ WORD wFlags
Definition: wincon.h:531
#define ERR(fmt,...)
Definition: debug.h:110
Definition: ntuser.h:663
struct _USER_MESSAGE_QUEUE * MessageQueue
Definition: win32.h:91
#define IS_SYSTEM_MENU(MenuInfo)
Definition: menu.c:58
DWORD state
Definition: ntuser.h:671
#define NULL
Definition: types.h:112
static BOOL FASTCALL MENU_InitTracking(PWND pWnd, PMENU Menu, BOOL bPopup, UINT wFlags)
Definition: menu.c:4386
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
ULONG fFlags
Definition: ntuser.h:392
RECT rcExclude
Definition: winuser.h:3556
#define MSQ_STATE_MENUOWNER
Definition: ntuser.h:3651
#define WNDS_DESTROYED
Definition: ntuser.h:610
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)
Definition: error.c:27
PCLS pcls
Definition: ntuser.h:690
DWORD style
Definition: ntuser.h:676

Referenced by IntDefWindowProc(), and NtUserTrackPopupMenuEx().

◆ MENU_AdjustMenuItemRect()

VOID FASTCALL MENU_AdjustMenuItemRect ( PMENU  menu,
PRECTL  rect 
)

Definition at line 1462 of file menu.c.

1463 {
1464  if (menu->dwArrowsOn)
1465  {
1466  UINT arrow_bitmap_height;
1467  arrow_bitmap_height = gpsi->oembmi[OBI_UPARROW].cy;
1468  rect->top += arrow_bitmap_height - menu->iTop;
1469  rect->bottom += arrow_bitmap_height - menu->iTop;
1470  }
1471 }
PSERVERINFO gpsi
Definition: main.c:27
& rect
Definition: startmenu.cpp:1413
INT iTop
Definition: ntuser.h:406
DWORD dwArrowsOn
Definition: ntuser.h:408
unsigned int UINT
Definition: ndis.h:50

Referenced by MENU_DrawMenuItem(), MENU_FindItemByCoords(), MENU_ShowSubPopup(), and NtUserMenuItemFromPoint().

◆ MENU_ButtonDown()

static BOOL FASTCALL MENU_ButtonDown ( MTRACKER pmt,
PMENU  PtMenu,
UINT  Flags 
)
static

Definition at line 3550 of file menu.c.

3551 {
3552  TRACE("%x PtMenu=%p\n", pmt, PtMenu);
3553 
3554  if (PtMenu)
3555  {
3556  UINT id = 0;
3557  PITEM item;
3558  if (IS_SYSTEM_MENU(PtMenu))
3559  {
3560  item = PtMenu->rgItems;
3561  }
3562  else
3563  {
3564  item = MENU_FindItemByCoords( PtMenu, pmt->Pt, &id );
3565  }
3566 
3567  if (item)
3568  {
3569  if (PtMenu->iItem != id)
3570  MENU_SwitchTracking(pmt, PtMenu, id, Flags);
3571 
3572  /* If the popup menu is not already "popped" */
3573  if (!(item->fState & MF_MOUSESELECT))
3574  {
3575  pmt->CurrentMenu = MENU_ShowSubPopup(pmt->OwnerWnd, PtMenu, FALSE, Flags);
3576  }
3577 
3578  return TRUE;
3579  }
3580  /* Else the click was on the menu bar, finish the tracking */
3581  }
3582  return FALSE;
3583 }
#define TRUE
Definition: types.h:120
static PMENU FASTCALL MENU_ShowSubPopup(PWND WndOwner, PMENU Menu, BOOL SelectFirst, UINT Flags)
Definition: menu.c:3313
PWND OwnerWnd
Definition: menu.c:83
PMENU CurrentMenu
Definition: menu.c:81
POINT Pt
Definition: menu.c:84
#define MF_MOUSESELECT
Definition: winuser.h:145
#define FALSE
Definition: types.h:117
#define TRACE(s)
Definition: solgame.cpp:4
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
PITEM rgItems
Definition: ntuser.h:400
static ATOM item
Definition: dde.c:856
#define IS_SYSTEM_MENU(MenuInfo)
Definition: menu.c:58
unsigned int UINT
Definition: ndis.h:50
static void FASTCALL MENU_SwitchTracking(MTRACKER *pmt, PMENU PtMenu, UINT Index, UINT wFlags)
Definition: menu.c:3525
static ITEM * MENU_FindItemByCoords(MENU *menu, POINT pt, UINT *pos)
Definition: menu.c:1480
INT iItem
Definition: ntuser.h:393

Referenced by MENU_TrackMenu().

◆ MENU_ButtonUp()

static INT FASTCALL MENU_ButtonUp ( MTRACKER pmt,
PMENU  PtMenu,
UINT  Flags 
)
static

Definition at line 3593 of file menu.c.

3594 {
3595  TRACE("%p pmenu=%x\n", pmt, PtMenu);
3596 
3597  if (PtMenu)
3598  {
3599  UINT Id = 0;
3600  ITEM *item;
3601 
3602  if ( IS_SYSTEM_MENU(PtMenu) )
3603  {
3604  item = PtMenu->rgItems;
3605  }
3606  else
3607  {
3608  item = MENU_FindItemByCoords( PtMenu, pmt->Pt, &Id );
3609  }
3610 
3611  if (item && ( PtMenu->iItem == Id))
3612  {
3613  if (!(item->spSubMenu))
3614  {
3615  INT ExecutedMenuId = MENU_ExecFocusedItem( pmt, PtMenu, Flags);
3616  if (ExecutedMenuId == -1 || ExecutedMenuId == -2) return -1;
3617  return ExecutedMenuId;
3618  }
3619 
3620  /* If we are dealing with the menu bar */
3621  /* and this is a click on an already "popped" item: */
3622  /* Stop the menu tracking and close the opened submenus */
3623  if (pmt->TopMenu == PtMenu && PtMenu->TimeToHide)
3624  {
3625  return 0;
3626  }
3627  }
3628  if ( IntGetMenu(PtMenu->hWnd) == PtMenu )
3629  {
3630  PtMenu->TimeToHide = TRUE;
3631  }
3632  }
3633  return -1;
3634 }
HWND hWnd
Definition: ntuser.h:411
PMENU WINAPI IntGetMenu(HWND hWnd)
Definition: menu.c:248
#define TRUE
Definition: types.h:120
BOOL TimeToHide
Definition: ntuser.h:412
int32_t INT
Definition: typedefs.h:58
DWORD Id
POINT Pt
Definition: menu.c:84
#define TRACE(s)
Definition: solgame.cpp:4
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
PITEM rgItems
Definition: ntuser.h:400
static INT FASTCALL MENU_ExecFocusedItem(MTRACKER *pmt, PMENU Menu, UINT Flags)
Definition: menu.c:3470
static ATOM item
Definition: dde.c:856
#define IS_SYSTEM_MENU(MenuInfo)
Definition: menu.c:58
unsigned int UINT
Definition: ndis.h:50
PMENU TopMenu
Definition: menu.c:82
static ITEM * MENU_FindItemByCoords(MENU *menu, POINT pt, UINT *pos)
Definition: menu.c:1480
INT iItem
Definition: ntuser.h:393

Referenced by MENU_TrackMenu().

◆ MENU_CalcItemSize()

static void FASTCALL MENU_CalcItemSize ( HDC  hdc,
PITEM  lpitem,
PMENU  Menu,
PWND  pwndOwner,
INT  orgX,
INT  orgY,
BOOL  menuBar,
BOOL  textandbmp 
)
static

Definition at line 1825 of file menu.c.

1827 {
1828  WCHAR *p;
1829  UINT check_bitmap_width = UserGetSystemMetrics( SM_CXMENUCHECK );
1830  UINT arrow_bitmap_width;
1831  RECT Rect;
1832  INT itemheight = 0;
1833 
1834  TRACE("dc=%x owner=%x (%d,%d)\n", hdc, pwndOwner, orgX, orgY);
1835 
1836  arrow_bitmap_width = gpsi->oembmi[OBI_MNARROW].cx;
1837 
1839 
1840  RECTL_vSetRect( &Rect, orgX, orgY, orgX, orgY );
1841 
1842  if (lpitem->fType & MF_OWNERDRAW)
1843  {
1844  MEASUREITEMSTRUCT mis;
1845  mis.CtlType = ODT_MENU;
1846  mis.CtlID = 0;
1847  mis.itemID = lpitem->wID;
1848  mis.itemData = lpitem->dwItemData;
1850  mis.itemWidth = 0;
1851  co_IntSendMessage( UserHMGetHandle(pwndOwner), WM_MEASUREITEM, 0, (LPARAM)&mis );
1852  /* Tests reveal that Windows ( Win95 thru WinXP) adds twice the average
1853  * width of a menufont character to the width of an owner-drawn menu.
1854  */
1855  Rect.right += mis.itemWidth + 2 * MenuCharSize.cx;
1856  if (menuBar) {
1857  /* under at least win95 you seem to be given a standard
1858  height for the menu and the height value is ignored */
1860  } else
1861  Rect.bottom += mis.itemHeight;
1862  // Or this,
1863  //lpitem->cxBmp = mis.itemWidth;
1864  //lpitem->cyBmp = mis.itemHeight;
1865  TRACE("MF_OWNERDRAW Height %d Width %d\n",mis.itemHeight,mis.itemWidth);
1866  TRACE("MF_OWNERDRAW id=%04lx size=%dx%d cx %d cy %d\n",
1867  lpitem->wID, Rect.right-Rect.left,
1868  Rect.bottom-Rect.top, MenuCharSize.cx, MenuCharSize.cy);
1869 
1870  lpitem->xItem = Rect.left;
1871  lpitem->yItem = Rect.top;
1872  lpitem->cxItem = Rect.right;
1873  lpitem->cyItem = Rect.bottom;
1874 
1875  return;
1876  }
1877 
1878  lpitem->xItem = orgX;
1879  lpitem->yItem = orgY;
1880  lpitem->cxItem = orgX;
1881  lpitem->cyItem = orgY;
1882 
1883  if (lpitem->fType & MF_SEPARATOR)
1884  {
1885  lpitem->cyItem += UserGetSystemMetrics( SM_CYMENUSIZE)/2;//SEPARATOR_HEIGHT;
1886  if( !menuBar)
1887  lpitem->cxItem += arrow_bitmap_width + MenuCharSize.cx;
1888  return;
1889  }
1890 
1891  lpitem->dxTab = 0;
1892 
1893  if (lpitem->hbmp)
1894  {
1895  SIZE size;
1896 
1897  if (!menuBar) {
1898  MENU_GetBitmapItemSize(lpitem, &size, pwndOwner );
1899  /* Keep the size of the bitmap in callback mode to be able
1900  * to draw it correctly */
1901  lpitem->cxBmp = size.cx;
1902  lpitem->cyBmp = size.cy;
1903  Menu->cxTextAlign = max(Menu->cxTextAlign, size.cx);
1904  lpitem->cxItem += size.cx + 2;
1905  itemheight = size.cy + 2;
1906 
1907  if( !((Menu->fFlags & MNS_STYLE_MASK) & MNS_NOCHECK))
1908  lpitem->cxItem += 2 * check_bitmap_width;
1909  lpitem->cxItem += 4 + MenuCharSize.cx;
1910  lpitem->dxTab = lpitem->cxItem;
1911  lpitem->cxItem += arrow_bitmap_width;
1912  } else /* hbmpItem & MenuBar */ {
1913  MENU_GetBitmapItemSize(lpitem, &size, pwndOwner );
1914  lpitem->cxItem += size.cx;
1915  if( lpitem->Xlpstr) lpitem->cxItem += 2;
1916  itemheight = size.cy;
1917 
1918  /* Special case: Minimize button doesn't have a space behind it. */
1919  if (lpitem->hbmp == (HBITMAP)HBMMENU_MBAR_MINIMIZE ||
1920  lpitem->hbmp == (HBITMAP)HBMMENU_MBAR_MINIMIZE_D)
1921  lpitem->cxItem -= 1;
1922  }
1923  }
1924  else if (!menuBar) {
1925  if( !((Menu->fFlags & MNS_STYLE_MASK) & MNS_NOCHECK))
1926  lpitem->cxItem += check_bitmap_width;
1927  lpitem->cxItem += 4 + MenuCharSize.cx;
1928  lpitem->dxTab = lpitem->cxItem;
1929  lpitem->cxItem += arrow_bitmap_width;
1930  }
1931 
1932  /* it must be a text item - unless it's the system menu */
1933  if (!(lpitem->fType & MF_SYSMENU) && lpitem->Xlpstr) {
1934  HFONT hfontOld = NULL;
1935  RECT rc;// = lpitem->Rect;
1936  LONG txtheight, txtwidth;
1937 
1938  rc.left = lpitem->xItem;
1939  rc.top = lpitem->yItem;
1940  rc.right = lpitem->cxItem; // Do this for now......
1941  rc.bottom = lpitem->cyItem;
1942 
1943  if ( lpitem->fState & MFS_DEFAULT ) {
1944  hfontOld = NtGdiSelectFont( hdc, ghMenuFontBold );
1945  }
1946  if (menuBar) {
1947  txtheight = DrawTextW( hdc, lpitem->Xlpstr, -1, &rc, DT_SINGLELINE|DT_CALCRECT);
1948 
1949  lpitem->cxItem += rc.right - rc.left;
1950  itemheight = max( max( itemheight, txtheight), UserGetSystemMetrics( SM_CYMENU) - 1);
1951 
1952  lpitem->cxItem += 2 * MenuCharSize.cx;
1953  } else {
1954  if ((p = wcschr( lpitem->Xlpstr, '\t' )) != NULL) {
1955  RECT tmprc = rc;
1956  LONG tmpheight;
1957  int n = (int)( p - lpitem->Xlpstr);
1958  /* Item contains a tab (only meaningful in popup menus) */
1959  /* get text size before the tab */
1960  txtheight = DrawTextW( hdc, lpitem->Xlpstr, n, &rc,
1962  txtwidth = rc.right - rc.left;
1963  p += 1; /* advance past the Tab */
1964  /* get text size after the tab */
1965  tmpheight = DrawTextW( hdc, p, -1, &tmprc,
1967  lpitem->dxTab += txtwidth;
1968  txtheight = max( txtheight, tmpheight);
1969  txtwidth += MenuCharSize.cx + /* space for the tab */
1970  tmprc.right - tmprc.left; /* space for the short cut */
1971  } else {
1972  txtheight = DrawTextW( hdc, lpitem->Xlpstr, -1, &rc,
1974  txtwidth = rc.right - rc.left;
1975  lpitem->dxTab += txtwidth;
1976  }
1977  lpitem->cxItem += 2 + txtwidth;
1978  itemheight = max( itemheight,
1979  max( txtheight + 2, MenuCharSize.cy + 4));
1980  }
1981  if (hfontOld)
1982  {
1983  NtGdiSelectFont (hdc, hfontOld);
1984  }
1985  } else if( menuBar) {
1986  itemheight = max( itemheight, UserGetSystemMetrics(SM_CYMENU)-1);
1987  }
1988  lpitem->cyItem += itemheight;
1989  TRACE("(%ld,%ld)-(%ld,%ld)\n", lpitem->xItem, lpitem->yItem, lpitem->cxItem, lpitem->cyItem);
1990 }
INT cxBmp
Definition: ntuser.h:363
DWORD_PTR dwItemData
Definition: ntuser.h:354
#define max(a, b)
Definition: svc.c:63
UINT wID
Definition: ntuser.h:348
#define SM_CYMENUSIZE
Definition: winuser.h:1012
#define MNS_STYLE_MASK
Definition: menu.c:43
UINT fState
Definition: ntuser.h:347
#define ODT_MENU
Definition: winuser.h:2517
#define SM_CXMENUCHECK
Definition: winuser.h:1025
GLdouble n
Definition: glext.h:7729
LONG top
Definition: windef.h:307
ULONG cyItem
Definition: ntuser.h:358
#define HBMMENU_MBAR_MINIMIZE
Definition: winuser.h:2613
ULONG yItem
Definition: ntuser.h:356
LONG left
Definition: windef.h:306
#define MFS_DEFAULT
Definition: winuser.h:743
LONG right
Definition: windef.h:308
PSERVERINFO gpsi
Definition: main.c:27
int32_t INT
Definition: typedefs.h:58
#define HBMMENU_MBAR_MINIMIZE_D
Definition: winuser.h:2616
ULONG cxTextAlign
Definition: ntuser.h:398
#define DT_CALCRECT
Definition: winuser.h:526
long LONG
Definition: pedump.c:60
DWORD FASTCALL IntGetCharDimensions(HDC hdc, PTEXTMETRICW ptm, PDWORD height)
Definition: font.c:329
SIZE size
Definition: menu.c:78
#define MF_OWNERDRAW
Definition: winuser.h:135
ULONG cxItem
Definition: ntuser.h:357
LONG cx
Definition: windef.h:334
static void FASTCALL MENU_GetBitmapItemSize(PITEM lpitem, SIZE *size, PWND WndOwner)
Definition: menu.c:1588
#define MF_SEPARATOR
Definition: winuser.h:137
LONG_PTR LPARAM
Definition: windef.h:208
static SIZE MenuCharSize
Definition: menu.c:16
ULONG dxTab
Definition: ntuser.h:359
#define MF_SYSMENU
Definition: winuser.h:141
LONG NTAPI UserGetSystemMetrics(ULONG Index)
Definition: metric.c:180
#define UserHMGetHandle(obj)
Definition: ntuser.h:213
__kernel_entry W32KAPI HFONT APIENTRY NtGdiSelectFont(_In_ HDC hdc, _In_ HFONT hf)
Definition: dcobjs.c:597
#define TRACE(s)
Definition: solgame.cpp:4
GLsizeiptr size
Definition: glext.h:5919
_CONST_RETURN wchar_t *__cdecl wcschr(_In_z_ const wchar_t *_Str, wchar_t _Ch)
__wchar_t WCHAR
Definition: xmlstorage.h:180
HBITMAP hbmp
Definition: ntuser.h:362
#define WM_MEASUREITEM
Definition: winuser.h:1633
LRESULT FASTCALL co_IntSendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1446
HDC hdc
Definition: main.c:9
ULONG_PTR itemData
Definition: winuser.h:3626
ULONG xItem
Definition: ntuser.h:355
LONG IntGetDialogBaseUnits(VOID)
Definition: menu.c:1800
FORCEINLINE VOID RECTL_vSetRect(_Out_ RECTL *prcl, _In_ LONG left, _In_ LONG top, _In_ LONG right, _In_ LONG bottom)
Definition: rect.h:5
#define DT_SINGLELINE
Definition: winuser.h:540
#define MNS_NOCHECK
Definition: winuser.h:750
unsigned int UINT
Definition: ndis.h:50
#define NULL
Definition: types.h:112
DWORD * PDWORD
Definition: pedump.c:68
static DWORD *static HFONT(WINAPI *pCreateFontIndirectExA)(const ENUMLOGFONTEXDVA *)
HFONT ghMenuFontBold
Definition: menu.c:15
#define HIWORD(l)
Definition: typedefs.h:247
LONG bottom
Definition: windef.h:309
#define SM_CYMENU
Definition: winuser.h:970
static HBITMAP
Definition: button.c:44
INT cyBmp
Definition: ntuser.h:364
GLfloat GLfloat p
Definition: glext.h:8902
USHORT * Xlpstr
Definition: ntuser.h:352
ULONG fFlags
Definition: ntuser.h:392
UINT fType
Definition: ntuser.h:346
LONG cy
Definition: windef.h:335
struct Rect Rect
INT WINAPI DrawTextW(HDC hdc, LPCWSTR str, INT count, LPRECT rect, UINT flags)
Definition: defwnd.c:17
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
Definition: typeof.h:31

Referenced by MENU_MenuBarCalcSize(), and MENU_PopupMenuCalcSize().

◆ MENU_depth()

int FASTCALL MENU_depth ( PMENU  pmenu,
int  depth 
)

Definition at line 404 of file menu.c.

405 {
406  UINT i;
407  ITEM *item;
408  int subdepth;
409 
410  if (!pmenu) return depth;
411 
412  depth++;
413  if( depth > MAXMENUDEPTH) return depth;
414  item = pmenu->rgItems;
415  subdepth = depth;
416  for( i = 0; i < pmenu->cItems && subdepth <= MAXMENUDEPTH; i++, item++)
417  {
418  if( item->spSubMenu)//VerifyMenu(item->spSubMenu))
419  {
420  int bdepth = MENU_depth( item->spSubMenu, depth);
421  if( bdepth > subdepth) subdepth = bdepth;
422  }
423  if( subdepth > MAXMENUDEPTH)
424  TRACE("<- hmenu %p\n", item->spSubMenu);
425  }
426  return subdepth;
427 }
#define MAXMENUDEPTH
Definition: menu.c:41
int FASTCALL MENU_depth(PMENU pmenu, int depth)
Definition: menu.c:404
#define TRACE(s)
Definition: solgame.cpp:4
UINT cItems
Definition: ntuser.h:395
PITEM rgItems
Definition: ntuser.h:400
GLint GLint GLsizei GLsizei GLsizei depth
Definition: gl.h:1546
static ATOM item
Definition: dde.c:856
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
unsigned int UINT
Definition: ndis.h:50

Referenced by IntSetMenuItemInfo().

◆ MENU_DoNextMenu()

static LRESULT FASTCALL MENU_DoNextMenu ( MTRACKER pmt,
UINT  Vk,
UINT  wFlags 
)
static

Definition at line 3737 of file menu.c.

3738 {
3739  BOOL atEnd = FALSE;
3740 
3741  /* When skipping left, we need to do something special after the
3742  first menu. */
3743  if (Vk == VK_LEFT && pmt->TopMenu->iItem == 0)
3744  {
3745  atEnd = TRUE;
3746  }
3747  /* When skipping right, for the non-system menu, we need to
3748  handle the last non-special menu item (ie skip any window
3749  icons such as MDI maximize, restore or close) */
3750  else if ((Vk == VK_RIGHT) && !IS_SYSTEM_MENU(pmt->TopMenu))
3751  {
3752  UINT i = pmt->TopMenu->iItem + 1;
3753  while (i < pmt->TopMenu->cItems) {
3754  if ((pmt->TopMenu->rgItems[i].wID >= SC_SIZE &&
3755  pmt->TopMenu->rgItems[i].wID <= SC_RESTORE)) {
3756  i++;
3757  } else break;
3758  }
3759  if (i == pmt->TopMenu->cItems) {
3760  atEnd = TRUE;
3761  }
3762  }
3763  /* When skipping right, we need to cater for the system menu */
3764  else if ((Vk == VK_RIGHT) && IS_SYSTEM_MENU(pmt->TopMenu))
3765  {
3766  if (pmt->TopMenu->iItem == (pmt->TopMenu->cItems - 1)) {
3767  atEnd = TRUE;
3768  }
3769  }
3770 
3771  if ( atEnd )
3772  {
3773  MDINEXTMENU NextMenu;
3774  PMENU MenuTmp;
3775  PWND pwndTemp;
3776  HMENU hNewMenu;
3777  HWND hNewWnd;
3778  UINT Id = 0;
3779 
3780  MenuTmp = (IS_SYSTEM_MENU(pmt->TopMenu)) ? co_IntGetSubMenu(pmt->TopMenu, 0) : pmt->TopMenu;
3781  NextMenu.hmenuIn = UserHMGetHandle(MenuTmp);
3782  NextMenu.hmenuNext = NULL;
3783  NextMenu.hwndNext = NULL;
3784  co_IntSendMessage(UserHMGetHandle(pmt->OwnerWnd), WM_NEXTMENU, Vk, (LPARAM) &NextMenu);
3785 
3786  TRACE("%p [%p] -> %p [%p]\n",
3787  pmt->CurrentMenu, pmt->OwnerWnd, NextMenu.hmenuNext, NextMenu.hwndNext );
3788 
3789  if (NULL == NextMenu.hmenuNext || NULL == NextMenu.hwndNext)
3790  {
3791  hNewWnd = UserHMGetHandle(pmt->OwnerWnd);
3792  if (IS_SYSTEM_MENU(pmt->TopMenu))
3793  {
3794  /* switch to the menu bar */
3795 
3796  if (pmt->OwnerWnd->style & WS_CHILD || !(MenuTmp = IntGetMenu(hNewWnd))) return FALSE;
3797 
3798  if (Vk == VK_LEFT)
3799  {
3800  Id = MenuTmp->cItems - 1;
3801 
3802  /* Skip backwards over any system predefined icons,
3803  eg. MDI close, restore etc icons */
3804  while ((Id > 0) &&
3805  (MenuTmp->rgItems[Id].wID >= SC_SIZE &&
3806  MenuTmp->rgItems[Id].wID <= SC_RESTORE)) Id--;
3807 
3808  }
3809  hNewMenu = UserHMGetHandle(MenuTmp);
3810  }
3811  else if (pmt->OwnerWnd->style & WS_SYSMENU)
3812  {
3813  /* switch to the system menu */
3814  MenuTmp = get_win_sys_menu(hNewWnd);
3815  if (MenuTmp) hNewMenu = UserHMGetHandle(MenuTmp);
3816  else hNewMenu = NULL;
3817  }
3818  else
3819  return FALSE;
3820  }
3821  else /* application returned a new menu to switch to */
3822  {
3823  hNewMenu = NextMenu.hmenuNext;
3824  hNewWnd = NextMenu.hwndNext;
3825 
3826  if ((MenuTmp = UserGetMenuObject(hNewMenu)) && (pwndTemp = ValidateHwndNoErr(hNewWnd)))
3827  {
3828  if ( pwndTemp->style & WS_SYSMENU && (get_win_sys_menu(hNewWnd) == MenuTmp) )
3829  {
3830  /* get the real system menu */
3831  MenuTmp = get_win_sys_menu(hNewWnd);
3832  hNewMenu = UserHMGetHandle(MenuTmp);
3833  }
3834  else if (pwndTemp->style & WS_CHILD || IntGetMenu(hNewWnd) != MenuTmp)
3835  {
3836  /* FIXME: Not sure what to do here;
3837  * perhaps try to track NewMenu as a popup? */
3838 
3839  WARN(" -- got confused.\n");
3840  return FALSE;
3841  }
3842  }
3843  else return FALSE;
3844  }
3845 
3846  if (hNewMenu != UserHMGetHandle(pmt->TopMenu))
3847  {
3849 
3850  if (pmt->CurrentMenu != pmt->TopMenu)
3852  }
3853 
3854  if (hNewWnd != UserHMGetHandle(pmt->OwnerWnd))
3855  {
3857  pmt->OwnerWnd = ValidateHwndNoErr(hNewWnd);
3859  MsqSetStateWindow(pti, MSQ_STATE_MENUOWNER, hNewWnd);
3860  pti->MessageQueue->QF_flags &= ~QF_CAPTURELOCKED;
3862  pti->MessageQueue->QF_flags |= QF_CAPTURELOCKED;
3863  }
3864 
3865  pmt->TopMenu = pmt->CurrentMenu = UserGetMenuObject(hNewMenu); /* all subpopups are hidden */
3866  MENU_SelectItem(pmt->OwnerWnd, pmt->TopMenu, Id, TRUE, 0);
3867 
3868  return TRUE;
3869  }
3870  return FALSE;
3871 }
UINT wID
Definition: ntuser.h:348
PMENU WINAPI IntGetMenu(HWND hWnd)
Definition: menu.c:248
#define SC_RESTORE
Definition: winuser.h:2578
#define TRUE
Definition: types.h:120
#define WARN(fmt,...)
Definition: debug.h:112
PVOID NTAPI PsGetCurrentThreadWin32Thread(VOID)
Definition: thread.c:805
#define VK_LEFT
Definition: winuser.h:2204
#define WS_CHILD
Definition: pedump.c:617
PWND OwnerWnd
Definition: menu.c:83
PMENU CurrentMenu
Definition: menu.c:81
DWORD Id
FORCEINLINE PMENU UserGetMenuObject(HMENU hMenu)
Definition: userfuncs.h:3
#define WM_NEXTMENU
Definition: winuser.h:1793
#define FALSE
Definition: types.h:117
unsigned int BOOL
Definition: ntddk_ex.h:94
PMENU get_win_sys_menu(HWND hwnd)
Definition: menu.c:258
#define QF_CAPTURELOCKED
Definition: msgqueue.h:111
HMENU hmenuIn
Definition: winuser.h:3615
LONG_PTR LPARAM
Definition: windef.h:208
#define UserHMGetHandle(obj)
Definition: ntuser.h:213
static void FASTCALL MENU_SelectItem(PWND pwndOwner, PMENU menu, UINT wIndex, BOOL sendMenuSelect, PMENU topmenu)
Definition: menu.c:3139
static void FASTCALL MENU_HideSubPopups(PWND pWndOwner, PMENU Menu, BOOL SendMenuSelect, UINT wFlags)
Definition: menu.c:3262
HWND FASTCALL MsqSetStateWindow(PTHREADINFO pti, ULONG Type, HWND hWnd)
Definition: msgqueue.c:2552
#define TRACE(s)
Definition: solgame.cpp:4
HWND FASTCALL co_UserSetCapture(HWND hWnd)
Definition: focus.c:1389
#define NO_SELECTED_ITEM
Definition: ntuser.h:387
UINT cItems
Definition: ntuser.h:395
PITEM rgItems
Definition: ntuser.h:400
LRESULT FASTCALL co_IntSendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1446
PWND FASTCALL ValidateHwndNoErr(HWND hwnd)
Definition: utils.c:171
HMENU hmenuNext
Definition: winuser.h:3616
#define VK_RIGHT
Definition: winuser.h:2206
_In_ DWORD _Out_ _In_ WORD wFlags
Definition: wincon.h:531
Definition: ntuser.h:663
struct _USER_MESSAGE_QUEUE * MessageQueue
Definition: win32.h:91
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define IS_SYSTEM_MENU(MenuInfo)
Definition: menu.c:58
#define SC_SIZE
Definition: winuser.h:2564
unsigned int UINT
Definition: ndis.h:50
#define NULL
Definition: types.h:112
PMENU TopMenu
Definition: menu.c:82
PMENU FASTCALL co_IntGetSubMenu(PMENU pMenu, int nPos)
Definition: menu.c:1348
#define WS_SYSMENU
Definition: pedump.c:629
#define MSQ_STATE_MENUOWNER
Definition: ntuser.h:3651
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:60
DWORD style
Definition: ntuser.h:676
INT iItem
Definition: ntuser.h:393

Referenced by MENU_KeyLeft(), and MENU_KeyRight().

◆ MENU_DrawBitmapItem()

static void FASTCALL MENU_DrawBitmapItem ( HDC  hdc,
PITEM  lpitem,
const RECT rect,
PMENU  Menu,
PWND  WndOwner,
UINT  odaction,
BOOL  MenuBar 
)
static

Definition at line 1653 of file menu.c.

1655 {
1656  BITMAP bm;
1657  DWORD rop;
1658  HDC hdcMem;
1659  HBITMAP bmp;
1660  int w = rect->right - rect->left;
1661  int h = rect->bottom - rect->top;
1662  int bmp_xoffset = 0;
1663  int left, top;
1664  BOOL flat_menu;
1665  HBITMAP hbmToDraw = lpitem->hbmp;
1666  bmp = hbmToDraw;
1667 
1668  UserSystemParametersInfo(SPI_GETFLATMENU, 0, &flat_menu, 0);
1669 
1670  /* Check if there is a magic menu item associated with this item */
1671  if (IS_MAGIC_BITMAP(hbmToDraw))
1672  {
1673  UINT flags = 0;
1674  RECT r;
1675 
1676  r = *rect;
1677  switch ((INT_PTR)hbmToDraw)
1678  {
1679  case (INT_PTR)HBMMENU_SYSTEM:
1680  if (lpitem->dwItemData)
1681  {
1682  if (ValidateHwndNoErr((HWND)lpitem->dwItemData))
1683  {
1684  ERR("Get Item Data from this Window!!!\n");
1685  }
1686 
1687  ERR("Draw Bitmap\n");
1688  bmp = (HBITMAP)lpitem->dwItemData;
1689  if (!GreGetObject( bmp, sizeof(bm), &bm )) return;
1690  }
1691  else
1692  {
1693  PCURICON_OBJECT pIcon = NULL;
1694  //if (!BmpSysMenu) BmpSysMenu = LoadBitmapW(0, MAKEINTRESOURCEW(OBM_CLOSE));
1695  //bmp = BmpSysMenu;
1696  //if (! GreGetObject(bmp, sizeof(bm), &bm)) return;
1697  /* only use right half of the bitmap */
1698  //bmp_xoffset = bm.bmWidth / 2;
1699  //bm.bmWidth -= bmp_xoffset;
1700  if (WndOwner)
1701  {
1702  pIcon = NC_IconForWindow(WndOwner);
1703  // FIXME: NC_IconForWindow should reference it for us */
1704  if (pIcon) UserReferenceObject(pIcon);
1705  }
1706  ERR("Draw ICON\n");
1707  if (pIcon)
1708  {
1711  LONG x = rect->left - cx/2 + 1 + (rect->bottom - rect->top)/2; // this is really what Window does
1712  LONG y = (rect->top + rect->bottom)/2 - cy/2; // center
1713  UserDrawIconEx(hdc, x, y, pIcon, cx, cy, 0, NULL, DI_NORMAL);
1714  UserDereferenceObject(pIcon);
1715  }
1716  return;
1717  }
1718  goto got_bitmap;
1721  break;
1723  r.right += 1;
1725  break;
1727  r.right += 1;
1729  break;
1732  break;
1735  break;
1736  case (INT_PTR)HBMMENU_CALLBACK:
1737  {
1738  DRAWITEMSTRUCT drawItem;
1739  POINT origorg;
1740  drawItem.CtlType = ODT_MENU;
1741  drawItem.CtlID<