ReactOS  0.4.14-dev-57-g333b8f1
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
smooth NULL
Definition: ftsmooth.c:416
struct tagMENU * spSubMenu
Definition: ntuser.h:343
unsigned int UINT
Definition: ndis.h:50

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 }
const DOCKBAR PVOID HWND HWND * hwnd
Definition: tooldock.h:22
PWND FASTCALL ValidateHwndNoErr(HWND hWnd)
Definition: window.c:96
FORCEINLINE PMENU UserGetMenuObject(HMENU hMenu)
Definition: userfuncs.h:3
int ret
Definition: ntuser.h:657
static real win[4][36]

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:341
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:398
HWND hWnd
Definition: ntuser.h:405
HBRUSH hbrBack
Definition: ntuser.h:399
struct _WND * spwndNotify
Definition: ntuser.h:393
BOOL TimeToHide
Definition: ntuser.h:406
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:392
ULONG cyMenu
Definition: ntuser.h:391
smooth NULL
Definition: ftsmooth.c:416
INT iTop
Definition: ntuser.h:400
DWORD dwContextHelpId
Definition: ntuser.h:396
#define NO_SELECTED_ITEM
Definition: ntuser.h:381
ULONG cyMax
Definition: ntuser.h:397
UINT cItems
Definition: ntuser.h:389
struct tagMENU * PMENU
PITEM rgItems
Definition: ntuser.h:394
BOOL FASTCALL IntCloneMenuItems(PMENU Destination, PMENU Source)
Definition: menu.c:771
INT iMaxTop
Definition: ntuser.h:401
_In_ UINT _In_ UINT _In_ PNDIS_PACKET Source
Definition: ndis.h:3167
ULONG fFlags
Definition: ntuser.h:386
PUSER_HANDLE_TABLE gHandleTable
Definition: object.c:13
ULONG cxMenu
Definition: ntuser.h:390
INT iItem
Definition: ntuser.h:387

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 }
Definition: fontsub.cpp:35
DWORD_PTR dwItemData
Definition: ntuser.h:348
UINT wID
Definition: ntuser.h:342
#define TRUE
Definition: types.h:120
USHORT MaximumLength
Definition: env_spec_w32.h:370
UINT fState
Definition: ntuser.h:341
UNICODE_STRING lpstr
Definition: ntuser.h:360
NTSYSAPI VOID NTAPI RtlCopyUnicodeString(PUNICODE_STRING DestinationString, PUNICODE_STRING SourceString)
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
static __inline PVOID DesktopHeapAlloc(IN PDESKTOP Desktop, IN SIZE_T Bytes)
Definition: desktop.h:230
smooth NULL
Definition: ftsmooth.c:416
__wchar_t WCHAR
Definition: xmlstorage.h:180
HANDLE hbmpUnchecked
Definition: ntuser.h:345
HBITMAP hbmp
Definition: ntuser.h:356
_In_ PUNICODE_STRING _Inout_ PUNICODE_STRING Destination
Definition: rtlfuncs.h:2891
struct tagMENU * spSubMenu
Definition: ntuser.h:343
HANDLE hbmpChecked
Definition: ntuser.h:344
unsigned int UINT
Definition: ndis.h:50
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:261
_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:239
USHORT * Xlpstr
Definition: ntuser.h:346
UINT fType
Definition: ntuser.h:340

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:398
HWND hWnd
Definition: ntuser.h:405
HBRUSH hbrBack
Definition: ntuser.h:399
struct _WND * spwndNotify
Definition: ntuser.h:393
BOOL TimeToHide
Definition: ntuser.h:406
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:392
ULONG cyMenu
Definition: ntuser.h:391
smooth NULL
Definition: ftsmooth.c:416
INT iTop
Definition: ntuser.h:400
DWORD dwContextHelpId
Definition: ntuser.h:396
_In_ HANDLE Handle
Definition: extypes.h:390
#define NO_SELECTED_ITEM
Definition: ntuser.h:381
ULONG cyMax
Definition: ntuser.h:397
UINT cItems
Definition: ntuser.h:389
struct tagMENU * PMENU
PITEM rgItems
Definition: ntuser.h:394
INT iMaxTop
Definition: ntuser.h:401
#define MNF_POPUP
Definition: ntuser.h:370
ULONG fFlags
Definition: ntuser.h:386
PUSER_HANDLE_TABLE gHandleTable
Definition: object.c:13
ULONG cxMenu
Definition: ntuser.h:390
INT iItem
Definition: ntuser.h:387

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 }
Definition: fontsub.cpp:35
BOOL NTAPI GreSetObjectOwner(HGDIOBJ hobj, ULONG ulOwner)
Definition: gdiobj.c:1252
#define TRUE
Definition: types.h:120
BOOL FASTCALL IntDestroyMenuObject(PMENU Menu, BOOL bRecurse)
Definition: menu.c:317
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
PROCDESKHEAD head
Definition: ntuser.h:385
smooth NULL
Definition: ftsmooth.c:416
UINT cItems
Definition: ntuser.h:389
PITEM rgItems
Definition: ntuser.h:394
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
#define GDI_OBJ_HMGR_POWNED
Definition: ntgdihdl.h:117
static ATOM item
Definition: dde.c:856
BOOL FASTCALL UserIsEnteredExclusive(VOID)
Definition: ntuser.c:231
#define MFS_HBMMENUBMP
Definition: ntuser.h:336
static __inline BOOL DesktopHeapFree(IN PDESKTOP Desktop, IN PVOID lpMem)
Definition: desktop.h:239
struct _DESKTOP * rpdesk
Definition: ntuser.h:197
#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:405
BOOL FASTCALL UserDeleteObject(HANDLE h, HANDLE_TYPE type)
Definition: object.c:683
#define TRUE
Definition: types.h:120
PWND FASTCALL ValidateHwndNoErr(HWND hWnd)
Definition: window.c:96
Definition: window.c:29
PROCDESKHEAD head
Definition: ntuser.h:385
unsigned int BOOL
Definition: ntddk_ex.h:94
ULONG NTAPI PsGetCurrentProcessSessionId(VOID)
Definition: process.c:1133
#define TRACE(s)
Definition: solgame.cpp:4
int Window
Definition: x11stubs.h:26
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
int ret
#define ERR(fmt,...)
Definition: debug.h:109
Definition: ntuser.h:657
BOOL FASTCALL UserIsEnteredExclusive(VOID)
Definition: ntuser.c:231
#define MNF_POPUP
Definition: ntuser.h:370
BOOL IntDestroyMenu(PMENU pMenu, BOOL bRecurse)
Definition: menu.c:269
#define MNF_SYSSUBMENU
Definition: ntuser.h:376
ULONG fFlags
Definition: ntuser.h:386
struct _DESKTOP * rpdesk
Definition: ntuser.h:197
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 }
#define TRUE
Definition: types.h:120
HFONT ghMenuFont
Definition: menu.c:14
HGDIOBJ FASTCALL IntGetSysColorBrush(INT Object)
Definition: stockobj.c:317
__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)
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
__kernel_entry W32KAPI HPEN APIENTRY NtGdiSelectPen(_In_ HDC hdc, _In_ HPEN hpen)
#define COLOR_3DFACE
Definition: winuser.h:919
unsigned int BOOL
Definition: ntddk_ex.h:94
ULONG cyMenu
Definition: ntuser.h:391
smooth NULL
Definition: ftsmooth.c:416
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:907
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:2517
UINT_PTR IDMenu
Definition: ntuser.h:695
#define TRACE(s)
Definition: solgame.cpp:4
#define UlongToHandle(ul)
Definition: basetsd.h:97
UINT cItems
Definition: ntuser.h:389
DWORD FASTCALL IntGetSysColor(INT nIndex)
Definition: stockobj.c:323
PITEM rgItems
Definition: ntuser.h:394
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
unsigned int UINT
Definition: ndis.h:50
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:966
BOOL FASTCALL UserSystemParametersInfo(UINT uiAction, UINT uiParam, PVOID pvParam, UINT fWinIni)
Definition: sysparams.c:2066
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:342
#define MF_DISABLED
Definition: winuser.h:130
#define SC_RESTORE
Definition: winuser.h:2573
UINT fState
Definition: ntuser.h:341
PITEM FASTCALL MENU_FindItem(PMENU *pmenu, UINT *nPos, UINT wFlags)
Definition: menu.c:507
struct _WND * spwndNotify
Definition: ntuser.h:393
#define SC_MAXIMIZE
Definition: winuser.h:2563
#define SC_MINIMIZE
Definition: winuser.h:2561
#define SC_SIZE
Definition: winuser.h:2559
unsigned int UINT
Definition: ndis.h:50
BOOL UserPaintCaption(PWND pWnd, INT Flags)
Definition: defwnd.c:396
#define SC_MOVE
Definition: winuser.h:2560
#define SC_CLOSE
Definition: winuser.h:2567
GLuint res
Definition: glext.h:9613
#define MF_GRAYED
Definition: winuser.h:129
#define MNF_SYSSUBMENU
Definition: ntuser.h:376
ULONG fFlags
Definition: ntuser.h:386

