Exemple #1
0
static int AutoAwayEvent(WPARAM, LPARAM lParam)
{
	MIRANDA_IDLE_INFO mii = { sizeof(mii) };
	CallService(MS_IDLE_GETIDLEINFO, 0, (LPARAM)&mii);

	if (mii.idlesoundsoff)
		iBreakSounds = (lParam & IDF_ISIDLE) != 0;

	// we don't need to switch the status
	if (mii.aaStatus == 0)
		return 0;

	int numAccounts;
	PROTOACCOUNT** accounts;
	Proto_EnumAccounts(&numAccounts, &accounts);

	for (int i = 0; i < numAccounts; i++) {
		PROTOACCOUNT *pa = accounts[i];
		if (!Proto_IsAccountEnabled(pa) || Proto_IsAccountLocked(pa))
			continue;

		int currentstatus = CallProtoService(pa->szModuleName, PS_GETSTATUS, 0, 0);
		int statusbits = CallProtoService(pa->szModuleName, PS_GETCAPS, PFLAGNUM_2, 0);
		int status = mii.aaStatus;
		if (!(statusbits & Proto_Status2Flag(status))) {
			// the protocol doesnt support the given status
			if (statusbits & Proto_Status2Flag(ID_STATUS_AWAY))
				status = ID_STATUS_AWAY;
		}
		if (lParam & IDF_ISIDLE) {
			if (currentstatus != ID_STATUS_ONLINE && currentstatus != ID_STATUS_FREECHAT)
				continue;

			// save old status of account and set to given status
			db_set_w(NULL, AA_MODULE, pa->szModuleName, currentstatus);
			Proto_SetStatus(pa->szModuleName, status);
		}
		else {
			int oldstatus = db_get_w(NULL, AA_MODULE, pa->szModuleName, 0);
			if (oldstatus != ID_STATUS_ONLINE && oldstatus != ID_STATUS_FREECHAT)
				continue;

			// returning from idle and this accout was set away, set it back
			db_unset(NULL, AA_MODULE, pa->szModuleName);
			if (!mii.aaLock)
				Proto_SetStatus(pa->szModuleName, oldstatus);
		}
	}

	return 0;
}
Exemple #2
0
void ChangeAllProtoMessages(char *szProto, int statusMode, TCHAR *msg)
{
	if (szProto == NULL) 
	{
		for (int i=0; i < accounts.getCount(); i++)
		{
			PROTOACCOUNT* pa = accounts[i];
			if (!Proto_IsAccountEnabled(pa)) continue;
			if ((CallProtoService(pa->szModuleName, PS_GETCAPS, PFLAGNUM_1, 0) & PF1_MODEMSGSEND) && 
				!Proto_IsAccountLocked(pa))
				CallProtoService(pa->szModuleName, PS_SETAWAYMSGT, statusMode, (LPARAM)msg);
		}
	}
	else 
		CallProtoService(szProto, PS_SETAWAYMSGT, statusMode,(LPARAM)msg);
}
Exemple #3
0
int fnGetAverageMode(int *pNetProtoCount)
{
	int netProtoCount = 0, averageMode = 0;

	for (int i = 0; i < accounts.getCount(); i++) {
		PROTOACCOUNT *pa = accounts[i];
		if (cli.pfnGetProtocolVisibility(pa->szModuleName) == 0 || Proto_IsAccountLocked(pa))
			continue;

		netProtoCount++;

		if (averageMode == 0)
			averageMode = CallProtoServiceInt(NULL, pa->szModuleName, PS_GETSTATUS, 0, 0);
		else if (averageMode > 0 && averageMode != CallProtoServiceInt(NULL, pa->szModuleName, PS_GETSTATUS, 0, 0)) {
			averageMode = -1;
			if (pNetProtoCount == NULL)
				break;
		}
	}

	if (pNetProtoCount) *pNetProtoCount = netProtoCount;
	return averageMode;
}
Exemple #4
0
void RebuildMenuOrder(void)
{
	BYTE bHideStatusMenu = db_get_b(NULL, "CLUI", "DontHideStatusMenu", 0); // cool perversion, though

	//clear statusmenu
	RecursiveDeleteMenu(hStatusMenu);

	//status menu
	if (hStatusMenuObject != 0) {
		CallService(MO_REMOVEMENUOBJECT, (WPARAM)hStatusMenuObject, 0);
		mir_free(hStatusMainMenuHandles);
		mir_free(hStatusMenuHandles);
	}

	hStatusMenuObject = MO_CreateMenuObject("StatusMenu", LPGEN("Status menu"), "StatusMenuCheckService", "StatusMenuExecService");
	MO_SetOptionsMenuObject(hStatusMenuObject, OPT_MENUOBJECT_SET_FREE_SERVICE, (INT_PTR)"CLISTMENUS/FreeOwnerDataStatusMenu");

	hStatusMainMenuHandles = (PMO_IntMenuItem*)mir_calloc(SIZEOF(statusModeList) * sizeof(PMO_IntMenuItem*));
	hStatusMainMenuHandlesCnt = SIZEOF(statusModeList);

	hStatusMenuHandles = (tStatusMenuHandles*)mir_calloc(sizeof(tStatusMenuHandles)*accounts.getCount());
	hStatusMenuHandlesCnt = accounts.getCount();

	FreeMenuProtos();

	for (int s = 0; s < accounts.getCount(); s++) {
		int i = cli.pfnGetAccountIndexByPos(s);
		if (i == -1)
			continue;

		PROTOACCOUNT *pa = accounts[i];
		int pos = 0;
		if (!bHideStatusMenu && !cli.pfnGetProtocolVisibility(pa->szModuleName))
			continue;

		DWORD flags = pa->ppro->GetCaps(PFLAGNUM_2, 0) & ~pa->ppro->GetCaps(PFLAGNUM_5, 0);
		HICON ic;
		TCHAR tbuf[256];

		//adding root
		TMO_MenuItem tmi = { 0 };
		tmi.cbSize = sizeof(tmi);
		tmi.flags = CMIF_TCHAR | CMIF_ROOTHANDLE | CMIF_KEEPUNTRANSLATED;
		tmi.position = pos++;
		tmi.hIcon = ic = (HICON)CallProtoServiceInt(NULL, pa->szModuleName, PS_LOADICON, PLI_PROTOCOL | PLIF_SMALL, 0);

		if (Proto_IsAccountLocked(pa) && cli.bDisplayLocked) {
			mir_sntprintf(tbuf, SIZEOF(tbuf), TranslateT("%s (locked)"), pa->tszAccountName);
			tmi.ptszName = tbuf;
		}
		else tmi.ptszName = pa->tszAccountName;

		//owner data
		StatusMenuExecParam *smep = (StatusMenuExecParam*)mir_calloc(sizeof(StatusMenuExecParam));
		smep->proto = mir_strdup(pa->szModuleName);
		tmi.ownerdata = smep;

		PMO_IntMenuItem rootmenu = MO_AddNewMenuItem(hStatusMenuObject, &tmi);

		memset(&tmi, 0, sizeof(tmi));
		tmi.cbSize = sizeof(tmi);
		tmi.flags = CMIF_TCHAR | CMIF_ROOTHANDLE | CMIF_KEEPUNTRANSLATED;
		tmi.root = rootmenu;
		tmi.position = pos++;
		tmi.hIcon = ic;

		//owner data
		smep = (StatusMenuExecParam*)mir_calloc(sizeof(StatusMenuExecParam));
		smep->proto = mir_strdup(pa->szModuleName);
		tmi.ownerdata = smep;

		if (Proto_IsAccountLocked(pa))
			tmi.flags |= CMIF_CHECKED;

		if ((tmi.flags & CMIF_CHECKED) && cli.bDisplayLocked) {
			mir_sntprintf(tbuf, SIZEOF(tbuf), TranslateT("%s (locked)"), pa->tszAccountName);
			tmi.ptszName = tbuf;
		}
		else tmi.ptszName = pa->tszAccountName;

		PMO_IntMenuItem menuHandle = MO_AddNewMenuItem(hStatusMenuObject, &tmi);
		((StatusMenuExecParam*)tmi.ownerdata)->protoindex = (int)menuHandle;
		MO_ModifyMenuItem(menuHandle, &tmi);

		cli.menuProtos = (MenuProto*)mir_realloc(cli.menuProtos, sizeof(MenuProto)*(cli.menuProtoCount + 1));
		memset(&(cli.menuProtos[cli.menuProtoCount]), 0, sizeof(MenuProto));
		cli.menuProtos[cli.menuProtoCount].pMenu = rootmenu;
		cli.menuProtos[cli.menuProtoCount].szProto = mir_strdup(pa->szModuleName);

		cli.menuProtoCount++;

		char buf[256];
		mir_snprintf(buf, SIZEOF(buf), "RootProtocolIcon_%s", pa->szModuleName);
		MO_SetOptionsMenuItem(menuHandle, OPT_MENUITEMSETUNIQNAME, (INT_PTR)buf);

		DestroyIcon(ic);
		pos += 500000;

		for (int j = 0; j < SIZEOF(statusModeList); j++) {
			if (!(flags & statusModePf2List[j]))
				continue;

			// adding
			memset(&tmi, 0, sizeof(tmi));
			tmi.cbSize = sizeof(tmi);
			tmi.flags = CMIF_ROOTHANDLE | CMIF_TCHAR;
			if (statusModeList[j] == ID_STATUS_OFFLINE)
				tmi.flags |= CMIF_CHECKED;
			tmi.root = rootmenu;
			tmi.position = pos++;
			tmi.ptszName = cli.pfnGetStatusModeDescription(statusModeList[j], GSMDF_UNTRANSLATED);
			tmi.hIcon = LoadSkinProtoIcon(pa->szModuleName, statusModeList[j]);

			// owner data
			StatusMenuExecParam *smep = (StatusMenuExecParam*)mir_calloc(sizeof(StatusMenuExecParam));
			smep->custom = FALSE;
			smep->status = statusModeList[j];
			smep->protoindex = i;
			smep->proto = mir_strdup(pa->szModuleName);
			tmi.ownerdata = smep;

			hStatusMenuHandles[i].protoindex = i;
			hStatusMenuHandles[i].protostatus[j] = statusModeList[j];
			hStatusMenuHandles[i].menuhandle[j] = MO_AddNewMenuItem(hStatusMenuObject, &tmi);

			char buf[256];
			mir_snprintf(buf, SIZEOF(buf), "ProtocolIcon_%s_%s", pa->szModuleName, tmi.pszName);
			MO_SetOptionsMenuItem(hStatusMenuHandles[i].menuhandle[j], OPT_MENUITEMSETUNIQNAME, (INT_PTR)buf);

			IcoLib_ReleaseIcon(tmi.hIcon, 0);
		}
	}

	NotifyEventHooks(cli.hPreBuildStatusMenuEvent, 0, 0);
	int pos = 200000;

	// add to root menu
	for (int j = 0; j < SIZEOF(statusModeList); j++) {
		for (int i = 0; i < accounts.getCount(); i++) {
			PROTOACCOUNT *pa = accounts[i];
			if (!bHideStatusMenu && !cli.pfnGetProtocolVisibility(pa->szModuleName))
				continue;

			DWORD flags = pa->ppro->GetCaps(PFLAGNUM_2, 0) & ~pa->ppro->GetCaps(PFLAGNUM_5, 0);
			if (!(flags & statusModePf2List[j]))
				continue;

			TMO_MenuItem tmi = { sizeof(tmi) };
			tmi.flags = CMIF_ROOTHANDLE | CMIF_TCHAR;
			if (statusModeList[j] == ID_STATUS_OFFLINE)
				tmi.flags |= CMIF_CHECKED;

			tmi.hIcon = LoadSkinIcon(skinIconStatusList[j]);
			tmi.position = pos++;
			tmi.hotKey = MAKELPARAM(MOD_CONTROL, '0' + j);

			//owner data
			StatusMenuExecParam *smep = (StatusMenuExecParam*)mir_calloc(sizeof(StatusMenuExecParam));
			smep->status = statusModeList[j];
			tmi.ownerdata = smep;
			{
				TCHAR buf[256], hotkeyName[100];
				WORD hotKey = GetHotkeyValue(statusHotkeys[j]);
				HotkeyToName(hotkeyName, SIZEOF(hotkeyName), HIBYTE(hotKey), LOBYTE(hotKey));
				mir_sntprintf(buf, SIZEOF(buf), _T("%s\t%s"),
					cli.pfnGetStatusModeDescription(statusModeList[j], 0), hotkeyName);
				tmi.ptszName = buf;
				tmi.hotKey = MAKELONG(HIBYTE(hotKey), LOBYTE(hotKey));
				hStatusMainMenuHandles[j] = MO_AddNewMenuItem(hStatusMenuObject, &tmi);
			}

			char buf[256];
			mir_snprintf(buf, SIZEOF(buf), "Root2ProtocolIcon_%s_%s", pa->szModuleName, tmi.pszName);
			MO_SetOptionsMenuItem(hStatusMainMenuHandles[j], OPT_MENUITEMSETUNIQNAME, (INT_PTR)buf);

			IcoLib_ReleaseIcon(tmi.hIcon, 0);
			break;
		}
	}

	BuildStatusMenu(0, 0);
}
Exemple #5
0
INT_PTR StatusMenuExecService(WPARAM wParam, LPARAM)
{
	StatusMenuExecParam *smep = (StatusMenuExecParam*)wParam;
	if (smep != NULL) {
		if (smep->custom) {
			if (smep->svc && *smep->svc)
				CallService(smep->svc, 0, (LPARAM)smep->hMenuItem);
		}
		else {
			if (smep->status == 0 && smep->protoindex != 0 && smep->proto != NULL) {
				PMO_IntMenuItem pimi;
				char *prot = smep->proto;
				char szHumanName[64] = { 0 };
				PROTOACCOUNT *acc = Proto_GetAccount(smep->proto);
				bool bIsLocked = !Proto_IsAccountLocked(acc);
				db_set_b(NULL, prot, "LockMainStatus", bIsLocked);

				CallProtoServiceInt(NULL, smep->proto, PS_GETNAME, (WPARAM)SIZEOF(szHumanName), (LPARAM)szHumanName);
				pimi = MO_GetIntMenuItem((HGENMENU)smep->protoindex);
				PMO_IntMenuItem root = (PMO_IntMenuItem)pimi->mi.root;
				mir_free(pimi->mi.pszName);
				mir_free(root->mi.pszName);
				if (bIsLocked) {
					TCHAR buf[256];
					pimi->mi.flags |= CMIF_CHECKED;
					if (cli.bDisplayLocked) {
						mir_sntprintf(buf, SIZEOF(buf), TranslateT("%s (locked)"), acc->tszAccountName);
						pimi->mi.ptszName = mir_tstrdup(buf);
						root->mi.ptszName = mir_tstrdup(buf);
					}
					else {
						pimi->mi.ptszName = mir_tstrdup(acc->tszAccountName);
						root->mi.ptszName = mir_tstrdup(acc->tszAccountName);
					}
				}
				else {
					pimi->mi.ptszName = mir_tstrdup(acc->tszAccountName);
					root->mi.ptszName = mir_tstrdup(acc->tszAccountName);
					pimi->mi.flags &= ~CMIF_CHECKED;
				}
				if (cli.hwndStatus)
					InvalidateRect(cli.hwndStatus, NULL, TRUE);
			}
			else if (smep->proto != NULL) {
				Proto_SetStatus(smep->proto, smep->status);
				NotifyEventHooks(hStatusModeChangeEvent, smep->status, (LPARAM)smep->proto);
			}
			else {
				int MenusProtoCount = 0;

				for (int i = 0; i < accounts.getCount(); i++)
					if (cli.pfnGetProtocolVisibility(accounts[i]->szModuleName))
						MenusProtoCount++;

				cli.currentDesiredStatusMode = smep->status;

				for (int j = 0; j < accounts.getCount(); j++) {
					PROTOACCOUNT *pa = accounts[j];
					if (!Proto_IsAccountEnabled(pa))
						continue;
					if (MenusProtoCount > 1 && Proto_IsAccountLocked(pa))
						continue;

					Proto_SetStatus(pa->szModuleName, cli.currentDesiredStatusMode);
				}
				NotifyEventHooks(hStatusModeChangeEvent, cli.currentDesiredStatusMode, 0);
				db_set_w(NULL, "CList", "Status", (WORD)cli.currentDesiredStatusMode);
				return 1;
			}
		}
	}

	return 0;
}