[PATCH 3/3] user: move menu info handling to the server menu.c | 436 ++++++++++++++++++++++++++++++++++++++++------------------- tests/menu.c | 22 +- 2 files changed, 308 insertions(+), 150 deletions(-) --- Index: dlls/user/menu.c =================================================================== RCS file: /home/wine/wine/dlls/user/menu.c,v retrieving revision 1.65 diff -u -r1.65 menu.c --- dlls/user/menu.c 12 Jun 2006 12:12:23 -0000 1.65 +++ dlls/user/menu.c 15 Jun 2006 03:28:57 -0000 @@ -6,6 +6,7 @@ * Copyright 1997 Morten Welinder * Copyright 2005 Maxime Bellengé * 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 @@ -45,6 +46,7 @@ #include #include +#include #include "windef.h" #include "winbase.h" @@ -68,6 +70,7 @@ #define MM_SETMENUHANDLE (WM_USER + 0) #define MM_GETMENUHANDLE (WM_USER + 1) +/* MENUITEM and POPUPMENU duplicated in server/menu.c */ /* Menu item structure */ typedef struct { /* ----------- MENUITEMINFO Stuff ----------- */ @@ -284,17 +287,42 @@ /*********************************************************************** * 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 = USER_HEAP_LIN_ADDR(hMenu); - if (!menu || menu->wMagic != MENU_MAGIC) + NTSTATUS ret; + SERVER_START_REQ( get_menu_info ) { - WARN("invalid menu handle=%p, ptr=%p, magic=%x\n", hMenu, menu, menu? menu->wMagic:0); - menu = NULL; + req->handle = hMenu; + wine_server_set_reply(req, menu, sizeof(POPUPMENU)); + if ((ret = wine_server_call_err( req ))) + WARN("error hMenu=0x%x, status=%ld\n", (unsigned) hMenu, ret); + else + assert(wine_server_reply_size(reply) == sizeof(POPUPMENU)); } - return menu; + 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 int mask) +{ + NTSTATUS ret = STATUS_INVALID_HANDLE; + SERVER_START_REQ( set_menu_info ) + { + req->handle = hMenu; + req->mask = mask; + wine_server_add_data(req, menu, sizeof(POPUPMENU)); + if ((ret = wine_server_call_err( req ))) + WARN("error hMenu=0x%x, status=%ld\n", (unsigned) hMenu, ret); + } + SERVER_END_REQ; + return ret; } /*********************************************************************** @@ -415,8 +443,11 @@ HMENU hMenu = LoadMenuW(user32_module, sysmenuW); if( hMenu ) { - POPUPMENU* menu = MENU_GetMenu(hMenu); + POPUPMENU tmpmenu; + POPUPMENU* menu = &tmpmenu; + MENU_GetMenu(hMenu, menu); menu->wFlags |= MF_SYSMENU | MF_POPUP; + MENU_UpdateMenu(hMenu, menu, SET_MI_FLAGS); SetMenuDefaultItem(hMenu, SC_CLOSE, FALSE); } else @@ -444,9 +475,12 @@ TRACE("loading system menu, hWnd %p, hPopupMenu %p\n", hWnd, hPopupMenu); if ((hMenu = CreateMenu())) { - POPUPMENU *menu = MENU_GetMenu(hMenu); + POPUPMENU tmpmenu; + POPUPMENU *menu = &tmpmenu; + MENU_GetMenu(hMenu, menu); menu->wFlags = MF_SYSMENU; menu->hWnd = WIN_GetFullHandle( hWnd ); + MENU_UpdateMenu(hMenu, menu, SET_MI_FLAGS|SET_MI_HWND); TRACE("hWnd %p (hMenu %p)\n", menu->hWnd, hMenu); if (!hPopupMenu) @@ -455,14 +489,21 @@ if (hPopupMenu) { if (GetClassLongW(hWnd, GCL_STYLE) & CS_NOCLOSE) + { DeleteMenu(hPopupMenu, SC_CLOSE, MF_BYCOMMAND); + } InsertMenuW( hMenu, -1, MF_SYSMENU | MF_POPUP | MF_BYPOSITION, (UINT_PTR)hPopupMenu, NULL ); + MENU_GetMenu(hMenu, menu); menu->items[0].fType = MF_SYSMENU | MF_POPUP; menu->items[0].fState = 0; - if ((menu = MENU_GetMenu(hPopupMenu))) menu->wFlags |= MF_SYSMENU; + if (!MENU_GetMenu(hPopupMenu, menu)) + { + menu->wFlags |= MF_SYSMENU; + MENU_UpdateMenu(hPopupMenu, menu, SET_MI_FLAGS); + } TRACE("hMenu=%p (hPopup %p)\n", hMenu, hPopupMenu ); return hMenu; @@ -511,10 +552,11 @@ static UINT MENU_GetStartOfNextColumn( HMENU hMenu ) { - POPUPMENU *menu = MENU_GetMenu(hMenu); + POPUPMENU tmpmenu; + POPUPMENU *menu = &tmpmenu; UINT i; - if(!menu) + if(MENU_GetMenu(hMenu, menu)) return NO_SELECTED_ITEM; i = menu->FocusedItem + 1; @@ -540,10 +582,11 @@ static UINT MENU_GetStartOfPrevColumn( HMENU hMenu ) { - POPUPMENU *menu = MENU_GetMenu(hMenu); + POPUPMENU tmpmenu; + POPUPMENU *menu = &tmpmenu; UINT i; - if( !menu ) + if( MENU_GetMenu(hMenu, menu) ) return NO_SELECTED_ITEM; if( menu->FocusedItem == 0 || menu->FocusedItem == NO_SELECTED_ITEM ) @@ -578,12 +621,14 @@ */ static MENUITEM *MENU_FindItem( HMENU *hmenu, UINT *nPos, UINT wFlags ) { - POPUPMENU *menu; + POPUPMENU tmpmenu; + POPUPMENU *menu = &tmpmenu; MENUITEM *fallback = NULL; UINT fallback_pos = 0; UINT i; - if ((*hmenu == (HMENU)0xffff) || (!(menu = MENU_GetMenu(*hmenu)))) return NULL; + if ((*hmenu == (HMENU)0xffff) || (MENU_GetMenu(*hmenu, menu))) + return NULL; if (wFlags & MF_BYPOSITION) { if (*nPos >= menu->nItems) return NULL; @@ -633,11 +678,12 @@ */ UINT MENU_FindSubMenu( HMENU *hmenu, HMENU hSubTarget ) { - POPUPMENU *menu; + POPUPMENU tmpmenu; + POPUPMENU *menu = &tmpmenu; UINT i; MENUITEM *item; if (((*hmenu)==(HMENU)0xffff) || - (!(menu = MENU_GetMenu(*hmenu)))) + (MENU_GetMenu(*hmenu, menu))) return NO_SELECTED_ITEM; item = menu->items; for (i = 0; i < menu->nItems; i++, item++) { @@ -736,7 +782,9 @@ if (hmenu) { - POPUPMENU *menu = MENU_GetMenu( hmenu ); + POPUPMENU tmpmenu; + POPUPMENU *menu = &tmpmenu; + MENU_GetMenu(hmenu, menu); MENUITEM *item = menu->items; LRESULT menuchar; @@ -1338,7 +1386,8 @@ BOOL flat_menu = FALSE; int bkgnd; UINT arrow_bitmap_width = 0, arrow_bitmap_height = 0; - POPUPMENU *menu = MENU_GetMenu(hmenu); + POPUPMENU tmpmenu; + POPUPMENU *menu = &tmpmenu; RECT bmprc; debug_print_menuitem("MENU_DrawMenuItem: ", lpitem, ""); @@ -1386,7 +1435,8 @@ TRACE("rect=%s\n", wine_dbgstr_rect( &lpitem->rect)); rect = lpitem->rect; - MENU_AdjustMenuItemRect(MENU_GetMenu(hmenu), &rect); + MENU_GetMenu(hmenu, menu); + MENU_AdjustMenuItemRect(menu, &rect); if (lpitem->fType & MF_OWNERDRAW) { @@ -1693,7 +1743,8 @@ hPrevPen = SelectObject( hdc, GetStockObject( NULL_PEN ) ); if( hPrevPen ) { - POPUPMENU *menu; + POPUPMENU tmpmenu; + POPUPMENU *menu = &tmpmenu; BOOL flat_menu = FALSE; SystemParametersInfoW (SPI_GETFLATMENU, 0, &flat_menu, 0); @@ -1702,7 +1753,7 @@ else DrawEdge (hdc, &rect, EDGE_RAISED, BF_RECT); - if( (menu = MENU_GetMenu( hmenu ))) + if( (!MENU_GetMenu( hmenu, menu ))) { /* draw menu items */ if( menu->nItems) @@ -1735,12 +1786,12 @@ UINT MENU_DrawMenuBar( HDC hDC, LPRECT lprect, HWND hwnd, BOOL suppress_draw) { - LPPOPUPMENU lppop; + POPUPMENU tmppop; + LPPOPUPMENU lppop = &tmppop; HFONT hfontOld = 0; HMENU hMenu = GetMenu(hwnd); - lppop = MENU_GetMenu( hMenu ); - if (lppop == NULL || lprect == NULL) + if (MENU_GetMenu(hMenu, lppop) || lprect == NULL) { return GetSystemMetrics(SM_CYMENU); } @@ -1750,7 +1801,10 @@ hfontOld = SelectObject( hDC, get_menu_font(FALSE)); if (lppop->Height == 0) + { MENU_MenuBarCalcSize(hDC, lprect, lppop, hwnd); + MENU_UpdateMenu(hMenu, lppop, SET_MI_MAXBMPSIZE); + } lprect->bottom = lprect->top + lppop->Height; @@ -1770,17 +1824,19 @@ static BOOL MENU_ShowPopup( HWND hwndOwner, HMENU hmenu, UINT id, INT x, INT y, INT xanchor, INT yanchor ) { - POPUPMENU *menu; + POPUPMENU tmpmenu; + POPUPMENU *menu = &tmpmenu; UINT width, height; TRACE("owner=%p hmenu=%p id=0x%04x x=0x%04x y=0x%04x xa=0x%04x ya=0x%04x\n", hwndOwner, hmenu, id, x, y, xanchor, yanchor); - if (!(menu = MENU_GetMenu( hmenu ))) return FALSE; + if (MENU_GetMenu( hmenu, menu )) return FALSE; if (menu->FocusedItem != NO_SELECTED_ITEM) { menu->items[menu->FocusedItem].fState &= ~(MF_HILITE|MF_MOUSESELECT); menu->FocusedItem = NO_SELECTED_ITEM; + MENU_UpdateMenu(hmenu, menu, SET_MI_FOCUSITEM); } /* store the owner for DrawItem */ @@ -1788,6 +1844,7 @@ menu->nScrollPos = 0; MENU_PopupMenuCalcSize( menu, hwndOwner ); + MENU_UpdateMenu(hmenu, menu, SET_MI_WIDTH|SET_MI_HEIGHT|SET_MI_MAXBMPSIZE|SET_MI_TOTALHEIGHT|SET_MI_SCROLLING|SET_MI_SCROLLPOS|SET_MI_OWNER); /* adjust popup menu pos so that it fits within the desktop */ @@ -1819,6 +1876,7 @@ WS_POPUP, x, y, width, height, hwndOwner, 0, (HINSTANCE)GetWindowLongPtrW(hwndOwner, GWLP_HINSTANCE), (LPVOID)hmenu ); + MENU_UpdateMenu( hmenu, menu, SET_MI_HWND ); if( !menu->hWnd ) return FALSE; if (!top_popup) top_popup = menu->hWnd; @@ -1878,13 +1936,14 @@ static void MENU_SelectItem( HWND hwndOwner, HMENU hmenu, UINT wIndex, BOOL sendMenuSelect, HMENU topmenu ) { - LPPOPUPMENU lppop; + POPUPMENU tmppop; + LPPOPUPMENU lppop = &tmppop; HDC hdc; TRACE("owner=%p menu=%p index=0x%04x select=0x%04x\n", hwndOwner, hmenu, wIndex, sendMenuSelect); - lppop = MENU_GetMenu( hmenu ); - if ((!lppop) || (!lppop->nItems) || (!lppop->hWnd)) return; + if (MENU_GetMenu( hmenu, lppop ) || (!lppop->nItems) + || (!lppop->hWnd)) return; if (lppop->FocusedItem == wIndex) return; if (lppop->wFlags & MF_POPUP) hdc = GetDC( lppop->hWnd ); @@ -1904,6 +1963,7 @@ /* Highlight new item (if any) */ lppop->FocusedItem = wIndex; + MENU_UpdateMenu(hmenu, lppop, SET_MI_FOCUSITEM); if (lppop->FocusedItem != NO_SELECTED_ITEM) { if(!(lppop->items[wIndex].fType & MF_SEPARATOR)) { @@ -1926,7 +1986,9 @@ if(topmenu){ int pos; if((pos=MENU_FindSubMenu(&topmenu, hmenu))!=NO_SELECTED_ITEM){ - POPUPMENU *ptm = MENU_GetMenu( topmenu ); + POPUPMENU tmpptm; + POPUPMENU *ptm = &tmpptm; + MENU_GetMenu( topmenu, ptm ); MENUITEM *ip = &ptm->items[pos]; SendMessageW( hwndOwner, WM_MENUSELECT, MAKELONG(pos, ip->fType | ip->fState | @@ -1948,12 +2010,12 @@ static void MENU_MoveSelection( HWND hwndOwner, HMENU hmenu, INT offset ) { INT i; - POPUPMENU *menu; + POPUPMENU tmpmenu; + POPUPMENU *menu = &tmpmenu; TRACE("hwnd=%p hmenu=%p off=0x%04x\n", hwndOwner, hmenu, offset); - menu = MENU_GetMenu( hmenu ); - if ((!menu) || (!menu->items)) return; + if ((MENU_GetMenu(hmenu, menu)) || (!menu->items)) return; if ( menu->FocusedItem != NO_SELECTED_ITEM ) { @@ -2031,8 +2093,13 @@ if (flags & MF_POPUP) { - POPUPMENU *menu = MENU_GetMenu((HMENU)id); - if (menu) menu->wFlags |= MF_POPUP; + POPUPMENU tmpmenu; + POPUPMENU *menu = &tmpmenu; + if (!MENU_GetMenu((HMENU)id, menu)) + { + menu->wFlags |= MF_POPUP; + MENU_UpdateMenu((HMENU)id, menu, SET_MI_FLAGS); + } else { item->wID = 0; @@ -2068,9 +2135,10 @@ static MENUITEM *MENU_InsertItem( HMENU hMenu, UINT pos, UINT flags ) { MENUITEM *newItems; - POPUPMENU *menu; + POPUPMENU tmpmenu; + POPUPMENU *menu = &tmpmenu; - if (!(menu = MENU_GetMenu(hMenu))) + if (MENU_GetMenu(hMenu, menu)) return NULL; /* Find where to insert new item */ @@ -2082,7 +2150,7 @@ if (!MENU_FindItem( &hMenu, &pos, flags )) pos = menu->nItems; else { - if (!(menu = MENU_GetMenu( hMenu ))) + if (MENU_GetMenu(hMenu, menu)) return NULL; } } @@ -2107,6 +2175,7 @@ menu->nItems++; memset( &newItems[pos], 0, sizeof(*newItems) ); menu->Height = 0; /* force size recalculate */ + MENU_UpdateMenu(hMenu, menu, SET_MI_ITEMS|SET_MI_NITEMS|SET_MI_HEIGHT); return &newItems[pos]; } @@ -2220,12 +2289,12 @@ */ static HMENU MENU_GetSubPopup( HMENU hmenu ) { - POPUPMENU *menu; + POPUPMENU tmpmenu; + POPUPMENU *menu = &tmpmenu; MENUITEM *item; - menu = MENU_GetMenu( hmenu ); - - if ((!menu) || (menu->FocusedItem == NO_SELECTED_ITEM)) return 0; + if (MENU_GetMenu( hmenu, menu ) + || (menu->FocusedItem == NO_SELECTED_ITEM)) return 0; item = &menu->items[menu->FocusedItem]; if ((item->fType & MF_POPUP) && (item->fState & MF_MOUSESELECT)) @@ -2242,14 +2311,16 @@ static void MENU_HideSubPopups( HWND hwndOwner, HMENU hmenu, BOOL sendMenuSelect ) { - POPUPMENU *menu = MENU_GetMenu( hmenu ); + POPUPMENU tmpmenu; + POPUPMENU *menu = &tmpmenu; TRACE("owner=%p hmenu=%p 0x%04x\n", hwndOwner, hmenu, sendMenuSelect); - if (menu && top_popup) + if (!MENU_GetMenu( hmenu, menu ) && top_popup) { HMENU hsubmenu; - POPUPMENU *submenu; + POPUPMENU tmpsubmenu; + POPUPMENU *submenu = &tmpsubmenu; MENUITEM *item; if (menu->FocusedItem != NO_SELECTED_ITEM) @@ -2261,11 +2332,12 @@ hsubmenu = item->hSubMenu; } else return; - submenu = 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 = 0; + MENU_UpdateMenu(hsubmenu, submenu, SET_MI_HWND); } } @@ -2280,13 +2352,14 @@ BOOL selectFirst, UINT wFlags ) { RECT rect; - POPUPMENU *menu; + POPUPMENU tmpmenu; + POPUPMENU *menu = &tmpmenu; MENUITEM *item; HDC hdc; TRACE("owner=%p hmenu=%p 0x%04x\n", hwndOwner, hmenu, selectFirst); - if (!(menu = MENU_GetMenu( hmenu ))) return hmenu; + if (MENU_GetMenu( hmenu, menu )) return hmenu; if (menu->FocusedItem == NO_SELECTED_ITEM) return hmenu; @@ -2383,7 +2456,9 @@ */ static HMENU MENU_PtMenu( HMENU hMenu, POINT pt ) { - POPUPMENU *menu = MENU_GetMenu( hMenu ); + POPUPMENU tmpmenu; + POPUPMENU *menu = &tmpmenu; + MENU_GetMenu( hMenu, menu ); UINT item = menu->FocusedItem; HMENU ret; @@ -2421,11 +2496,12 @@ static INT MENU_ExecFocusedItem( MTRACKER* pmt, HMENU hMenu, UINT wFlags ) { MENUITEM *item; - POPUPMENU *menu = MENU_GetMenu( hMenu ); + POPUPMENU tmpmenu; + POPUPMENU *menu = &tmpmenu; TRACE("%p hmenu=%p\n", pmt, hMenu); - if (!menu || !menu->nItems || + if (MENU_GetMenu( hMenu, menu ) || !menu->nItems || (menu->FocusedItem == NO_SELECTED_ITEM)) return -1; item = &menu->items[menu->FocusedItem]; @@ -2465,8 +2541,10 @@ */ static void MENU_SwitchTracking( MTRACKER* pmt, HMENU hPtMenu, UINT id ) { - POPUPMENU *ptmenu = MENU_GetMenu( hPtMenu ); - POPUPMENU *topmenu = MENU_GetMenu( pmt->hTopMenu ); + POPUPMENU tmpptmenu, tmptopmenu; + POPUPMENU *ptmenu = &tmpptmenu, *topmenu = &tmptopmenu; + MENU_GetMenu( hPtMenu, ptmenu ); + MENU_GetMenu( pmt->hTopMenu, topmenu ); TRACE("%p hmenu=%p 0x%04x\n", pmt, hPtMenu, id); @@ -2495,8 +2573,10 @@ if (hPtMenu) { UINT id = 0; - POPUPMENU *ptmenu = MENU_GetMenu( hPtMenu ); + POPUPMENU tmpptmenu; + POPUPMENU *ptmenu = &tmpptmenu; MENUITEM *item; + MENU_GetMenu( hPtMenu, ptmenu ); if( IS_SYSTEM_MENU(ptmenu) ) item = ptmenu->items; @@ -2536,8 +2616,10 @@ if (hPtMenu) { UINT id = 0; - POPUPMENU *ptmenu = MENU_GetMenu( hPtMenu ); MENUITEM *item; + POPUPMENU tmpptmenu; + POPUPMENU *ptmenu = &tmpptmenu; + MENU_GetMenu( hPtMenu, ptmenu ); if( IS_SYSTEM_MENU(ptmenu) ) item = ptmenu->items; @@ -2559,6 +2641,7 @@ return 0; } ptmenu->bTimeToHide = TRUE; + MENU_UpdateMenu( hPtMenu, ptmenu, SET_MI_TIMETOHIDE ); } return -1; } @@ -2572,11 +2655,12 @@ static BOOL MENU_MouseMove( MTRACKER* pmt, HMENU hPtMenu, UINT wFlags ) { UINT id = NO_SELECTED_ITEM; - POPUPMENU *ptmenu = NULL; + POPUPMENU tmpptmenu; + POPUPMENU *ptmenu = &tmpptmenu; if( hPtMenu ) { - ptmenu = MENU_GetMenu( hPtMenu ); + MENU_GetMenu( hPtMenu, ptmenu ); if( IS_SYSTEM_MENU(ptmenu) ) id = 0; else @@ -2629,7 +2713,9 @@ */ static LRESULT MENU_DoNextMenu( MTRACKER* pmt, UINT vk ) { - POPUPMENU *menu = MENU_GetMenu( pmt->hTopMenu ); + POPUPMENU tmpmenu; + POPUPMENU *menu = &tmpmenu; + MENU_GetMenu( pmt->hTopMenu, menu ); if( (vk == VK_LEFT && menu->FocusedItem == 0 ) || (vk == VK_RIGHT && menu->FocusedItem == menu->nItems - 1)) @@ -2659,7 +2745,7 @@ if( vk == VK_LEFT ) { - menu = MENU_GetMenu( hNewMenu ); + MENU_GetMenu( hNewMenu, menu ); id = menu->nItems - 1; } } @@ -2768,7 +2854,9 @@ if (pmt->hCurrentMenu != pmt->hTopMenu) { - POPUPMENU *menu = MENU_GetMenu(pmt->hCurrentMenu); + POPUPMENU tmpmenu; + POPUPMENU *menu = &tmpmenu; + MENU_GetMenu(pmt->hCurrentMenu, menu); if (menu->wFlags & MF_POPUP) { @@ -2799,12 +2887,13 @@ */ static void MENU_KeyLeft( MTRACKER* pmt, UINT wFlags ) { - POPUPMENU *menu; + POPUPMENU tmpmenu; + POPUPMENU *menu = &tmpmenu; HMENU hmenutmp, hmenuprev; UINT prevcol; hmenuprev = hmenutmp = pmt->hTopMenu; - menu = MENU_GetMenu( hmenutmp ); + MENU_GetMenu( hmenutmp, menu ); /* Try to move 1 column left (if possible) */ if( (prevcol = MENU_GetStartOfPrevColumn( pmt->hCurrentMenu )) != @@ -2853,12 +2942,15 @@ static void MENU_KeyRight( MTRACKER* pmt, UINT wFlags ) { HMENU hmenutmp; - POPUPMENU *menu = MENU_GetMenu( pmt->hTopMenu ); + POPUPMENU tmpmenu, tmpcurmenu; + POPUPMENU *menu = &tmpmenu, *curmenu = &tmpcurmenu; + MENU_GetMenu( pmt->hTopMenu, menu); UINT nextcol; + 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) ); if ( (menu->wFlags & MF_POPUP) || (pmt->hCurrentMenu != pmt->hTopMenu)) @@ -2909,7 +3001,8 @@ HWND hwnd, const RECT *lprect ) { MSG msg; - POPUPMENU *menu; + POPUPMENU tmpmenu; + POPUPMENU *menu = &tmpmenu; BOOL fRemove; INT executedMenuId = -1; MTRACKER mt; @@ -2926,7 +3019,7 @@ hmenu, wFlags, x, y, hwnd, wine_dbgstr_rect( lprect)); fEndMenu = FALSE; - if (!(menu = MENU_GetMenu( hmenu ))) + if (MENU_GetMenu( hmenu, menu )) { WARN("Invalid menu handle %p\n", hmenu); SetLastError(ERROR_INVALID_MENU_HANDLE); @@ -2946,9 +3039,11 @@ while (!fEndMenu) { - menu = 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; + } /* we have to keep the message in the queue until it's * clear that menu loop is not over yet. */ @@ -3076,7 +3171,7 @@ case VK_UP: case VK_DOWN: /* If on menu bar, pull-down the menu */ - menu = MENU_GetMenu( mt.hCurrentMenu ); + MENU_GetMenu( mt.hCurrentMenu, menu ); if (!(menu->wFlags & MF_POPUP)) mt.hCurrentMenu = MENU_ShowSubPopup(mt.hOwnerWnd, mt.hTopMenu, TRUE, wFlags); else /* otherwise try to move selection */ @@ -3173,23 +3268,28 @@ check for this first. */ if( IsMenu( mt.hTopMenu ) ) { - menu = MENU_GetMenu( mt.hTopMenu ); + int ret = MENU_GetMenu( mt.hTopMenu, menu ); if( IsWindow( mt.hOwnerWnd ) ) { MENU_HideSubPopups( mt.hOwnerWnd, mt.hTopMenu, FALSE ); - if (menu && (menu->wFlags & MF_POPUP)) + if (!ret && (menu->wFlags & MF_POPUP)) { DestroyWindow( menu->hWnd ); menu->hWnd = 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 ); } /* Reset the variable for hiding menu */ - if( menu ) menu->bTimeToHide = FALSE; + if( !ret ) + { + menu->bTimeToHide = FALSE; + MENU_UpdateMenu(mt.hTopMenu, menu, SET_MI_TIMETOHIDE); + } } /* The return value is only used by TrackPopupMenu */ @@ -3203,7 +3303,8 @@ */ static BOOL MENU_InitTracking(HWND hWnd, HMENU hMenu, BOOL bPopup, UINT wFlags) { - POPUPMENU *menu; + POPUPMENU tmpmenu; + POPUPMENU *menu = &tmpmenu; TRACE("hwnd=%p hmenu=%p\n", hWnd, hMenu); @@ -3227,7 +3328,11 @@ * 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 = MENU_GetMenu( hMenu ))) menu->hWnd = hWnd; + if (!MENU_GetMenu( hMenu, menu )) + { + menu->hWnd = hWnd; + MENU_UpdateMenu( hMenu, menu, SET_MI_HWND ); + } return TRUE; } @@ -3440,16 +3545,18 @@ { HDC hdc; RECT rectBar; - LPPOPUPMENU lppop; + POPUPMENU tmppop; + LPPOPUPMENU lppop = &tmppop; TRACE("HWND %p, width %d, at (%d, %d).\n", hwnd, menubarWidth, orgX, orgY ); - if (!(lppop = MENU_GetMenu( GetMenu(hwnd) ))) return 0; + if (MENU_GetMenu( GetMenu(hwnd), lppop )) return 0; hdc = GetDCEx( hwnd, 0, DCX_CACHE | DCX_WINDOW ); SelectObject( hdc, get_menu_font(FALSE)); SetRect(&rectBar, orgX, orgY, orgX+menubarWidth, orgY+GetSystemMetrics(SM_CYMENU)); MENU_MenuBarCalcSize( hdc, &rectBar, lppop, hwnd ); + MENU_UpdateMenu( GetMenu(hwnd), lppop, SET_MI_WIDTH|SET_MI_HEIGHT|SET_MI_MAXBMPSIZE|SET_MI_TOTALHEIGHT|SET_MI_SCROLLING); ReleaseDC( hwnd, hdc ); return lppop->Height; } @@ -3519,12 +3626,13 @@ { UINT oldflags; MENUITEM *item; - POPUPMENU *menu; + POPUPMENU tmpmenu; + POPUPMENU *menu = &tmpmenu; TRACE("(%p, %04x, %04x) !\n", hMenu, wItemID, wFlags); /* Get the Popupmenu to access the owner menu */ - if (!(menu = MENU_GetMenu(hMenu))) + if (MENU_GetMenu(hMenu, menu)) return (UINT)-1; if (!(item = MENU_FindItem( &hMenu, &wItemID, wFlags ))) @@ -3539,10 +3647,11 @@ if (menu->hSysMenuOwner != 0) { RECT rc; - POPUPMENU* parentMenu; + POPUPMENU tmpparentMenu; + POPUPMENU *parentMenu = &tmpparentMenu; /* Get the parent menu to access*/ - if (!(parentMenu = MENU_GetMenu(menu->hSysMenuOwner))) + if (MENU_GetMenu(menu->hSysMenuOwner, parentMenu)) return (UINT)-1; /* Refresh the frame to reflect the change */ @@ -3614,10 +3723,11 @@ BOOL WINAPI HiliteMenuItem( HWND hWnd, HMENU hMenu, UINT wItemID, UINT wHilite ) { - LPPOPUPMENU menu; + POPUPMENU tmpmenu; + LPPOPUPMENU menu = &tmpmenu; TRACE("(%p, %p, %04x, %04x);\n", hWnd, hMenu, wItemID, wHilite); if (!MENU_FindItem( &hMenu, &wItemID, wHilite )) return FALSE; - if (!(menu = MENU_GetMenu(hMenu))) return FALSE; + if (MENU_GetMenu(hMenu, menu)) return FALSE; if (menu->FocusedItem == wItemID) return TRUE; MENU_HideSubPopups( hWnd, hMenu, FALSE ); MENU_SelectItem( hWnd, hMenu, wItemID, TRUE, 0 ); @@ -3636,8 +3746,9 @@ debug_print_menuitem (" item: ", item, ""); if (item->fType & MF_POPUP) { - POPUPMENU *menu = MENU_GetMenu( item->hSubMenu ); - if (!menu) return -1; + POPUPMENU tmpmenu; + POPUPMENU *menu = &tmpmenu; + if (MENU_GetMenu( item->hSubMenu, menu )) return -1; else return (menu->nItems << 8) | ((item->fState|item->fType) & 0xff); } else @@ -3655,8 +3766,9 @@ */ INT WINAPI GetMenuItemCount( HMENU hMenu ) { - LPPOPUPMENU menu = MENU_GetMenu(hMenu); - if (!menu) return -1; + POPUPMENU tmpmenu; + LPPOPUPMENU menu = &tmpmenu; + if (MENU_GetMenu(hMenu, menu)) return -1; TRACE("(%p) returning %d\n", hMenu, menu->nItems ); return menu->nItems; } @@ -3699,7 +3811,13 @@ } if (flags & MF_POPUP) /* Set the MF_POPUP flag on the popup-menu */ - (MENU_GetMenu((HMENU)id))->wFlags |= MF_POPUP; + { + POPUPMENU tmpmenu; + POPUPMENU *menu = &tmpmenu; + MENU_GetMenu((HMENU)id, menu); + menu->wFlags |= MF_POPUP; + MENU_UpdateMenu((HMENU)id, menu, SET_MI_FLAGS); + } item->hCheckBit = item->hUnCheckBit = 0; return TRUE; @@ -3755,12 +3873,13 @@ */ BOOL WINAPI RemoveMenu( HMENU hMenu, UINT nPos, UINT wFlags ) { - LPPOPUPMENU menu; + POPUPMENU tmpmenu; + LPPOPUPMENU menu = &tmpmenu; MENUITEM *item; TRACE("(menu=%p pos=%04x flags=%04x)\n",hMenu, nPos, wFlags); if (!(item = MENU_FindItem( &hMenu, &nPos, wFlags ))) return FALSE; - if (!(menu = MENU_GetMenu(hMenu))) return FALSE; + if (MENU_GetMenu(hMenu, menu)) return FALSE; /* Remove item */ @@ -3782,6 +3901,7 @@ menu->items = HeapReAlloc( GetProcessHeap(), 0, menu->items, menu->nItems * sizeof(MENUITEM) ); } + MENU_UpdateMenu(hMenu, menu, SET_MI_NITEMS|SET_MI_ITEMS); return TRUE; } @@ -3807,6 +3927,8 @@ UINT_PTR id, LPCWSTR str ) { MENUITEM *item; + POPUPMENU tmpmenu; + POPUPMENU *menu = &tmpmenu; if (IS_STRING_ITEM(flags)) TRACE("%p %d %04x %04x %s\n", hMenu, pos, flags, id, debugstr_w(str) ); @@ -3814,7 +3936,9 @@ TRACE("%p %d %04x %04x %p\n", hMenu, pos, flags, id, str ); if (!(item = MENU_FindItem( &hMenu, &pos, flags ))) return FALSE; - MENU_GetMenu(hMenu)->Height = 0; /* force size recalculate */ + MENU_GetMenu(hMenu, menu); + menu->Height = 0; /* force size recalculate */ + MENU_UpdateMenu(hMenu, menu, SET_MI_HEIGHT); return MENU_SetItemData( item, flags, id, str ); } @@ -3849,12 +3973,14 @@ HMENU WINAPI CreatePopupMenu(void) { HMENU hmenu; - POPUPMENU *menu; + POPUPMENU tmpmenu; + POPUPMENU *menu = &tmpmenu; if (!(hmenu = CreateMenu())) return 0; - menu = MENU_GetMenu( hmenu ); + MENU_GetMenu(hmenu, menu); menu->wFlags |= MF_POPUP; menu->bTimeToHide = FALSE; + MENU_UpdateMenu(hmenu, menu, SET_MI_FLAGS|SET_MI_TIMETOHIDE); return hmenu; } @@ -3899,15 +4025,14 @@ */ HMENU WINAPI CreateMenu(void) { - HMENU hMenu; - LPPOPUPMENU menu; - if (!(hMenu = USER_HEAP_ALLOC( sizeof(POPUPMENU) ))) return 0; - menu = (LPPOPUPMENU) USER_HEAP_LIN_ADDR(hMenu); - - ZeroMemory(menu, sizeof(POPUPMENU)); - menu->wMagic = MENU_MAGIC; - menu->FocusedItem = NO_SELECTED_ITEM; - menu->bTimeToHide = FALSE; + HMENU hMenu = 0; + + SERVER_START_REQ( create_menu ) + { + if (!wine_server_call_err( req )) + hMenu = reply->handle; + } + SERVER_END_REQ; TRACE("return %p\n", hMenu ); @@ -3920,12 +4045,12 @@ */ BOOL WINAPI DestroyMenu( HMENU hMenu ) { - LPPOPUPMENU lppop = MENU_GetMenu(hMenu); + POPUPMENU tmppop; + LPPOPUPMENU lppop = &tmppop; TRACE("(%p)\n", hMenu); - - if (!lppop) return FALSE; + if (MENU_GetMenu(hMenu, lppop)) return FALSE; lppop->wMagic = 0; /* Mark it as destroyed */ @@ -3947,7 +4072,15 @@ } HeapFree( GetProcessHeap(), 0, lppop->items ); } - USER_HEAP_FREE( hMenu ); + + SERVER_START_REQ( destroy_menu ) + { + req->handle = hMenu; + if (!wine_server_call_err( req )) + { + } + } + SERVER_END_REQ; return TRUE; } @@ -3978,14 +4111,17 @@ if( wndPtr->hSysMenu ) { - POPUPMENU *menu; + POPUPMENU tmpmenu; + POPUPMENU *menu = &tmpmenu; retvalue = GetSubMenu(wndPtr->hSysMenu, 0); /* Store the dummy sysmenu handle to facilitate the refresh */ /* of the close button if the SC_CLOSE item change */ - menu = MENU_GetMenu(retvalue); - if ( menu ) + if (!MENU_GetMenu(retvalue, menu)) + { menu->hSysMenuOwner = wndPtr->hSysMenu; + MENU_UpdateMenu(retvalue, menu, SET_MI_OWNER); + } } WIN_ReleasePtr( wndPtr ); } @@ -4053,12 +4189,14 @@ if (hMenu != 0) { - LPPOPUPMENU lpmenu; + POPUPMENU tmpmenu; + LPPOPUPMENU lpmenu = &tmpmenu; - if (!(lpmenu = MENU_GetMenu(hMenu))) return FALSE; + if (MENU_GetMenu(hMenu, lpmenu)) return FALSE; lpmenu->hWnd = hWnd; lpmenu->Height = 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 +4235,17 @@ */ BOOL WINAPI DrawMenuBar( HWND hWnd ) { - LPPOPUPMENU lppop; + POPUPMENU tmppop; + LPPOPUPMENU lppop = &tmppop; HMENU hMenu = GetMenu(hWnd); if (!WIN_ALLOWED_MENU(GetWindowLongW( hWnd, GWL_STYLE ))) return FALSE; - if (!hMenu || !(lppop = MENU_GetMenu( hMenu ))) return FALSE; + if (!hMenu || MENU_GetMenu( hMenu, lppop )) return FALSE; lppop->Height = 0; /* Make sure we call MENU_MenuBarCalcSize */ lppop->hwndOwner = 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 +4262,8 @@ */ DWORD WINAPI DrawMenuBarTemp(HWND hwnd, HDC hDC, LPRECT lprect, HMENU hMenu, HFONT hFont) { - LPPOPUPMENU lppop; + POPUPMENU tmppop; + LPPOPUPMENU lppop = &tmppop; UINT i,retvalue; HFONT hfontOld = 0; BOOL flat_menu = FALSE; @@ -4135,8 +4276,7 @@ if (!hFont) hFont = get_menu_font(FALSE); - lppop = MENU_GetMenu( hMenu ); - if (lppop == NULL || lprect == NULL) + if (MENU_GetMenu(hMenu, lppop) || lprect == NULL) { retvalue = GetSystemMetrics(SM_CYMENU); goto END; @@ -4147,7 +4287,10 @@ hfontOld = SelectObject( hDC, hFont); if (lppop->Height == 0) + { MENU_MenuBarCalcSize(hDC, lprect, lppop, hwnd); + MENU_UpdateMenu(hMenu, lppop, SET_MI_MAXBMPSIZE); + } lprect->bottom = lprect->top + lppop->Height; @@ -4335,9 +4478,9 @@ */ BOOL WINAPI IsMenu(HMENU hmenu) { - LPPOPUPMENU menu = MENU_GetMenu(hmenu); - - if (!menu) + POPUPMENU menu; + + if (MENU_GetMenu(hmenu, &menu)) { SetLastError(ERROR_INVALID_MENU_HANDLE); return FALSE; @@ -4570,9 +4713,12 @@ if (lpmii->fMask & MIIM_SUBMENU) { menu->hSubMenu = lpmii->hSubMenu; if (menu->hSubMenu) { - POPUPMENU *subMenu = MENU_GetMenu(menu->hSubMenu); - if (subMenu) { + POPUPMENU tmpsubMenu; + POPUPMENU *subMenu = &tmpsubMenu; + if (!MENU_GetMenu(menu->hSubMenu, subMenu)) + { subMenu->wFlags |= MF_POPUP; + MENU_UpdateMenu(menu->hSubMenu, subMenu, SET_MI_FLAGS); menu->fType |= MF_POPUP; } else { @@ -4654,12 +4800,13 @@ BOOL WINAPI SetMenuDefaultItem(HMENU hmenu, UINT uItem, UINT bypos) { UINT i; - POPUPMENU *menu; + POPUPMENU tmpmenu; + POPUPMENU *menu = &tmpmenu; MENUITEM *item; TRACE("(%p,%d,%d)\n", hmenu, uItem, bypos); - if (!(menu = MENU_GetMenu(hmenu))) return FALSE; + if (MENU_GetMenu(hmenu, menu)) return FALSE; /* reset all default-item flags */ item = menu->items; @@ -4701,13 +4848,14 @@ */ UINT WINAPI GetMenuDefaultItem(HMENU hmenu, UINT bypos, UINT flags) { - POPUPMENU *menu; + POPUPMENU tmpmenu; + POPUPMENU *menu = &tmpmenu; MENUITEM * item; UINT i = 0; TRACE("(%p,%d,%d)\n", hmenu, bypos, flags); - if (!(menu = MENU_GetMenu(hmenu))) return -1; + if (MENU_GetMenu(hmenu, menu)) return -1; /* find default item */ item = menu->items; @@ -4831,7 +4979,8 @@ BOOL WINAPI GetMenuItemRect (HWND hwnd, HMENU hMenu, UINT uItem, LPRECT rect) { - POPUPMENU *itemMenu; + POPUPMENU tmpitemMenu; + POPUPMENU *itemMenu = &tmpitemMenu; MENUITEM *item; HWND referenceHwnd; @@ -4842,8 +4991,7 @@ if(!hwnd) { - itemMenu = MENU_GetMenu(hMenu); - if (itemMenu == NULL) + if (MENU_GetMenu(hMenu, itemMenu)) return FALSE; if(itemMenu->hWnd == 0) @@ -4871,11 +5019,12 @@ */ BOOL WINAPI SetMenuInfo (HMENU hMenu, LPCMENUINFO lpmi) { - POPUPMENU *menu; + POPUPMENU tmpmenu; + POPUPMENU *menu = &tmpmenu; TRACE("(%p %p)\n", hMenu, lpmi); - if (lpmi && (lpmi->cbSize==sizeof(MENUINFO)) && (menu = MENU_GetMenu(hMenu))) + if (lpmi && (lpmi->cbSize==sizeof(MENUINFO)) && !MENU_GetMenu(hMenu, menu)) { if (lpmi->fMask & MIM_BACKGROUND) @@ -4899,6 +5048,10 @@ if (menu->dwStyle & MNS_NOTIFYBYPOS) FIXME("MNS_NOTIFYBYPOS unimplemented\n"); } + MENU_UpdateMenu(hMenu, menu, lpmi->fMask + & (MIM_BACKGROUND|MIM_HELPID|MIM_MAXHEIGHT + |MIM_MENUDATA|MIM_STYLE)); + return TRUE; } return FALSE; @@ -4912,11 +5065,13 @@ * */ BOOL WINAPI GetMenuInfo (HMENU hMenu, LPMENUINFO lpmi) -{ POPUPMENU *menu; +{ + POPUPMENU tmpmenu; + POPUPMENU *menu = &tmpmenu; TRACE("(%p %p)\n", hMenu, lpmi); - if (lpmi && (menu = MENU_GetMenu(hMenu))) + if (lpmi && !MENU_GetMenu(hMenu, menu)) { if (lpmi->fMask & MIM_BACKGROUND) @@ -4945,11 +5100,12 @@ */ BOOL WINAPI SetMenuContextHelpId( HMENU hMenu, DWORD dwContextHelpID) { - LPPOPUPMENU menu; + POPUPMENU tmpmenu; + LPPOPUPMENU menu = &tmpmenu; TRACE("(%p 0x%08lx)\n", hMenu, dwContextHelpID); - if ((menu = MENU_GetMenu(hMenu))) + if (!MENU_GetMenu(hMenu, menu)) { menu->dwContextHelpID = dwContextHelpID; return TRUE; @@ -4963,11 +5119,12 @@ */ DWORD WINAPI GetMenuContextHelpId( HMENU hMenu ) { - LPPOPUPMENU menu; + POPUPMENU tmpmenu; + LPPOPUPMENU menu = &tmpmenu; TRACE("(%p)\n", hMenu); - if ((menu = MENU_GetMenu(hMenu))) + if (!MENU_GetMenu(hMenu, menu)) { return menu->dwContextHelpID; } @@ -4979,11 +5136,12 @@ */ INT WINAPI MenuItemFromPoint(HWND hWnd, HMENU hMenu, POINT ptScreen) { - POPUPMENU *menu = MENU_GetMenu(hMenu); + POPUPMENU tmpmenu; + POPUPMENU *menu = &tmpmenu; UINT pos; /*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 -aur ../menutest/dlls/user/tests/menu.c dlls/user/tests/menu.c --- ../menutest/dlls/user/tests/menu.c 2006-06-14 18:22:15.000000000 -0700 +++ dlls/user/tests/menu.c 2006-06-14 18:21:38.000000000 -0700 @@ -1721,17 +1721,17 @@ nMenu = GetMenuItemCount(hMenu); /* notepad.exe menus slightly differ in Wine and Windows */ - todo_wine ok(nMenu == 4 || nMenu == 5, "nMenu = %d, error=%ld\n", nMenu, + ok(nMenu == 4 || nMenu == 5, "nMenu = %d, error=%ld\n", nMenu, GetLastError()); memset(&mii, 0, sizeof(mii)); mii.cbSize = sizeof(MENUITEMINFO); mii.fMask = MIIM_STRING; mii.dwTypeData = NULL; - todo_wine ok (GetMenuItemInfo(hMenu, 0, TRUE, &mii), + ok (GetMenuItemInfo(hMenu, 0, TRUE, &mii), "error=%ld\n", GetLastError()); mii.dwTypeData = malloc(++mii.cch); - todo_wine ok (GetMenuItemInfo(hMenu, 0, TRUE, &mii), + ok (GetMenuItemInfo(hMenu, 0, TRUE, &mii), "error=%ld, dwTypeData='%s'\n", GetLastError(), mii.dwTypeData); todo_wine ok (mii.dwTypeData && !strcmp(mii.dwTypeData, "&File"), "error=%ld, dwTypeData='%s'\n", GetLastError(), mii.dwTypeData); @@ -1740,30 +1740,30 @@ mii.cbSize = sizeof(MENUITEMINFO); mii.fMask = MIIM_STRING; mii.dwTypeData = "&New File Menu"; - todo_wine ok (SetMenuItemInfo(hMenu, 0, TRUE, &mii), "error=%ld\n", - GetLastError()); + ok (SetMenuItemInfo(hMenu, 0, TRUE, &mii), "error=%ld\n", + GetLastError()); DrawMenuBar(hNotepad); memset(&mii, 0, sizeof(mii)); mii.cbSize = sizeof(MENUITEMINFO); mii.fMask = MIIM_STRING; mii.dwTypeData = NULL; - todo_wine ok (GetMenuItemInfo(hMenu, 0, TRUE, &mii), + ok (GetMenuItemInfo(hMenu, 0, TRUE, &mii), "error=%ld\n", GetLastError()); mii.dwTypeData = malloc(++mii.cch); - todo_wine ok (GetMenuItemInfo(hMenu, 0, TRUE, &mii), + ok (GetMenuItemInfo(hMenu, 0, TRUE, &mii), "error=%ld, dwTypeData='%s'\n", GetLastError(), mii.dwTypeData); - todo_wine ok (mii.dwTypeData && !strcmp(mii.dwTypeData, "&New File Menu"), + ok (mii.dwTypeData && !strcmp(mii.dwTypeData, "&New File Menu"), "error=%ld, dwTypeData='%s'\n", GetLastError(), mii.dwTypeData); free(mii.dwTypeData); mi.cbSize = sizeof(MENUINFO); mi.fMask = MIM_MENUDATA; - todo_wine ok (GetMenuInfo(hMenu, &mi), "error=%ld\n", GetLastError()); + ok (GetMenuInfo(hMenu, &mi), "error=%ld\n", GetLastError()); oldMenuData = mi.dwMenuData; mi.dwMenuData = !mi.dwMenuData; - todo_wine ok (SetMenuInfo(hMenu, &mi), "error=%ld\n", GetLastError()); - todo_wine ok (GetMenuInfo(hMenu, &mi), "error=%ld\n", GetLastError()); + ok (SetMenuInfo(hMenu, &mi), "error=%ld\n", GetLastError()); + ok (GetMenuInfo(hMenu, &mi), "error=%ld\n", GetLastError()); ok (oldMenuData != mi.dwMenuData, "oldMenuData=%ld, dwMenuData=%ld\n", oldMenuData, mi.dwMenuData);