Referenced by MENU_InitSysMenuPopup(), and NtUserEnableMenuItem().

◆ IntFindSubMenu()

UINT FASTCALL IntFindSubMenu ( HMENU hMenu,
HMENU  hSubTarget 
)

Definition at line 5012 of file menu.c.

5013 {
5014  PMENU menu, pSubTarget;
5015  UINT Pos;
5016  if (((*hMenu)==(HMENU)0xffff) ||(!(menu = UserGetMenuObject(*hMenu))))
5017  return NO_SELECTED_ITEM;
5018 
5019  pSubTarget = UserGetMenuObject(hSubTarget);
5020 
5021  Pos = MENU_FindSubMenu(&menu, pSubTarget );
5022 
5023  *hMenu = (menu ? UserHMGetHandle(menu) : NULL);
5024 
5025  return Pos;
5026 }
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
smooth NULL
Definition: ftsmooth.c:416
#define UserHMGetHandle(obj)
Definition: ntuser.h:208
#define NO_SELECTED_ITEM
Definition: ntuser.h:381
unsigned int UINT
Definition: ndis.h:50
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)
DWORD FASTCALL IntGetCharDimensions(HDC hdc, PTEXTMETRICW ptm, PDWORD height)
Definition: font.c:329
SIZE size
Definition: menu.c:131
#define MAKELONG(a, b)
Definition: typedefs.h:248
smooth NULL
Definition: ftsmooth.c:416
LONG cx
Definition: windef.h:319
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:2096
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 }
PWND FASTCALL ValidateHwndNoErr(HWND hWnd)
Definition: window.c:96
HWND hWnd
Definition: settings.c:17
FORCEINLINE PMENU UserGetMenuObject(HMENU hMenu)
Definition: userfuncs.h:3
smooth NULL
Definition: ftsmooth.c:416
UINT_PTR IDMenu
Definition: ntuser.h:695
#define UlongToHandle(ul)
Definition: basetsd.h:97
Definition: ntuser.h:657

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:342
UINT fState
Definition: ntuser.h:341
#define MFS_DISABLED
Definition: winuser.h:744
#define MFS_DEFAULT
Definition: winuser.h:743
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 GMDI_GOINTOPOPUPS
Definition: winuser.h:2107
UINT FASTCALL IntGetMenuDefaultItem(PMENU MenuObject, UINT fByPos, UINT gmdiFlags, DWORD *gismc)
Definition: menu.c:1315
UINT cItems
Definition: ntuser.h:389
PITEM rgItems
Definition: ntuser.h:394
int ret
struct tagMENU * spSubMenu
Definition: ntuser.h:343
#define GMDI_USEDISABLED
Definition: winuser.h:2108
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:398
HWND hWnd
Definition: ntuser.h:405
#define TRUE
Definition: types.h:120
INT iMaxTop
Definition: menu.h:92
HBRUSH hbrBack
Definition: ntuser.h:399
#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:393
BOOL TimeToHide
Definition: ntuser.h:406
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:392
PROCDESKHEAD head
Definition: ntuser.h:385
ULONG cyMenu
Definition: ntuser.h:391
INT iTop
Definition: ntuser.h:400
DWORD dwContextHelpId
Definition: ntuser.h:396
HMENU Self
Definition: menu.h:95
INT iTop
Definition: menu.h:91
DWORD dwArrowsOn
Definition: ntuser.h:402
ULONG cyMax
Definition: ntuser.h:397
DWORD dwArrowsOn
Definition: menu.h:93
ULONG fFlags
Definition: menu.h:84
UINT cItems
Definition: ntuser.h:389
DWORD dwContextHelpID
Definition: menu.h:81
WORD cxMenu
Definition: menu.h:87
DWORD fMask
Definition: menu.h:77
INT iMaxTop
Definition: ntuser.h:401
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:386
ULONG cxMenu
Definition: ntuser.h:390
INT iItem
Definition: ntuser.h:387
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:357
DWORD_PTR dwItemData
Definition: ntuser.h:348
LPWSTR lpstr
Definition: menu.h:118
UINT wID
Definition: ntuser.h:342
#define MIIM_FTYPE
Definition: winuser.h:724
#define TRUE
Definition: types.h:120
USHORT MaximumLength
Definition: env_spec_w32.h:370
UINT fState
Definition: ntuser.h:341
LONG NTSTATUS
Definition: precomp.h:26
#define MF_STRING
Definition: winuser.h:138
HBITMAP hbmpUnchecked
Definition: menu.h:110
LONG top
Definition: windef.h:292
ULONG cyItem
Definition: ntuser.h:352
ULONG yItem
Definition: ntuser.h:350
SIZE maxBmpSize
Definition: menu.h:119
#define MmCopyToCaller(x, y, z)
Definition: mmcopy.h:19
LONG left
Definition: windef.h:291
#define MENU_ITEM_TYPE(flags)
Definition: menu.c:24
LONG right
Definition: windef.h:293
UNICODE_STRING lpstr
Definition: ntuser.h:360
#define MIIM_BITMAP
Definition: winuser.h:723
#define MIIM_SUBMENU
Definition: winuser.h:718
#define MIIM_STATE
Definition: winuser.h:716
smooth NULL
Definition: ftsmooth.c:416
ULONG cxItem
Definition: ntuser.h:351
LONG cx
Definition: windef.h:319
ULONG dxTab
Definition: ntuser.h:353
#define MIIM_ID
Definition: winuser.h:717
HBITMAP hbmpItem
Definition: menu.h:114
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:345
HBITMAP hbmp
Definition: ntuser.h:356
struct tagMENU * spSubMenu
Definition: ntuser.h:343
#define MIIM_TYPE
Definition: winuser.h:720
ULONG xItem
Definition: ntuser.h:349
HANDLE hbmpChecked
Definition: ntuser.h:344
#define MIIM_CHECKMARKS
Definition: winuser.h:719
VOID FASTCALL SetLastNtError(NTSTATUS Status)
Definition: error.c:36
Status
Definition: gdiplustypes.h:24
#define MIIM_STRING
Definition: winuser.h:722
HMENU hSubMenu
Definition: menu.h:108
#define min(a, b)
Definition: monoChain.cc:55
LONG bottom
Definition: windef.h:294
HBITMAP hbmpChecked
Definition: menu.h:109
LPWSTR dwTypeData
Definition: menu.h:112
INT cyBmp
Definition: ntuser.h:358
#define MIIM_DATA
Definition: winuser.h:721
UINT fType
Definition: ntuser.h:340
LONG cy
Definition: windef.h:320

