From 409d7264947ae132f6185cf5c6d1e4d3ff626f80 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Sun, 22 Jun 2014 15:37:37 +0000 Subject: current sub in tabSRMM untied from the meta services git-svn-id: http://svn.miranda-ng.org/main/trunk@9553 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- src/modules/metacontacts/meta_services.cpp | 49 ++++++++++++++++++++++-------- src/modules/metacontacts/meta_utils.cpp | 2 +- src/modules/metacontacts/metacontacts.h | 7 ++++- 3 files changed, 43 insertions(+), 15 deletions(-) (limited to 'src') diff --git a/src/modules/metacontacts/meta_services.cpp b/src/modules/metacontacts/meta_services.cpp index 7852c2c92d..6516bf09f0 100644 --- a/src/modules/metacontacts/meta_services.cpp +++ b/src/modules/metacontacts/meta_services.cpp @@ -40,7 +40,7 @@ HANDLE UINT_PTR setStatusTimerId = 0; BOOL firstSetOnline = TRUE; // see Meta_SetStatus function -LIST arMetaWindows(1); +OBJLIST arMetaWindows(1, NumericKeySortT); /** Get the capabilities of the "MetaContacts" protocol. * @@ -475,7 +475,7 @@ int Meta_ContactDeleted(WPARAM hContact, LPARAM lParam) * @param wParam HANDLE to the contact that we are typing to * @param lParam either PROTOTYPE_SELFTYPING_ON or PROTOTYPE_SELFTYPING_OFF */ -INT_PTR Meta_UserIsTyping(WPARAM hMeta, LPARAM lParam) +static INT_PTR Meta_UserIsTyping(WPARAM hMeta, LPARAM lParam) { DBCachedContact *cc = CheckMeta(hMeta); if (cc == NULL) @@ -501,7 +501,7 @@ INT_PTR Meta_UserIsTyping(WPARAM hMeta, LPARAM lParam) * @param lParam either PROTOTYPE_SELFTYPING_ON or PROTOTYPE_SELFTYPING_OFF */ -int Meta_ContactIsTyping(WPARAM hContact, LPARAM lParam) +static int Meta_ContactIsTyping(WPARAM hContact, LPARAM lParam) { if (!db_mc_isEnabled()) return 0; @@ -521,7 +521,7 @@ int Meta_ContactIsTyping(WPARAM hContact, LPARAM lParam) * */ -int Meta_UserInfo(WPARAM wParam, LPARAM hMeta) +static int Meta_UserInfo(WPARAM wParam, LPARAM hMeta) { DBCachedContact *cc = CheckMeta(hMeta); if (cc == NULL || cc->nDefault == -1) @@ -532,27 +532,42 @@ int Meta_UserInfo(WPARAM wParam, LPARAM hMeta) } // record window open/close status for subs & metas -int Meta_MessageWindowEvent(WPARAM wParam, LPARAM lParam) +static int Meta_MessageWindowEvent(WPARAM wParam, LPARAM lParam) { MessageWindowEventData *mwed = (MessageWindowEventData*)lParam; if (mwed->uType == MSG_WINDOW_EVT_OPEN) { DBCachedContact *cc = currDb->m_cache->GetCachedContact(mwed->hContact); if (cc != NULL) { Meta_UpdateSrmmIcon(cc, db_get_w(cc->contactID, META_PROTO, "Status", ID_STATUS_OFFLINE)); - if (cc->IsMeta()) - arMetaWindows.insert(mwed->hwndWindow); + if (cc->IsMeta()) { + MetaSrmmData *p = new MetaSrmmData; + p->m_hMeta = cc->contactID; + p->m_hSub = db_mc_getMostOnline(cc->contactID); + p->m_hWnd = mwed->hwndWindow; + arMetaWindows.insert(p); + } } } else if (mwed->uType == MSG_WINDOW_EVT_CLOSING) { for (int i = 0; i < arMetaWindows.getCount(); i++) - if (arMetaWindows[i] == mwed->hwndWindow) + if (arMetaWindows[i].m_hWnd == mwed->hwndWindow) arMetaWindows.remove(i); } return 0; } +// returns manually chosen sub in the meta window +static INT_PTR Meta_SrmmCurrentSub(WPARAM hMeta, LPARAM lParam) +{ + MetaSrmmData tmp = { hMeta }; + if (MetaSrmmData *p = arMetaWindows.find(&tmp)) + return p->m_hSub; + + return db_mc_getMostOnline(hMeta); +} + // we assume that it could be called only for the metacontacts -int Meta_SrmmIconClicked(WPARAM hMeta, LPARAM lParam) +static int Meta_SrmmIconClicked(WPARAM hMeta, LPARAM lParam) { StatusIconClickData *sicd = (StatusIconClickData*)lParam; if (lstrcmpA(sicd->szModule, META_PROTO)) @@ -563,7 +578,7 @@ int Meta_SrmmIconClicked(WPARAM hMeta, LPARAM lParam) return 0; HMENU hMenu = CreatePopupMenu(); - int iDefault = Meta_GetContactNumber(cc, Meta_GetMostOnline(cc)); + int iDefault = Meta_GetContactNumber(cc, CallService(MS_MC_GETSRMMSUB, cc->contactID, 0)); TCHAR tszItemName[200]; MENUITEMINFO mii = { sizeof(mii) }; @@ -575,7 +590,8 @@ int Meta_SrmmIconClicked(WPARAM hMeta, LPARAM lParam) if (szProto == NULL) continue; PROTOACCOUNT *pa = ProtoGetAccount(szProto); - if (pa == NULL) continue; + if (pa == NULL) + continue; mir_sntprintf(tszItemName, SIZEOF(tszItemName), _T("%s [%s]"), cli.pfnGetContactDisplayName(cc->pSubs[i], 0), pa->tszAccountName); @@ -586,8 +602,14 @@ int Meta_SrmmIconClicked(WPARAM hMeta, LPARAM lParam) } UINT res = TrackPopupMenu(hMenu, TPM_NONOTIFY | TPM_RETURNCMD | TPM_BOTTOMALIGN | TPM_LEFTALIGN, sicd->clickLocation.x, sicd->clickLocation.y, 0, cli.hwndContactTree, NULL); - if (res > 0) - db_mc_setDefault(cc->contactID, Meta_GetContactHandle(cc, res-1), true); + if (res > 0) { + MCONTACT hChosen = Meta_GetContactHandle(cc, res - 1); + db_mc_setDefault(cc->contactID, hChosen, true); + + MetaSrmmData tmp = { cc->contactID }; + if (MetaSrmmData *p = arMetaWindows.find(&tmp)) + p->m_hSub = hChosen; + } return 0; } @@ -856,6 +878,7 @@ void Meta_InitServices() CreateApiServices(); CreateServiceFunction("MetaContacts/OnOff", Meta_OnOff); + CreateServiceFunction(MS_MC_GETSRMMSUB, Meta_SrmmCurrentSub); CreateProtoServiceFunction(META_PROTO, PS_SEND_NUDGE, Meta_SendNudge); diff --git a/src/modules/metacontacts/meta_utils.cpp b/src/modules/metacontacts/meta_utils.cpp index 6c4887c6fb..b9119a4d4e 100644 --- a/src/modules/metacontacts/meta_utils.cpp +++ b/src/modules/metacontacts/meta_utils.cpp @@ -412,7 +412,7 @@ int Meta_HideMetaContacts(bool bHide) if (bHide) { for (int i = 0; i < arMetaWindows.getCount(); i++) - SendMessage((HWND)arMetaWindows[i], WM_CLOSE, 0, 0); + SendMessage(arMetaWindows[i].m_hWnd, WM_CLOSE, 0, 0); arMetaWindows.destroy(); } diff --git a/src/modules/metacontacts/metacontacts.h b/src/modules/metacontacts/metacontacts.h index 79f6e74d53..19b970a308 100644 --- a/src/modules/metacontacts/metacontacts.h +++ b/src/modules/metacontacts/metacontacts.h @@ -28,7 +28,12 @@ INT_PTR TranslateMenuFunc(MCONTACT hContact, int i); void InitMenus(); extern int mcStatus; -extern LIST arMetaWindows; +struct MetaSrmmData +{ + MCONTACT m_hMeta, m_hSub; + HWND m_hWnd; +}; +extern OBJLIST arMetaWindows; INT_PTR Meta_Convert(WPARAM wParam,LPARAM lParam); INT_PTR Meta_AddTo(WPARAM wParam,LPARAM lParam); -- cgit v1.2.3