void ShowPopup(ALARM *alarm) { if ( ServiceExists(MS_POPUP_ADDPOPUPT)) { ALARM *data = new ALARM; memset(data, 0, sizeof(ALARM)); copy_alarm_data(data, alarm); POPUPDATAT ppd = { 0 }; ppd.lchIcon = hIconMenuSet; mir_tstrncpy(ppd.lptzContactName, data->szTitle, MAX_CONTACTNAME); mir_tstrncpy(ppd.lptzText, data->szDesc, MAX_SECONDLINE); ppd.PluginWindowProc = PopupAlarmDlgProc; ppd.PluginData = data; ppd.iSeconds = -1; PUAddPopupT(&ppd); } }
void alter_alarm_list(ALARM *alarm) { bool found = false; mir_cslock lck(alarm_cs); if (alarm->id != 0) { ALARM *i; for(alarms.reset(); i = alarms.current(); alarms.next()) { if (i->id == alarm->id) { copy_alarm_data(i, alarm); found = true; break; } } } if (!found) { if (!alarm->id) alarm->id = next_alarm_id++; alarms.push_back(alarm); } SaveAlarms(); }
LRESULT CALLBACK FrameWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { MEASUREITEMSTRUCT *mis; DRAWITEMSTRUCT *dis; SIZE textSize; SIZE timeSize; switch(msg) { case WM_CREATE: hwnd_list = CreateWindow(_T("LISTBOX"), _T(""), (WS_VISIBLE | WS_CHILD | LBS_NOINTEGRALHEIGHT | LBS_STANDARD | LBS_NOTIFY | LBS_OWNERDRAWFIXED) & ~LBS_SORT & ~WS_BORDER, 0, 0, 0, 0, hwnd, NULL, hInst,0); return FALSE; case WMU_INITIALIZE: PostMessage(hwnd, WMU_FILL_LIST, 0, 0); SetTimer(hwnd, ID_FRAME_UPDATE_TIMER, 5000, 0); SetTimer(hwnd, ID_FRAME_SHOWHIDE_TIMER, 200, 0); return TRUE; case WM_MEASUREITEM: mis = (MEASUREITEMSTRUCT *)lParam; mis->itemHeight = options.row_height; return TRUE; case WM_DRAWITEM: dis = (DRAWITEMSTRUCT *)lParam; if (dis->itemID != (DWORD)-1) { ALARM alarm = {0}; mir_cslock lck(list_cs); ALARM &list_alarm = alarm_list.at(dis->itemData); copy_alarm_data(&alarm, &list_alarm); RECT r; GetClientRect(hwnd, &r); int min = MinutesInFuture(alarm.time, alarm.occurrence); FillRect(dis->hDC, &dis->rcItem, bk_brush); dis->rcItem.left += options.indent; SetBkMode(dis->hDC, TRANSPARENT); SetTextColor(dis->hDC, fontColour); HICON hIcon = (min <= 5 ? hIconList2 : hIconList1); DrawIconEx(dis->hDC,dis->rcItem.left,(dis->rcItem.top + dis->rcItem.bottom - 16)>>1,hIcon,0, 0, 0, NULL, DI_NORMAL); GetTextExtentPoint32(dis->hDC,alarm.szTitle,(int)mir_tstrlen(alarm.szTitle),&textSize); TCHAR buff[100]; if (min >= 60) mir_sntprintf(buff, TranslateT("%dh %dm"), min / 60, min % 60); else mir_sntprintf(buff, TranslateT("%dm"), min); GetTextExtentPoint32(dis->hDC,buff,(int)mir_tstrlen(buff),&timeSize); if (textSize.cx > (dis->rcItem.right - dis->rcItem.left) - (GetSystemMetrics(SM_CXSMICON) + 4) - timeSize.cx - 2 - 4) { // need elipsis TCHAR titlebuff[512]; size_t len = mir_tstrlen(alarm.szTitle); if (len > 511) len = 511; while(len > 0 && textSize.cx > (dis->rcItem.right - dis->rcItem.left) - (GetSystemMetrics(SM_CXSMICON) + 4) - timeSize.cx - 2 - 4) { len--; _tcsncpy(titlebuff, alarm.szTitle, len); titlebuff[len] = 0; mir_tstrcat(titlebuff, _T("...")); GetTextExtentPoint32(dis->hDC,titlebuff,(int)mir_tstrlen(titlebuff),&textSize); } TextOut(dis->hDC,dis->rcItem.left + 16 + 4,(dis->rcItem.top + dis->rcItem.bottom - textSize.cy)>>1,titlebuff,(int)mir_tstrlen(titlebuff)); TextOut(dis->hDC,dis->rcItem.right - timeSize.cx - 2,(dis->rcItem.top + dis->rcItem.bottom - timeSize.cy)>>1, buff,(int)mir_tstrlen(buff)); } else {
void DoAlarm(ALARM *alarm) { ALARMINFO alarminfo; alarminfo.szTitle = alarm->szTitle; alarminfo.szDesc = alarm->szDesc; alarminfo.szCommand = alarm->szCommand; alarminfo.szCommandParams = alarm->szCommandParams; alarminfo.occurrence = alarm->occurrence; alarminfo.snoozer = alarm->snoozer; alarminfo.time = alarm->time; alarminfo.flags = alarm->flags; alarminfo.action = alarm->action; alarminfo.sound_num = alarm->sound_num; if (!NotifyEventHooks(hAlarmTriggeredEvent, 0, (LPARAM)&alarminfo)) { if (alarm->action & AAF_SOUND) { if (alarm->sound_num > 0 && alarm->sound_num <= 3) { char buff[128]; mir_snprintf(buff, "Triggered%d", alarm->sound_num); SkinPlaySound(buff); } else if (alarm->sound_num == 4) { if (alarm->szTitle != NULL && alarm->szTitle[0] != '\0') { if (ServiceExists("Speak/Say")) { CallService("Speak/Say", 0, (LPARAM)alarm->szTitle); } } } } if (alarm->action & AAF_POPUP) { if (options.use_popup_module && ServiceExists(MS_POPUP_ADDPOPUPT)) ShowPopup(alarm); else { HWND hwndDlg = CreateDialog(hInst, MAKEINTRESOURCE(IDD_ALARM), GetDesktopWindow(), DlgProcAlarm); WindowList_Add(hAlarmWindowList, hwndDlg, 0); ALARM *data = new ALARM; memset(data, 0, sizeof(ALARM)); copy_alarm_data(data, alarm); SendMessage(hwndDlg, WMU_SETALARM, 0, (LPARAM)data); if (is_idle || !options.aw_dontstealfocus) ShowWindow(hwndDlg, SW_SHOW); else ShowWindow(hwndDlg, SW_SHOWNOACTIVATE); SetWindowPos(hwndDlg, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); } } if (alarm->action & AAF_COMMAND) ShellExecute(0, 0, alarm->szCommand, alarm->szCommandParams, 0, SW_NORMAL); if (alarm->action & AAF_SYSTRAY) { CLISTEVENT cle = { sizeof(cle) }; cle.hIcon = hIconSystray; cle.ptszTooltip = alarm->szTitle; cle.flags = CLEF_ONLYAFEW | CLEF_TCHAR; CallService(MS_CLIST_ADDEVENT, 0, (LPARAM)&cle); } } }