[v4 PATCH] user32/menu: Return locked menu data when looking for menu items.
Huw Davies
huw at codeweavers.com
Wed May 9 06:51:39 CDT 2018
On Wed, May 09, 2018 at 12:04:28PM +0300, Nikolay Sivov wrote:
> Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
> ---
>
> v4: changed helper interface, simplified insertion point logic a bit.
>
> dlls/user32/menu.c | 556 ++++++++++++++++++++++++++++-----------------
> 1 file changed, 348 insertions(+), 208 deletions(-)
>
> diff --git a/dlls/user32/menu.c b/dlls/user32/menu.c
> index 537c2ebe1a..98f1fce506 100644
> --- a/dlls/user32/menu.c
> +++ b/dlls/user32/menu.c
> @@ -584,26 +584,25 @@ static UINT MENU_GetStartOfPrevColumn(
> return i;
> }
>
> -
> -
> -/***********************************************************************
> - * MENU_FindItem
> - *
> - * Find a menu item. Return a pointer on the item, and modifies *hmenu
> - * in case the item was in a sub-menu.
> - */
> -static MENUITEM *MENU_FindItem( HMENU *hmenu, UINT *nPos, UINT wFlags )
> +static POPUPMENU *find_menu_item(HMENU hmenu, UINT id, UINT flags, UINT *pos)
I think this is more natural than the previous version.
> BOOL WINAPI RemoveMenu( HMENU hMenu, UINT nPos, UINT wFlags )
> {
> - LPPOPUPMENU menu;
> - MENUITEM *item;
> + POPUPMENU *menu;
> + UINT pos;
>
> 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;
>
> - /* Remove item */
> + if (!(menu = find_menu_item(hMenu, nPos, wFlags, &pos)))
> + return FALSE;
>
> - MENU_FreeItemData( item );
> + /* Remove item */
> + MENU_FreeItemData( &menu->items[pos] );
>
> if (--menu->nItems == 0)
> {
> @@ -4024,17 +4093,19 @@ BOOL WINAPI RemoveMenu( HMENU hMenu, UINT nPos, UINT wFlags )
> }
> else
> {
> - MENUITEM *new_items;
> - while(nPos < menu->nItems)
> + MENUITEM *new_items, *item = &menu->items[pos];
> +
> + while (nPos < menu->nItems)
> {
> *item = *(item+1);
> item++;
> nPos++;
> }
These should be pos not nPos. I'd suggest changing the function's parameter name
from nPos to id.
> - new_items = HeapReAlloc( GetProcessHeap(), 0, menu->items,
> - menu->nItems * sizeof(MENUITEM) );
> + new_items = HeapReAlloc( GetProcessHeap(), 0, menu->items, menu->nItems * sizeof(MENUITEM) );
> if (new_items) menu->items = new_items;
> }
> + release_menu_ptr(menu);
> +
> return TRUE;
> }
>
> @@ -4044,11 +4115,17 @@ BOOL WINAPI RemoveMenu( HMENU hMenu, UINT nPos, UINT wFlags )
> */
> BOOL WINAPI DeleteMenu( HMENU hMenu, UINT nPos, UINT wFlags )
> {
Probably change nPos to id here as well.
Huw.
More information about the wine-devel
mailing list