From 0853598b0a7b5885d1bd022dd7afca3395bcd90f Mon Sep 17 00:00:00 2001 From: George Hazan Date: Tue, 25 Mar 2014 20:37:15 +0000 Subject: contact list events + mc git-svn-id: http://svn.miranda-ng.org/main/trunk@8752 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- src/modules/clist/clistevents.cpp | 167 +++++++++++++++++--------------------- 1 file changed, 75 insertions(+), 92 deletions(-) (limited to 'src/modules/clist') diff --git a/src/modules/clist/clistevents.cpp b/src/modules/clist/clistevents.cpp index 73b3abfb4c..10c728e187 100644 --- a/src/modules/clist/clistevents.cpp +++ b/src/modules/clist/clistevents.cpp @@ -50,11 +50,10 @@ static int disableIconFlash; int fnGetImlIconIndex(HICON hIcon) { int i; - - for (i=0; i < imlIconCount; i++) { + for (i=0; i < imlIconCount; i++) if (imlIcon[i].hIcon == hIcon) return imlIcon[i].index; - } + imlIcon = (struct CListImlIcon *) mir_realloc(imlIcon, sizeof(struct CListImlIcon) * (imlIconCount + 1)); imlIconCount++; imlIcon[i].hIcon = hIcon; @@ -64,21 +63,14 @@ int fnGetImlIconIndex(HICON hIcon) static char * GetEventProtocol(int idx) { - if (cli.events.count && idx>=0 && idxcle.hContact == NULL) - { - if (cli.events.items[idx]->cle.flags&CLEF_PROTOCOLGLOBAL) - szProto = cli.events.items[idx]->cle.lpszProtocol; - else - szProto = NULL; - } - else - szProto = GetContactProto(cli.events.items[idx]->cle.hContact); - return szProto; - } - return NULL; + if (!cli.events.count || idx < 0 && idx >= cli.events.count) + return NULL; + + CListEvent *ev = cli.events.items[idx]; + if (ev->cle.hContact != NULL) + return GetContactProto(ev->cle.hContact); + + return (ev->cle.flags & CLEF_PROTOCOLGLOBAL) ? ev->cle.lpszProtocol : NULL; } static void ShowOneEventInTray(int idx) @@ -88,13 +80,9 @@ static void ShowOneEventInTray(int idx) static void ShowEventsInTray() { - int i; - char ** pTrayProtos; - char nTrayProtoCnt; int nTrayCnt = cli.trayIconCount; if (!cli.events.count || !nTrayCnt) return; - if (cli.events.count == 1 || nTrayCnt == 1) - { + if (cli.events.count == 1 || nTrayCnt == 1) { ShowOneEventInTray(0); //for only one icon in tray show topmost event return; } @@ -102,45 +90,45 @@ static void ShowEventsInTray() // in case if we have several icons in tray and several events with different protocols // lets use several icon to show events from protocols in different icons cli.pfnLockTray(); - pTrayProtos = (char**)_alloca(sizeof(char*)*cli.trayIconCount); - nTrayProtoCnt = 0; - for (i=0; i=nTrayProtoCnt) j = 0; //event was not found so assume first icon - if (pTrayProtos[j]) //if not already set - ShowOneEventInTray(i); //show it - pTrayProtos[j] = NULL; //and clear slot - } + + for (int i = 0; i < cli.events.count; i++) { + char *iEventProto = GetEventProtocol(i); + + int j; + for (j = 0; j < nTrayProtoCnt; j++) + if (iEventProto && pTrayProtos[j] && !lstrcmpA(pTrayProtos[j], iEventProto)) + break; + if (j >= nTrayProtoCnt) // event was not found so assume first icon + j = 0; + if (pTrayProtos[j]) // if not already set + ShowOneEventInTray(i); // show it + pTrayProtos[j] = NULL; // and clear slot } cli.pfnUnlockTray(); } static VOID CALLBACK IconFlashTimer(HWND, UINT, UINT_PTR idEvent, DWORD) { - int i, j; ShowEventsInTray(); - for (i=0; i < cli.events.count; i++) { + + for (int i=0; i < cli.events.count; i++) { + int j; for (j = 0; j < i; j++) if (cli.events.items[j]->cle.hContact == cli.events.items[i]->cle.hContact) break; if (j >= i) cli.pfnChangeContactIcon(cli.events.items[i]->cle.hContact, iconsOn || disableIconFlash ? cli.events.items[i]->imlIconIndex : 0, 0); - //decrease eflashes in any case - no need to collect all events - if (cli.events.items[i]->cle.flags & CLEF_ONLYAFEW) { + + // decrease eflashes in any case - no need to collect all events + if (cli.events.items[i]->cle.flags & CLEF_ONLYAFEW) if (0 >= --cli.events.items[i]->flashesDone) cli.pfnRemoveEvent(cli.events.items[i]->cle.hContact, cli.events.items[i]->cle.hDbEvent); - } } if (cli.events.count == 0) { @@ -151,10 +139,9 @@ static VOID CALLBACK IconFlashTimer(HWND, UINT, UINT_PTR idEvent, DWORD) iconsOn = !iconsOn; } -struct CListEvent* fnAddEvent(CLISTEVENT *cle) +CListEvent* fnAddEvent(CLISTEVENT *cle) { int i; - struct CListEvent* p; if (cle == NULL || cle->cbSize != sizeof(CLISTEVENT)) return NULL; @@ -166,23 +153,26 @@ struct CListEvent* fnAddEvent(CLISTEVENT *cle) } else i = cli.events.count; - if ((p = (struct CListEvent*)cli.pfnCreateEvent()) == NULL) + CListEvent *p = cli.pfnCreateEvent(); + if (p == NULL) return NULL; + if (db_mc_isSub(cle->hContact)) + cle->hContact = db_mc_getMeta(cle->hContact); + List_Insert((SortedList*)&cli.events, p, i); p->cle = *cle; p->imlIconIndex = fnGetImlIconIndex(cli.events.items[i]->cle.hIcon); p->flashesDone = 12; p->cle.pszService = mir_strdup(cli.events.items[i]->cle.pszService); if (p->cle.flags & CLEF_UNICODE) - p->cle.ptszTooltip = mir_tstrdup((TCHAR*)p->cle.ptszTooltip); + p->cle.ptszTooltip = mir_tstrdup(p->cle.ptszTooltip); else - p->cle.ptszTooltip = mir_a2u((char*)p->cle.pszTooltip); //if no flag defined it handled as unicode + p->cle.ptszTooltip = mir_a2u(p->cle.pszTooltip); //if no flag defined it handled as unicode if (cli.events.count == 1) { char *szProto; - if (cle->hContact == NULL) - { - if (cle->flags&CLEF_PROTOCOLGLOBAL) + if (cle->hContact == NULL) { + if (cle->flags & CLEF_PROTOCOLGLOBAL) szProto = cle->lpszProtocol; else szProto = NULL; @@ -202,11 +192,8 @@ struct CListEvent* fnAddEvent(CLISTEVENT *cle) // Returns 0 if the event was successfully removed, or nonzero if the event was not found int fnRemoveEvent(MCONTACT hContact, HANDLE dbEvent) { - int i; - char *szProto; - int nSameProto = 0; - // Find the event that should be removed + int i; for (i=0; i < cli.events.count; i++) if ((cli.events.items[i]->cle.hContact == hContact) && (cli.events.items[i]->cle.hDbEvent == dbEvent)) break; @@ -216,31 +203,28 @@ int fnRemoveEvent(MCONTACT hContact, HANDLE dbEvent) return 1; // Update contact's icon - szProto = GetContactProto(hContact); + char *szProto = GetContactProto(hContact); cli.pfnChangeContactIcon(cli.events.items[i]->cle.hContact, - CallService(MS_CLIST_GETCONTACTICON, (WPARAM)cli.events.items[i]->cle.hContact, 1), - 0); + CallService(MS_CLIST_GETCONTACTICON, (WPARAM)cli.events.items[i]->cle.hContact, 1), 0); // Free any memory allocated to the event cli.pfnFreeEvent(cli.events.items[i]); List_Remove((SortedList*)&cli.events, i); - { - //count same protocoled events - char * szEventProto; - for (i=0; i < cli.events.count; i++) - { - if (cli.events.items[i]->cle.hContact) - szEventProto = GetContactProto((cli.events.items[i]->cle.hContact)); - else if (cli.events.items[i]->cle.flags&CLEF_PROTOCOLGLOBAL) - szEventProto = (char *) cli.events.items[i]->cle.lpszProtocol; - else - szEventProto = NULL; - if (szEventProto && szProto && !lstrcmpA(szEventProto, szProto)) - nSameProto++; - - } + //count same protocoled events + int nSameProto = 0; + char *szEventProto; + for (int i = 0; i < cli.events.count; i++) { + if (cli.events.items[i]->cle.hContact) + szEventProto = GetContactProto((cli.events.items[i]->cle.hContact)); + else if (cli.events.items[i]->cle.flags & CLEF_PROTOCOLGLOBAL) + szEventProto = (char *)cli.events.items[i]->cle.lpszProtocol; + else + szEventProto = NULL; + if (szEventProto && szProto && !lstrcmpA(szEventProto, szProto)) + nSameProto++; } + if (cli.events.count == 0 || nSameProto == 0) { if (cli.events.count == 0) KillTimer(NULL, flashTimerId); @@ -277,7 +261,7 @@ int fnEventsProcessContactDoubleClick(MCONTACT hContact) for (int i=0; i < cli.events.count; i++) { if (cli.events.items[i]->cle.hContact == hContact) { HANDLE hDbEvent = cli.events.items[i]->cle.hDbEvent; - CallService(cli.events.items[i]->cle.pszService, (WPARAM) (HWND) NULL, (LPARAM) & cli.events.items[i]->cle); + CallService(cli.events.items[i]->cle.pszService, (WPARAM)(HWND)NULL, (LPARAM)& cli.events.items[i]->cle); cli.pfnRemoveEvent(hContact, hDbEvent); return 0; } @@ -294,17 +278,17 @@ int fnEventsProcessTrayDoubleClick(int index) HANDLE hDbEvent; int eventIndex = 0; cli.pfnLockTray(); - if (cli.trayIconCount>1 && index>0) { + if (cli.trayIconCount > 1 && index > 0) { int i; - char * szProto = NULL; - for (i=0; icle.hContact) eventProto = GetContactProto(cli.events.items[i]->cle.hContact); @@ -321,14 +305,14 @@ int fnEventsProcessTrayDoubleClick(int index) //lets process backward try to find first event without desired proto in tray int j; if (click_in_first_icon) - for (i=0; icle.hContact) eventProto = GetContactProto(cli.events.items[i]->cle.hContact); if (!eventProto) eventProto = cli.events.items[i]->cle.lpszProtocol; if (eventProto) { - for (j = 0; jcle.hContact; hDbEvent = cli.events.items[eventIndex]->cle.hDbEvent; // ; may be better to show send msg? - CallService(cli.events.items[eventIndex]->cle.pszService, (WPARAM) NULL, (LPARAM) & cli.events.items[eventIndex]->cle); + CallService(cli.events.items[eventIndex]->cle.pszService, (WPARAM)NULL, (LPARAM)& cli.events.items[eventIndex]->cle); cli.pfnRemoveEvent(hContact, hDbEvent); return 0; } @@ -417,12 +401,12 @@ int InitCListEvents(void) return 0; } -struct CListEvent* fnCreateEvent(void) +CListEvent* fnCreateEvent(void) { - return (struct CListEvent*)mir_calloc(sizeof(struct CListEvent)); + return (CListEvent*)mir_calloc(sizeof(CListEvent)); } -void fnFreeEvent(struct CListEvent* p) +void fnFreeEvent(CListEvent* p) { mir_free(p->cle.pszService); mir_free(p->cle.pszTooltip); @@ -431,12 +415,11 @@ void fnFreeEvent(struct CListEvent* p) void UninitCListEvents(void) { - int i; - - if (cli.events.count) KillTimer(NULL, flashTimerId); + if (cli.events.count) + KillTimer(NULL, flashTimerId); - for (i=0; i < cli.events.count; i++) - cli.pfnFreeEvent((struct CListEvent*)cli.events.items[i]); + for (int i=0; i < cli.events.count; i++) + cli.pfnFreeEvent((CListEvent*)cli.events.items[i]); List_Destroy((SortedList*)&cli.events); if (imlIcon != NULL) -- cgit v1.2.3