Referenced by IntMenuItemInfo(), and UserMenuItemInfo().

◆ IntGetMenuItemRect()

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

Definition at line 5227 of file menu.c.

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

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:385

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

◆ IntGetMenuState()

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

Definition at line 4972 of file menu.c.

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

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

◆ IntGetSubMenu()

HMENU FASTCALL IntGetSubMenu ( HMENU  hMenu,
int  nPos 
)

Definition at line 4992 of file menu.c.

4993 {
4994  PMENU MenuObject;
4995  PITEM pItem;
4996 
4997  if (!(MenuObject = UserGetMenuObject(hMenu)))
4998  {
4999  return NULL;
5000  }
5001 
5002  if (!(pItem = MENU_FindItem( &MenuObject, (UINT*)&nPos, MF_BYPOSITION ))) return NULL;
5003 
5004  if (pItem->spSubMenu)
5005  {
5006  HMENU hsubmenu = UserHMGetHandle(pItem->spSubMenu);
5007  return hsubmenu;
5008  }
5009  return NULL;
5010 }
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
smooth NULL
Definition: ftsmooth.c:416
#define UserHMGetHandle(obj)
Definition: ntuser.h:208
struct tagMENU * spSubMenu
Definition: ntuser.h:343
unsigned int UINT
Definition: ndis.h:50
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 5380 of file menu.c.

5381 {
5382  PMENU Menu;
5383 
5384  if (bRevert)
5385  {
5386  if (Window->SystemMenu)
5387  {
5388  Menu = UserGetMenuObject(Window->SystemMenu);
5389  if (Menu && !(Menu->fFlags & MNF_SYSDESKMN))
5390  {
5391  IntDestroyMenuObject(Menu, TRUE);
5392  Window->SystemMenu = NULL;
5393  }
5394  }
5395  }
5396  else
5397  {
5398  Menu = Window->SystemMenu ? UserGetMenuObject(Window->SystemMenu) : NULL;
5399  if ((!Menu || Menu->fFlags & MNF_SYSDESKMN) && Window->style & WS_SYSMENU)
5400  {
5401  Menu = MENU_GetSystemMenu(Window, NULL);
5402  Window->SystemMenu = Menu ? UserHMGetHandle(Menu) : NULL;
5403  }
5404  }
5405 
5406  if (Window->SystemMenu)
5407  {
5408  HMENU hMenu = IntGetSubMenu( Window->SystemMenu, 0);
5409  /* Store the dummy sysmenu handle to facilitate the refresh */
5410  /* of the close button if the SC_CLOSE item change */
5411  Menu = UserGetMenuObject(hMenu);
5412  if (Menu)
5413  {
5414  Menu->spwndNotify = Window;
5415  Menu->fFlags |= MNF_SYSSUBMENU;
5416  }
5417  return Menu;
5418  }
5419  return NULL;
5420 }
#define TRUE
Definition: types.h:120
struct _WND * spwndNotify
Definition: ntuser.h:393
BOOL FASTCALL IntDestroyMenuObject(PMENU Menu, BOOL bRecurse)
Definition: menu.c:317
FORCEINLINE PMENU UserGetMenuObject(HMENU hMenu)
Definition: userfuncs.h:3
Definition: window.c:29
smooth NULL
Definition: ftsmooth.c:416
#define UserHMGetHandle(obj)
Definition: ntuser.h:208
int Window
Definition: x11stubs.h:26
HMENU FASTCALL IntGetSubMenu(HMENU hMenu, int nPos)
Definition: menu.c:4992
#define MNF_SYSDESKMN
Definition: ntuser.h:375
#define MNF_SYSSUBMENU
Definition: ntuser.h:376
ULONG fFlags
Definition: ntuser.h:386
#define WS_SYSMENU
Definition: pedump.c:629
PMENU FASTCALL MENU_GetSystemMenu(PWND Window, PMENU Popup)
Definition: menu.c:5275
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 4801 of file menu.c.

