/* * Tread sub to ask protocol to retrieve away message */ static void amThreadProc(void *) { Netlib_Logf(NULL, "amThreadProc thread start"); ClcCacheEntry dnce; memset(&dnce, 0, sizeof(dnce)); while (!MirandaExiting()) { MCONTACT hContact = amGetCurrentChain(); while (hContact) { DWORD time = GetTickCount(); if ((time - amRequestTick) < AMASKPERIOD) { SleepEx(AMASKPERIOD - (time - amRequestTick) + 10, TRUE); if (MirandaExiting()) goto LBL_Exit; } CListSettings_FreeCacheItemData(&dnce); dnce.hContact = hContact; Sync(CLUI_SyncGetPDNCE, (WPARAM)0, (LPARAM)&dnce); HANDLE ACK = 0; if (dnce.ApparentMode != ID_STATUS_OFFLINE) //don't ask if contact is always invisible (should be done with protocol) ACK = (HANDLE)CallContactService(hContact, PSS_GETAWAYMSG, 0, 0); if (!ACK) { ACKDATA ack; ack.hContact = hContact; ack.type = ACKTYPE_AWAYMSG; ack.result = ACKRESULT_FAILED; if (dnce.m_cache_cszProto) ack.szModule = dnce.m_cache_cszProto; else ack.szModule = NULL; ClcDoProtoAck(hContact, &ack); } CListSettings_FreeCacheItemData(&dnce); amRequestTick = time; hContact = amGetCurrentChain(); if (hContact) { DWORD i = 0; do { i++; SleepEx(50, TRUE); } while (i < AMASKPERIOD / 50 && !MirandaExiting()); } else break; if (MirandaExiting()) goto LBL_Exit; } WaitForSingleObjectEx(hamProcessEvent, INFINITE, TRUE); ResetEvent(hamProcessEvent); if (MirandaExiting()) break; } LBL_Exit: g_hAwayMsgThread = NULL; Netlib_Logf(NULL, "amThreadProc thread end"); }
static void gtaThreadProc(void*) { Netlib_Logf(NULL, "GTA thread start"); SHORTDATA data = { 0 }; while (!MirandaExiting()) { Sync(CLUI_SyncGetShortData, (WPARAM)pcli->hwndContactTree, (LPARAM)&data); while (true) { if (MirandaExiting()) goto LBL_Exit; SleepEx(0, TRUE); //1000 contacts per second GTACHAINITEM mpChain = { 0 }; SHORTDATA dat2 = { 0 }; if (!gtaGetItem(&mpChain)) break; SHORTDATA *dat; if (mpChain.dat == NULL || (!IsBadReadPtr(mpChain.dat, sizeof(*mpChain.dat)) && mpChain.dat->hWnd == data.hWnd)) dat = &data; else { Sync(CLUI_SyncGetShortData, (WPARAM)mpChain.dat->hWnd, (LPARAM)&dat2); dat = &dat2; } if (MirandaExiting()) goto LBL_Exit; ClcCacheEntry cacheEntry; memset(&cacheEntry, 0, sizeof(cacheEntry)); cacheEntry.hContact = mpChain.hContact; if (!Sync(CLUI_SyncGetPDNCE, (WPARAM)0, (LPARAM)&cacheEntry)) { Cache_GetSecondLineText(dat, &cacheEntry); Cache_GetThirdLineText(dat, &cacheEntry); Sync(CLUI_SyncSetPDNCE, (WPARAM)CCI_LINES, (LPARAM)&cacheEntry); CListSettings_FreeCacheItemData(&cacheEntry); } KillTimer(dat->hWnd, TIMERID_INVALIDATE_FULL); CLUI_SafeSetTimer(dat->hWnd, TIMERID_INVALIDATE_FULL, 500, NULL); } WaitForSingleObjectEx(hgtaWakeupEvent, INFINITE, TRUE); ResetEvent(hgtaWakeupEvent); } LBL_Exit: CloseHandle(hgtaWakeupEvent); hgtaWakeupEvent = NULL; g_hGetTextAsyncThread = NULL; Netlib_Logf(NULL, "GTA thread end"); }
static int OnBuildSubGroupMenu(WPARAM wParam, LPARAM) { BOOL gray1 = FALSE; BOOL gray2 = FALSE; BOOL showOfflineinGroup = FALSE; ClcGroup *group = (ClcGroup *)wParam; if (wParam == 0) return 0; if (MirandaExiting()) return 0; //contact->group showOfflineinGroup = CLCItems_IsShowOfflineGroup(group); gray1 = (showOfflineinGroup != FALSE); gray2 = (group->hideOffline != FALSE); if (gray1 && gray2) gray1 = FALSE; //should not be cause CLCItems_IsShowOfflineGroup return false if group->hideOffline CLISTMENUITEM mi = { sizeof(mi) }; mi.flags = CMIM_FLAGS | ((group->hideOffline && !gray1) ? CMIF_CHECKED : 0) | (gray1 ? CMIF_GRAYED : 0); Menu_ModifyItem(hHideOfflineUsersHereMenuItem, &mi); mi.flags = CMIM_FLAGS | ((showOfflineinGroup && !gray2) ? CMIF_CHECKED : 0) | (gray2 ? CMIF_GRAYED : 0); Menu_ModifyItem(hShowOfflineUsersHereMenuItem, &mi); return 0; }
static int OnBuildSubGroupMenu(WPARAM wParam,LPARAM lParam) { CLISTMENUITEM mi; BOOL gray1=FALSE; BOOL gray2=FALSE; BOOL showOfflineinGroup=FALSE; struct ClcGroup *group=(struct ClcGroup *)wParam; if (wParam==0) return 0; if (MirandaExiting()) return 0; //contact->group ZeroMemory(&mi,sizeof(mi)); mi.cbSize = sizeof(mi); showOfflineinGroup=CLCItems_IsShowOfflineGroup(group); gray1=(showOfflineinGroup!=FALSE); gray2=(group->hideOffline!=FALSE); if (gray1&&gray2) gray1=FALSE; //should not be cause CLCItems_IsShowOfflineGroup return false if group->hideOffline mi.flags = CMIM_FLAGS | ((group->hideOffline&&!gray1)?CMIF_CHECKED:0)| (gray1?CMIF_GRAYED:0); CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)hHideOfflineUsersHereMenuItem, (LPARAM)&mi); mi.flags = CMIM_FLAGS | ((showOfflineinGroup&&!gray2) ? CMIF_CHECKED:0)| (gray2?CMIF_GRAYED:0); CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)hShowOfflineUsersHereMenuItem, (LPARAM)&mi); return 0; };
static int OnBuildGroupMenu(WPARAM wParam,LPARAM lParam) { CLISTMENUITEM mi; if (MirandaExiting()) return 0; ZeroMemory(&mi,sizeof(mi)); mi.cbSize = sizeof(mi); mi.flags = CMIM_FLAGS | (ModernGetSettingByte(NULL,"CList","HideOffline",SETTING_HIDEOFFLINE_DEFAULT)?CMIF_CHECKED:0); CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)hHideOfflineUsersMenuItem, (LPARAM)&mi); ZeroMemory(&mi,sizeof(mi)); mi.cbSize = sizeof(mi); mi.flags = CMIM_FLAGS | (SendMessage(pcli->hwndContactTree,CLM_GETHIDEOFFLINEROOT,0,0)?CMIF_CHECKED:0); CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)hHideOfflineUsersOutHereMenuItem, (LPARAM)&mi); ZeroMemory(&mi,sizeof(mi)); mi.cbSize = sizeof(mi); mi.flags = CMIM_FLAGS | (GetWindowLong(pcli->hwndContactTree,GWL_STYLE)&CLS_HIDEEMPTYGROUPS?CMIF_CHECKED:0); CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)hHideEmptyGroupsMenuItem, (LPARAM)&mi); ZeroMemory(&mi,sizeof(mi)); mi.cbSize = sizeof(mi); mi.flags = CMIM_FLAGS | (GetWindowLong(pcli->hwndContactTree,GWL_STYLE)&CLS_USEGROUPS?0:CMIF_CHECKED); CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)hDisableGroupsMenuItem, (LPARAM)&mi); return 0; };
int BgStatusBarChange(WPARAM, LPARAM) { if (!MirandaExiting()) LoadStatusBarData(); return 0; }
int BgStatusBarChange(WPARAM wParam,LPARAM lParam) { if (MirandaExiting()) return 0; LoadStatusBarData(); return 0; }
// wparam menu handle to pass to clc.c // lparam WM_COMMAND HWND static int OnBuildSubGroupMenu(WPARAM wParam, LPARAM) { ClcGroup *group = (ClcGroup *)wParam; if (wParam == 0) return 0; if (MirandaExiting()) return 0; bool showOfflineinGroup = CLCItems_IsShowOfflineGroup(group); bool gray2 = group->hideOffline == 0; Menu_EnableItem(hShowOfflineUsersHereMenuItem, gray2); Menu_SetChecked(hShowOfflineUsersHereMenuItem, showOfflineinGroup && gray2); return 0; }
static int OnBuildGroupMenu(WPARAM, LPARAM) { if (MirandaExiting()) return 0; CLISTMENUITEM mi = { sizeof(mi) }; mi.flags = CMIM_FLAGS | (db_get_b(NULL, "CList", "HideOffline", SETTING_HIDEOFFLINE_DEFAULT) ? CMIF_CHECKED : 0); Menu_ModifyItem(hHideOfflineUsersMenuItem, &mi); mi.flags = CMIM_FLAGS | (SendMessage(pcli->hwndContactTree, CLM_GETHIDEOFFLINEROOT, 0, 0) ? CMIF_CHECKED : 0); Menu_ModifyItem(hHideOfflineUsersOutHereMenuItem, &mi); mi.flags = CMIM_FLAGS | (GetWindowLongPtr(pcli->hwndContactTree, GWL_STYLE)&CLS_HIDEEMPTYGROUPS ? CMIF_CHECKED : 0); Menu_ModifyItem(hHideEmptyGroupsMenuItem, &mi); mi.flags = CMIM_FLAGS | (GetWindowLongPtr(pcli->hwndContactTree, GWL_STYLE)&CLS_USEGROUPS ? 0 : CMIF_CHECKED); Menu_ModifyItem(hDisableGroupsMenuItem, &mi); return 0; }
int static OnIconLibIconChanged(WPARAM wParam,LPARAM lParam) { HICON hicon; CLISTMENUITEM clmi={0}; BOOL needFree; if (MirandaExiting()) return 0; hicon=CLUI_LoadIconFromExternalFile("clisticons.dll",2,TRUE,FALSE,"NewGroup","Contact List","New Group",-IDI_NEWGROUP2,&needFree); NewGroupIconidx=ImageList_ReplaceIcon(hCListImages,NewGroupIconidx,hicon); if (needFree) DestroyIcon_protect(hicon); clmi.cbSize=sizeof(clmi); clmi.flags=CMIM_ICON; clmi.hIcon=ske_ImageList_GetIcon(hCListImages,NewGroupIconidx,0); CallService(MS_CLIST_MODIFYMENUITEM,(WPARAM)hNewSubGroupMenuItem,(LPARAM)&clmi); CallService(MS_CLIST_MODIFYMENUITEM,(WPARAM)hNewGroupMenuItem,(LPARAM)&clmi); // return 0; };
int gtaAddRequest(ClcData *dat, MCONTACT hContact) { if (MirandaExiting()) return 0; mir_cslock lck(gtaCS); GTACHAINITEM *mpChain = (GTACHAINITEM*)malloc(sizeof(GTACHAINITEM)); mpChain->hContact = hContact; mpChain->dat = dat; mpChain->Next = NULL; if (gtaLastItem) { gtaLastItem->Next = (GTACHAINITEM*)mpChain; gtaLastItem = mpChain; } else { gtaFirstItem = mpChain; gtaLastItem = mpChain; SetEvent(hgtaWakeupEvent); } return FALSE; }
int gtaAddRequest(struct ClcData *dat,struct ClcContact *contact,HANDLE hContact) { if (MirandaExiting()) return 0; gtalock; { GTACHAINITEM * mpChain=(GTACHAINITEM *)malloc(sizeof(GTACHAINITEM)); mpChain->hContact=hContact; mpChain->dat=dat; mpChain->Next=NULL; if (gtaLastItem) { gtaLastItem->Next=(GTACHAINITEM *)mpChain; gtaLastItem=mpChain; } else { gtaFirstItem=mpChain; gtaLastItem=mpChain; SetEvent(hgtaWakeupEvent); } } gtaunlock; return FALSE; }
// Calc and store row height for all items in the list void RowHeights_CalcRowHeights(ClcData *dat, HWND hwnd) { if (MirandaExiting()) return; // Draw lines ClcGroup *group = &dat->list; group->scanIndex = 0; int indent = 0; int subindex = -1; int line_num = -1; RowHeights_Clear(dat); while (true) { int subident; ClcContact *Drawing; if (subindex == -1) { if (group->scanIndex == group->cl.getCount()) { if ((group = group->parent) == nullptr) break; group->scanIndex++; indent--; continue; } // Get item to draw Drawing = group->cl[group->scanIndex]; subident = 0; } else { // Get item to draw Drawing = &group->cl[group->scanIndex]->subcontacts[subindex]; subident = dat->subIndent; } line_num++; // Calc row height if (!gl_RowRoot) RowHeights_GetRowHeight(dat, hwnd, Drawing, line_num); else RowHeight_CalcRowHeight(dat, Drawing, line_num); // increment by subcontacts if (group->cl[group->scanIndex]->subcontacts != nullptr && group->cl[group->scanIndex]->type != CLCIT_GROUP) { if (group->cl[group->scanIndex]->bSubExpanded && dat->bMetaExpanding) { if (subindex < group->cl[group->scanIndex]->iSubAllocated - 1) subindex++; else subindex = -1; } } if (subindex == -1) { if (group->cl[group->scanIndex]->type == CLCIT_GROUP && group->cl[group->scanIndex]->group->expanded) { group = group->cl[group->scanIndex]->group; indent++; group->scanIndex = 0; subindex = -1; continue; } group->scanIndex++; } } }
static int gtaThreadProc(void * lpParam) { BOOL exit=FALSE; HWND hwnd=pcli->hwndContactList; struct SHORTDATA data={0}; struct SHORTDATA * dat; while (!MirandaExiting()) { Sync(CLUI_SyncGetShortData,(WPARAM)pcli->hwndContactTree,(LPARAM)&data); do { if (!MirandaExiting()) SleepEx(0,TRUE); //1000 contacts per second if (MirandaExiting()) { g_dwGetTextAsyncThreadID=0; return 0; } else { GTACHAINITEM mpChain={0}; struct SHORTDATA dat2={0}; if (!gtaGetItem(&mpChain)) break; if (mpChain.dat==NULL || (!IsBadReadPtr(mpChain.dat,sizeof(mpChain.dat)) && mpChain.dat->hWnd==data.hWnd)) dat=&data; else { Sync(CLUI_SyncGetShortData,(WPARAM)mpChain.dat->hWnd,(LPARAM)&dat2); dat=&dat2; } if (!MirandaExiting()) { displayNameCacheEntry cacheEntry; memset( &cacheEntry, 0, sizeof(cacheEntry)); cacheEntry.m_cache_hContact=mpChain.hContact; if (!Sync(CLUI_SyncGetPDNCE, (WPARAM) 0,(LPARAM)&cacheEntry)) { if (!MirandaExiting()) Cache_GetSecondLineText(dat, &cacheEntry); if (!MirandaExiting()) Cache_GetThirdLineText(dat, &cacheEntry); if (!MirandaExiting()) Sync(CLUI_SyncSetPDNCE, (WPARAM) CCI_LINES,(LPARAM)&cacheEntry); CListSettings_FreeCacheItemData(&cacheEntry); } } else { g_dwGetTextAsyncThreadID=0; return 0; } KillTimer(dat->hWnd,TIMERID_INVALIDATE_FULL); CLUI_SafeSetTimer(dat->hWnd,TIMERID_INVALIDATE_FULL,500,NULL); } } while (!exit); WaitForSingleObjectEx(hgtaWakeupEvent, INFINITE, FALSE ); ResetEvent(hgtaWakeupEvent); } g_dwGetTextAsyncThreadID=0; return 1; }