Skip to content
Snippets Groups Projects
menu.c 57 KiB
Newer Older
Alexandre Julliard's avatar
Alexandre Julliard committed
	if (OldWidth < lppop->Width) goto CalcAGAIN;
	lppop->Height = rect.bottom;
	SetRect(&lppop->rect, 1, 1, lppop->Width, lppop->Height);
Alexandre Julliard's avatar
Alexandre Julliard committed
#ifdef DEBUG_MENUCALC
Alexandre Julliard's avatar
Alexandre Julliard committed
	printf("PopupMenuCalcSize w=%d h=%d !\n", lppop->Width, lppop->Height);
Alexandre Julliard's avatar
Alexandre Julliard committed
#endif
Alexandre Julliard's avatar
Alexandre Julliard committed
	SelectObject(hDC, hOldFont);
	ReleaseDC(hwnd, hDC);
Alexandre Julliard's avatar
Alexandre Julliard committed
void MenuBarCalcSize(HDC hDC, LPRECT lprect, LPPOPUPMENU lppop)
Alexandre Julliard's avatar
Alexandre Julliard committed
{
Alexandre Julliard's avatar
Alexandre Julliard committed
	LPMENUITEM 	lpitem;
	RECT 	rect;
	HBITMAP	hBitMap;
	BITMAP	bm;
	HFONT	hOldFont;
	UINT  	i, OldHeight;
	DWORD	dwRet;
	if (lppop == NULL) return;
	if (lppop->nItems == 0) return;
Alexandre Julliard's avatar
Alexandre Julliard committed
#ifdef DEBUG_MENUCALC
Alexandre Julliard's avatar
Alexandre Julliard committed
	printf("MenuBarCalcSize left=%d top=%d right=%d bottom=%d !\n", 
		lprect->left, lprect->top, lprect->right, lprect->bottom);
Alexandre Julliard's avatar
Alexandre Julliard committed
#endif
Alexandre Julliard's avatar
Alexandre Julliard committed
	hOldFont = SelectObject(hDC, GetStockObject(SYSTEM_FONT));
	lppop->Height = lprect->bottom - lprect->top;
Alexandre Julliard's avatar
Alexandre Julliard committed
CalcAGAIN:
Alexandre Julliard's avatar
Alexandre Julliard committed
	OldHeight = lppop->Height;
	SetRect(&rect, lprect->left, lprect->top, 0, lprect->top + OldHeight);
	lpitem = lppop->firstItem;
	for(i = 0; i < lppop->nItems; i++) {
		if (lpitem == NULL) break;
		rect.bottom = lprect->top + lppop->Height;
		if (rect.right > lprect->right) 
			SetRect(&rect, lprect->left, rect.bottom, 
				0, rect.bottom + SYSMETRICS_CYMENU);
		if ((lpitem->item_flags & MF_BITMAP) == MF_BITMAP) {
			hBitMap = (HBITMAP)LOWORD((LONG)lpitem->item_text);
			GetObject(hBitMap, sizeof(BITMAP), (LPSTR)&bm);
			rect.right = rect.left + bm.bmWidth;
			lppop->Height = max(lppop->Height, bm.bmHeight);
			}
		if (((lpitem->item_flags & MF_BITMAP) != MF_BITMAP) &&
			((lpitem->item_flags & MF_SEPARATOR) != MF_SEPARATOR) &&
			((lpitem->item_flags & MF_MENUBREAK) != MF_MENUBREAK)) {
			dwRet = GetTextExtent(hDC, (char *)lpitem->item_text, 
			strlen((char *)lpitem->item_text));
			rect.right = rect.left + LOWORD(dwRet) + 10;
			dwRet = max(SYSMETRICS_CYMENU, (HIWORD(dwRet) + 6));
			lppop->Height = max(lppop->Height, (WORD)dwRet);
			}
		CopyRect(&lpitem->rect, &rect);
		rect.left = rect.right;
		lpitem = (LPMENUITEM)lpitem->next;
		}
	if (OldHeight < lppop->Height) goto CalcAGAIN;
	lppop->Width = rect.right;
	lprect->bottom =  lprect->top + lppop->Height;
	CopyRect(&lppop->rect, lprect);
Alexandre Julliard's avatar
Alexandre Julliard committed
#ifdef DEBUG_MENUCALC
Alexandre Julliard's avatar
Alexandre Julliard committed
	printf("MenuBarCalcSize w=%d h=%d !\n", lppop->Width, lppop->Height);
Alexandre Julliard's avatar
Alexandre Julliard committed
#endif
Alexandre Julliard's avatar
Alexandre Julliard committed
	SelectObject(hDC, hOldFont);
Alexandre Julliard's avatar
Alexandre Julliard committed

Alexandre Julliard's avatar
Alexandre Julliard committed
/***********************************************************************
 *           FindMenuItem
 */
LPMENUITEM FindMenuItem(HMENU hMenu, WORD nPos, WORD wFlags)
{
	LPPOPUPMENU	menu;
	LPMENUITEM 	lpitem;
	int		i;
	menu = (LPPOPUPMENU) GlobalLock(hMenu);
	if (menu == NULL) {
		GlobalUnlock(hMenu);
		return FALSE;
		}
	lpitem = menu->firstItem;
	if (wFlags & MF_BYPOSITION) {
		for (i = 0; i < nPos; i++, lpitem = lpitem->next) 
			if (lpitem == NULL)	return NULL;
		}
	else {
		for (i = 0; i < menu->nItems && lpitem != NULL; i++) {
			if (lpitem->item_id == nPos) return lpitem;
			lpitem = lpitem->next;
			}
		return NULL;
		}
    return lpitem;
}


Alexandre Julliard's avatar
Alexandre Julliard committed
LPMENUITEM GetMenuItemPtr(LPPOPUPMENU menu, WORD nPos)
{
    LPMENUITEM 	lpitem;
    int		i;
    if (menu == NULL) return NULL;
    lpitem = menu->firstItem;
    for (i = 0; i < menu->nItems; i++) {
Alexandre Julliard's avatar
Alexandre Julliard committed
    	if (lpitem == NULL) return NULL;
Alexandre Julliard's avatar
Alexandre Julliard committed
    	if (i == nPos) return(lpitem);
Alexandre Julliard's avatar
Alexandre Julliard committed
    	lpitem = (LPMENUITEM)lpitem->next;
Alexandre Julliard's avatar
Alexandre Julliard committed
WORD GetSelectionKey(LPSTR str)
{
Alexandre Julliard's avatar
Alexandre Julliard committed
	int		i;
	WORD	sel_key;
	for (i = 0; i < strlen(str); i++) {
		if (str[i] == '&' && str[i + 1] != '&') {
			sel_key = str[i + 1];
			if (sel_key >= 'a' && sel_key <= 'z') sel_key -= 'a' - 'A';
Alexandre Julliard's avatar
Alexandre Julliard committed
#ifdef DEBUG_MENU
Alexandre Julliard's avatar
Alexandre Julliard committed
			printf("GetSelectionKey // %04X\n", sel_key);
Alexandre Julliard's avatar
Alexandre Julliard committed
#endif
Alexandre Julliard's avatar
Alexandre Julliard committed
			return sel_key;
			}
		}
Alexandre Julliard's avatar
Alexandre Julliard committed
#ifdef DEBUG_MENU
Alexandre Julliard's avatar
Alexandre Julliard committed
	printf("GetSelectionKey NULL \n");
Alexandre Julliard's avatar
Alexandre Julliard committed
#endif
Alexandre Julliard's avatar
Alexandre Julliard committed
	return 0;
Alexandre Julliard's avatar
Alexandre Julliard committed
}



LPSTR GetShortCutString(LPSTR str)
{
Alexandre Julliard's avatar
Alexandre Julliard committed
	int		i;
	LPSTR	str2;
	for (i = 0; i < strlen(str); i++) {
		if (str[i] == '\t' && str[i + 1] != '\t') {
			str2 = &str[i + 1];
Alexandre Julliard's avatar
Alexandre Julliard committed
#ifdef DEBUG_MENUSHORTCUT
Alexandre Julliard's avatar
Alexandre Julliard committed
			printf("GetShortCutString // '%s' \n", str2);
Alexandre Julliard's avatar
Alexandre Julliard committed
#endif
Alexandre Julliard's avatar
Alexandre Julliard committed
			return str2;
			}
		}
Alexandre Julliard's avatar
Alexandre Julliard committed
#ifdef DEBUG_MENUSHORTCUT
Alexandre Julliard's avatar
Alexandre Julliard committed
	printf("GetShortCutString NULL \n");
Alexandre Julliard's avatar
Alexandre Julliard committed
#endif
Alexandre Julliard's avatar
Alexandre Julliard committed
	return NULL;
Alexandre Julliard's avatar
Alexandre Julliard committed
}



WORD GetShortCutPos(LPSTR str)
{
Alexandre Julliard's avatar
Alexandre Julliard committed
	int		i;
	for (i = 0; i < strlen(str); i++) {
		if (str[i] == '\t' && str[i + 1] != '\t') {
Alexandre Julliard's avatar
Alexandre Julliard committed
#ifdef DEBUG_MENUSHORTCUT
Alexandre Julliard's avatar
Alexandre Julliard committed
			printf("GetShortCutPos = %d \n", i);
Alexandre Julliard's avatar
Alexandre Julliard committed
#endif
Alexandre Julliard's avatar
Alexandre Julliard committed
			return i;
			}
		}
Alexandre Julliard's avatar
Alexandre Julliard committed
#ifdef DEBUG_MENUSHORTCUT
Alexandre Julliard's avatar
Alexandre Julliard committed
	printf("GetShortCutString NULL \n");
Alexandre Julliard's avatar
Alexandre Julliard committed
#endif
Alexandre Julliard's avatar
Alexandre Julliard committed
	return -1;
Alexandre Julliard's avatar
Alexandre Julliard committed
}



BOOL HideAllSubPopupMenu(LPPOPUPMENU menu)
{
Alexandre Julliard's avatar
Alexandre Julliard committed
	LPPOPUPMENU submenu;
	LPMENUITEM 	lpitem;
	BOOL	someClosed = FALSE;
	int		i;
	if (menu == NULL) return;
	lpitem = menu->firstItem;
	for (i = 0; i < menu->nItems; i++) {
		if (lpitem == NULL) return;
		if (lpitem->item_flags & MF_POPUP) {
			submenu = (LPPOPUPMENU) GlobalLock((HMENU)lpitem->item_id);
			if (submenu != NULL) {
				if (IsWindowVisible(submenu->hWnd)) {
					ShowWindow(submenu->hWnd, SW_HIDE);
					someClosed = TRUE;
					}
				GlobalUnlock((HMENU)lpitem->item_id);
		    	}
	   	    }
	   	lpitem = (LPMENUITEM)lpitem->next;
	   	}
	return someClosed;
Alexandre Julliard's avatar
Alexandre Julliard committed


/**********************************************************************
Alexandre Julliard's avatar
Alexandre Julliard committed
 *			ChangeMenu		[USER.153]
Alexandre Julliard's avatar
Alexandre Julliard committed
 */
Alexandre Julliard's avatar
Alexandre Julliard committed
BOOL ChangeMenu(HMENU hMenu, WORD nPos, LPSTR lpNewItem, 
			WORD wItemID, WORD wFlags)
Alexandre Julliard's avatar
Alexandre Julliard committed
{
Alexandre Julliard's avatar
Alexandre Julliard committed
	if (wFlags & MF_APPEND)
		return AppendMenu(hMenu, wFlags, wItemID, lpNewItem);
	if (wFlags & MF_DELETE)
		return DeleteMenu(hMenu, wItemID, wFlags);
	if (wFlags & MF_INSERT) 
		return InsertMenu(hMenu, nPos, wFlags, wItemID, lpNewItem);
	if (wFlags & MF_CHANGE) 
		return ModifyMenu(hMenu, nPos, wFlags, wItemID, lpNewItem);
	if (wFlags & MF_REMOVE) 
		return RemoveMenu(hMenu, wItemID, wFlags);
	return FALSE;
Alexandre Julliard's avatar
Alexandre Julliard committed
}
Alexandre Julliard's avatar
Alexandre Julliard committed


/**********************************************************************
 *			CheckMenuItem		[USER.154]
 */
BOOL CheckMenuItem(HMENU hMenu, WORD wItemID, WORD wFlags)
{
Alexandre Julliard's avatar
Alexandre Julliard committed
	WND		*wndPtr;
	LPPOPUPMENU	menu;
	LPMENUITEM 	lpitem;
	int		i;
Alexandre Julliard's avatar
Alexandre Julliard committed
#ifdef DEBUG_MENU
Alexandre Julliard's avatar
Alexandre Julliard committed
	printf("CheckMenuItem (%04X, %04X, %04X) !\n", hMenu, wItemID, wFlags);
Alexandre Julliard's avatar
Alexandre Julliard committed
#endif
Alexandre Julliard's avatar
Alexandre Julliard committed
	menu = (LPPOPUPMENU) GlobalLock(hMenu);
	if (menu == NULL) return FALSE;
	lpitem = menu->firstItem;
	for (i = 0; i < menu->nItems; i++) {
		if (lpitem == NULL) break;
		if (i == wItemID) {
			if (wFlags && MF_CHECKED)
				lpitem->item_flags |= MF_CHECKED;
			else
				lpitem->item_flags &= ((WORD)-1 ^ MF_CHECKED);
			GlobalUnlock(hMenu);
			return(TRUE);
			}
		lpitem = (LPMENUITEM)lpitem->next;
		}
	GlobalUnlock(hMenu);
	return FALSE;
Alexandre Julliard's avatar
Alexandre Julliard committed
}


/**********************************************************************
 *			EnableMenuItem		[USER.155]
 */
BOOL EnableMenuItem(HMENU hMenu, WORD wItemID, WORD wFlags)
{
Alexandre Julliard's avatar
Alexandre Julliard committed
	WND		*wndPtr;
	LPPOPUPMENU	menu;
	LPMENUITEM 	lpitem;
	int		i;
Alexandre Julliard's avatar
Alexandre Julliard committed
#ifdef DEBUG_MENU
Alexandre Julliard's avatar
Alexandre Julliard committed
	printf("EnableMenuItem (%04X, %04X, %04X) !\n", hMenu, wItemID, wFlags);
Alexandre Julliard's avatar
Alexandre Julliard committed
#endif
Alexandre Julliard's avatar
Alexandre Julliard committed
	menu = (LPPOPUPMENU) GlobalLock(hMenu);
	if (menu == NULL) return FALSE;
	lpitem = menu->firstItem;
	for (i = 0; i < menu->nItems; i++) {
		if (lpitem == NULL) break;
		if (i == wItemID) {
			if (wFlags && MF_DISABLED)
				lpitem->item_flags |= MF_DISABLED;
			else
				lpitem->item_flags &= ((WORD)-1 ^ MF_DISABLED);
			GlobalUnlock(hMenu);
			return(TRUE);
			}
		lpitem = (LPMENUITEM)lpitem->next;
		}
	GlobalUnlock(hMenu);
	return FALSE;
Alexandre Julliard's avatar
Alexandre Julliard committed
}


/**********************************************************************
 *			InsertMenu		[USER.410]
 */
BOOL InsertMenu(HMENU hMenu, WORD nPos, WORD wFlags, WORD wItemID, LPSTR lpNewItem)
{
Alexandre Julliard's avatar
Alexandre Julliard committed
	WND		*wndPtr;
	LPPOPUPMENU	menu;
	HANDLE	hNewItem;
	LPMENUITEM 	lpitem, lpitem2;
	int		i;
Alexandre Julliard's avatar
Alexandre Julliard committed
#ifdef DEBUG_MENU
Alexandre Julliard's avatar
Alexandre Julliard committed
	if (wFlags & MF_STRING) 
		printf("InsertMenu (%04X, %04X, %04X, '%s') !\n",
					hMenu, wFlags, wItemID, lpNewItem);
	else
		printf("InsertMenu (%04X, %04X, %04X, %04X, %08X) !\n",
					hMenu, nPos, wFlags, wItemID, lpNewItem);
Alexandre Julliard's avatar
Alexandre Julliard committed
#endif
Alexandre Julliard's avatar
Alexandre Julliard committed
	menu = (LPPOPUPMENU) GlobalLock(hMenu);
	if (menu == NULL) return FALSE;
	lpitem = FindMenuItem(hMenu, nPos, wFlags);
Alexandre Julliard's avatar
Alexandre Julliard committed
	if (lpitem == NULL) lpitem = menu->firstItem;
Alexandre Julliard's avatar
Alexandre Julliard committed
	hNewItem = GlobalAlloc(GMEM_MOVEABLE, sizeof(MENUITEM));
	if (hNewItem == 0) {
		GlobalUnlock(hMenu);
		return FALSE;
		}
	lpitem2 = (LPMENUITEM)GlobalLock(hNewItem);
	if (lpitem2 == NULL) {
		GlobalFree(hNewItem);
		GlobalUnlock(hMenu);
		return FALSE;
		}
	lpitem2->item_flags = wFlags;
	lpitem2->item_id = wItemID;
	if (!(wFlags & (MF_BITMAP | MF_OWNERDRAW | MF_MENUBARBREAK | 
Alexandre Julliard's avatar
Alexandre Julliard committed
		MF_MENUBREAK | MF_SEPARATOR))) {
/*		lpitem2->item_text = GlobalQuickAlloc(strlen(lpNewItem) + 1); */
		lpitem2->item_text = GlobalLock(GlobalAlloc(GMEM_MOVEABLE, strlen(lpNewItem) + 1));
		if (lpitem2->item_text != NULL)
			strcpy(lpitem2->item_text, lpNewItem);
		else {
			printf("InsertMenu // Bad Alloc !\n");
			return FALSE;
			}
Alexandre Julliard's avatar
Alexandre Julliard committed
		lpitem2->sel_key = GetSelectionKey(lpitem2->item_text);
		}
	else {
Alexandre Julliard's avatar
Alexandre Julliard committed
		lpitem2->item_text = lpNewItem;
		}
	if (lpitem == NULL) {
		menu->firstItem = lpitem2;
		lpitem2->prev = NULL;
Alexandre Julliard's avatar
Alexandre Julliard committed
		lpitem2->next = NULL;
Alexandre Julliard's avatar
Alexandre Julliard committed
		}
	else {
		lpitem2->prev = lpitem;
		lpitem2->next = lpitem->next;
		if (lpitem2->next != NULL) lpitem2->next->prev = lpitem2;
		lpitem->next = lpitem2;
		}
Alexandre Julliard's avatar
Alexandre Julliard committed
	lpitem2->child = NULL;
	lpitem2->parent = NULL;
	menu->nItems++;
Alexandre Julliard's avatar
Alexandre Julliard committed
	GlobalUnlock(hMenu);
Alexandre Julliard's avatar
Alexandre Julliard committed
	return TRUE;
Alexandre Julliard's avatar
Alexandre Julliard committed
}


/**********************************************************************
 *			AppendMenu		[USER.411]
 */
BOOL AppendMenu(HMENU hMenu, WORD wFlags, WORD wItemID, LPSTR lpNewItem)
{
Alexandre Julliard's avatar
Alexandre Julliard committed
	WND		*wndPtr;
	LPPOPUPMENU	menu;
	HANDLE	hNewItem;
	LPMENUITEM 	lpitem, lpitem2;
Alexandre Julliard's avatar
Alexandre Julliard committed
#ifdef DEBUG_MENU
Alexandre Julliard's avatar
Alexandre Julliard committed
	if ((wFlags & (MF_BITMAP | MF_SEPARATOR | MF_MENUBREAK | MF_OWNERDRAW)) == 0)
		printf("AppendMenu (%04X, %04X, %04X, '%s') !\n",
Alexandre Julliard's avatar
Alexandre Julliard committed
					hMenu, wFlags, wItemID, lpNewItem);
Alexandre Julliard's avatar
Alexandre Julliard committed
	else
		printf("AppendMenu (%04X, %04X, %04X, %08X) !\n",
Alexandre Julliard's avatar
Alexandre Julliard committed
					hMenu, wFlags, wItemID, lpNewItem);
Alexandre Julliard's avatar
Alexandre Julliard committed
#endif
Alexandre Julliard's avatar
Alexandre Julliard committed
	menu = (LPPOPUPMENU) GlobalLock(hMenu);
	if (menu == NULL) return FALSE;
	lpitem = menu->firstItem;
	if (lpitem != NULL) {
		while (lpitem->next != NULL) {
			lpitem = (LPMENUITEM)lpitem->next;
			}
		}
	hNewItem = GlobalAlloc(GMEM_MOVEABLE, sizeof(MENUITEM));
	if (hNewItem == 0) {
		GlobalUnlock(hMenu);
		return FALSE;
		}
	lpitem2 = (LPMENUITEM)GlobalLock(hNewItem);
	if (lpitem2 == NULL) {
		GlobalFree(hNewItem);
		GlobalUnlock(hMenu);
		return FALSE;
		}
	lpitem2->item_flags = wFlags;
	lpitem2->item_id = wItemID;
	if (!(wFlags & (MF_BITMAP | MF_OWNERDRAW | MF_MENUBARBREAK | 
Alexandre Julliard's avatar
Alexandre Julliard committed
		MF_MENUBREAK | MF_SEPARATOR))) {
/*        lpitem2->item_text = GlobalQuickAlloc(strlen(lpNewItem) + 1); */
		lpitem2->item_text = GlobalLock(GlobalAlloc(GMEM_MOVEABLE, strlen(lpNewItem) + 1));
		if (lpitem2->item_text != NULL)
			strcpy(lpitem2->item_text, lpNewItem);
		else {
			printf("AppendMenu // Bad Alloc !\n");
			return FALSE;
			}
Alexandre Julliard's avatar
Alexandre Julliard committed
		lpitem2->sel_key = GetSelectionKey(lpitem2->item_text);
		}
	else {
Alexandre Julliard's avatar
Alexandre Julliard committed
		lpitem2->item_text = lpNewItem;
		}
Alexandre Julliard's avatar
Alexandre Julliard committed
	if (lpitem == NULL)
		menu->firstItem = lpitem2;
	else
		lpitem->next = lpitem2;
	lpitem2->prev = lpitem;
	lpitem2->next = NULL;
	lpitem2->child = NULL;
	lpitem2->parent = NULL;
	lpitem2->hCheckBit = (HBITMAP)NULL;
	lpitem2->hUnCheckBit = (HBITMAP)NULL;
	menu->nItems++;
Alexandre Julliard's avatar
Alexandre Julliard committed
	GlobalUnlock(hMenu);
Alexandre Julliard's avatar
Alexandre Julliard committed
	return TRUE;
Alexandre Julliard's avatar
Alexandre Julliard committed
}


/**********************************************************************
 *			RemoveMenu		[USER.412]
 */
BOOL RemoveMenu(HMENU hMenu, WORD nPos, WORD wFlags)
{
Alexandre Julliard's avatar
Alexandre Julliard committed
	WND		*wndPtr;
	LPPOPUPMENU	menu;
	LPMENUITEM 	lpitem;
	int		i;
Alexandre Julliard's avatar
Alexandre Julliard committed
#ifdef DEBUG_MENU
Alexandre Julliard's avatar
Alexandre Julliard committed
	printf("RemoveMenu (%04X, %04X, %04X) !\n", hMenu, nPos, wFlags);
Alexandre Julliard's avatar
Alexandre Julliard committed
#endif
Alexandre Julliard's avatar
Alexandre Julliard committed
	menu = (LPPOPUPMENU) GlobalLock(hMenu);
	if (menu == NULL) return FALSE;
	lpitem = menu->firstItem;
	for (i = 0; i < menu->nItems; i++) {
		if (lpitem == NULL) break;
		if (i == nPos) {
			lpitem->prev->next = lpitem->next;
			lpitem->next->prev = lpitem->prev;
			if (!(lpitem->item_flags & 
Alexandre Julliard's avatar
Alexandre Julliard committed
				(MF_BITMAP | MF_OWNERDRAW | MF_MENUBARBREAK | 
				MF_MENUBREAK | MF_SEPARATOR))) {
				GlobalFree((HANDLE)lpitem->item_text);
				}
Alexandre Julliard's avatar
Alexandre Julliard committed
			GlobalFree(lpitem);
			GlobalUnlock(hMenu);
			return TRUE;
			}
		lpitem = (LPMENUITEM)lpitem->next;
		printf("RemoveMenu // during loop items !\n");
		}
	printf("RemoveMenu // after loop items !\n");
	GlobalUnlock(hMenu);
	return FALSE;
Alexandre Julliard's avatar
Alexandre Julliard committed
}


/**********************************************************************
 *			DeleteMenu		[USER.413]
 */
BOOL DeleteMenu(HMENU hMenu, WORD nPos, WORD wFlags)
{
Alexandre Julliard's avatar
Alexandre Julliard committed
	LPPOPUPMENU	menu;
	LPMENUITEM 	lpitem;
	int		i;
Alexandre Julliard's avatar
Alexandre Julliard committed
#ifdef DEBUG_MENU
Alexandre Julliard's avatar
Alexandre Julliard committed
	printf("DeleteMenu (%04X, %04X, %04X) !\n", hMenu, nPos, wFlags);
Alexandre Julliard's avatar
Alexandre Julliard committed
#endif
Alexandre Julliard's avatar
Alexandre Julliard committed
	menu = (LPPOPUPMENU) GlobalLock(hMenu);
	if (menu == NULL) {
		GlobalUnlock(hMenu);
		return FALSE;
		}
	lpitem = FindMenuItem(hMenu, nPos, wFlags);
	if (lpitem != NULL) {
		if ((lpitem->item_flags & MF_POPUP) == MF_POPUP) 
			DestroyMenu((HMENU)lpitem->item_id);
		if (!(lpitem->item_flags & 
			(MF_BITMAP | MF_OWNERDRAW | MF_MENUBARBREAK | 
			MF_MENUBREAK | MF_SEPARATOR))) {
			GlobalFree((HANDLE)lpitem->item_text);
			}
		if (lpitem->prev) lpitem->prev->next = lpitem->next;
		if (lpitem->next) lpitem->next->prev = lpitem->prev;
		GlobalFree(lpitem);
		GlobalUnlock(hMenu);
		return TRUE;
		}
Alexandre Julliard's avatar
Alexandre Julliard committed
	GlobalUnlock(hMenu);
	return FALSE;
Alexandre Julliard's avatar
Alexandre Julliard committed
}


/**********************************************************************
 *			ModifyMenu		[USER.414]
 */
BOOL ModifyMenu(HMENU hMenu, WORD nPos, WORD wFlags, WORD wItemID, LPSTR lpNewItem)
{
Alexandre Julliard's avatar
Alexandre Julliard committed
	WND		*wndPtr;
	LPPOPUPMENU	menu;
	LPMENUITEM 	lpitem;
	int		i;
Alexandre Julliard's avatar
Alexandre Julliard committed
#ifdef DEBUG_MENU
Alexandre Julliard's avatar
Alexandre Julliard committed
	printf("ModifyMenu (%04X, %04X, %04X, %04X, %08X) !\n",
				hMenu, nPos, wFlags, wItemID, lpNewItem);
Alexandre Julliard's avatar
Alexandre Julliard committed
#endif
Alexandre Julliard's avatar
Alexandre Julliard committed
	menu = (LPPOPUPMENU) GlobalLock(hMenu);
	if (menu == NULL) return FALSE;
	lpitem = menu->firstItem;
	for (i = 0; i < menu->nItems; i++) {
		if (lpitem == NULL) break;
		if (i == nPos) {
			lpitem->item_flags = wFlags;
			lpitem->item_id    = wItemID;
			if (!(lpitem->item_flags & 
				(MF_BITMAP | MF_OWNERDRAW | MF_MENUBARBREAK | 
				MF_MENUBREAK | MF_SEPARATOR))) {
				GlobalFree((HANDLE)lpitem->item_text);
/*				lpitem->item_text = GlobalQuickAlloc(strlen(lpNewItem) + 1); */
				lpitem->item_text = GlobalLock(GlobalAlloc(GMEM_MOVEABLE, strlen(lpNewItem) + 1));
				printf("ModifyMenu %08X %08X '%s') !\n",
					lpitem->item_text, lpNewItem, lpNewItem);
				if (lpitem->item_text != NULL)
					strcpy(lpitem->item_text, lpNewItem);
				else
					printf("ModifyMenu // Bad Alloc !\n");
				}
			else
				lpitem->item_text = lpNewItem;
				GlobalUnlock(hMenu);
				return(TRUE);
				}
		lpitem = (LPMENUITEM)lpitem->next;
		}
Alexandre Julliard's avatar
Alexandre Julliard committed
    GlobalUnlock(hMenu);
Alexandre Julliard's avatar
Alexandre Julliard committed
    return FALSE;
Alexandre Julliard's avatar
Alexandre Julliard committed
}


/**********************************************************************
 *			CreatePopupMenu		[USER.415]
 */
HMENU CreatePopupMenu()
{
Alexandre Julliard's avatar
Alexandre Julliard committed
	HANDLE	hItem;
	HMENU	hMenu;
	LPPOPUPMENU menu;
Alexandre Julliard's avatar
Alexandre Julliard committed
#ifdef DEBUG_MENU
Alexandre Julliard's avatar
Alexandre Julliard committed
	printf("CreatePopupMenu !\n");
Alexandre Julliard's avatar
Alexandre Julliard committed
#endif
Alexandre Julliard's avatar
Alexandre Julliard committed
	hMenu = GlobalAlloc(GMEM_MOVEABLE, sizeof(POPUPMENU));
	menu = (LPPOPUPMENU) GlobalLock(hMenu);
	if (menu == NULL) {
		GlobalFree(hMenu);
		return 0;
		}
	menu->nItems 		= 0;
	menu->firstItem 	= NULL;
	menu->ownerWnd		= 0;
	menu->hWndPrev		= 0;
	menu->hWnd			= 0;
	menu->hWndParent	= 0;
	menu->MouseFlags	= 0;
	menu->BarFlag		= FALSE;
	menu->SysFlag		= FALSE;
	menu->ChildFlag		= TRUE;
	menu->Width 		= 100;
	menu->Height 		= 0;
	GlobalUnlock(hMenu);
	return hMenu;
Alexandre Julliard's avatar
Alexandre Julliard committed
}


/**********************************************************************
Alexandre Julliard's avatar
Alexandre Julliard committed
 *			TrackPopupMenu		[USER.416]
Alexandre Julliard's avatar
Alexandre Julliard committed
 */
BOOL TrackPopupMenu(HMENU hMenu, WORD wFlags, short x, short y,
	short nReserved, HWND hWnd, LPRECT lpRect)
{
Alexandre Julliard's avatar
Alexandre Julliard committed
	WND		*wndPtr;
	LPPOPUPMENU	lppop;
	RECT	rect;
#ifdef DEBUG_MENU
	printf("TrackPopupMenu (%04X, %04X, %d, %d, %04X, %04X, %08X) !\n",
		hMenu, wFlags, x, y, nReserved, hWnd, lpRect);
#endif
	lppop = (LPPOPUPMENU) GlobalLock(hMenu);
Alexandre Julliard's avatar
Alexandre Julliard committed
	if (lppop == NULL) {
		printf("TrackPopupMenu // Bad menu handle %04X !\n", hMenu);
		return FALSE;
		}
Alexandre Julliard's avatar
Alexandre Julliard committed
	wndPtr = WIN_FindWndPtr(hWnd);
Alexandre Julliard's avatar
Alexandre Julliard committed
	if (wndPtr == NULL) {
		printf("TrackPopupMenu // Bad window handle %04X !\n", hWnd);
		return FALSE;
		}
Alexandre Julliard's avatar
Alexandre Julliard committed
	lppop->ownerWnd = hWnd;
Alexandre Julliard's avatar
Alexandre Julliard committed
	lppop->hWndPrev = GetFocus();
Alexandre Julliard's avatar
Alexandre Julliard committed
	if (lppop->hWnd == (HWND)NULL) {
		lppop->hWnd = CreateWindow("POPUPMENU", "", WS_POPUP | WS_VISIBLE,
			x, y, lppop->Width, lppop->Height, (HWND)NULL, 0, 
			wndPtr->hInstance, (LPSTR)lppop);
Alexandre Julliard's avatar
Alexandre Julliard committed
		if (lppop->hWnd == 0) {
			printf("TrackPopupMenu // Can't create PopupMenu window !\n");
			return FALSE;
			}
Alexandre Julliard's avatar
Alexandre Julliard committed
		}
	else {
		ShowWindow(lppop->hWnd, SW_SHOW);
		}
	if (!lppop->BarFlag) {
		PopupMenuCalcSize(lppop->hWnd);
#ifdef DEBUG_MENU
		printf("TrackPopupMenu // x=%d y=%d Width=%d Height=%d\n", 
			x, y, lppop->Width, lppop->Height); 
#endif
		SetWindowPos(lppop->hWnd, 0, x, y, lppop->Width + 2, lppop->Height, 
			SWP_NOZORDER);
		}
Alexandre Julliard's avatar
Alexandre Julliard committed
	SetFocus(lppop->hWnd);
Alexandre Julliard's avatar
Alexandre Julliard committed
	if (!MenuHasFocus) {
#ifdef DEBUG_MENU
		printf("TrackPopupMenu // before MenuFocusLoop !\n");
#endif
		MenuFocusLoop(hWnd, NULL);
Alexandre Julliard's avatar
Alexandre Julliard committed
#ifdef DEBUG_MENU
Alexandre Julliard's avatar
Alexandre Julliard committed
		printf("TrackPopupMenu // after MenuFocusLoop !\n");
Alexandre Julliard's avatar
Alexandre Julliard committed
#endif
Alexandre Julliard's avatar
Alexandre Julliard committed
		}
	GlobalUnlock(hMenu);
	return TRUE;
}


Alexandre Julliard's avatar
Alexandre Julliard committed
BOOL ActivateMenuBarFocus(HWND hWnd)
Alexandre Julliard's avatar
Alexandre Julliard committed
{
	WND		*wndPtr;
	LPPOPUPMENU	lpmenu;
	BOOL	bRet;
	MSG		msg;
	if (MenuHasFocus) return FALSE;
Alexandre Julliard's avatar
Alexandre Julliard committed
	wndPtr = WIN_FindWndPtr(hWnd);
Alexandre Julliard's avatar
Alexandre Julliard committed
	if (wndPtr == NULL) return FALSE;
Alexandre Julliard's avatar
Alexandre Julliard committed
#ifdef DEBUG_MENU
Alexandre Julliard's avatar
Alexandre Julliard committed
	printf("ActivateMenuBarFocus (%04X) !\n", hWnd);
Alexandre Julliard's avatar
Alexandre Julliard committed
#endif
Alexandre Julliard's avatar
Alexandre Julliard committed
	while((wndPtr->dwStyle & WS_CHILD) == WS_CHILD) {
		hWnd = GetParent(hWnd);
		printf("ActivateMenuBarFocus // next Parent=%04X !\n", hWnd);
		wndPtr = WIN_FindWndPtr(hWnd);
		if (wndPtr == NULL) return FALSE;
		}
Alexandre Julliard's avatar
Alexandre Julliard committed
	if ((wndPtr->dwStyle & WS_CHILD) == 0 && wndPtr->wIDmenu != 0) {
		lpmenu = (LPPOPUPMENU) GlobalLock(wndPtr->wIDmenu);
Alexandre Julliard's avatar
Alexandre Julliard committed
		if (lpmenu == NULL) return FALSE;
		lpmenu->hWndPrev = GetFocus();
		SetFocus(hWnd);
Alexandre Julliard's avatar
Alexandre Julliard committed
		MenuItemSelect(hWnd, lpmenu, 0);
		bRet = MenuFocusLoop(hWnd, lpmenu);
Alexandre Julliard's avatar
Alexandre Julliard committed
		GlobalUnlock(wndPtr->wIDmenu);
Alexandre Julliard's avatar
Alexandre Julliard committed
		return bRet;
		}
	return FALSE;
}


BOOL MenuFocusLoop(HWND hWnd, LPPOPUPMENU lpmenu)
{
	WND		*wndPtr;
	MSG		msg;
#ifdef DEBUG_MENU
	printf("Enter in Menu Focus Loop !\n");
#endif
	MenuHasFocus = TRUE;
	while(TRUE) {
		if (!MenuHasFocus) break;
		if (!GetMessage(&msg, (HWND)NULL, 0, 0)) break;
		TranslateMessage(&msg);
		if (hWnd == msg.hwnd && lpmenu != NULL) {
			if ((msg.message == WM_SYSKEYDOWN && msg.wParam == VK_MENU) ||
				(msg.message == WM_CHAR && msg.wParam == VK_ESCAPE)) {
				HideAllSubPopupMenu(lpmenu);
				break;
				}
			switch(msg.message) {
				case WM_KEYDOWN:
				case WM_KEYUP:
				case WM_CHAR:
				case WM_LBUTTONDOWN:
				case WM_LBUTTONUP:
				case WM_MOUSEMOVE:
					PopupMenuWndProc(hWnd, msg.message, msg.wParam, msg.lParam);
				default:
					DispatchMessage(&msg);
				}
			}
		else
			DispatchMessage(&msg);
		}
EndOfFocus:
	MenuHasFocus = FALSE;
	if (lpmenu != NULL) MenuItemSelect(hWnd, lpmenu, -1);
#ifdef DEBUG_MENU
	printf("End of Menu Focus Loop !\n");
#endif
	return TRUE;
Alexandre Julliard's avatar
Alexandre Julliard committed
/**********************************************************************
 *			NC_TrackSysMenu		[Internal]
 */
Alexandre Julliard's avatar
Alexandre Julliard committed
void NC_TrackSysMenu(HWND hWnd)
Alexandre Julliard's avatar
Alexandre Julliard committed
{
Alexandre Julliard's avatar
Alexandre Julliard committed
	RECT	rect;
	LPPOPUPMENU	lpsys;
	WND *wndPtr = WIN_FindWndPtr(hWnd);    
Alexandre Julliard's avatar
Alexandre Julliard committed
#ifdef DEBUG_MENU
Alexandre Julliard's avatar
Alexandre Julliard committed
	printf("NC_TrackSysMenu hWnd=%04X !\n", hWnd);
Alexandre Julliard's avatar
Alexandre Julliard committed
#endif
Alexandre Julliard's avatar
Alexandre Julliard committed
	if (!wndPtr) return;
	lpsys = (LPPOPUPMENU)GlobalLock(wndPtr->hSysMenu);
Alexandre Julliard's avatar
Alexandre Julliard committed
#ifdef DEBUG_MENU
Alexandre Julliard's avatar
Alexandre Julliard committed
	printf("NC_TrackSysMenu wndPtr->hSysMenu=%04X !\n", wndPtr->hSysMenu);
Alexandre Julliard's avatar
Alexandre Julliard committed
#endif
Alexandre Julliard's avatar
Alexandre Julliard committed
	if (lpsys == NULL) return;
Alexandre Julliard's avatar
Alexandre Julliard committed
#ifdef DEBUG_MENU
Alexandre Julliard's avatar
Alexandre Julliard committed
	printf("NC_TrackSysMenu wndPtr->hSysMenu=%04X !\n", wndPtr->hSysMenu);
Alexandre Julliard's avatar
Alexandre Julliard committed
#endif
Alexandre Julliard's avatar
Alexandre Julliard committed
	lpsys->BarFlag = FALSE;
	lpsys->SysFlag = TRUE;
	lpsys->ChildFlag = FALSE;
	lpsys->hWndParent = hWnd;
	if (!IsWindowVisible(lpsys->hWnd)) {
		GetWindowRect(hWnd, &rect);
Alexandre Julliard's avatar
Alexandre Julliard committed
#ifdef DEBUG_MENU
Alexandre Julliard's avatar
Alexandre Julliard committed
		printf("NC_TrackSysMenu lpsys->hWnd=%04X !\n", lpsys->hWnd);
Alexandre Julliard's avatar
Alexandre Julliard committed
#endif
Alexandre Julliard's avatar
Alexandre Julliard committed
		if (MenuHasFocus) {
			TrackPopupMenu(wndPtr->hSysMenu, TPM_LEFTBUTTON, 
				rect.left, rect.top + SYSMETRICS_CYSIZE, 
				0, hWnd, (LPRECT)NULL);
			}
		else {
			MenuHasFocus = TRUE;
			TrackPopupMenu(wndPtr->hSysMenu, TPM_LEFTBUTTON, 
				rect.left, rect.top + SYSMETRICS_CYSIZE, 
				0, hWnd, (LPRECT)NULL);
			MenuHasFocus = FALSE;
#ifdef DEBUG_MENU
			printf("NC_TrackSysMenu // before MenuFocusLoop !\n");
#endif
			MenuFocusLoop(hWnd, NULL);
#ifdef DEBUG_MENU
			printf("NC_TrackSysMenu // after MenuFocusLoop !\n");
#endif
			}
		}
	else {
		ShowWindow(lpsys->hWnd, SW_HIDE);
		}
	GlobalUnlock(wndPtr->hSysMenu);
Alexandre Julliard's avatar
Alexandre Julliard committed
}


/**********************************************************************
 *			GetMenuCheckMarkDimensions	[USER.417]
 */
DWORD GetMenuCheckMarkDimensions()
{
    BITMAP	bm;
    if (hStdCheck == (HBITMAP)NULL) 
	hStdCheck = LoadBitmap((HANDLE)NULL, (LPSTR)OBM_CHECK);
    GetObject(hStdCheck, sizeof(BITMAP), (LPSTR)&bm);
    return MAKELONG(bm.bmWidth, bm.bmHeight);
Alexandre Julliard's avatar
Alexandre Julliard committed
/**********************************************************************
 *			SetMenuItemBitmaps	[USER.418]
 */
BOOL SetMenuItemBitmaps(HMENU hMenu, WORD nPos, WORD wFlags,
		HBITMAP hNewCheck, HBITMAP hNewUnCheck)
{
Alexandre Julliard's avatar
Alexandre Julliard committed
	WND		*wndPtr;
	LPPOPUPMENU	menu;
	LPMENUITEM 	lpitem;
	int		i;
Alexandre Julliard's avatar
Alexandre Julliard committed
#ifdef DEBUG_MENU
Alexandre Julliard's avatar
Alexandre Julliard committed
	printf("SetMenuItemBitmaps (%04X, %04X, %04X, %04X, %08X) !\n",
					hMenu, nPos, wFlags, hNewCheck, hNewUnCheck);
Alexandre Julliard's avatar
Alexandre Julliard committed
#endif
Alexandre Julliard's avatar
Alexandre Julliard committed
	menu = (LPPOPUPMENU) GlobalLock(hMenu);
	if (menu == NULL) return FALSE;
	lpitem = menu->firstItem;
	for (i = 0; i < menu->nItems; i++) {
		if (lpitem == NULL) break;
		if (i == nPos) {
			lpitem->hCheckBit   = hNewCheck;
			lpitem->hUnCheckBit = hNewUnCheck;
			GlobalUnlock(hMenu);
			return TRUE;
			}
		lpitem = (LPMENUITEM)lpitem->next;
		}
	GlobalUnlock(hMenu);
	return FALSE;
Alexandre Julliard's avatar
Alexandre Julliard committed
/**********************************************************************
 *			CreateMenu		[USER.151]
 */
HMENU CreateMenu()
{
Alexandre Julliard's avatar
Alexandre Julliard committed
	HANDLE	hItem;
	HMENU	hMenu;
	LPPOPUPMENU menu;
Alexandre Julliard's avatar
Alexandre Julliard committed
#ifdef DEBUG_MENU
Alexandre Julliard's avatar
Alexandre Julliard committed
	printf("CreatePopupMenu !\n");
Alexandre Julliard's avatar
Alexandre Julliard committed
#endif
Alexandre Julliard's avatar
Alexandre Julliard committed
	hMenu = GlobalAlloc(GMEM_MOVEABLE, sizeof(POPUPMENU));
	menu = (LPPOPUPMENU) GlobalLock(hMenu);
	if (menu == NULL) {
		GlobalFree(hMenu);
		return 0;
		}
	menu->nItems 		= 0;
	menu->firstItem 	= NULL;
	menu->hWndPrev		= 0;
	menu->ownerWnd		= 0;
	menu->hWnd			= 0;
	menu->hWndParent	= 0;
	menu->MouseFlags	= 0;
	menu->BarFlag		= TRUE;
	menu->SysFlag		= FALSE;
	menu->ChildFlag 	= TRUE;
	menu->Width 		= 100;
	menu->Height 		= 0;
	GlobalUnlock(hMenu);
	return hMenu;
Alexandre Julliard's avatar
Alexandre Julliard committed
}


/**********************************************************************
 *			DestroyMenu		[USER.152]
 */
BOOL DestroyMenu(HMENU hMenu)
{
Alexandre Julliard's avatar
Alexandre Julliard committed
	LPPOPUPMENU lppop;
	LPMENUITEM 	lpitem, lpitem2;
Alexandre Julliard's avatar
Alexandre Julliard committed
#ifdef DEBUG_MENU
Alexandre Julliard's avatar
Alexandre Julliard committed
	printf("DestroyMenu (%04X) !\n", hMenu);
#endif
	if (hMenu == 0) return FALSE;
	lppop = (LPPOPUPMENU) GlobalLock(hMenu);
	if (lppop == NULL) return FALSE;
	if (lppop->hWnd) DestroyWindow (lppop->hWnd);
	lpitem = lppop->firstItem;
	while (lpitem != NULL) {
Alexandre Julliard's avatar
Alexandre Julliard committed
#ifdef DEBUG_MENU
Alexandre Julliard's avatar
Alexandre Julliard committed
		printf("DestroyMenu (%04X) // during loop items !\n", hMenu);
Alexandre Julliard's avatar
Alexandre Julliard committed
#endif
Alexandre Julliard's avatar
Alexandre Julliard committed
		if ((lpitem->item_flags & MF_POPUP) == MF_POPUP) {
			DestroyMenu((HMENU)lpitem->item_id);
			}
		lpitem = (LPMENUITEM)lpitem->next;
		}
	GlobalUnlock(hMenu);
	GlobalFree(hMenu);
Alexandre Julliard's avatar
Alexandre Julliard committed
#ifdef DEBUG_MENU
Alexandre Julliard's avatar
Alexandre Julliard committed
	printf("DestroyMenu (%04X) // End !\n", hMenu);
Alexandre Julliard's avatar
Alexandre Julliard committed
#endif
Alexandre Julliard's avatar
Alexandre Julliard committed
	return TRUE;
Alexandre Julliard's avatar
Alexandre Julliard committed
/**********************************************************************
Alexandre Julliard's avatar
Alexandre Julliard committed
 *			LoadMenu		[USER.150]
 */
HMENU LoadMenu(HINSTANCE instance, char *menu_name)
{
Alexandre Julliard's avatar
Alexandre Julliard committed
	HMENU     		hMenu;
	HANDLE		hMenu_desc;
	MENU_HEADER 	*menu_desc;
Alexandre Julliard's avatar
Alexandre Julliard committed
#ifdef DEBUG_MENU
Alexandre Julliard's avatar
Alexandre Julliard committed
	if ((LONG)menu_name & 0xFFFF0000L)
		printf("LoadMenu: instance %02x, menu '%s'\n", instance, menu_name);
	else
		printf("LoadMenu: instance %02x, menu '%04X'\n", instance, menu_name);
#endif
	if (instance == (HANDLE)NULL)  instance = hSysRes;
	if (menu_name == NULL || 
		(hMenu_desc = RSC_LoadMenu(instance, menu_name)) == 0 ||
		(menu_desc = (MENU_HEADER *) GlobalLock(hMenu_desc)) == NULL) {
		return 0;
		}
	hMenu = LoadMenuIndirect((LPSTR)menu_desc);
	return hMenu;
Alexandre Julliard's avatar
Alexandre Julliard committed
}


/**********************************************************************
 *			GetSystemMenu		[USER.156]
 */
HMENU GetSystemMenu(HWND hWnd, BOOL bRevert)
{
Alexandre Julliard's avatar
Alexandre Julliard committed
	WND		*wndPtr;
	wndPtr = WIN_FindWndPtr(hWnd);
	if (!bRevert) {
		return wndPtr->hSysMenu;
		}
	else {
		DestroyMenu(wndPtr->hSysMenu);
		wndPtr->hSysMenu = CopySysMenu();
		}
Alexandre Julliard's avatar
Alexandre Julliard committed
	return wndPtr->hSysMenu;
}

Alexandre Julliard's avatar
Alexandre Julliard committed
/**********************************************************************
 *			SetSystemMenu		[USER.280]
 */
BOOL SetSystemMenu(HWND hWnd, HMENU newHmenu)
{
	WND	*wndPtr;

	if ((wndPtr = WIN_FindWndPtr(hWnd)) != NULL)
		wndPtr->hSysMenu = newHmenu;
}

Alexandre Julliard's avatar
Alexandre Julliard committed

/**********************************************************************
 *			GetMenu		[USER.157]
 */
HMENU GetMenu(HWND hWnd) 
{ 
Alexandre Julliard's avatar
Alexandre Julliard committed
	WND * wndPtr = WIN_FindWndPtr(hWnd);
	if (wndPtr == NULL) return 0;
	return wndPtr->wIDmenu;
Alexandre Julliard's avatar
Alexandre Julliard committed
}

/**********************************************************************
 * 			SetMenu 	[USER.158]
 */
BOOL SetMenu(HWND hWnd, HMENU hMenu)
{
Alexandre Julliard's avatar
Alexandre Julliard committed
	LPPOPUPMENU lpmenu;
Alexandre Julliard's avatar
Alexandre Julliard committed
	WND * wndPtr = WIN_FindWndPtr(hWnd);
Alexandre Julliard's avatar
Alexandre Julliard committed
	if (wndPtr == NULL) {
		printf("SetMenu(%04X, %04X) // Bad window handle !\n", hWnd, hMenu);
		return FALSE;
		}
Alexandre Julliard's avatar
Alexandre Julliard committed
#ifdef DEBUG_MENU
Alexandre Julliard's avatar
Alexandre Julliard committed
	printf("SetMenu(%04X, %04X);\n", hWnd, hMenu);
Alexandre Julliard's avatar
Alexandre Julliard committed
#endif
Alexandre Julliard's avatar
Alexandre Julliard committed
	wndPtr->wIDmenu = hMenu;
Alexandre Julliard's avatar
Alexandre Julliard committed
	lpmenu = (LPPOPUPMENU) GlobalLock(hMenu);
	if (lpmenu == NULL) {
		printf("SetMenu(%04X, %04X) // Bad menu handle !\n", hWnd, hMenu);
		return FALSE;
		}
	lpmenu->ownerWnd = hWnd;
	ResetHiliteFlags(lpmenu);
Alexandre Julliard's avatar
Alexandre Julliard committed
	GlobalUnlock(hMenu);
	return TRUE;
Alexandre Julliard's avatar
Alexandre Julliard committed
}


/**********************************************************************
 *			GetSubMenu		[USER.159]
 */
HMENU GetSubMenu(HMENU hMenu, short nPos)
{
Alexandre Julliard's avatar
Alexandre Julliard committed
	HMENU	hSubMenu;
	LPPOPUPMENU lppop;
	LPMENUITEM 	lpitem;
	int		i;
Alexandre Julliard's avatar
Alexandre Julliard committed
#ifdef DEBUG_MENU
Alexandre Julliard's avatar
Alexandre Julliard committed
	printf("GetSubMenu (%04X, %04X) !\n", hMenu, nPos);
Alexandre Julliard's avatar
Alexandre Julliard committed
#endif
Alexandre Julliard's avatar
Alexandre Julliard committed
	if (hMenu == 0) return 0;
	lppop = (LPPOPUPMENU) GlobalLock(hMenu);
	if (lppop == NULL) return 0;
	lpitem = lppop->firstItem;
	for (i = 0; i < lppop->nItems; i++) {
		if (lpitem == NULL) break;
		if (i == nPos) {
#ifdef DEBUG_MENU
			printf("    found %04x\n", lpitem->item_id);
#endif	    
			if (lpitem->item_flags & MF_POPUP)
				return lpitem->item_id;
			else