4802 {
4803 
4804  DWORD dwStyle = 0;
4805  DWORD dwExStyle = 0;
4806  BOOLEAN retValue = TRUE;
4807 
4808  if (bti->cbSize == sizeof(TITLEBARINFO))
4809  {
4810  RtlZeroMemory(&bti->rgstate[0],sizeof(DWORD)*(CCHILDREN_TITLEBAR+1));
4811 
4812  bti->rgstate[0] = STATE_SYSTEM_FOCUSABLE;
4813 
4814  dwStyle = pWindowObject->style;
4815  dwExStyle = pWindowObject->ExStyle;
4816 
4817  bti->rcTitleBar.top = 0;
4818  bti->rcTitleBar.left = 0;
4819  bti->rcTitleBar.right = pWindowObject->rcWindow.right - pWindowObject->rcWindow.left;
4820  bti->rcTitleBar.bottom = pWindowObject->rcWindow.bottom - pWindowObject->rcWindow.top;
4821 
4822  /* Is it iconiced ? */
4823  if ((dwStyle & WS_ICONIC)!=WS_ICONIC)
4824  {
4825  /* Remove frame from rectangle */
4826  if (HAS_THICKFRAME( dwStyle, dwExStyle ))
4827  {
4828  /* FIXME: Note this value should exists in pWindowObject for UserGetSystemMetrics(SM_CXFRAME) and UserGetSystemMetrics(SM_CYFRAME) */
4830  }
4831  else if (HAS_DLGFRAME( dwStyle, dwExStyle ))
4832  {
4833  /* FIXME: Note this value should exists in pWindowObject for UserGetSystemMetrics(SM_CXDLGFRAME) and UserGetSystemMetrics(SM_CYDLGFRAME) */
4835  }
4836  else if (HAS_THINFRAME( dwStyle, dwExStyle))
4837  {
4838  /* FIXME: Note this value should exists in pWindowObject for UserGetSystemMetrics(SM_CXBORDER) and UserGetSystemMetrics(SM_CYBORDER) */
4840  }
4841 
4842  /* We have additional border information if the window
4843  * is a child (but not an MDI child) */
4844  if ( (dwStyle & WS_CHILD) &&
4845  ((dwExStyle & WS_EX_MDICHILD) == 0 ) )
4846  {
4847  if (dwExStyle & WS_EX_CLIENTEDGE)
4848  {
4849  /* FIXME: Note this value should exists in pWindowObject for UserGetSystemMetrics(SM_CXEDGE) and UserGetSystemMetrics(SM_CYEDGE) */
4851  }
4852 
4853  if (dwExStyle & WS_EX_STATICEDGE)
4854  {
4855  /* FIXME: Note this value should exists in pWindowObject for UserGetSystemMetrics(SM_CXBORDER) and UserGetSystemMetrics(SM_CYBORDER) */
4857  }
4858  }
4859  }
4860 
4861  bti->rcTitleBar.top += pWindowObject->rcWindow.top;
4862  bti->rcTitleBar.left += pWindowObject->rcWindow.left;
4863  bti->rcTitleBar.right += pWindowObject->rcWindow.left;
4864 
4865  bti->rcTitleBar.bottom = bti->rcTitleBar.top;
4866  if (dwExStyle & WS_EX_TOOLWINDOW)
4867  {
4868  /* FIXME: Note this value should exists in pWindowObject for UserGetSystemMetrics(SM_CYSMCAPTION) */
4870  }
4871  else
4872  {
4873  /* FIXME: Note this value should exists in pWindowObject for UserGetSystemMetrics(SM_CYCAPTION) and UserGetSystemMetrics(SM_CXSIZE) */
4876  }
4877 
4878  if (dwStyle & WS_CAPTION)
4879  {
4880  bti->rgstate[1] = STATE_SYSTEM_INVISIBLE;
4881  if (dwStyle & WS_SYSMENU)
4882  {
4883  if (!(dwStyle & (WS_MINIMIZEBOX|WS_MAXIMIZEBOX)))
4884  {
4885  bti->rgstate[2] = STATE_SYSTEM_INVISIBLE;
4886  bti->rgstate[3] = STATE_SYSTEM_INVISIBLE;
4887  }
4888  else
4889  {
4890  if (!(dwStyle & WS_MINIMIZEBOX))
4891  {
4893  }
4894  if (!(dwStyle & WS_MAXIMIZEBOX))
4895  {
4897  }
4898  }
4899 
4900  if (!(dwExStyle & WS_EX_CONTEXTHELP))
4901  {
4902  bti->rgstate[4] = STATE_SYSTEM_INVISIBLE;
4903  }
4904  if (pWindowObject->pcls->style & CS_NOCLOSE)
4905  {
4907  }
4908  }
4909  else
4910  {
4911  bti->rgstate[2] = STATE_SYSTEM_INVISIBLE;
4912  bti->rgstate[3] = STATE_SYSTEM_INVISIBLE;
4913  bti->rgstate[4] = STATE_SYSTEM_INVISIBLE;
4914  bti->rgstate[5] = STATE_SYSTEM_INVISIBLE;
4915  }
4916  }
4917  else
4918  {
4919  bti->rgstate[0] |= STATE_SYSTEM_INVISIBLE;
4920  }
4921  }
4922  else
4923  {
4925  retValue = FALSE;
4926  }
4927 
4928  return retValue;
4929 }
#define CCHILDREN_TITLEBAR
Definition: winuser.h:3731
#define WS_EX_CONTEXTHELP
Definition: winuser.h:386
#define ERROR_INVALID_PARAMETER
Definition: compat.h:91
DWORD ExStyle
Definition: ntuser.h:668
#define STATE_SYSTEM_UNAVAILABLE
Definition: winuser.h:2836
#define TRUE
Definition: types.h:120
#define STATE_SYSTEM_FOCUSABLE
Definition: winuser.h:2856
VOID FASTCALL RECTL_vInflateRect(_Inout_ RECTL *rect, _In_ INT dx, _In_ INT dy)
Definition: rect.c:101
LONG top
Definition: windef.h:292
#define CS_NOCLOSE
Definition: winuser.h:649
#define SM_CXEDGE
Definition: winuser.h:998
#define WS_CHILD
Definition: pedump.c:617
LONG left
Definition: windef.h:291
#define SM_CYFRAME
Definition: winuser.h:986
#define SM_CXFRAME
Definition: winuser.h:984
LONG right
Definition: windef.h:293
#define WS_EX_TOOLWINDOW
Definition: winuser.h:404
#define WS_EX_MDICHILD
Definition: winuser.h:394
UINT style
Definition: ntuser.h:548
#define SM_CYDLGFRAME
Definition: winuser.h:958
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:999
#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:953
#define WS_ICONIC
Definition: pedump.c:641
#define SM_CXDLGFRAME
Definition: winuser.h:956
unsigned long DWORD
Definition: ntddk_ex.h:95
#define SM_CYBORDER
Definition: winuser.h:955
#define SM_CXBORDER
Definition: winuser.h:954
RECT rcWindow
Definition: ntuser.h:680
DWORD rgstate[CCHILDREN_TITLEBAR+1]
Definition: winuser.h:3736
#define WS_EX_CLIENTEDGE
Definition: winuser.h:384
#define WS_MINIMIZEBOX
Definition: pedump.c:631
#define SM_CXSIZE
Definition: winuser.h:981
#define HAS_DLGFRAME(Style, ExStyle)
Definition: window.h:8
LONG bottom
Definition: windef.h:294
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:261
#define WS_SYSMENU
Definition: pedump.c:629
#define SM_CYSMCAPTION
Definition: winuser.h:1004
#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:2851
PCLS pcls
Definition: ntuser.h:684
DWORD style
Definition: ntuser.h:670

