int MO_SetOptionsMenuItem(WPARAM wParam,LPARAM lParam)
{
	lpOptParam lpop;
	PMO_IntMenuItem pimi;
	int objidx;

	if (!isGenMenuInited) return -1;
	if (lParam==0){return(0);}
	lockmo();
	setcnt++;
	__try
	{
		lpop=(lpOptParam)lParam;
		pimi=MO_GetIntMenuItem(lpop->Handle);
		if (pimi==NULL){unlockmo();return(-1);}
		objidx=GetObjIdxByItemId(pimi->id);
		if (objidx==-1){unlockmo();return(-1);}

		switch(lpop->Setting) {
	 case OPT_MENUITEMSETUNIQNAME:
		 if (!(pimi->mi.flags&CMIF_ROOTPOPUP)) {
			 FreeAndNil(&pimi->UniqName);
			 pimi->UniqName=mir_strdup((char*)lpop->Value);
		 }
		 break;
		}
		return(1);
	}
	__finally
	{
		setcnt--;
		unlockmo();
	}
	return 1;
}
MIR_APP_DLL(int) Menu_ConfigureItem(HGENMENU hItem, int iOption, INT_PTR value)
{
	if (!bIsGenMenuInited)
		return -1;

	mir_cslock lck(csMenuHook);
	TMO_IntMenuItem *pimi = MO_GetIntMenuItem(hItem);
	if (pimi == NULL)
		return -1;

	switch (iOption) {
	case MCI_OPT_UNIQUENAME:
		replaceStr(pimi->UniqName, (char*)value);
		return 0;

	case MCI_OPT_HOTKEY:
		pimi->hotKey = (DWORD)value;
		return 0;

	case MCI_OPT_EXECPARAM:
		pimi->execParam = value;
		return 0;
	}

	return 1;
}
Beispiel #3
0
int MO_SetOptionsMenuItem( PMO_IntMenuItem aHandle, int setting, INT_PTR value )
{
	if ( !bIsGenMenuInited )
		return -1;

	EnterCriticalSection( &csMenuHook );
	PMO_IntMenuItem pimi = MO_GetIntMenuItem( aHandle );
	if ( !pimi ) {
		LeaveCriticalSection( &csMenuHook );
		return -1;
	}

	int res = -1;
	__try 
	{
		res = 1;
		if ( setting == OPT_MENUITEMSETUNIQNAME ) {
			mir_free( pimi->UniqName );
			pimi->UniqName = mir_strdup(( char* )value );
		}
	}
	__except( EXCEPTION_EXECUTE_HANDLER ) {}

	LeaveCriticalSection( &csMenuHook );
	return res;
}
Beispiel #4
0
INT_PTR MO_RemoveMenuItem(WPARAM wParam, LPARAM)
{
	EnterCriticalSection( &csMenuHook );
	PMO_IntMenuItem pimi = MO_GetIntMenuItem(( HGENMENU )wParam );
	if ( !pimi ) {
		LeaveCriticalSection( &csMenuHook );
		return -1;
	}

	if ( pimi->submenu.first ) {
		MO_RecursiveWalkMenu( pimi->submenu.first, FreeMenuItem, NULL );
		pimi->submenu.first = NULL;
	}

	PMO_IntMenuItem prev = MO_RecursiveWalkMenu( pimi->owner->first, FindParent, pimi );
	if ( prev )
		prev->next = pimi->next;
	if ( pimi->owner->first == pimi )
		pimi->owner->first = pimi->next;
	if ( pimi->owner->last == pimi )
		pimi->owner->last = prev;

	pimi->signature = 0; // invalidate all future calls to that object
	pimi->parent->freeItem( pimi );

	LeaveCriticalSection( &csMenuHook );
	return 0;
}
Beispiel #5
0
BOOL FindMenuHanleByGlobalID(HMENU hMenu, PMO_IntMenuItem id, MenuItemData* itdat)
{
	if (!itdat)
		return FALSE;

	BOOL inSub = FALSE;

	MENUITEMINFO mii = { sizeof(mii) };
	mii.fMask = MIIM_SUBMENU | MIIM_DATA;
	for (int i = GetMenuItemCount(hMenu) - 1; i >= 0; i--) {
		GetMenuItemInfo(hMenu, i, TRUE, &mii);
		if (mii.fType == MFT_SEPARATOR)
			continue;

		if (mii.hSubMenu)
			inSub = FindMenuHanleByGlobalID(mii.hSubMenu, id, itdat);
		if (inSub)
			return inSub;

		PMO_IntMenuItem pimi = MO_GetIntMenuItem((HGENMENU)mii.dwItemData);
		if (pimi != NULL) {
			if (pimi == id) {
				itdat->OwnerMenu = hMenu;
				itdat->position = i;
				return TRUE;
			}
		}
	}

	return FALSE;
}
static UINT GetMenuItemTypeData(HMENU hMenu, int uItem, TMO_IntMenuItem* &p)
{
	MENUITEMINFO mii = { 0 };
	mii.cbSize = sizeof(mii);
	mii.fMask = MIIM_DATA | MIIM_TYPE;
	GetMenuItemInfo(hMenu, uItem, TRUE, &mii);
	p = MO_GetIntMenuItem((HGENMENU)mii.dwItemData);
	return mii.fType;
}
MIR_APP_DLL(void*) Menu_GetItemData(HGENMENU hMenuItem)
{
	if (!bIsGenMenuInited)
		return NULL;

	mir_cslock lck(csMenuHook);
	TMO_IntMenuItem *pimi = MO_GetIntMenuItem(hMenuItem);
	return (pimi) ? pimi->pUserData : NULL;
}
MIR_APP_DLL(HGENMENU) Menu_GetDefaultItem(HGENMENU hMenu)
{
	if (!bIsGenMenuInited)
		return NULL;

	TMO_IntMenuItem *pimi = MO_GetIntMenuItem(hMenu);
	mir_cslock lck(csMenuHook);
	return (pimi) ? MO_RecursiveWalkMenu(pimi, FindDefaultItem, NULL) : NULL;
}
Beispiel #9
0
INT_PTR MO_GetDefaultMenuItem(WPARAM wParam, LPARAM)
{
	if ( !bIsGenMenuInited )
		return -1;

	PMO_IntMenuItem pimi = MO_GetIntMenuItem(( HGENMENU )wParam);
	EnterCriticalSection( &csMenuHook );
	if ( pimi )
		pimi = MO_RecursiveWalkMenu( pimi, FindDefaultItem, NULL );

	LeaveCriticalSection( &csMenuHook );
	return ( INT_PTR )pimi;
}
Beispiel #10
0
MIR_APP_DLL(int) Menu_GetItemInfo(HGENMENU hMenuItem, TMO_MenuItem &pInfo)
{
	if (!bIsGenMenuInited)
		return -1;

	TMO_IntMenuItem *pimi = MO_GetIntMenuItem(hMenuItem);
	mir_cslock lck(csMenuHook);
	if (pimi == NULL)
		return -1;

	pInfo = pimi->mi;
	return 0;
}
Beispiel #11
0
MIR_APP_DLL(HGENMENU) Menu_AddItem(int hMenuObject, TMO_MenuItem *pmi, void *pUserData)
{
	if (!bIsGenMenuInited || pmi == NULL)
		return NULL;

	mir_cslock lck(csMenuHook);
	TIntMenuObject *pmo = GetMenuObjbyId(hMenuObject);
	if (pmo == NULL)
		return NULL;

	TMO_IntMenuItem* p = (TMO_IntMenuItem*)mir_calloc(sizeof(TMO_IntMenuItem));
	p->parent = pmo;
	p->signature = MENUITEM_SIGNATURE;
	p->iCommand = GetNextObjectMenuItemId();
	p->mi = *pmi;
	p->iconId = -1;
	p->originalPosition = pmi->position;
	p->pUserData = pUserData;

	if (pmi->flags & CMIF_UNICODE)
		p->mi.name.t = mir_tstrdup(pmi->name.t);
	else
		p->mi.name.t = mir_a2u(pmi->name.a);

	if (pmi->hIcon != NULL && !bIconsDisabled) {
		HANDLE hIcolibItem = IcoLib_IsManaged(pmi->hIcon);
		if (hIcolibItem != NULL) {
			HICON hIcon = IcoLib_GetIconByHandle(hIcolibItem, false);
			p->iconId = ImageList_AddIcon(pmo->m_hMenuIcons, hIcon);
			p->hIcolibItem = hIcolibItem;
			IcoLib_ReleaseIcon(hIcon);
		}
		else p->iconId = ImageList_AddIcon(pmo->m_hMenuIcons, pmi->hIcon);
	}

	TMO_IntMenuItem *pRoot = (p->mi.root != NULL) ? MO_GetIntMenuItem(p->mi.root) : NULL;
	if (pRoot) {
		p->owner = &pRoot->submenu;

		if (pRoot->iconId == -1)
			pRoot->iconId = p->iconId;
	}
	else p->owner = &pmo->m_items;

	if (!p->owner->first)
		p->owner->first = p;
	if (p->owner->last)
		p->owner->last->next = p;
	p->owner->last = p;
	return p;
}
Beispiel #12
0
static INT_PTR ShowHideMenuItem(WPARAM wParam, LPARAM lParam)
{
	PMO_IntMenuItem pimi = MO_GetIntMenuItem((HGENMENU)wParam);
	if (pimi == NULL)
		return 1;

	TMO_MenuItem tmi = { sizeof(tmi) };
	tmi.flags = CMIM_FLAGS + pimi->mi.flags;
	if (lParam)
		tmi.flags &= ~CMIF_HIDDEN;
	else
		tmi.flags |= CMIF_HIDDEN;

	return MO_ModifyMenuItem((PMO_IntMenuItem)wParam, &tmi);
}
static int WhereToPlace(HMENU hMenu,PMO_MenuItem mi,MENUITEMINFO *mii,ListParam *param)
{
	int i=0;

	mii->fMask=MIIM_SUBMENU|MIIM_DATA;
	for ( i=GetMenuItemCount(hMenu)-1; i >= 0; i-- ) {
		GetMenuItemInfo(hMenu,i,TRUE,mii);
		if ( mii->fType != MFT_SEPARATOR ) {
			PMO_IntMenuItem pimi = MO_GetIntMenuItem(mii->dwItemData);
			if ( pimi != NULL )
				if ( pimi->mi.position <= mi->position ) 
					break;
	}	}

	return i+1;
}
Beispiel #14
0
static void Menu_SetItemFlags(HGENMENU hMenuItem, bool bSet, int mask)
{
	TMO_IntMenuItem *pimi = MO_GetIntMenuItem(hMenuItem);
	if (pimi == NULL)
		return;

	int flags = pimi->mi.flags;
	if (bSet)
		flags |= mask;
	else
		flags &= ~mask;

	// we allow to set only first 3 bits
	mir_cslock lck(csMenuHook);
	pimi->mi.flags = flags | (pimi->mi.flags & 0xFFFFFFF8);
}
Beispiel #15
0
//wparam MenuItemHandle
//return ownerdata useful to free ownerdata before delete menu item,
//NULL on error.
INT_PTR MO_MenuItemGetOwnerData(WPARAM wParam, LPARAM)
{
	if ( !bIsGenMenuInited )
		return -1;

	EnterCriticalSection( &csMenuHook );
	PMO_IntMenuItem pimi = MO_GetIntMenuItem(( HGENMENU )wParam );
	if ( !pimi ) {
		LeaveCriticalSection( &csMenuHook );
		return -1;
	}

	INT_PTR res = ( INT_PTR )pimi->mi.ownerdata;
	LeaveCriticalSection( &csMenuHook );
	return res;
}
Beispiel #16
0
MIR_APP_DLL(BOOL) Menu_ProcessCommand(HGENMENU hMenuItem, LPARAM lParam)
{
	if (!bIsGenMenuInited)
		return false;

	TMO_IntMenuItem *pimi;
	{
		mir_cslock lck(csMenuHook);
		if ((pimi = MO_GetIntMenuItem(hMenuItem)) == NULL)
			return false;
	}

	LPCSTR srvname = pimi->parent->ExecService;
	CallService(srvname, (WPARAM)pimi->pUserData, lParam);
	return true;
}
Beispiel #17
0
static int WhereToPlace( HMENU hMenu, PMO_MenuItem mi )
{
	MENUITEMINFO mii = { 0 };
	mii.cbSize = MENUITEMINFO_V4_SIZE;
	mii.fMask = MIIM_SUBMENU | MIIM_DATA;
	for ( int i=GetMenuItemCount( hMenu )-1; i >= 0; i-- ) {
		GetMenuItemInfo( hMenu, i, TRUE, &mii );
		if ( mii.fType != MFT_SEPARATOR ) {
			PMO_IntMenuItem pimi = MO_GetIntMenuItem(( HGENMENU )mii.dwItemData);
			if ( pimi != NULL )
				if ( pimi->mi.position <= mi->position )
					return i+1;
	}	}

	return 0;
}
//wparam=0
//lparam=LPMEASUREITEMSTRUCT
static int MO_MeasureMenuItem(WPARAM wParam,LPARAM lParam)
{
	PMO_IntMenuItem pimi=NULL;
	LPMEASUREITEMSTRUCT mis=(LPMEASUREITEMSTRUCT)lParam;

	if (!isGenMenuInited) return -1;

	if (mis==NULL){return(FALSE);}
	pimi=MO_GetIntMenuItem(mis->itemData);
	if (pimi==NULL) return FALSE;
	if (pimi->iconId==-1) return FALSE;

	mis->itemWidth=max(0,GetSystemMetrics(SM_CXSMICON)-GetSystemMetrics(SM_CXMENUCHECK)+4);
	mis->itemHeight=GetSystemMetrics(SM_CYSMICON)+2;
	return TRUE;
}
Beispiel #19
0
//wparam=MenuItemHandle
//lparam=PMO_MenuItem
INT_PTR MO_GetMenuItem(WPARAM wParam,LPARAM lParam)
{
	PMO_MenuItem mi = (PMO_MenuItem)lParam;
	if ( !bIsGenMenuInited || mi == NULL )
		return -1;

	PMO_IntMenuItem pimi = MO_GetIntMenuItem(( HGENMENU )wParam);
	EnterCriticalSection( &csMenuHook );
	if ( !pimi ) {
		LeaveCriticalSection( &csMenuHook );
		return -1;
	}

	*mi = pimi->mi;
	LeaveCriticalSection( &csMenuHook );
	return 0;
}
//wparam=MenuItemHandle
//lparam=PMO_MenuItem
int MO_GetMenuItem(WPARAM wParam,LPARAM lParam)
{
	PMO_IntMenuItem pimi;
	PMO_MenuItem mi=(PMO_MenuItem)lParam;

	if (!isGenMenuInited) return -1;
	if (mi==NULL){return(-1);}
	lockmo();
	pimi=MO_GetIntMenuItem(wParam);
	if (pimi!=NULL){
		*mi=(pimi->mi);
		unlockmo();
		return(0);
	}
	unlockmo();
	return(-1);
}
Beispiel #21
0
//wparam=0
//lparam=LPDRAWITEMSTRUCT
int MO_DrawMenuItem( LPDRAWITEMSTRUCT dis )
{
	if ( !bIsGenMenuInited )
		return -1;

	if ( dis == NULL )
		return FALSE;

	EnterCriticalSection( &csMenuHook );

	PMO_IntMenuItem pimi = MO_GetIntMenuItem(( HGENMENU )dis->itemData );
	if ( pimi == NULL || pimi->iconId == -1 ) {
		LeaveCriticalSection( &csMenuHook );
		return FALSE;
	}

	int y = (dis->rcItem.bottom - dis->rcItem.top - GetSystemMetrics(SM_CYSMICON))/2+1;
	if ( dis->itemState & ODS_SELECTED ) {
		if ( dis->itemState & ODS_CHECKED ) {
			RECT rc;
			rc.left = 2; rc.right = GetSystemMetrics(SM_CXSMICON)+2;
			rc.top = y; rc.bottom = rc.top+GetSystemMetrics(SM_CYSMICON)+2;
			FillRect(dis->hDC, &rc, GetSysColorBrush( COLOR_HIGHLIGHT ));
			ImageList_DrawEx( pimi->parent->m_hMenuIcons, pimi->iconId, dis->hDC, 2, y, 0, 0, CLR_NONE, CLR_DEFAULT, ILD_SELECTED );
		}
		else ImageList_DrawEx( pimi->parent->m_hMenuIcons, pimi->iconId, dis->hDC, 2, y, 0, 0, CLR_NONE, CLR_DEFAULT, ILD_FOCUS );
	}
	else {
		if ( dis->itemState & ODS_CHECKED) {
			RECT rc;
			rc.left = 0; rc.right = GetSystemMetrics(SM_CXSMICON)+4;
			rc.top = y-2; rc.bottom = rc.top + GetSystemMetrics(SM_CYSMICON)+4;
			DrawEdge(dis->hDC,&rc,BDR_SUNKENOUTER,BF_RECT);
			InflateRect(&rc,-1,-1);
			COLORREF menuCol = GetSysColor(COLOR_MENU);
			COLORREF hiliteCol = GetSysColor(COLOR_3DHIGHLIGHT);
			HBRUSH hBrush = CreateSolidBrush(RGB((GetRValue(menuCol)+GetRValue(hiliteCol))/2,(GetGValue(menuCol)+GetGValue(hiliteCol))/2,(GetBValue(menuCol)+GetBValue(hiliteCol))/2));
			FillRect(dis->hDC,&rc,GetSysColorBrush(COLOR_MENU));
			DeleteObject(hBrush);
			ImageList_DrawEx(pimi->parent->m_hMenuIcons,pimi->iconId,dis->hDC,2,y,0,0,CLR_NONE,GetSysColor(COLOR_MENU),ILD_BLEND50);
		}
		else ImageList_DrawEx(pimi->parent->m_hMenuIcons,pimi->iconId,dis->hDC,2,y,0,0,CLR_NONE,CLR_NONE,ILD_NORMAL);
	}
	LeaveCriticalSection( &csMenuHook );
	return TRUE;
}
Beispiel #22
0
MIR_APP_DLL(int) Menu_ModifyItem(HGENMENU hMenuItem, const TCHAR *ptszName, HANDLE hIcolib, int iFlags)
{
	if (!bIsGenMenuInited)
		return -1;

	mir_cslock lck(csMenuHook);

	TMO_IntMenuItem *pimi = MO_GetIntMenuItem(hMenuItem);
	if (pimi == NULL)
		return -1;

	if (ptszName != NULL)
		replaceStrT(pimi->mi.name.t, ptszName);

	if (iFlags != -1) {
		// we allow to set only first 3 bits
		int oldflags = (pimi->mi.flags & 0xFFFFFFF8);
		pimi->mi.flags = (iFlags & 0x07) | oldflags;
	}

	if (hIcolib != INVALID_HANDLE_VALUE && !bIconsDisabled) {
		HANDLE hIcolibItem = IcoLib_IsManaged((HICON)hIcolib);
		if (hIcolibItem) {
			HICON hIcon = IcoLib_GetIconByHandle(hIcolibItem, false);
			if (hIcon != NULL) {
				pimi->hIcolibItem = hIcolibItem;
				pimi->iconId = ImageList_ReplaceIcon(pimi->parent->m_hMenuIcons, pimi->iconId, hIcon);
				IcoLib_ReleaseIcon(hIcon);
			}
			else pimi->iconId = -1, pimi->hIcolibItem = NULL;
		}
		else {
			pimi->mi.hIcon = (HICON)hIcolib;
			if (hIcolib != NULL)
				pimi->iconId = ImageList_ReplaceIcon(pimi->parent->m_hMenuIcons, pimi->iconId, (HICON)hIcolib);
			else
				pimi->iconId = -1;	  //fixme, should remove old icon & shuffle all iconIds
		}
		if (pimi->hBmp) {
			DeleteObject(pimi->hBmp);
			pimi->hBmp = NULL;
		}
	}

	return 0;
}
Beispiel #23
0
int MO_ProcessCommand( PMO_IntMenuItem aHandle, LPARAM lParam )
{
	if ( !bIsGenMenuInited )
		return -1;

	EnterCriticalSection( &csMenuHook );
	PMO_IntMenuItem pimi = MO_GetIntMenuItem( aHandle );
	if ( !pimi ) {
		LeaveCriticalSection( &csMenuHook );
		return -1;
	}

	char *srvname = pimi->parent->ExecService;
	void *ownerdata = pimi->mi.ownerdata;
	LeaveCriticalSection( &csMenuHook );
	CallService( srvname, ( WPARAM )ownerdata, lParam );
	return 1;
}
Beispiel #24
0
static void InsertMenuItemWithSeparators(HMENU hMenu, int uItem, MENUITEMINFO *lpmii)
{
	TMO_IntMenuItem *pimi = MO_GetIntMenuItem((HGENMENU)lpmii->dwItemData), *p;
	if (pimi == NULL)
		return;

	// check for separator before
	if (uItem) {
		UINT fType = GetMenuItemTypeData(hMenu, uItem - 1, p);
		if (p != NULL && fType != MFT_SEPARATOR) {
			if ((p->mi.position / SEPARATORPOSITIONINTERVAL) != (pimi->mi.position / SEPARATORPOSITIONINTERVAL)) {
				// but might be supposed to be after the next one instead
				if (!(uItem < GetMenuItemCount(hMenu) && GetMenuItemType(hMenu, uItem) == MFT_SEPARATOR))
					InsertSeparator(hMenu, uItem);
				uItem++;
			}
		}
	}

	// check for separator after
	if (uItem < GetMenuItemCount(hMenu)) {
		UINT fType = GetMenuItemTypeData(hMenu, uItem, p);
		if (p != NULL && fType != MFT_SEPARATOR)
			if ((p->mi.position / SEPARATORPOSITIONINTERVAL) != (pimi->mi.position / SEPARATORPOSITIONINTERVAL))
				InsertSeparator(hMenu, uItem);
	}

	// create local copy *lpmii so we can change some flags
	MENUITEMINFO mii = *lpmii;

	int count = GetMenuItemCount(hMenu);
	if (count != 0 && (count % 33) == 0 && pimi->mi.root != NULL) {
		if (!(mii.fMask & MIIM_FTYPE))
			mii.fType = 0;
		mii.fMask |= MIIM_FTYPE;
		mii.fType |= MFT_MENUBARBREAK;
	}

	if (!pimi->CustomName)
		mii.dwTypeData = GetMenuItemText(pimi);

	InsertMenuItem(hMenu, uItem, TRUE, &mii);
}
Beispiel #25
0
MIR_APP_DLL(BOOL) Menu_DrawItem(DRAWITEMSTRUCT *dis)
{
	if (!bIsGenMenuInited)
		return FALSE;

	if (dis == NULL)
		return FALSE;

	mir_cslock lck(csMenuHook);

	TMO_IntMenuItem *pimi = MO_GetIntMenuItem((HGENMENU)dis->itemData);
	if (pimi == NULL || pimi->iconId == -1)
		return FALSE;

	int y = (dis->rcItem.bottom - dis->rcItem.top - g_iIconSY) / 2 + 1;
	if (dis->itemState & ODS_SELECTED) {
		if (dis->itemState & ODS_CHECKED) {
			RECT rc;
			rc.left = 2; rc.right = g_iIconSX + 2;
			rc.top = y; rc.bottom = rc.top + g_iIconSY + 2;
			FillRect(dis->hDC, &rc, GetSysColorBrush(COLOR_HIGHLIGHT));
			ImageList_DrawEx(pimi->parent->m_hMenuIcons, pimi->iconId, dis->hDC, 2, y, 0, 0, CLR_NONE, CLR_DEFAULT, ILD_SELECTED);
		}
		else ImageList_DrawEx(pimi->parent->m_hMenuIcons, pimi->iconId, dis->hDC, 2, y, 0, 0, CLR_NONE, CLR_DEFAULT, ILD_FOCUS);
	}
	else {
		if (dis->itemState & ODS_CHECKED) {
			RECT rc;
			rc.left = 0; rc.right = g_iIconSX + 4;
			rc.top = y - 2; rc.bottom = rc.top + g_iIconSY + 4;
			DrawEdge(dis->hDC, &rc, BDR_SUNKENOUTER, BF_RECT);
			InflateRect(&rc, -1, -1);
			COLORREF menuCol = GetSysColor(COLOR_MENU);
			COLORREF hiliteCol = GetSysColor(COLOR_3DHIGHLIGHT);
			HBRUSH hBrush = CreateSolidBrush(RGB((GetRValue(menuCol) + GetRValue(hiliteCol)) / 2, (GetGValue(menuCol) + GetGValue(hiliteCol)) / 2, (GetBValue(menuCol) + GetBValue(hiliteCol)) / 2));
			FillRect(dis->hDC, &rc, GetSysColorBrush(COLOR_MENU));
			DeleteObject(hBrush);
			ImageList_DrawEx(pimi->parent->m_hMenuIcons, pimi->iconId, dis->hDC, 2, y, 0, 0, CLR_NONE, GetSysColor(COLOR_MENU), ILD_BLEND50);
		}
		else ImageList_DrawEx(pimi->parent->m_hMenuIcons, pimi->iconId, dis->hDC, 2, y, 0, 0, CLR_NONE, CLR_NONE, ILD_NORMAL);
	}
	return TRUE;
}
//wparam MenuItemHandle
//lparam PMO_MenuItem
int MO_ModifyMenuItem(WPARAM wParam,LPARAM lParam)
{
	PMO_MenuItem pmiparam=(PMO_MenuItem)lParam;
	PMO_IntMenuItem pimi;
	int oldflags;
	int objidx;

	if (!isGenMenuInited) return -1;
	if (pmiparam==NULL){return(-1);}
	lockmo();
	pimi=MO_GetIntMenuItem(wParam);
	if (pimi==NULL){unlockmo();return(-1);}
	if (pmiparam->cbSize!=sizeof(TMO_MenuItem)){unlockmo();return(-1);}
	objidx=GetObjIdxByItemId(pimi->id);
	if (objidx==-1){unlockmo();return(-1);}

	if (pmiparam->flags&CMIM_NAME) {
		FreeAndNil(&pimi->mi.pszName);
		pimi->mi.pszName = mir_tstrdup(pmiparam->pszName);
	}
	if (pmiparam->flags&CMIM_FLAGS) {
		oldflags=(pimi->mi.flags&CMIF_ROOTPOPUP)|(pimi->mi.flags&CMIF_CHILDPOPUP);
		pimi->mi.flags=pmiparam->flags&~CMIM_ALL;
		pimi->mi.flags|=oldflags;
	}
	if (pmiparam->flags&CMIM_ICON) {
		pimi->mi.hIcon=pmiparam->hIcon;
		if (pmiparam->hIcon!=NULL) pimi->iconId=ImageList_ReplaceIcon(MenuObjects[objidx].hMenuIcons,pimi->iconId,pmiparam->hIcon);
		else pimi->iconId=-1;	  //fixme, should remove old icon & shuffle all iconIds
	}
	if (pmiparam->flags&CMIM_HOTKEY) {
		pimi->mi.hotKey=pmiparam->hotKey;
	}
	if (pmiparam->flags&CMIM_HOTKEY) {
		pimi->mi.hotKey=pmiparam->hotKey;
	}
	unlockmo();
	return(0);
}
Beispiel #27
0
//wparam=0
//lparam=LPMEASUREITEMSTRUCT
int MO_MeasureMenuItem( LPMEASUREITEMSTRUCT mis )
{
	// prevent win9x from ugly menus displaying when there is no icon
	mis->itemWidth = 0;
	mis->itemHeight = 0;

	if ( !bIsGenMenuInited )
		return -1;

	if ( mis == NULL )
		return FALSE;

	PMO_IntMenuItem pimi = MO_GetIntMenuItem(( HGENMENU )mis->itemData );
	if ( pimi == NULL )
		return FALSE;

	if ( pimi->iconId == -1 )
		return FALSE;

	mis->itemWidth = max(0,GetSystemMetrics(SM_CXSMICON)-GetSystemMetrics(SM_CXMENUCHECK)+4);
	mis->itemHeight = GetSystemMetrics(SM_CYSMICON)+2;
	return TRUE;
}
Beispiel #28
0
MIR_APP_DLL(BOOL) Menu_MeasureItem(MEASUREITEMSTRUCT *mis)
{
	if (!bIsGenMenuInited)
		return FALSE;

	if (mis == NULL)
		return FALSE;

	// prevent win9x from ugly menus displaying when there is no icon
	mis->itemWidth = 0;
	mis->itemHeight = 0;

	TMO_IntMenuItem *pimi = MO_GetIntMenuItem((HGENMENU)mis->itemData);
	if (pimi == NULL)
		return FALSE;

	if (pimi->iconId == -1)
		return FALSE;

	mis->itemWidth = max(0, g_iIconSX - GetSystemMetrics(SM_CXMENUCHECK) + 4);
	mis->itemHeight = g_iIconSY + 2;
	return TRUE;
}
Beispiel #29
0
MIR_APP_DLL(int) Menu_RemoveItem(HGENMENU hMenuItem)
{
	mir_cslock lck(csMenuHook);
	TMO_IntMenuItem *pimi = MO_GetIntMenuItem(hMenuItem);
	if (pimi == NULL)
		return -1;

	if (pimi->submenu.first) {
		MO_RecursiveWalkMenu(pimi->submenu.first, FreeMenuItem, NULL);
		pimi->submenu.first = NULL;
	}

	TMO_IntMenuItem *prev = MO_RecursiveWalkMenu(pimi->owner->first, FindParent, pimi);
	if (prev)
		prev->next = pimi->next;
	if (pimi->owner->first == pimi)
		pimi->owner->first = pimi->next;
	if (pimi->owner->last == pimi)
		pimi->owner->last = prev;

	pimi->signature = 0; // invalidate all future calls to that object
	pimi->parent->freeItem(pimi);
	return 0;
}
static void InsertMenuItemWithSeparators(HMENU hMenu,int uItem,BOOL fByPosition,MENUITEMINFO *lpmii,ListParam *param)
{
	int thisItemPosition,needSeparator,itemidx;
	MENUITEMINFO mii;
	PMO_IntMenuItem MenuItems=NULL;
	PMO_IntMenuItem pimi=NULL;

	int objid,menuitemid;//id
	int objidx,menuitemidx;//pos in array
	needSeparator=0;

	UnpackGlobalId(lpmii->dwItemData,&objid,&menuitemid);
	if ((objid==-1)||(menuitemid==-1)){return;}
	objidx=GetMenuObjbyId(objid);
	menuitemidx=GetMenuItembyId(objidx,menuitemid);
	if ((objidx==-1)||(menuitemidx==-1)){return;}

	MenuItems=MenuObjects[objidx].MenuItems;
	itemidx=menuitemidx;
	//timi=
	thisItemPosition=(MenuItems)[itemidx].mi.position;

	ZeroMemory(&mii,sizeof(mii));
	mii.cbSize=MENUITEMINFO_V4_SIZE;
	//check for separator before
	if (uItem) {
		mii.fMask=MIIM_SUBMENU|MIIM_DATA|MIIM_TYPE;
		GetMenuItemInfo(hMenu,uItem-1,TRUE,&mii);
		pimi=MO_GetIntMenuItem(mii.dwItemData);
		if (pimi!=NULL)
			if (mii.fType==MFT_SEPARATOR) needSeparator=0;
			else needSeparator=((pimi->mi.position)/SEPARATORPOSITIONINTERVAL)!=thisItemPosition/SEPARATORPOSITIONINTERVAL;
			if (needSeparator) {
				//but might be supposed to be after the next one instead
				mii.fType=0;
				if (uItem<GetMenuItemCount(hMenu)) {
					mii.fMask=MIIM_SUBMENU|MIIM_DATA|MIIM_TYPE;
					GetMenuItemInfo(hMenu,uItem,TRUE,&mii);
				}
				if (mii.fType!=MFT_SEPARATOR) {
					mii.fMask=MIIM_TYPE;
					mii.fType=MFT_SEPARATOR;
					InsertMenuItem(hMenu,uItem,TRUE,&mii);
				}
				uItem++;
			}
	}
	//check for separator after
	if (uItem<GetMenuItemCount(hMenu)) {
		mii.fMask=MIIM_SUBMENU|MIIM_DATA|MIIM_TYPE;
		mii.cch=0;
		GetMenuItemInfo(hMenu,uItem,TRUE,&mii);
		pimi=MO_GetIntMenuItem(mii.dwItemData);
		if (pimi!=NULL)
			if (mii.fType==MFT_SEPARATOR) needSeparator=0;
			else needSeparator=((pimi->mi.position)/SEPARATORPOSITIONINTERVAL)!=thisItemPosition/SEPARATORPOSITIONINTERVAL;
			if (needSeparator) {
				mii.fMask=MIIM_TYPE;
				mii.fType=MFT_SEPARATOR;
				InsertMenuItem(hMenu,uItem,TRUE,&mii);
			}
	}
	if (uItem==GetMenuItemCount(hMenu)-1) {
		TCHAR str[32];
		mii.fMask=MIIM_SUBMENU|MIIM_DATA|MIIM_TYPE;
		mii.dwTypeData=str;
		mii.cch=SIZEOF(str);
		GetMenuItemInfo(hMenu,uItem,TRUE,&mii);
		/*if (param->cntFlag==MENU_CUSTOMITEMMAIN) {
		if (mii.fType==MFT_STRING && !strcmp(mii.dwTypeData,Translate("E&xit"))) {
		//make sure we keep the separator before the exit menu item
		mii.fMask=MIIM_TYPE;
		mii.fType=MFT_SEPARATOR;
		InsertMenuItem(hMenu,uItem,TRUE,&mii);
		}

		}
		*/
	}
	InsertMenuItem(hMenu,uItem,TRUE,lpmii);
}