[PATCH 03/11] user: use server calls to manage menu info server-side
Thomas Kho
tkho at ucla.edu
Thu Jun 29 15:34:11 CDT 2006
user: use server calls to manage menu info server-side
Thomas Kho
---
dlls/user/menu.c | 482 ++++++++++++++++++++++++++++++++++--------=
------
dlls/user/tests/menu.c | 22 +-
2 files changed, 352 insertions(+), 152 deletions(-)
diff --git a/dlls/user/menu.c b/dlls/user/menu.c
index bc1db93..aa0a3aa 100644
--- a/dlls/user/menu.c
+++ b/dlls/user/menu.c
@@ -6,6 +6,7 @@
* Copyright 1997 Morten Welinder
* Copyright 2005 Maxime Belleng=E9
* Copyright 2006 Phil Krylov
+ * Copyright 2006 Google (Thomas Kho)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -284,17 +285,85 @@ #undef MENUFLAG
/***********************************************************************
* MENU_GetMenu
*
- * Validate the given menu handle and returns the menu structure pointer.
+ * Get a local copy of menu for given hMenu
*/
-static POPUPMENU *MENU_GetMenu(HMENU hMenu)
+static NTSTATUS MENU_GetMenu(HMENU hMenu, POPUPMENU *menu)
{
- POPUPMENU *menu =3D USER_HEAP_LIN_ADDR(hMenu);
- if (!menu || menu->wMagic !=3D MENU_MAGIC)
+ NTSTATUS ret;
+ SERVER_START_REQ( get_menu_info )
{
- WARN("invalid menu handle=3D%p, ptr=3D%p, magic=3D%x\n", hMenu, =
menu, menu? menu->wMagic:0);
- menu =3D NULL;
+ req->handle =3D hMenu;
+ if ((ret =3D wine_server_call_err( req )))
+ WARN("error hMenu=3D0x%x, status=3D%ld\n", (unsigned) hMenu,=
ret);
+ else if (menu)
+ {
+ menu->wFlags =3D reply->flags;
+ menu->Width =3D reply->width;
+ menu->Height =3D reply->height;
+ menu->nItems =3D reply->nitems;
+ menu->hWnd =3D reply->hwnd;
+ menu->items =3D reply->items;
+ menu->FocusedItem =3D reply->focuseditem;
+ menu->hwndOwner =3D reply->hwndowner;
+ menu->bTimeToHide =3D reply->timetohide;
+ menu->bScrolling =3D reply->scrolling;
+ menu->nScrollPos =3D reply->scrollpos;
+ menu->nTotalHeight =3D reply->totalheight;
+
+ menu->dwStyle =3D reply->style;
+ menu->cyMax =3D reply->cymax;
+ menu->hbrBack =3D reply->back;
+ menu->dwContextHelpID =3D reply->contexthelpid;
+ menu->dwMenuData =3D reply->menudata;
+ menu->hSysMenuOwner =3D reply->sysmenuowner;
+ menu->maxBmpSize.cx =3D reply->maxbmpsize.x;
+ menu->maxBmpSize.cy =3D reply->maxbmpsize.y;
+ }
+ }
+ SERVER_END_REQ;
+ return ret;
+}
+
+/***********************************************************************
+ * MENU_UpdateMenu
+ *
+ * Update specific fields in server's copy of menu
+ */
+static NTSTATUS MENU_UpdateMenu(HMENU hMenu, POPUPMENU *menu, unsigned i=
nt mask)
+{
+ NTSTATUS ret =3D STATUS_INVALID_HANDLE;
+ SERVER_START_REQ( set_menu_info )
+ {
+ req->handle =3D hMenu;
+ req->mask =3D mask;
+
+ req->flags =3D menu->wFlags;
+ req->width =3D menu->Width;
+ req->height =3D menu->Height;
+ req->nitems =3D menu->nItems;
+ req->hwnd =3D menu->hWnd;
+ req->items =3D menu->items;
+ req->focuseditem =3D menu->FocusedItem;
+ req->hwndowner =3D menu->hwndOwner;
+ req->timetohide =3D menu->bTimeToHide;
+ req->scrolling =3D menu->bScrolling;
+ req->scrollpos =3D menu->nScrollPos;
+ req->totalheight =3D menu->nTotalHeight;
+
+ req->style =3D menu->dwStyle;
+ req->cymax =3D menu->cyMax;
+ req->back =3D menu->hbrBack;
+ req->contexthelpid =3D menu->dwContextHelpID;
+ req->menudata =3D menu->dwMenuData;
+ req->sysmenuowner =3D menu->hSysMenuOwner;
+ req->maxbmpsize.x =3D menu->maxBmpSize.cx;
+ req->maxbmpsize.y =3D menu->maxBmpSize.cy;
+
+ if ((ret =3D wine_server_call_err( req )))
+ WARN("error hMenu=3D0x%x, status=3D%ld\n", (unsigned) hMenu,=
ret);
}
- return menu;
+ SERVER_END_REQ;
+ return ret;
}
=20
/***********************************************************************
@@ -415,8 +484,11 @@ static HMENU MENU_CopySysPopup(void)
HMENU hMenu =3D LoadMenuW(user32_module, sysmenuW);
=20
if( hMenu ) {
- POPUPMENU* menu =3D MENU_GetMenu(hMenu);
+ POPUPMENU tmpmenu;
+ POPUPMENU* menu =3D &tmpmenu;
+ MENU_GetMenu(hMenu, menu);
menu->wFlags |=3D MF_SYSMENU | MF_POPUP;
+ MENU_UpdateMenu(hMenu, menu, SET_MI_FLAGS);
SetMenuDefaultItem(hMenu, SC_CLOSE, FALSE);
}
else
@@ -444,9 +516,12 @@ HMENU MENU_GetSysMenu( HWND hWnd, HMENU=20
TRACE("loading system menu, hWnd %p, hPopupMenu %p\n", hWnd, hPopupM=
enu);
if ((hMenu =3D CreateMenu()))
{
- POPUPMENU *menu =3D MENU_GetMenu(hMenu);
+ POPUPMENU tmpmenu;
+ POPUPMENU *menu =3D &tmpmenu;
+ MENU_GetMenu(hMenu, menu);
menu->wFlags =3D MF_SYSMENU;
menu->hWnd =3D WIN_GetFullHandle( hWnd );
+ MENU_UpdateMenu(hMenu, menu, SET_MI_FLAGS|SET_MI_HWND);
TRACE("hWnd %p (hMenu %p)\n", menu->hWnd, hMenu);
=20
if (!hPopupMenu)
@@ -460,9 +535,14 @@ HMENU MENU_GetSysMenu( HWND hWnd, HMENU=20
InsertMenuW( hMenu, -1, MF_SYSMENU | MF_POPUP | MF_BYPOSITION,
(UINT_PTR)hPopupMenu, NULL );
=20
+ MENU_GetMenu(hMenu, menu);
menu->items[0].fType =3D MF_SYSMENU | MF_POPUP;
menu->items[0].fState =3D 0;
- if ((menu =3D MENU_GetMenu(hPopupMenu))) menu->wFlags |=3D M=
F_SYSMENU;
+ if (!MENU_GetMenu(hPopupMenu, menu))
+ {
+ menu->wFlags |=3D MF_SYSMENU;
+ MENU_UpdateMenu(hPopupMenu, menu, SET_MI_FLAGS);
+ }
=20
TRACE("hMenu=3D%p (hPopup %p)\n", hMenu, hPopupMenu );
return hMenu;
@@ -511,10 +591,11 @@ static void MENU_InitSysMenuPopup( HMENU
static UINT MENU_GetStartOfNextColumn(
HMENU hMenu )
{
- POPUPMENU *menu =3D MENU_GetMenu(hMenu);
+ POPUPMENU tmpmenu;
+ POPUPMENU *menu =3D &tmpmenu;
UINT i;
=20
- if(!menu)
+ if(MENU_GetMenu(hMenu, menu))
return NO_SELECTED_ITEM;
=20
i =3D menu->FocusedItem + 1;
@@ -540,10 +621,11 @@ static UINT MENU_GetStartOfNextColumn(
static UINT MENU_GetStartOfPrevColumn(
HMENU hMenu )
{
- POPUPMENU *menu =3D MENU_GetMenu(hMenu);
+ POPUPMENU tmpmenu;
+ POPUPMENU *menu =3D &tmpmenu;
UINT i;
=20
- if( !menu )
+ if( MENU_GetMenu(hMenu, menu) )
return NO_SELECTED_ITEM;
=20
if( menu->FocusedItem =3D=3D 0 || menu->FocusedItem =3D=3D NO_SELECT=
ED_ITEM )
@@ -578,12 +660,14 @@ static UINT MENU_GetStartOfPrevColumn(
*/
static MENUITEM *MENU_FindItem( HMENU *hmenu, UINT *nPos, UINT wFlags )
{
- POPUPMENU *menu;
+ POPUPMENU tmpmenu;
+ POPUPMENU *menu =3D &tmpmenu;
MENUITEM *fallback =3D NULL;
UINT fallback_pos =3D 0;
UINT i;
=20
- if ((*hmenu =3D=3D (HMENU)0xffff) || (!(menu =3D MENU_GetMenu(*hmenu=
)))) return NULL;
+ if ((*hmenu =3D=3D (HMENU)0xffff) || (MENU_GetMenu(*hmenu, menu)))
+ return NULL;
if (wFlags & MF_BYPOSITION)
{
if (*nPos >=3D menu->nItems) return NULL;
@@ -633,11 +717,12 @@ static MENUITEM *MENU_FindItem( HMENU *h
*/
UINT MENU_FindSubMenu( HMENU *hmenu, HMENU hSubTarget )
{
- POPUPMENU *menu;
+ POPUPMENU tmpmenu;
+ POPUPMENU *menu =3D &tmpmenu;
UINT i;
MENUITEM *item;
if (((*hmenu)=3D=3D(HMENU)0xffff) ||
- (!(menu =3D MENU_GetMenu(*hmenu))))
+ (MENU_GetMenu(*hmenu, menu)))
return NO_SELECTED_ITEM;
item =3D menu->items;
for (i =3D 0; i < menu->nItems; i++, item++) {
@@ -736,9 +821,12 @@ static UINT MENU_FindItemByKey( HWND hwn
=20
if (hmenu)
{
- POPUPMENU *menu =3D MENU_GetMenu( hmenu );
- MENUITEM *item =3D menu->items;
+ POPUPMENU tmpmenu;
+ POPUPMENU *menu =3D &tmpmenu;
+ MENUITEM *item;
LRESULT menuchar;
+ MENU_GetMenu(hmenu, menu);
+ item =3D menu->items;
=20
if( !forceMenuChar )
{
@@ -1338,7 +1426,8 @@ static void MENU_DrawMenuItem( HWND hwnd
BOOL flat_menu =3D FALSE;
int bkgnd;
UINT arrow_bitmap_width =3D 0, arrow_bitmap_height =3D 0;
- POPUPMENU *menu =3D MENU_GetMenu(hmenu);
+ POPUPMENU tmpmenu;
+ POPUPMENU *menu =3D &tmpmenu;
RECT bmprc;
=20
debug_print_menuitem("MENU_DrawMenuItem: ", lpitem, "");
@@ -1386,7 +1475,8 @@ static void MENU_DrawMenuItem( HWND hwnd
=20
TRACE("rect=3D%s\n", wine_dbgstr_rect( &lpitem->rect));
rect =3D lpitem->rect;
- MENU_AdjustMenuItemRect(MENU_GetMenu(hmenu), &rect);
+ MENU_GetMenu(hmenu, menu);
+ MENU_AdjustMenuItemRect(menu, &rect);
=20
if (lpitem->fType & MF_OWNERDRAW)
{
@@ -1693,7 +1783,8 @@ static void MENU_DrawPopupMenu( HWND hwn
hPrevPen =3D SelectObject( hdc, GetStockObject( NULL_PEN ) );
if( hPrevPen )
{
- POPUPMENU *menu;
+ POPUPMENU tmpmenu;
+ POPUPMENU *menu =3D &tmpmenu;
BOOL flat_menu =3D FALSE;
=20
SystemParametersInfoW (SPI_GETFLATMENU, 0, &flat_menu, 0);
@@ -1702,7 +1793,7 @@ static void MENU_DrawPopupMenu( HWND hwn
else
DrawEdge (hdc, &rect, EDGE_RAISED, BF_RECT);
=20
- if( (menu =3D MENU_GetMenu( hmenu )))
+ if( (!MENU_GetMenu( hmenu, menu )))
{
/* draw menu items */
if( menu->nItems)
@@ -1735,12 +1826,12 @@ static void MENU_DrawPopupMenu( HWND hwn
UINT MENU_DrawMenuBar( HDC hDC, LPRECT lprect, HWND hwnd,
BOOL suppress_draw)
{
- LPPOPUPMENU lppop;
+ POPUPMENU tmppop;
+ LPPOPUPMENU lppop =3D &tmppop;
HFONT hfontOld =3D 0;
HMENU hMenu =3D GetMenu(hwnd);
=20
- lppop =3D MENU_GetMenu( hMenu );
- if (lppop =3D=3D NULL || lprect =3D=3D NULL)
+ if (MENU_GetMenu(hMenu, lppop) || lprect =3D=3D NULL)
{
return GetSystemMetrics(SM_CYMENU);
}
@@ -1750,7 +1841,10 @@ UINT MENU_DrawMenuBar( HDC hDC, LPRECT l
hfontOld =3D SelectObject( hDC, get_menu_font(FALSE));
=20
if (lppop->Height =3D=3D 0)
+ {
MENU_MenuBarCalcSize(hDC, lprect, lppop, hwnd);
+ MENU_UpdateMenu(hMenu, lppop, SET_MI_MAXBMPSIZE);
+ }
=20
lprect->bottom =3D lprect->top + lppop->Height;
=20
@@ -1770,17 +1864,19 @@ UINT MENU_DrawMenuBar( HDC hDC, LPRECT l
static BOOL MENU_ShowPopup( HWND hwndOwner, HMENU hmenu, UINT id,
INT x, INT y, INT xanchor, INT yanchor )
{
- POPUPMENU *menu;
+ POPUPMENU tmpmenu;
+ POPUPMENU *menu =3D &tmpmenu;
UINT width, height;
=20
TRACE("owner=3D%p hmenu=3D%p id=3D0x%04x x=3D0x%04x y=3D0x%04x xa=3D=
0x%04x ya=3D0x%04x\n",
hwndOwner, hmenu, id, x, y, xanchor, yanchor);
=20
- if (!(menu =3D MENU_GetMenu( hmenu ))) return FALSE;
+ if (MENU_GetMenu( hmenu, menu )) return FALSE;
if (menu->FocusedItem !=3D NO_SELECTED_ITEM)
{
menu->items[menu->FocusedItem].fState &=3D ~(MF_HILITE|MF_MOUSESELECT);
menu->FocusedItem =3D NO_SELECTED_ITEM;
+ MENU_UpdateMenu(hmenu, menu, SET_MI_FOCUSITEM);
}
=20
/* store the owner for DrawItem */
@@ -1788,6 +1884,7 @@ static BOOL MENU_ShowPopup( HWND hwndOwn
=20
menu->nScrollPos =3D 0;
MENU_PopupMenuCalcSize( menu, hwndOwner );
+ MENU_UpdateMenu(hmenu, menu, SET_MI_WIDTH|SET_MI_HEIGHT|SET_MI_MAXBM=
PSIZE|SET_MI_TOTALHEIGHT|SET_MI_SCROLLING|SET_MI_SCROLLPOS|SET_MI_OWNER);
=20
/* adjust popup menu pos so that it fits within the desktop */
=20
@@ -1819,6 +1916,7 @@ static BOOL MENU_ShowPopup( HWND hwndOwn
WS_POPUP, x, y, width, height,
hwndOwner, 0, (HINSTANCE)GetWindowLongPt=
rW(hwndOwner, GWLP_HINSTANCE),
(LPVOID)hmenu );
+ MENU_UpdateMenu( hmenu, menu, SET_MI_HWND );
if( !menu->hWnd ) return FALSE;
if (!top_popup) top_popup =3D menu->hWnd;
=20
@@ -1878,13 +1976,14 @@ MENU_EnsureMenuItemVisible(LPPOPUPMENU l
static void MENU_SelectItem( HWND hwndOwner, HMENU hmenu, UINT wIndex,
BOOL sendMenuSelect, HMENU topmenu )
{
- LPPOPUPMENU lppop;
+ POPUPMENU tmppop;
+ LPPOPUPMENU lppop =3D &tmppop;
HDC hdc;
=20
TRACE("owner=3D%p menu=3D%p index=3D0x%04x select=3D0x%04x\n", hwndO=
wner, hmenu, wIndex, sendMenuSelect);
=20
- lppop =3D MENU_GetMenu( hmenu );
- if ((!lppop) || (!lppop->nItems) || (!lppop->hWnd)) return;
+ if (MENU_GetMenu( hmenu, lppop ) || (!lppop->nItems)
+ || (!lppop->hWnd)) return;
=20
if (lppop->FocusedItem =3D=3D wIndex) return;
if (lppop->wFlags & MF_POPUP) hdc =3D GetDC( lppop->hWnd );
@@ -1904,6 +2003,7 @@ static void MENU_SelectItem( HWND hwndOw
=20
/* Highlight new item (if any) */
lppop->FocusedItem =3D wIndex;
+ MENU_UpdateMenu(hmenu, lppop, SET_MI_FOCUSITEM);
if (lppop->FocusedItem !=3D NO_SELECTED_ITEM)
{
if(!(lppop->items[wIndex].fType & MF_SEPARATOR)) {
@@ -1926,8 +2026,11 @@ static void MENU_SelectItem( HWND hwndOw
if(topmenu){
int pos;
if((pos=3DMENU_FindSubMenu(&topmenu, hmenu))!=3DNO_SELECTED_=
ITEM){
- POPUPMENU *ptm =3D MENU_GetMenu( topmenu );
- MENUITEM *ip =3D &ptm->items[pos];
+ POPUPMENU tmpptm;
+ POPUPMENU *ptm =3D &tmpptm;
+ MENUITEM *ip;
+ MENU_GetMenu( topmenu, ptm );
+ ip =3D &ptm->items[pos];
SendMessageW( hwndOwner, WM_MENUSELECT, MAKELONG(pos,
ip->fType | ip->fState |
(ptm->wFlags & MF_SYSMENU)), (LPARAM)topmenu);
@@ -1948,12 +2051,12 @@ static void MENU_SelectItem( HWND hwndOw
static void MENU_MoveSelection( HWND hwndOwner, HMENU hmenu, INT offset =
)
{
INT i;
- POPUPMENU *menu;
+ POPUPMENU tmpmenu;
+ POPUPMENU *menu =3D &tmpmenu;
=20
TRACE("hwnd=3D%p hmenu=3D%p off=3D0x%04x\n", hwndOwner, hmenu, offse=
t);
=20
- menu =3D MENU_GetMenu( hmenu );
- if ((!menu) || (!menu->items)) return;
+ if ((MENU_GetMenu(hmenu, menu)) || (!menu->items)) return;
=20
if ( menu->FocusedItem !=3D NO_SELECTED_ITEM )
{
@@ -2031,8 +2134,13 @@ static BOOL MENU_SetItemData( MENUITEM *
=20
if (flags & MF_POPUP)
{
- POPUPMENU *menu =3D MENU_GetMenu((HMENU)id);
- if (menu) menu->wFlags |=3D MF_POPUP;
+ POPUPMENU tmpmenu;
+ POPUPMENU *menu =3D &tmpmenu;
+ if (!MENU_GetMenu((HMENU)id, menu))
+ {
+ menu->wFlags |=3D MF_POPUP;
+ MENU_UpdateMenu((HMENU)id, menu, SET_MI_FLAGS);
+ }
else
{
item->wID =3D 0;
@@ -2068,9 +2176,10 @@ static BOOL MENU_SetItemData( MENUITEM *
static MENUITEM *MENU_InsertItem( HMENU hMenu, UINT pos, UINT flags )
{
MENUITEM *newItems;
- POPUPMENU *menu;
+ POPUPMENU tmpmenu;
+ POPUPMENU *menu =3D &tmpmenu;
=20
- if (!(menu =3D MENU_GetMenu(hMenu)))
+ if (MENU_GetMenu(hMenu, menu))
return NULL;
=20
/* Find where to insert new item */
@@ -2082,7 +2191,7 @@ static MENUITEM *MENU_InsertItem( HMENU=20
if (!MENU_FindItem( &hMenu, &pos, flags ))
pos =3D menu->nItems;
else {
- if (!(menu =3D MENU_GetMenu( hMenu )))
+ if (MENU_GetMenu(hMenu, menu))
return NULL;
}
}
@@ -2107,6 +2216,7 @@ static MENUITEM *MENU_InsertItem( HMENU=20
menu->nItems++;
memset( &newItems[pos], 0, sizeof(*newItems) );
menu->Height =3D 0; /* force size recalculate */
+ MENU_UpdateMenu(hMenu, menu, SET_MI_ITEMS|SET_MI_NITEMS|SET_MI_HEIGH=
T);
return &newItems[pos];
}
=20
@@ -2220,12 +2330,12 @@ static LPCSTR MENUEX_ParseResource( LPCS
*/
static HMENU MENU_GetSubPopup( HMENU hmenu )
{
- POPUPMENU *menu;
+ POPUPMENU tmpmenu;
+ POPUPMENU *menu =3D &tmpmenu;
MENUITEM *item;
=20
- menu =3D MENU_GetMenu( hmenu );
-
- if ((!menu) || (menu->FocusedItem =3D=3D NO_SELECTED_ITEM)) return 0=
;
+ if (MENU_GetMenu( hmenu, menu )
+ || (menu->FocusedItem =3D=3D NO_SELECTED_ITEM)) return 0;
=20
item =3D &menu->items[menu->FocusedItem];
if ((item->fType & MF_POPUP) && (item->fState & MF_MOUSESELECT))
@@ -2242,14 +2352,16 @@ static HMENU MENU_GetSubPopup( HMENU hme
static void MENU_HideSubPopups( HWND hwndOwner, HMENU hmenu,
BOOL sendMenuSelect )
{
- POPUPMENU *menu =3D MENU_GetMenu( hmenu );
+ POPUPMENU tmpmenu;
+ POPUPMENU *menu =3D &tmpmenu;
=20
TRACE("owner=3D%p hmenu=3D%p 0x%04x\n", hwndOwner, hmenu, sendMenuSe=
lect);
=20
- if (menu && top_popup)
+ if (!MENU_GetMenu( hmenu, menu ) && top_popup)
{
HMENU hsubmenu;
- POPUPMENU *submenu;
+ POPUPMENU tmpsubmenu;
+ POPUPMENU *submenu =3D &tmpsubmenu;
MENUITEM *item;
=20
if (menu->FocusedItem !=3D NO_SELECTED_ITEM)
@@ -2261,11 +2373,12 @@ static void MENU_HideSubPopups( HWND hwn
hsubmenu =3D item->hSubMenu;
} else return;
=20
- submenu =3D MENU_GetMenu( hsubmenu );
+ MENU_GetMenu( hsubmenu, submenu );
MENU_HideSubPopups( hwndOwner, hsubmenu, FALSE );
MENU_SelectItem( hwndOwner, hsubmenu, NO_SELECTED_ITEM, sendMenuSelect,=
0 );
DestroyWindow( submenu->hWnd );
submenu->hWnd =3D 0;
+ MENU_UpdateMenu(hsubmenu, submenu, SET_MI_HWND);
}
}
=20
@@ -2280,13 +2393,14 @@ static HMENU MENU_ShowSubPopup( HWND hwn
BOOL selectFirst, UINT wFlags )
{
RECT rect;
- POPUPMENU *menu;
+ POPUPMENU tmpmenu;
+ POPUPMENU *menu =3D &tmpmenu;
MENUITEM *item;
HDC hdc;
=20
TRACE("owner=3D%p hmenu=3D%p 0x%04x\n", hwndOwner, hmenu, selectFirs=
t);
=20
- if (!(menu =3D MENU_GetMenu( hmenu ))) return hmenu;
+ if (MENU_GetMenu( hmenu, menu )) return hmenu;
=20
if (menu->FocusedItem =3D=3D NO_SELECTED_ITEM) return hmenu;
=20
@@ -2383,9 +2497,12 @@ HWND MENU_IsMenuActive(void)
*/
static HMENU MENU_PtMenu( HMENU hMenu, POINT pt )
{
- POPUPMENU *menu =3D MENU_GetMenu( hMenu );
- UINT item =3D menu->FocusedItem;
+ POPUPMENU tmpmenu;
+ POPUPMENU *menu =3D &tmpmenu;
+ UINT item;
HMENU ret;
+ MENU_GetMenu( hMenu, menu );
+ item =3D menu->FocusedItem;
=20
/* try subpopup first (if any) */
ret =3D (item !=3D NO_SELECTED_ITEM &&
@@ -2421,11 +2538,12 @@ static HMENU MENU_PtMenu( HMENU hMenu, P
static INT MENU_ExecFocusedItem( MTRACKER* pmt, HMENU hMenu, UINT wFlags=
)
{
MENUITEM *item;
- POPUPMENU *menu =3D MENU_GetMenu( hMenu );
+ POPUPMENU tmpmenu;
+ POPUPMENU *menu =3D &tmpmenu;
=20
TRACE("%p hmenu=3D%p\n", pmt, hMenu);
=20
- if (!menu || !menu->nItems ||
+ if (MENU_GetMenu( hMenu, menu ) || !menu->nItems ||
(menu->FocusedItem =3D=3D NO_SELECTED_ITEM)) return -1;
=20
item =3D &menu->items[menu->FocusedItem];
@@ -2465,8 +2583,10 @@ static INT MENU_ExecFocusedItem( MTRACKE
*/
static void MENU_SwitchTracking( MTRACKER* pmt, HMENU hPtMenu, UINT id )
{
- POPUPMENU *ptmenu =3D MENU_GetMenu( hPtMenu );
- POPUPMENU *topmenu =3D MENU_GetMenu( pmt->hTopMenu );
+ POPUPMENU tmpptmenu, tmptopmenu;
+ POPUPMENU *ptmenu =3D &tmpptmenu, *topmenu =3D &tmptopmenu;
+ MENU_GetMenu( hPtMenu, ptmenu );
+ MENU_GetMenu( pmt->hTopMenu, topmenu );
=20
TRACE("%p hmenu=3D%p 0x%04x\n", pmt, hPtMenu, id);
=20
@@ -2495,8 +2615,10 @@ static BOOL MENU_ButtonDown( MTRACKER* p
if (hPtMenu)
{
UINT id =3D 0;
- POPUPMENU *ptmenu =3D MENU_GetMenu( hPtMenu );
+ POPUPMENU tmpptmenu;
+ POPUPMENU *ptmenu =3D &tmpptmenu;
MENUITEM *item;
+ MENU_GetMenu( hPtMenu, ptmenu );
=20
if( IS_SYSTEM_MENU(ptmenu) )
item =3D ptmenu->items;
@@ -2536,8 +2658,10 @@ static INT MENU_ButtonUp( MTRACKER* pmt,
if (hPtMenu)
{
UINT id =3D 0;
- POPUPMENU *ptmenu =3D MENU_GetMenu( hPtMenu );
MENUITEM *item;
+ POPUPMENU tmpptmenu;
+ POPUPMENU *ptmenu =3D &tmpptmenu;
+ MENU_GetMenu( hPtMenu, ptmenu );
=20
if( IS_SYSTEM_MENU(ptmenu) )
item =3D ptmenu->items;
@@ -2559,6 +2683,7 @@ static INT MENU_ButtonUp( MTRACKER* pmt,
return 0;
}
ptmenu->bTimeToHide =3D TRUE;
+ MENU_UpdateMenu( hPtMenu, ptmenu, SET_MI_TIMETOHIDE );
}
return -1;
}
@@ -2572,11 +2697,12 @@ static INT MENU_ButtonUp( MTRACKER* pmt,
static BOOL MENU_MouseMove( MTRACKER* pmt, HMENU hPtMenu, UINT wFlags )
{
UINT id =3D NO_SELECTED_ITEM;
- POPUPMENU *ptmenu =3D NULL;
+ POPUPMENU tmpptmenu;
+ POPUPMENU *ptmenu =3D &tmpptmenu;
=20
if( hPtMenu )
{
- ptmenu =3D MENU_GetMenu( hPtMenu );
+ MENU_GetMenu( hPtMenu, ptmenu );
if( IS_SYSTEM_MENU(ptmenu) )
id =3D 0;
else
@@ -2629,7 +2755,9 @@ static void MENU_SetCapture( HWND hwnd )
*/
static LRESULT MENU_DoNextMenu( MTRACKER* pmt, UINT vk )
{
- POPUPMENU *menu =3D MENU_GetMenu( pmt->hTopMenu );
+ POPUPMENU tmpmenu;
+ POPUPMENU *menu =3D &tmpmenu;
+ MENU_GetMenu( pmt->hTopMenu, menu );
=20
if( (vk =3D=3D VK_LEFT && menu->FocusedItem =3D=3D 0 ) ||
(vk =3D=3D VK_RIGHT && menu->FocusedItem =3D=3D menu->nItems - 1=
))
@@ -2659,7 +2787,7 @@ static LRESULT MENU_DoNextMenu( MTRACKER
=20
if( vk =3D=3D VK_LEFT )
{
- menu =3D MENU_GetMenu( hNewMenu );
+ MENU_GetMenu( hNewMenu, menu );
id =3D menu->nItems - 1;
}
}
@@ -2768,7 +2896,9 @@ static BOOL MENU_KeyEscape(MTRACKER* pmt
=20
if (pmt->hCurrentMenu !=3D pmt->hTopMenu)
{
- POPUPMENU *menu =3D MENU_GetMenu(pmt->hCurrentMenu);
+ POPUPMENU tmpmenu;
+ POPUPMENU *menu =3D &tmpmenu;
+ MENU_GetMenu(pmt->hCurrentMenu, menu);
=20
if (menu->wFlags & MF_POPUP)
{
@@ -2799,12 +2929,13 @@ static BOOL MENU_KeyEscape(MTRACKER* pmt
*/
static void MENU_KeyLeft( MTRACKER* pmt, UINT wFlags )
{
- POPUPMENU *menu;
+ POPUPMENU tmpmenu;
+ POPUPMENU *menu =3D &tmpmenu;
HMENU hmenutmp, hmenuprev;
UINT prevcol;
=20
hmenuprev =3D hmenutmp =3D pmt->hTopMenu;
- menu =3D MENU_GetMenu( hmenutmp );
+ MENU_GetMenu( hmenutmp, menu );
=20
/* Try to move 1 column left (if possible) */
if( (prevcol =3D MENU_GetStartOfPrevColumn( pmt->hCurrentMenu )) !=3D
@@ -2853,12 +2984,15 @@ static void MENU_KeyLeft( MTRACKER* pmt,
static void MENU_KeyRight( MTRACKER* pmt, UINT wFlags )
{
HMENU hmenutmp;
- POPUPMENU *menu =3D MENU_GetMenu( pmt->hTopMenu );
+ POPUPMENU tmpmenu, tmpcurmenu;
+ POPUPMENU *menu =3D &tmpmenu, *curmenu =3D &tmpcurmenu;
UINT nextcol;
+ MENU_GetMenu( pmt->hTopMenu, menu);
=20
+ MENU_GetMenu(pmt->hCurrentMenu, curmenu);
TRACE("MENU_KeyRight called, cur %p (%s), top %p (%s).\n",
pmt->hCurrentMenu,
- debugstr_w((MENU_GetMenu(pmt->hCurrentMenu))->items[0].text),
+ debugstr_w(curmenu->items[0].text),
pmt->hTopMenu, debugstr_w(menu->items[0].text) );
=20
if ( (menu->wFlags & MF_POPUP) || (pmt->hCurrentMenu !=3D pmt->hTopM=
enu))
@@ -2909,7 +3043,8 @@ static BOOL MENU_TrackMenu( HMENU hmenu,
HWND hwnd, const RECT *lprect )
{
MSG msg;
- POPUPMENU *menu;
+ POPUPMENU tmpmenu;
+ POPUPMENU *menu =3D &tmpmenu;
BOOL fRemove;
INT executedMenuId =3D -1;
MTRACKER mt;
@@ -2926,7 +3061,7 @@ static BOOL MENU_TrackMenu( HMENU hmenu,
hmenu, wFlags, x, y, hwnd, wine_dbgstr_rect( lprect));
=20
fEndMenu =3D FALSE;
- if (!(menu =3D MENU_GetMenu( hmenu )))
+ if (MENU_GetMenu( hmenu, menu ))
{
WARN("Invalid menu handle %p\n", hmenu);
SetLastError(ERROR_INVALID_MENU_HANDLE);
@@ -2946,9 +3081,11 @@ static BOOL MENU_TrackMenu( HMENU hmenu,
=20
while (!fEndMenu)
{
- menu =3D MENU_GetMenu( mt.hCurrentMenu );
- if (!menu) /* sometimes happens if I do a window manager close */
+ if (MENU_GetMenu( mt.hCurrentMenu, menu ))
+ {
+ /* sometimes happens if I do a window manager close */
break;
+ }
=20
/* we have to keep the message in the queue until it's
* clear that menu loop is not over yet. */
@@ -3076,7 +3213,7 @@ static BOOL MENU_TrackMenu( HMENU hmenu,
case VK_UP:
case VK_DOWN: /* If on menu bar, pull-down the menu */
=20
- menu =3D MENU_GetMenu( mt.hCurrentMenu );
+ MENU_GetMenu( mt.hCurrentMenu, menu );
if (!(menu->wFlags & MF_POPUP))
mt.hCurrentMenu =3D MENU_ShowSubPopup(mt.hOwnerWnd, mt.hTopMenu, TRUE=
, wFlags);
else /* otherwise try to move selection */
@@ -3173,23 +3310,28 @@ static BOOL MENU_TrackMenu( HMENU hmenu,
check for this first. */
if( IsMenu( mt.hTopMenu ) )
{
- menu =3D MENU_GetMenu( mt.hTopMenu );
+ int ret =3D MENU_GetMenu( mt.hTopMenu, menu );
=20
if( IsWindow( mt.hOwnerWnd ) )
{
MENU_HideSubPopups( mt.hOwnerWnd, mt.hTopMenu, FALSE );
=20
- if (menu && (menu->wFlags & MF_POPUP))
+ if (!ret && (menu->wFlags & MF_POPUP))
{
DestroyWindow( menu->hWnd );
menu->hWnd =3D 0;
+ MENU_UpdateMenu(mt.hTopMenu, menu, SET_MI_HWND);
}
MENU_SelectItem( mt.hOwnerWnd, mt.hTopMenu, NO_SELECTED_ITEM, FALSE=
, 0 );
SendMessageW( mt.hOwnerWnd, WM_MENUSELECT, MAKELONG(0,0xffff), 0 );
}
=20
/* Reset the variable for hiding menu */
- if( menu ) menu->bTimeToHide =3D FALSE;
+ if( !ret )
+ {
+ menu->bTimeToHide =3D FALSE;
+ MENU_UpdateMenu(mt.hTopMenu, menu, SET_MI_TIMETOHIDE);
+ }
}
=20
/* The return value is only used by TrackPopupMenu */
@@ -3203,7 +3345,8 @@ static BOOL MENU_TrackMenu( HMENU hmenu,
*/
static BOOL MENU_InitTracking(HWND hWnd, HMENU hMenu, BOOL bPopup, UINT =
wFlags)
{
- POPUPMENU *menu;
+ POPUPMENU tmpmenu;
+ POPUPMENU *menu =3D &tmpmenu;
=20
TRACE("hwnd=3D%p hmenu=3D%p\n", hWnd, hMenu);
=20
@@ -3227,7 +3370,11 @@ static BOOL MENU_InitTracking(HWND hWnd,
* It also enables menus to be displayed in more than one window,
* but there are some bugs left that need to be fixed in this case.
*/
- if ((menu =3D MENU_GetMenu( hMenu ))) menu->hWnd =3D hWnd;
+ if (!MENU_GetMenu( hMenu, menu ))
+ {
+ menu->hWnd =3D hWnd;
+ MENU_UpdateMenu( hMenu, menu, SET_MI_HWND );
+ }
=20
return TRUE;
}
@@ -3440,16 +3587,18 @@ UINT MENU_GetMenuBarHeight( HWND hwnd, U
{
HDC hdc;
RECT rectBar;
- LPPOPUPMENU lppop;
+ POPUPMENU tmppop;
+ LPPOPUPMENU lppop =3D &tmppop;
=20
TRACE("HWND %p, width %d, at (%d, %d).\n", hwnd, menubarWidth, orgX,=
orgY );
=20
- if (!(lppop =3D MENU_GetMenu( GetMenu(hwnd) ))) return 0;
+ if (MENU_GetMenu( GetMenu(hwnd), lppop )) return 0;
=20
hdc =3D GetDCEx( hwnd, 0, DCX_CACHE | DCX_WINDOW );
SelectObject( hdc, get_menu_font(FALSE));
SetRect(&rectBar, orgX, orgY, orgX+menubarWidth, orgY+GetSystemMetri=
cs(SM_CYMENU));
MENU_MenuBarCalcSize( hdc, &rectBar, lppop, hwnd );
+ MENU_UpdateMenu( GetMenu(hwnd), lppop, SET_MI_WIDTH|SET_MI_HEIGHT|SE=
T_MI_MAXBMPSIZE|SET_MI_TOTALHEIGHT|SET_MI_SCROLLING);
ReleaseDC( hwnd, hdc );
return lppop->Height;
}
@@ -3519,12 +3668,13 @@ BOOL WINAPI EnableMenuItem( HMENU hMenu,
{
UINT oldflags;
MENUITEM *item;
- POPUPMENU *menu;
+ POPUPMENU tmpmenu;
+ POPUPMENU *menu =3D &tmpmenu;
=20
TRACE("(%p, %04x, %04x) !\n", hMenu, wItemID, wFlags);
=20
/* Get the Popupmenu to access the owner menu */
- if (!(menu =3D MENU_GetMenu(hMenu)))
+ if (MENU_GetMenu(hMenu, menu))
return (UINT)-1;
=20
if (!(item =3D MENU_FindItem( &hMenu, &wItemID, wFlags )))
@@ -3539,10 +3689,11 @@ BOOL WINAPI EnableMenuItem( HMENU hMenu,
if (menu->hSysMenuOwner !=3D 0)
{
RECT rc;
- POPUPMENU* parentMenu;
+ POPUPMENU tmpparentMenu;
+ POPUPMENU *parentMenu =3D &tmpparentMenu;
=20
/* Get the parent menu to access*/
- if (!(parentMenu =3D MENU_GetMenu(menu->hSysMenuOwner)))
+ if (MENU_GetMenu(menu->hSysMenuOwner, parentMenu))
return (UINT)-1;
=20
/* Refresh the frame to reflect the change */
@@ -3614,10 +3765,11 @@ INT WINAPI GetMenuStringW( HMENU hMenu,=20
BOOL WINAPI HiliteMenuItem( HWND hWnd, HMENU hMenu, UINT wItemID,
UINT wHilite )
{
- LPPOPUPMENU menu;
+ POPUPMENU tmpmenu;
+ LPPOPUPMENU menu =3D &tmpmenu;
TRACE("(%p, %p, %04x, %04x);\n", hWnd, hMenu, wItemID, wHilite);
if (!MENU_FindItem( &hMenu, &wItemID, wHilite )) return FALSE;
- if (!(menu =3D MENU_GetMenu(hMenu))) return FALSE;
+ if (MENU_GetMenu(hMenu, menu)) return FALSE;
if (menu->FocusedItem =3D=3D wItemID) return TRUE;
MENU_HideSubPopups( hWnd, hMenu, FALSE );
MENU_SelectItem( hWnd, hMenu, wItemID, TRUE, 0 );
@@ -3636,8 +3788,9 @@ UINT WINAPI GetMenuState( HMENU hMenu, U
debug_print_menuitem (" item: ", item, "");
if (item->fType & MF_POPUP)
{
- POPUPMENU *menu =3D MENU_GetMenu( item->hSubMenu );
- if (!menu) return -1;
+ POPUPMENU tmpmenu;
+ POPUPMENU *menu =3D &tmpmenu;
+ if (MENU_GetMenu( item->hSubMenu, menu )) return -1;
else return (menu->nItems << 8) | ((item->fState|item->fType) & 0xff);
}
else
@@ -3655,8 +3808,9 @@ UINT WINAPI GetMenuState( HMENU hMenu, U
*/
INT WINAPI GetMenuItemCount( HMENU hMenu )
{
- LPPOPUPMENU menu =3D MENU_GetMenu(hMenu);
- if (!menu) return -1;
+ POPUPMENU tmpmenu;
+ LPPOPUPMENU menu =3D &tmpmenu;
+ if (MENU_GetMenu(hMenu, menu)) return -1;
TRACE("(%p) returning %d\n", hMenu, menu->nItems );
return menu->nItems;
}
@@ -3699,7 +3853,13 @@ BOOL WINAPI InsertMenuW( HMENU hMenu, UI
}
=20
if (flags & MF_POPUP) /* Set the MF_POPUP flag on the popup-menu */
- (MENU_GetMenu((HMENU)id))->wFlags |=3D MF_POPUP;
+ {
+ POPUPMENU tmpmenu;
+ POPUPMENU *menu =3D &tmpmenu;
+ MENU_GetMenu((HMENU)id, menu);
+ menu->wFlags |=3D MF_POPUP;
+ MENU_UpdateMenu((HMENU)id, menu, SET_MI_FLAGS);
+ }
=20
item->hCheckBit =3D item->hUnCheckBit =3D 0;
return TRUE;
@@ -3755,12 +3915,13 @@ BOOL WINAPI AppendMenuW( HMENU hMenu, UI
*/
BOOL WINAPI RemoveMenu( HMENU hMenu, UINT nPos, UINT wFlags )
{
- LPPOPUPMENU menu;
+ POPUPMENU tmpmenu;
+ LPPOPUPMENU menu =3D &tmpmenu;
MENUITEM *item;
=20
TRACE("(menu=3D%p pos=3D%04x flags=3D%04x)\n",hMenu, nPos, wFlags);
if (!(item =3D MENU_FindItem( &hMenu, &nPos, wFlags ))) return FALSE=
;
- if (!(menu =3D MENU_GetMenu(hMenu))) return FALSE;
+ if (MENU_GetMenu(hMenu, menu)) return FALSE;
=20
/* Remove item */
=20
@@ -3782,6 +3943,7 @@ BOOL WINAPI RemoveMenu( HMENU hMenu, UIN
menu->items =3D HeapReAlloc( GetProcessHeap(), 0, menu->items,
menu->nItems * sizeof(MENUITEM) );
}
+ MENU_UpdateMenu(hMenu, menu, SET_MI_NITEMS|SET_MI_ITEMS);
return TRUE;
}
=20
@@ -3807,6 +3969,8 @@ BOOL WINAPI ModifyMenuW( HMENU hMenu, UI
UINT_PTR id, LPCWSTR str )
{
MENUITEM *item;
+ POPUPMENU tmpmenu;
+ POPUPMENU *menu =3D &tmpmenu;
=20
if (IS_STRING_ITEM(flags))
TRACE("%p %d %04x %04x %s\n", hMenu, pos, flags, id, debugstr_w(=
str) );
@@ -3814,7 +3978,9 @@ BOOL WINAPI ModifyMenuW( HMENU hMenu, UI
TRACE("%p %d %04x %04x %p\n", hMenu, pos, flags, id, str );
=20
if (!(item =3D MENU_FindItem( &hMenu, &pos, flags ))) return FALSE;
- MENU_GetMenu(hMenu)->Height =3D 0; /* force size recalculate */
+ MENU_GetMenu(hMenu, menu);
+ menu->Height =3D 0; /* force size recalculate */
+ MENU_UpdateMenu(hMenu, menu, SET_MI_HEIGHT);
return MENU_SetItemData( item, flags, id, str );
}
=20
@@ -3849,12 +4015,14 @@ BOOL WINAPI ModifyMenuA( HMENU hMenu, UI
HMENU WINAPI CreatePopupMenu(void)
{
HMENU hmenu;
- POPUPMENU *menu;
+ POPUPMENU tmpmenu;
+ POPUPMENU *menu =3D &tmpmenu;
=20
if (!(hmenu =3D CreateMenu())) return 0;
- menu =3D MENU_GetMenu( hmenu );
+ MENU_GetMenu(hmenu, menu);
menu->wFlags |=3D MF_POPUP;
menu->bTimeToHide =3D FALSE;
+ MENU_UpdateMenu(hmenu, menu, SET_MI_FLAGS|SET_MI_TIMETOHIDE);
return hmenu;
}
=20
@@ -3899,15 +4067,14 @@ BOOL WINAPI SetMenuItemBitmaps( HMENU hM
*/
HMENU WINAPI CreateMenu(void)
{
- HMENU hMenu;
- LPPOPUPMENU menu;
- if (!(hMenu =3D USER_HEAP_ALLOC( sizeof(POPUPMENU) ))) return 0;
- menu =3D (LPPOPUPMENU) USER_HEAP_LIN_ADDR(hMenu);
+ HMENU hMenu =3D 0;
=20
- ZeroMemory(menu, sizeof(POPUPMENU));
- menu->wMagic =3D MENU_MAGIC;
- menu->FocusedItem =3D NO_SELECTED_ITEM;
- menu->bTimeToHide =3D FALSE;
+ SERVER_START_REQ( create_menu )
+ {
+ if (!wine_server_call_err( req ))
+ hMenu =3D reply->handle;
+ }
+ SERVER_END_REQ;
=20
TRACE("return %p\n", hMenu );
=20
@@ -3920,12 +4087,12 @@ HMENU WINAPI CreateMenu(void)
*/
BOOL WINAPI DestroyMenu( HMENU hMenu )
{
- LPPOPUPMENU lppop =3D MENU_GetMenu(hMenu);
+ POPUPMENU tmppop;
+ LPPOPUPMENU lppop =3D &tmppop;
=20
TRACE("(%p)\n", hMenu);
=20
-
- if (!lppop) return FALSE;
+ if (MENU_GetMenu(hMenu, lppop)) return FALSE;
=20
lppop->wMagic =3D 0; /* Mark it as destroyed */
=20
@@ -3947,7 +4114,15 @@ BOOL WINAPI DestroyMenu( HMENU hMenu )
}
HeapFree( GetProcessHeap(), 0, lppop->items );
}
- USER_HEAP_FREE( hMenu );
+
+ SERVER_START_REQ( destroy_menu )
+ {
+ req->handle =3D hMenu;
+ if (!wine_server_call_err( req ))
+ {
+ }
+ }
+ SERVER_END_REQ;
return TRUE;
}
=20
@@ -3978,14 +4153,17 @@ HMENU WINAPI GetSystemMenu( HWND hWnd, B
=20
if( wndPtr->hSysMenu )
{
- POPUPMENU *menu;
+ POPUPMENU tmpmenu;
+ POPUPMENU *menu =3D &tmpmenu;
retvalue =3D GetSubMenu(wndPtr->hSysMenu, 0);
=20
/* Store the dummy sysmenu handle to facilitate the refresh */
/* of the close button if the SC_CLOSE item change */
- menu =3D MENU_GetMenu(retvalue);
- if ( menu )
+ if (!MENU_GetMenu(retvalue, menu))
+ {
menu->hSysMenuOwner =3D wndPtr->hSysMenu;
+ MENU_UpdateMenu(retvalue, menu, SET_MI_OWNER);
+ }
}
WIN_ReleasePtr( wndPtr );
}
@@ -4053,12 +4231,14 @@ BOOL MENU_SetMenu( HWND hWnd, HMENU hMen
=20
if (hMenu !=3D 0)
{
- LPPOPUPMENU lpmenu;
+ POPUPMENU tmpmenu;
+ LPPOPUPMENU lpmenu =3D &tmpmenu;
=20
- if (!(lpmenu =3D MENU_GetMenu(hMenu))) return FALSE;
+ if (MENU_GetMenu(hMenu, lpmenu)) return FALSE;
=20
lpmenu->hWnd =3D hWnd;
lpmenu->Height =3D 0; /* Make sure we recalculate the size */
+ MENU_UpdateMenu(hMenu, lpmenu, SET_MI_HWND|SET_MI_HEIGHT);
}
SetWindowLongPtrW( hWnd, GWLP_ID, (LONG_PTR)hMenu );
return TRUE;
@@ -4097,15 +4277,17 @@ HMENU WINAPI GetSubMenu( HMENU hMenu, IN
*/
BOOL WINAPI DrawMenuBar( HWND hWnd )
{
- LPPOPUPMENU lppop;
+ POPUPMENU tmppop;
+ LPPOPUPMENU lppop =3D &tmppop;
HMENU hMenu =3D GetMenu(hWnd);
=20
if (!WIN_ALLOWED_MENU(GetWindowLongW( hWnd, GWL_STYLE )))
return FALSE;
- if (!hMenu || !(lppop =3D MENU_GetMenu( hMenu ))) return FALSE;
+ if (!hMenu || MENU_GetMenu( hMenu, lppop )) return FALSE;
=20
lppop->Height =3D 0; /* Make sure we call MENU_MenuBarCalcSize */
lppop->hwndOwner =3D hWnd;
+ MENU_UpdateMenu( hMenu, lppop, SET_MI_HEIGHT|SET_MI_OWNER );
SetWindowPos( hWnd, 0, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE |
SWP_NOACTIVATE | SWP_NOZORDER | SWP_FRAMECHANGED );
return TRUE;
@@ -4122,7 +4304,8 @@ BOOL WINAPI DrawMenuBar( HWND hWnd )
*/
DWORD WINAPI DrawMenuBarTemp(HWND hwnd, HDC hDC, LPRECT lprect, HMENU hM=
enu, HFONT hFont)
{
- LPPOPUPMENU lppop;
+ POPUPMENU tmppop;
+ LPPOPUPMENU lppop =3D &tmppop;
UINT i,retvalue;
HFONT hfontOld =3D 0;
BOOL flat_menu =3D FALSE;
@@ -4135,8 +4318,7 @@ DWORD WINAPI DrawMenuBarTemp(HWND hwnd,=20
if (!hFont)
hFont =3D get_menu_font(FALSE);
=20
- lppop =3D MENU_GetMenu( hMenu );
- if (lppop =3D=3D NULL || lprect =3D=3D NULL)
+ if (MENU_GetMenu(hMenu, lppop) || lprect =3D=3D NULL)
{
retvalue =3D GetSystemMetrics(SM_CYMENU);
goto END;
@@ -4147,7 +4329,10 @@ DWORD WINAPI DrawMenuBarTemp(HWND hwnd,=20
hfontOld =3D SelectObject( hDC, hFont);
=20
if (lppop->Height =3D=3D 0)
+ {
MENU_MenuBarCalcSize(hDC, lprect, lppop, hwnd);
+ MENU_UpdateMenu(hMenu, lppop, SET_MI_MAXBMPSIZE);
+ }
=20
lprect->bottom =3D lprect->top + lppop->Height;
=20
@@ -4335,9 +4520,9 @@ HMENU WINAPI LoadMenuIndirectA( LPCVOID=20
*/
BOOL WINAPI IsMenu(HMENU hmenu)
{
- LPPOPUPMENU menu =3D MENU_GetMenu(hmenu);
-
- if (!menu)
+ POPUPMENU menu;
+ =20
+ if (MENU_GetMenu(hmenu, &menu))
{
SetLastError(ERROR_INVALID_MENU_HANDLE);
return FALSE;
@@ -4570,9 +4755,12 @@ static BOOL SetMenuItemInfo_common(MENUI
if (lpmii->fMask & MIIM_SUBMENU) {
menu->hSubMenu =3D lpmii->hSubMenu;
if (menu->hSubMenu) {
- POPUPMENU *subMenu =3D MENU_GetMenu(menu->hSubMenu);
- if (subMenu) {
+ POPUPMENU tmpsubMenu;
+ POPUPMENU *subMenu =3D &tmpsubMenu;
+ if (!MENU_GetMenu(menu->hSubMenu, subMenu))
+ {
subMenu->wFlags |=3D MF_POPUP;
+ MENU_UpdateMenu(menu->hSubMenu, subMenu, SET_MI_FLAGS);
menu->fType |=3D MF_POPUP;
}
else {
@@ -4654,12 +4842,13 @@ BOOL WINAPI SetMenuItemInfoW(HMENU hmenu
BOOL WINAPI SetMenuDefaultItem(HMENU hmenu, UINT uItem, UINT bypos)
{
UINT i;
- POPUPMENU *menu;
+ POPUPMENU tmpmenu;
+ POPUPMENU *menu =3D &tmpmenu;
MENUITEM *item;
=20
TRACE("(%p,%d,%d)\n", hmenu, uItem, bypos);
=20
- if (!(menu =3D MENU_GetMenu(hmenu))) return FALSE;
+ if (MENU_GetMenu(hmenu, menu)) return FALSE;
=20
/* reset all default-item flags */
item =3D menu->items;
@@ -4701,13 +4890,14 @@ BOOL WINAPI SetMenuDefaultItem(HMENU hme
*/
UINT WINAPI GetMenuDefaultItem(HMENU hmenu, UINT bypos, UINT flags)
{
- POPUPMENU *menu;
+ POPUPMENU tmpmenu;
+ POPUPMENU *menu =3D &tmpmenu;
MENUITEM * item;
UINT i =3D 0;
=20
TRACE("(%p,%d,%d)\n", hmenu, bypos, flags);
=20
- if (!(menu =3D MENU_GetMenu(hmenu))) return -1;
+ if (MENU_GetMenu(hmenu, menu)) return -1;
=20
/* find default item */
item =3D menu->items;
@@ -4831,7 +5021,8 @@ BOOL WINAPI CheckMenuRadioItem(HMENU hMe
BOOL WINAPI GetMenuItemRect (HWND hwnd, HMENU hMenu, UINT uItem,
LPRECT rect)
{
- POPUPMENU *itemMenu;
+ POPUPMENU tmpitemMenu;
+ POPUPMENU *itemMenu =3D &tmpitemMenu;
MENUITEM *item;
HWND referenceHwnd;
=20
@@ -4842,8 +5033,7 @@ BOOL WINAPI GetMenuItemRect (HWND hwnd,=20
=20
if(!hwnd)
{
- itemMenu =3D MENU_GetMenu(hMenu);
- if (itemMenu =3D=3D NULL)
+ if (MENU_GetMenu(hMenu, itemMenu))
return FALSE;
=20
if(itemMenu->hWnd =3D=3D 0)
@@ -4871,11 +5061,12 @@ BOOL WINAPI GetMenuItemRect (HWND hwnd,=20
*/
BOOL WINAPI SetMenuInfo (HMENU hMenu, LPCMENUINFO lpmi)
{
- POPUPMENU *menu;
+ POPUPMENU tmpmenu;
+ POPUPMENU *menu =3D &tmpmenu;
=20
TRACE("(%p %p)\n", hMenu, lpmi);
=20
- if (lpmi && (lpmi->cbSize=3D=3Dsizeof(MENUINFO)) && (menu =3D MENU_G=
etMenu(hMenu)))
+ if (lpmi && (lpmi->cbSize=3D=3Dsizeof(MENUINFO)) && !MENU_GetMenu(hM=
enu, menu))
{
=20
if (lpmi->fMask & MIM_BACKGROUND)
@@ -4899,6 +5090,10 @@ BOOL WINAPI SetMenuInfo (HMENU hMenu, LP
if (menu->dwStyle & MNS_NOTIFYBYPOS) FIXME("MNS_NOTIFYBYPOS unimple=
mented\n");
}
=20
+ MENU_UpdateMenu(hMenu, menu, lpmi->fMask
+ & (MIM_BACKGROUND|MIM_HELPID|MIM_MAXHEIGHT
+ |MIM_MENUDATA|MIM_STYLE));
+
return TRUE;
}
return FALSE;
@@ -4912,11 +5107,13 @@ BOOL WINAPI SetMenuInfo (HMENU hMenu, LP
*
*/
BOOL WINAPI GetMenuInfo (HMENU hMenu, LPMENUINFO lpmi)
-{ POPUPMENU *menu;
+{
+ POPUPMENU tmpmenu;
+ POPUPMENU *menu =3D &tmpmenu;
=20
TRACE("(%p %p)\n", hMenu, lpmi);
=20
- if (lpmi && (menu =3D MENU_GetMenu(hMenu)))
+ if (lpmi && !MENU_GetMenu(hMenu, menu))
{
=20
if (lpmi->fMask & MIM_BACKGROUND)
@@ -4945,11 +5142,12 @@ BOOL WINAPI GetMenuInfo (HMENU hMenu, LP
*/
BOOL WINAPI SetMenuContextHelpId( HMENU hMenu, DWORD dwContextHelpID)
{
- LPPOPUPMENU menu;
+ POPUPMENU tmpmenu;
+ LPPOPUPMENU menu =3D &tmpmenu;
=20
TRACE("(%p 0x%08lx)\n", hMenu, dwContextHelpID);
=20
- if ((menu =3D MENU_GetMenu(hMenu)))
+ if (!MENU_GetMenu(hMenu, menu))
{
menu->dwContextHelpID =3D dwContextHelpID;
return TRUE;
@@ -4963,11 +5161,12 @@ BOOL WINAPI SetMenuContextHelpId( HMENU=20
*/
DWORD WINAPI GetMenuContextHelpId( HMENU hMenu )
{
- LPPOPUPMENU menu;
+ POPUPMENU tmpmenu;
+ LPPOPUPMENU menu =3D &tmpmenu;
=20
TRACE("(%p)\n", hMenu);
=20
- if ((menu =3D MENU_GetMenu(hMenu)))
+ if (!MENU_GetMenu(hMenu, menu))
{
return menu->dwContextHelpID;
}
@@ -4979,11 +5178,12 @@ DWORD WINAPI GetMenuContextHelpId( HMENU
*/
INT WINAPI MenuItemFromPoint(HWND hWnd, HMENU hMenu, POINT ptScreen)
{
- POPUPMENU *menu =3D MENU_GetMenu(hMenu);
+ POPUPMENU tmpmenu;
+ POPUPMENU *menu =3D &tmpmenu;
UINT pos;
=20
/*FIXME: Do we have to handle hWnd here? */
- if (!menu) return -1;
+ if (MENU_GetMenu(hMenu, menu)) return -1;
if (!MENU_FindItemByCoords(menu, ptScreen, &pos)) return -1;
return pos;
}
diff --git a/dlls/user/tests/menu.c b/dlls/user/tests/menu.c
index 10a29a8..e715ae6 100644
--- a/dlls/user/tests/menu.c
+++ b/dlls/user/tests/menu.c
@@ -1709,17 +1709,17 @@ static void test_menu_remote_process()
ok ((int) hMenu, "GetMenu failed\n");
nMenu =3D GetMenuItemCount(hMenu);
/* notepad.exe menus slightly differ in Wine and Windows */
- todo_wine ok(nMenu =3D=3D 4 || nMenu =3D=3D 5, "nMenu =3D %d, error=3D=
%ld\n", nMenu,
+ ok(nMenu =3D=3D 4 || nMenu =3D=3D 5, "nMenu =3D %d, error=3D%ld\n", =
nMenu,
GetLastError());
=20
memset(&mii, 0, sizeof(mii));
mii.cbSize =3D sizeof(MENUITEMINFO);
mii.fMask =3D MIIM_STRING;
mii.dwTypeData =3D NULL;
- todo_wine ok (GetMenuItemInfo(hMenu, 0, TRUE, &mii),
+ ok (GetMenuItemInfo(hMenu, 0, TRUE, &mii),
"error=3D%ld\n", GetLastError());
mii.dwTypeData =3D malloc(++mii.cch);
- todo_wine ok (GetMenuItemInfo(hMenu, 0, TRUE, &mii),
+ ok (GetMenuItemInfo(hMenu, 0, TRUE, &mii),
"error=3D%ld, dwTypeData=3D'%s'\n", GetLastError(), mii.dwTypeDa=
ta);
todo_wine ok (mii.dwTypeData && !strcmp(mii.dwTypeData, "&File"),
"error=3D%ld, dwTypeData=3D'%s'\n", GetLastError(), mii.dwTypeDa=
ta);
@@ -1728,30 +1728,30 @@ static void test_menu_remote_process()
mii.cbSize =3D sizeof(MENUITEMINFO);
mii.fMask =3D MIIM_STRING;
mii.dwTypeData =3D "&New File Menu";
- todo_wine ok (SetMenuItemInfo(hMenu, 0, TRUE, &mii), "error=3D%ld\n"=
,
- GetLastError());
+ ok (SetMenuItemInfo(hMenu, 0, TRUE, &mii), "error=3D%ld\n",
+ GetLastError());
DrawMenuBar(hNotepad);
=20
memset(&mii, 0, sizeof(mii));
mii.cbSize =3D sizeof(MENUITEMINFO);
mii.fMask =3D MIIM_STRING;
mii.dwTypeData =3D NULL;
- todo_wine ok (GetMenuItemInfo(hMenu, 0, TRUE, &mii),
+ ok (GetMenuItemInfo(hMenu, 0, TRUE, &mii),
"error=3D%ld\n", GetLastError());
mii.dwTypeData =3D malloc(++mii.cch);
- todo_wine ok (GetMenuItemInfo(hMenu, 0, TRUE, &mii),
+ ok (GetMenuItemInfo(hMenu, 0, TRUE, &mii),
"error=3D%ld, dwTypeData=3D'%s'\n", GetLastError(), mii.dwTypeDa=
ta);
- todo_wine ok (mii.dwTypeData && !strcmp(mii.dwTypeData, "&New File M=
enu"),
+ ok (mii.dwTypeData && !strcmp(mii.dwTypeData, "&New File Menu"),
"error=3D%ld, dwTypeData=3D'%s'\n", GetLastError(), mii.dwTypeDa=
ta);
free(mii.dwTypeData);
=20
mi.cbSize =3D sizeof(MENUINFO);
mi.fMask =3D MIM_MENUDATA;
- todo_wine ok (GetMenuInfo(hMenu, &mi), "error=3D%ld\n", GetLastError=
());
+ ok (GetMenuInfo(hMenu, &mi), "error=3D%ld\n", GetLastError());
oldMenuData =3D mi.dwMenuData;
mi.dwMenuData =3D !mi.dwMenuData;
- todo_wine ok (SetMenuInfo(hMenu, &mi), "error=3D%ld\n", GetLastError=
());
- todo_wine ok (GetMenuInfo(hMenu, &mi), "error=3D%ld\n", GetLastError=
());
+ ok (SetMenuInfo(hMenu, &mi), "error=3D%ld\n", GetLastError());
+ ok (GetMenuInfo(hMenu, &mi), "error=3D%ld\n", GetLastError());
ok (oldMenuData !=3D mi.dwMenuData, "oldMenuData=3D%ld, dwMenuData=3D=
%ld\n",
oldMenuData, mi.dwMenuData);
=20
More information about the wine-patches
mailing list