Referenced by NtUserGetTitleBarInfo().

◆ IntHiliteMenuItem()

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

Definition at line 4775 of file menu.c.

4779 {
4780  PITEM MenuItem;
4781  UINT uItem = uItemHilite;
4782 
4783  if (!(MenuItem = MENU_FindItem( &MenuObject, &uItem, uHilite ))) return TRUE;
4784 
4785  if (uHilite & MF_HILITE)
4786  {
4787  MenuItem->fState |= MF_HILITE;
4788  }
4789  else
4790  {
4791  MenuItem->fState &= ~MF_HILITE;
4792  }
4793  if (MenuObject->iItem == uItemHilite) return TRUE;
4794  MENU_HideSubPopups( WindowObject, MenuObject, FALSE, 0 );
4795  MENU_SelectItem( WindowObject, MenuObject, uItemHilite, TRUE, 0 );
4796 
4797  return TRUE; // Always returns true!!!!
4798 }
#define TRUE
Definition: types.h:120
UINT fState
Definition: ntuser.h:341
PITEM FASTCALL MENU_FindItem(PMENU *pmenu, UINT *nPos, UINT wFlags)
Definition: menu.c:507
#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:387

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 TRUE
Definition: types.h:120
#define MF_BYCOMMAND
Definition: winuser.h:202
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:56
unsigned int BOOL
Definition: ntddk_ex.h:94
#define MF_BYPOSITION
Definition: winuser.h:203
ULONG cyMenu
Definition: ntuser.h:391
smooth NULL
Definition: ftsmooth.c:416
#define TRACE(s)
Definition: solgame.cpp:4
HANDLE hbmpUnchecked
Definition: ntuser.h:345
HANDLE hbmpChecked
Definition: ntuser.h:344
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:3312

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

◆ 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 5073 of file menu.c.

