summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGeorge Hazan <george.hazan@gmail.com>2014-03-25 20:37:15 +0000
committerGeorge Hazan <george.hazan@gmail.com>2014-03-25 20:37:15 +0000
commit0853598b0a7b5885d1bd022dd7afca3395bcd90f (patch)
tree3b0bd173d144d65a557cecfdf1e41dd6ba57a9de /src
parent5311d823007cfea3b261233f42677fc1ee39d1ac (diff)
contact list events + mc
git-svn-id: http://svn.miranda-ng.org/main/trunk@8752 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
Diffstat (limited to 'src')
-rw-r--r--src/modules/clist/clistevents.cpp167
1 files changed, 75 insertions, 92 deletions
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 && idx<cli.events.count)
- {
- char *szProto;
- if (cli.events.items[idx]->cle.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<cli.trayIconCount; i++)
- {
+ char **pTrayProtos = (char**)_alloca(sizeof(char*)*cli.trayIconCount);
+ int nTrayProtoCnt = 0;
+ for (int i = 0; i < cli.trayIconCount; i++) {
if (cli.trayIcon[i].id == 0 || !cli.trayIcon[i].szProto) continue;
pTrayProtos[nTrayProtoCnt++] = cli.trayIcon[i].szProto;
}
- for (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) 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; i<cli.trayIconCount; i++)
+ char *szProto = NULL;
+ for (i = 0; i < cli.trayIconCount; i++)
if (cli.trayIcon[i].id == index) {
szProto = cli.trayIcon[i].szProto;
if (i == 0) click_in_first_icon = TRUE;
break;
}
if (szProto) {
- for (i=0; i<cli.events.count; i++) {
+ for (i = 0; i < cli.events.count; i++) {
char * eventProto = NULL;
if (cli.events.items[i]->cle.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; i<cli.events.count; i++) {
- char * eventProto = NULL;
+ for (i = 0; i < cli.events.count; i++) {
+ char *eventProto = NULL;
if (cli.events.items[i]->cle.hContact)
eventProto = GetContactProto(cli.events.items[i]->cle.hContact);
if (!eventProto)
eventProto = cli.events.items[i]->cle.lpszProtocol;
if (eventProto) {
- for (j = 0; j<cli.trayIconCount; j++)
+ for (j = 0; j < cli.trayIconCount; j++)
if (cli.trayIcon[j].szProto && !_strcmpi(eventProto, cli.trayIcon[j].szProto))
break;
@@ -350,7 +334,7 @@ int fnEventsProcessTrayDoubleClick(int index)
hContact = cli.events.items[eventIndex]->cle.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)