5080 {
5081  PITEM MenuItem;
5082  BOOL Ret;
5083 
5084  if (!(MenuItem = MENU_FindItem( &Menu, &Item, (ByPosition ? MF_BYPOSITION : MF_BYCOMMAND) )))
5085  {
5087  return( FALSE);
5088  }
5089  if (SetOrGet)
5090  {
5091  Ret = IntSetMenuItemInfo(Menu, MenuItem, ItemInfo, lpstr);
5092  }
5093  else
5094  {
5095  Ret = IntGetMenuItemInfo(Menu, MenuItem, ItemInfo);
5096  }
5097  return( Ret);
5098 }
#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
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
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 }
Definition: fontsub.cpp:35
#define TRUE
Definition: types.h:120
static __inline PVOID DesktopHeapReAlloc(IN PDESKTOP Desktop, IN PVOID lpMem, IN SIZE_T Bytes)
Definition: desktop.h:248
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
PROCDESKHEAD head
Definition: ntuser.h:385
smooth NULL
Definition: ftsmooth.c:416
#define TRACE(s)
Definition: solgame.cpp:4
UINT cItems
Definition: ntuser.h:389
PITEM rgItems
Definition: ntuser.h:394
_In_ DWORD _Out_ _In_ WORD wFlags
Definition: wincon.h:519
static ATOM item
Definition: dde.c:856
static __inline BOOL DesktopHeapFree(IN PDESKTOP Desktop, IN PVOID lpMem)
Definition: desktop.h:239
struct _DESKTOP * rpdesk
Definition: ntuser.h:197
#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 5456 of file menu.c.

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

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:396

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:109
#define MNF_RTOL
Definition: ntuser.h:373
ULONG fFlags
Definition: ntuser.h:386

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:398
HWND hWnd
Definition: ntuser.h:405
#define MNS_MODELESS
Definition: winuser.h:751
#define TRUE
Definition: types.h:120
INT iMaxTop
Definition: menu.h:92
HBRUSH hbrBack
Definition: ntuser.h:399
#define MNS_DRAGDROP
Definition: winuser.h:752
#define MNS_AUTODISMISS
Definition: winuser.h:753
#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:393
BOOL TimeToHide
Definition: ntuser.h:406
DWORD cbSize
Definition: menu.h:76
HBRUSH hbrBack
Definition: menu.h:80
ULONG cxTextAlign
Definition: menu.h:89
UINT cyMax
Definition: menu.h:79
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
ULONG cxTextAlign
Definition: ntuser.h:392
#define FIXME(fmt,...)
Definition: debug.h:110
ULONG cyMenu
Definition: ntuser.h:391
INT iTop
Definition: ntuser.h:400
DWORD dwContextHelpId
Definition: ntuser.h:396
BOOL FASTCALL IntSetMenuInfo(PMENU Menu, PROSMENUINFO lpmi)
Definition: menu.c:914
INT iTop
Definition: menu.h:91
DWORD dwArrowsOn
Definition: ntuser.h:402
ULONG cyMax
Definition: ntuser.h:397
DWORD dwArrowsOn
Definition: menu.h:93
UINT cItems
Definition: ntuser.h:389
DWORD dwContextHelpID
Definition: menu.h:81
PITEM rgItems
Definition: ntuser.h:394
WORD cxMenu
Definition: menu.h:87
static ATOM item
Definition: dde.c:856
DWORD fMask
Definition: menu.h:77
INT iMaxTop
Definition: ntuser.h:401
ULONG_PTR dwMenuData
Definition: menu.h:82
BOOL TimeToHide
Definition: menu.h:97
HWND Wnd
Definition: menu.h:96
ULONG fFlags
Definition: ntuser.h:386
ULONG cxMenu
Definition: ntuser.h:390
INT iItem
Definition: ntuser.h:387
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:378
#define ERROR_INVALID_PARAMETER
Definition: compat.h:91
INT cxBmp
Definition: ntuser.h:357
#define KeRosDumpStackFrames(Frames, Count)
Definition: gdidebug.h:11
DWORD_PTR dwItemData
Definition: ntuser.h:348
LPWSTR lpstr
Definition: menu.h:118
UINT wID
Definition: ntuser.h:342
#define MFT_STRING
Definition: winuser.h:741
#define MIIM_FTYPE
Definition: winuser.h:724
#define TRUE
Definition: types.h:120
USHORT MaximumLength
Definition: env_spec_w32.h:370
BOOL FASTCALL UserSetMenuDefaultItem(PMENU MenuObject, UINT uItem, UINT fByPos)
Definition: menu.c:1274
UINT fState
Definition: ntuser.h:341
#define MF_STRING
Definition: winuser.h:138
ULONG cch
Definition: ntuser.h:347
HBITMAP hbmpUnchecked
Definition: menu.h:110
LONG top
Definition: windef.h:292
ULONG cyItem
Definition: ntuser.h:352
ULONG yItem
Definition: ntuser.h:350
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:291
#define NT_VERIFY(exp)
Definition: rtlfuncs.h:3289
#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:293
UNICODE_STRING lpstr
Definition: ntuser.h:360
#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:63
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
PROCDESKHEAD head
Definition: ntuser.h:385
#define MIIM_STATE
Definition: winuser.h:716
unsigned int BOOL
Definition: ntddk_ex.h:94
smooth NULL
Definition: ftsmooth.c:416
ULONG cxItem
Definition: ntuser.h:351
LONG cx
Definition: windef.h:319
#define UpdateMenuItemState(state, change)
Definition: menu.c:95
BOOL FASTCALL UserObjectInDestroy(HANDLE h)
Definition: object.c:669
ULONG dxTab
Definition: ntuser.h:353
#define MIIM_ID
Definition: winuser.h:717
HBITMAP hbmpItem
Definition: menu.h:114
#define HBMMENU_CALLBACK
Definition: winuser.h:2605
#define UNICODE_STRING_MAX_CHARS
DWORD dwItemData
Definition: menu.h:111
__wchar_t WCHAR
Definition: xmlstorage.h:180
HANDLE hbmpUnchecked
Definition: ntuser.h:345
HBITMAP hbmp
Definition: ntuser.h:356
#define HBMMENU_POPUP_MINIMIZE
Definition: winuser.h:2615
#define MFT_SEPARATOR
Definition: winuser.h:739
struct tagMENU * spSubMenu
Definition: ntuser.h:343
#define MIIM_TYPE
Definition: winuser.h:720
ULONG xItem
Definition: ntuser.h:349
HANDLE hbmpChecked
Definition: ntuser.h:344
#define MIIM_CHECKMARKS
Definition: winuser.h:719
VOID FASTCALL SetLastNtError(NTSTATUS Status)
Definition: error.c:36
#define ERR(fmt,...)
Definition: debug.h:109
#define MIIM_STRING
Definition: winuser.h:722
HMENU hSubMenu
Definition: menu.h:108
unsigned short USHORT
Definition: pedump.c:61
#define MFS_HBMMENUBMP
Definition: ntuser.h:336
DWORD_PTR hTaskWow
Definition: ntuser.h:196
#define MNF_POPUP
Definition: ntuser.h:370
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
LONG bottom
Definition: windef.h:294
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:358
#define MFT_OWNERDRAW
Definition: winuser.h:736
USHORT * Xlpstr
Definition: ntuser.h:346
#define MIIM_DATA
Definition: winuser.h:721
ULONG fFlags
Definition: ntuser.h:386
struct _DESKTOP * rpdesk
Definition: ntuser.h:197
PMENU FASTCALL IntCreateMenu(_Out_ PHANDLE Handle, _In_ BOOL IsMenuBar, _In_ PDESKTOP Desktop, _In_ PPROCESSINFO ppi)
Definition: menu.c:729
UINT fType
Definition: ntuser.h:340
LONG cy
Definition: windef.h:320
#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 5423 of file menu.c.

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

Referenced by NtUserSetSystemMenu().

◆ IntTrackPopupMenuEx()

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

Definition at line 4558 of file menu.c.

4560 {
4561  BOOL ret = FALSE;
4563 
4564  if (pti != pWnd->head.pti)
4565  {
4566  ERR("Must be the same pti!\n");
4567  return ret;
4568  }
4569 
4570  TRACE("hmenu %p flags %04x (%d,%d) hwnd %p lpTpm %p \n", //rect %s\n",
4571  UserHMGetHandle(menu), wFlags, x, y, UserHMGetHandle(pWnd), lpTpm); //,
4572  //lpTpm ? wine_dbgstr_rect( &lpTpm->rcExclude) : "-" );
4573 
4574  if (menu->hWnd && IntIsWindow(menu->hWnd))
4575  {
4577  return FALSE;
4578  }
4579 
4580  if (MENU_InitPopup( pWnd, menu, wFlags ))
4581  {
4582  MENU_InitTracking(pWnd, menu, TRUE, wFlags);
4583 
4584  /* Send WM_INITMENUPOPUP message only if TPM_NONOTIFY flag is not specified */
4585  if (!(wFlags & TPM_NONOTIFY))
4586  {
4588  }
4589 
4590  if (menu->fFlags & MNF_SYSMENU)
4591  MENU_InitSysMenuPopup( menu, pWnd->style, pWnd->pcls->style, HTSYSMENU);
4592 
4593  if (MENU_ShowPopup(pWnd, menu, 0, wFlags | TPM_POPUPMENU, x, y, lpTpm ? &lpTpm->rcExclude : NULL))
4594  ret = MENU_TrackMenu( menu, wFlags | TPM_POPUPMENU, 0, 0, pWnd);
4595  else
4596  {
4598  pti->MessageQueue->QF_flags &= ~QF_CAPTURELOCKED;
4599  co_UserSetCapture(NULL); /* release the capture */
4600  }
4601 
4602  MENU_ExitTracking(pWnd, TRUE, wFlags);
4603 
4604  if (menu->hWnd)
4605  {
4606  PWND pwndM = ValidateHwndNoErr( menu->hWnd );
4607  if (pwndM) // wine hack around this with their destroy function.
4608  {
4609  if (!(pWnd->state & WNDS_DESTROYED))
4610  co_UserDestroyWindow( pwndM ); // Fix wrong error return.
4611  }
4612  menu->hWnd = 0;
4613 
4614  if (!(wFlags & TPM_NONOTIFY))
4615  {
4616  co_IntSendMessage( UserHMGetHandle(pWnd), WM_UNINITMENUPOPUP, (WPARAM)UserHMGetHandle(menu),
4617  MAKELPARAM(0, IS_SYSTEM_MENU(menu)) );
4618  }
4619  }
4620  }
4621  return ret;
4622 }
#define MNF_SYSMENU
Definition: ntuser.h:378
HWND hWnd
Definition: ntuser.h:405
void FASTCALL MENU_InitSysMenuPopup(PMENU menu, DWORD style, DWORD clsStyle, LONG HitTest)
Definition: menu.c:1362
#define TRUE
Definition: types.h:120
static INT FASTCALL MENU_TrackMenu(PMENU pmenu, UINT wFlags, INT x, INT y, PWND pwnd)
Definition: menu.c:4051
PWND FASTCALL ValidateHwndNoErr(HWND hWnd)
Definition: window.c:96
static BOOL MENU_InitPopup(PWND pWndOwner, PMENU menu, UINT flags)
Definition: menu.c:2781
#define WM_INITMENUPOPUP
Definition: winuser.h:1728
#define TPM_POPUPMENU
Definition: menu.c:90
#define MAKELPARAM(l, h)
Definition: winuser.h:3947
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:4445
#define HTSYSMENU
Definition: winuser.h:2452
UINT style
Definition: ntuser.h:548
unsigned int BOOL
Definition: ntddk_ex.h:94
BOOLEAN co_UserDestroyWindow(PVOID Object)
Definition: window.c:2644
#define ERROR_POPUP_ALREADY_ACTIVE
Definition: winerror.h:927
#define QF_CAPTURELOCKED
Definition: msgqueue.h:111
THRDESKHEAD head
Definition: ntuser.h:659
smooth NULL
Definition: ftsmooth.c:416
#define UserHMGetHandle(obj)
Definition: ntuser.h:208
HWND FASTCALL MsqSetStateWindow(PTHREADINFO pti, ULONG Type, HWND hWnd)
Definition: msgqueue.c:2533
#define TRACE(s)
Definition: solgame.cpp:4
HWND FASTCALL co_UserSetCapture(HWND hWnd)
Definition: focus.c:1340
BOOL FASTCALL IntIsWindow(HWND hWnd)
Definition: window.c:157
#define TPM_NONOTIFY
Definition: winuser.h:2361
int ret
LRESULT FASTCALL co_IntSendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1281
_In_ DWORD _Out_ _In_ WORD wFlags
Definition: wincon.h:519
#define ERR(fmt,...)
Definition: debug.h:109
Definition: ntuser.h:657
struct _USER_MESSAGE_QUEUE * MessageQueue
Definition: win32.h:88
#define IS_SYSTEM_MENU(MenuInfo)
Definition: menu.c:58
DWORD state
Definition: ntuser.h:665
static BOOL FASTCALL MENU_InitTracking(PWND pWnd, PMENU Menu, BOOL bPopup, UINT wFlags)
Definition: menu.c:4385
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
ULONG fFlags
Definition: ntuser.h:386
RECT rcExclude
Definition: winuser.h:3550
#define MSQ_STATE_MENUOWNER
Definition: ntuser.h:3547
#define WNDS_DESTROYED
Definition: ntuser.h:604
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)
Definition: error.c:27
PCLS pcls
Definition: ntuser.h:684
DWORD style
Definition: ntuser.h:670

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:400
DWORD dwArrowsOn
Definition: ntuser.h:402
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
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
#define TRACE(s)
Definition: solgame.cpp:4
PITEM rgItems
Definition: ntuser.h:394
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:387

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 }
Definition: fontsub.cpp:35
HWND hWnd
Definition: ntuser.h:405
PMENU WINAPI IntGetMenu(HWND hWnd)
Definition: menu.c:248
#define TRUE
Definition: types.h:120
BOOL TimeToHide
Definition: ntuser.h:406
int32_t INT
Definition: typedefs.h:56
DWORD Id
POINT Pt
Definition: menu.c:84
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
#define TRACE(s)
Definition: solgame.cpp:4
PITEM rgItems
Definition: ntuser.h:394
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:387

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:357
DWORD_PTR dwItemData
Definition: ntuser.h:348
#define max(a, b)
Definition: svc.c:63
UINT wID
Definition: ntuser.h:342
#define SM_CYMENUSIZE
Definition: winuser.h:1008
#define MNS_STYLE_MASK
Definition: menu.c:43
UINT fState
Definition: ntuser.h:341
#define ODT_MENU
Definition: winuser.h:2512
#define SM_CXMENUCHECK
Definition: winuser.h:1021
GLdouble n
Definition: glext.h:7729
LONG top
Definition: windef.h:292
ULONG cyItem
Definition: ntuser.h:352
#define HBMMENU_MBAR_MINIMIZE
Definition: winuser.h:2608
ULONG yItem
Definition: ntuser.h:350
LONG left
Definition: windef.h:291
#define MFS_DEFAULT
Definition: winuser.h:743
LONG right
Definition: windef.h:293
PSERVERINFO gpsi
Definition: main.c:27
int32_t INT
Definition: typedefs.h:56
#define HBMMENU_MBAR_MINIMIZE_D
Definition: winuser.h:2611
ULONG cxTextAlign
Definition: ntuser.h:392
#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:131
#define MF_OWNERDRAW
Definition: winuser.h:135
smooth NULL
Definition: ftsmooth.c:416
ULONG cxItem
Definition: ntuser.h:351
LONG cx
Definition: windef.h:319
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:353
#define MF_SYSMENU
Definition: winuser.h:141
LONG NTAPI UserGetSystemMetrics(ULONG Index)
Definition: metric.c:180
#define UserHMGetHandle(obj)
Definition: ntuser.h:208
__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:356
#define WM_MEASUREITEM
Definition: winuser.h:1628
LRESULT FASTCALL co_IntSendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1281
HDC hdc
Definition: main.c:9
ULONG_PTR itemData
Definition: winuser.h:3620
ULONG xItem
Definition: ntuser.h:349
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
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:246
LONG bottom
Definition: windef.h:294
#define SM_CYMENU
Definition: winuser.h:966
static HBITMAP
Definition: button.c:44
INT cyBmp
Definition: ntuser.h:358
GLfloat GLfloat p
Definition: glext.h:8902
USHORT * Xlpstr
Definition: ntuser.h:346
ULONG fFlags
Definition: ntuser.h:386
UINT fType
Definition: ntuser.h:340
LONG cy
Definition: windef.h:320
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 }
Definition: fontsub.cpp:35
#define MAXMENUDEPTH
Definition: menu.c:41
int FASTCALL MENU_depth(PMENU pmenu, int depth)
Definition: menu.c:404
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 TRACE(s)
Definition: solgame.cpp:4
UINT cItems
Definition: ntuser.h:389
PITEM rgItems
Definition: ntuser.h:394
GLint GLint GLsizei GLsizei GLsizei depth
Definition: gl.h:1546
static ATOM item
Definition: dde.c:856
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  }
3817  else
3818  return FALSE;
3819  }
3820  else /* application returned a new menu to switch to */
3821  {
3822  hNewMenu = NextMenu.hmenuNext;
3823  hNewWnd = NextMenu.hwndNext;
3824 
3825  if ((MenuTmp = UserGetMenuObject(hNewMenu)) && (pwndTemp = ValidateHwndNoErr(hNewWnd)))
3826  {
3827  if ( pwndTemp->style & WS_SYSMENU && (get_win_sys_menu(hNewWnd) == MenuTmp) )
3828  {
3829  /* get the real system menu */
3830  MenuTmp = get_win_sys_menu(hNewWnd);
3831  hNewMenu = UserHMGetHandle(MenuTmp);
3832  }
3833  else if (pwndTemp->style & WS_CHILD || IntGetMenu(hNewWnd) != MenuTmp)
3834  {
3835  /* FIXME: Not sure what to do here;
3836  * perhaps try to track NewMenu as a popup? */
3837 
3838  WARN(" -- got confused.\n");
3839  return FALSE;
3840  }
3841  }
3842  else return FALSE;
3843  }
3844 
3845  if (hNewMenu != UserHMGetHandle(pmt->TopMenu))
3846  {
3848 
3849  if (pmt->CurrentMenu != pmt->TopMenu)
3851  }
3852 
3853  if (hNewWnd != UserHMGetHandle(pmt->OwnerWnd))
3854  {
3856  pmt->OwnerWnd = ValidateHwndNoErr(hNewWnd);
3858  MsqSetStateWindow(pti, MSQ_STATE_MENUOWNER, hNewWnd);
3859  pti->MessageQueue->QF_flags &= ~QF_CAPTURELOCKED;
3861  pti->MessageQueue->QF_flags |= QF_CAPTURELOCKED;
3862  }
3863 
3864  pmt->TopMenu = pmt->CurrentMenu = UserGetMenuObject(hNewMenu); /* all subpopups are hidden */
3865  MENU_SelectItem(pmt->OwnerWnd, pmt->TopMenu, Id, TRUE, 0);
3866 
3867  return TRUE;
3868  }
3869  return FALSE;
3870 }
UINT wID
Definition: ntuser.h:342
PMENU WINAPI IntGetMenu(HWND hWnd)
Definition: menu.c:248
#define TRUE
Definition: types.h:120
PWND FASTCALL ValidateHwndNoErr(HWND hWnd)
Definition: window.c:96
#define SC_RESTORE
Definition: winuser.h:2573
#define WARN(fmt,...)
Definition: debug.h:111
PVOID NTAPI PsGetCurrentThreadWin32Thread(VOID)
Definition: thread.c:805
#define VK_LEFT
Definition: winuser.h:2199
#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:1788
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 BOOL
Definition: ntddk_ex.h:94
PMENU get_win_sys_menu(HWND hwnd)
Definition: menu.c:258
#define QF_CAPTURELOCKED
Definition: msgqueue.h:111
smooth NULL
Definition: ftsmooth.c:416
HMENU hmenuIn
Definition: winuser.h:3609
LONG_PTR LPARAM
Definition: windef.h:208
#define UserHMGetHandle(obj)
Definition: ntuser.h:208
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:2533
#define TRACE(s)
Definition: solgame.cpp:4
HWND FASTCALL co_UserSetCapture(HWND hWnd)
Definition: focus.c:1340
#define NO_SELECTED_ITEM
Definition: ntuser.h:381
UINT cItems
Definition: ntuser.h:389
PITEM rgItems
Definition: ntuser.h:394
LRESULT FASTCALL co_IntSendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1281
HMENU hmenuNext
Definition: winuser.h:3610
#define VK_RIGHT
Definition: winuser.h:2201
_In_ DWORD _Out_ _In_ WORD wFlags
Definition: wincon.h:519
Definition: ntuser.h:657
struct _USER_MESSAGE_QUEUE * MessageQueue
Definition: win32.h:88
#define IS_SYSTEM_MENU(MenuInfo)
Definition: menu.c:58
#define SC_SIZE
Definition: winuser.h:2559
unsigned int UINT
Definition: ndis.h:50
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:3547
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:60
DWORD style
Definition: ntuser.h:670
INT iItem
Definition: ntuser.h:387

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 = 0;
1742  drawItem.itemID = lpitem->wID;
1743  drawItem.itemAction = odaction;
1744  drawItem.itemState = (lpitem->fState & MF_CHECKED)?ODS_CHECKED:0;
1745  drawItem.itemState |= (lpitem->fState & MF_DEFAULT)?ODS_DEFAULT:0;
1746  drawItem.itemState |= (lpitem->fState & MF_DISABLED)?ODS_DISABLED:0;
1747  drawItem.itemState |= (lpitem->fState & MF_GRAYED)?ODS_GRAYED|ODS_DISABLED:0;
1748  drawItem.itemState |= (lpitem->fState & MF_HILITE)?ODS_SELECTED:0;
1749  drawItem.itemState |= (!(Menu->fFlags & MNF_UNDERLINE))?ODS_NOACCEL:0;
1750  drawItem.itemState |= (Menu->fFlags & MNF_INACTIVE)?ODS_INACTIVE:0;
1751  drawItem.hwndItem = (HWND)UserHMGetHandle(Menu);
1752  drawItem.hDC = hdc;
1753  drawItem.rcItem = *rect;
1754  drawItem.itemData = lpitem->dwItemData;
1755  /* some applications make this assumption on the DC's origin */
1756  GreSetViewportOrgEx( hdc, lpitem->xItem, lpitem->yItem, &origorg);
1757  RECTL_vOffsetRect(&drawItem.rcItem, -(LONG)lpitem->xItem, -(LONG)lpitem->yItem);
1758