static LRESULT CALLBACK PopupAlarmDlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch(message) { case WM_COMMAND: // snooze if (HIWORD(wParam) == STN_CLICKED) { //It was a click on the Popup. ALARM *mpd = (ALARM *)CallService(MS_POPUP_GETPLUGINDATA, (WPARAM)hWnd, 0); if (mpd->flags & ALF_NOSNOOZE) return TRUE; // add snooze minutes to current time FILETIME ft; GetLocalTime(&mpd->time); SystemTimeToFileTime(&mpd->time, &ft); ULARGE_INTEGER uli; uli.LowPart = ft.dwLowDateTime; uli.HighPart = ft.dwHighDateTime; uli.QuadPart += mult.QuadPart * options.snooze_minutes; ft.dwHighDateTime = uli.HighPart; ft.dwLowDateTime = uli.LowPart; FileTimeToSystemTime(&ft, &mpd->time); mpd->occurrence = OC_ONCE; mpd->snoozer = true; mpd->flags = mpd->flags & ~(ALF_NOSTARTUP); mpd->id = next_alarm_id++; append_to_list(mpd); } PUDeletePopup(hWnd); return TRUE; case WM_CONTEXTMENU: PUDeletePopup(hWnd); return TRUE; case UM_FREEPLUGINDATA: ALARM *mpd = (ALARM *)CallService(MS_POPUP_GETPLUGINDATA, (WPARAM)hWnd, 0); if (mpd > 0) { free_alarm_data(mpd); delete mpd; } return TRUE; } return DefWindowProc(hWnd, message, wParam, lParam); }
void copy_alarm_data(ALARM *dest, ALARM *src) { dest->action = src->action; dest->flags = src->flags; dest->id = src->id; dest->occurrence = src->occurrence; dest->snoozer = src->snoozer; dest->sound_num = src->sound_num; dest->time = src->time; free_alarm_data(dest); dest->szTitle = mir_tstrdup(src->szTitle); dest->szDesc = mir_tstrdup(src->szDesc); dest->szCommand = mir_tstrdup(src->szCommand); dest->szCommandParams = mir_tstrdup(src->szCommandParams); }
INT_PTR CALLBACK DlgProcAlarm(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { switch ( msg ) { case WM_INITDIALOG: TranslateDialogDefault( hwndDlg ); { Utils_RestoreWindowPositionNoSize(hwndDlg, 0, MODULE, "Notify"); SetFocus(GetDlgItem(hwndDlg, IDC_SNOOZE)); WindowData *wd = new WindowData; wd->moving = false; wd->alarm = 0; wd->win_num = win_num++; if (wd->win_num > 0) { RECT r; GetWindowRect(hwndDlg, &r); r.top += 20; r.left += 20; SetWindowPos(hwndDlg, 0, r.left, r.top, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE); Utils_SaveWindowPosition(hwndDlg, 0, MODULE, "Notify"); } SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)wd); // options SendMessage(hwndDlg, WMU_SETOPT, 0, 0); // fonts SendMessage(hwndDlg, WMU_SETFONTS, 0, 0); } return FALSE; case WMU_REFRESH: InvalidateRect(hwndDlg, 0, TRUE); return TRUE; case WM_CTLCOLORSTATIC: { HDC hdc = (HDC)wParam; HWND hwndCtrl = (HWND)lParam; if (hBackgroundBrush) { if (hTitleFont && GetDlgItem(hwndDlg, IDC_TITLE) == hwndCtrl) SetTextColor(hdc, title_font_colour); else if (hWindowFont) SetTextColor(hdc, window_font_colour); SetBkMode(hdc, TRANSPARENT); return (BOOL)hBackgroundBrush; } } break; case WM_CTLCOLORDLG: if (hBackgroundBrush) return (BOOL)hBackgroundBrush; break; case WMU_SETFONTS: // fonts if (hWindowFont) SendMessage(hwndDlg, WM_SETFONT, (WPARAM)hWindowFont, TRUE); if (hTitleFont) SendDlgItemMessage(hwndDlg, IDC_TITLE, WM_SETFONT, (WPARAM)hTitleFont, TRUE); if (hBackgroundBrush) { SetClassLong(hwndDlg, GCLP_HBRBACKGROUND, (LONG)hBackgroundBrush); InvalidateRect(hwndDlg, 0, TRUE); } return TRUE; case WMU_SETOPT: { Options *opt; if (lParam) opt = (Options *)lParam; else opt = &options; // round corners if (opt->aw_roundcorners) { HRGN hRgn1; RECT r; int v,h; int w=10; GetWindowRect(hwndDlg,&r); h=(r.right-r.left)>(w*2)?w:(r.right-r.left); v=(r.bottom-r.top)>(w*2)?w:(r.bottom-r.top); h=(h<v)?h:v; hRgn1=CreateRoundRectRgn(0,0,(r.right-r.left+1),(r.bottom-r.top+1),h,h); SetWindowRgn(hwndDlg,hRgn1,1); } else { HRGN hRgn1; RECT r; int v,h; int w=10; GetWindowRect(hwndDlg,&r); h=(r.right-r.left)>(w*2)?w:(r.right-r.left); v=(r.bottom-r.top)>(w*2)?w:(r.bottom-r.top); h=(h<v)?h:v; hRgn1=CreateRectRgn(0,0,(r.right-r.left+1),(r.bottom-r.top+1)); SetWindowRgn(hwndDlg,hRgn1,1); } // transparency #ifdef WS_EX_LAYERED SetWindowLongPtr(hwndDlg, GWL_EXSTYLE, GetWindowLongPtr(hwndDlg, GWL_EXSTYLE) | WS_EX_LAYERED); #endif #ifdef LWA_ALPHA SetLayeredWindowAttributes(hwndDlg, RGB(0,0,0), (int)((100 - opt->aw_trans) / 100.0 * 255), LWA_ALPHA); #endif } return TRUE; case WMU_SETALARM: { ALARM *data = (ALARM *)lParam; SetWindowText(hwndDlg, data->szTitle); HWND hw = GetDlgItem(hwndDlg, IDC_TITLE); SetWindowText(hw, data->szTitle); SetDlgItemText(hwndDlg, IDC_ED_DESC, data->szDesc); ((WindowData *)GetWindowLongPtr(hwndDlg, GWLP_USERDATA))->alarm = data; if (data->action & AAF_SOUND && options.loop_sound) { if (data->sound_num <= 3) SetTimer(hwndDlg, ID_TIMER_SOUND, SOUND_REPEAT_PERIOD, 0); else if (data->sound_num == 4) SetTimer(hwndDlg, ID_TIMER_SOUND, SPEACH_REPEAT_PERIOD, 0); } hw = GetDlgItem(hwndDlg, IDC_SNOOZE); EnableWindow(hw, !(data->flags & ALF_NOSNOOZE)); ShowWindow(hw, (data->flags & ALF_NOSNOOZE) ? SW_HIDE : SW_SHOWNA); } return TRUE; case WMU_FAKEALARM: { SetWindowText(hwndDlg, TranslateT("Example alarm")); SetDlgItemText(hwndDlg, IDC_TITLE, TranslateT("Example alarm")); SetDlgItemText(hwndDlg, IDC_ED_DESC, TranslateT("Some example text. Example, example, example.")); } return TRUE; case WM_TIMER: if (wParam == ID_TIMER_SOUND) { WindowData *dw = (WindowData *)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); if (dw) { ALARM *data = dw->alarm; if (data && data->action & AAF_SOUND) { if (data->sound_num <= 3) { char buff[128]; mir_snprintf(buff, SIZEOF(buff), "Triggered%d", data->sound_num); SkinPlaySound(buff); } else if (data->sound_num == 4) { if (data->szTitle != NULL && data->szTitle[0] != '\0') { if (ServiceExists("Speak/Say")) { CallService("Speak/Say", 0, (LPARAM)data->szTitle); } } } } } } return TRUE; case WM_MOVE: Utils_SaveWindowPosition(hwndDlg, 0, MODULE, "Notify"); break; case WMU_ADDSNOOZER: { WindowData *wd = (WindowData *)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); if (wd) { ALARM *data = wd->alarm; if (data) { // add snooze minutes to current time FILETIME ft; GetLocalTime(&data->time); SystemTimeToFileTime(&data->time, &ft); ULARGE_INTEGER uli; uli.LowPart = ft.dwLowDateTime; uli.HighPart = ft.dwHighDateTime; // there are 10000000 100-nanosecond blocks in a second... uli.QuadPart += mult.QuadPart * (int)(wParam); ft.dwHighDateTime = uli.HighPart; ft.dwLowDateTime = uli.LowPart; FileTimeToSystemTime(&ft, &data->time); data->occurrence = OC_ONCE; data->snoozer = true; data->flags = data->flags & ~ALF_NOSTARTUP; data->id = next_alarm_id++; append_to_list(data); } } } return TRUE; case WM_COMMAND: if ( HIWORD( wParam ) == BN_CLICKED ) { switch( LOWORD( wParam )) { case IDCANCEL: // no button - esc pressed case IDOK: // space? case IDC_SNOOZE: SendMessage(hwndDlg, WMU_ADDSNOOZER, (WPARAM)options.snooze_minutes, 0); //drop through case IDC_DISMISS: { WindowData *window_data = (WindowData *)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); KillTimer(hwndDlg, ID_TIMER_SOUND); if (window_data) { if (window_data->alarm) { free_alarm_data(window_data->alarm); delete window_data->alarm; } delete window_data; } SetWindowLongPtr(hwndDlg, GWLP_USERDATA, 0); win_num--; //EndDialog(hwndDlg, IDOK); // not modal! WindowList_Remove(hAlarmWindowList, hwndDlg); DestroyWindow(hwndDlg); } break; case IDC_SNOOZELIST: { POINT pt, pt_rel; GetCursorPos(&pt); pt_rel = pt; ScreenToClient(hwndDlg,&pt_rel); HMENU hMenu = CreatePopupMenu(); MENUITEMINFO mmi = {0}; mmi.cbSize = sizeof(mmi); mmi.fMask = MIIM_ID | MIIM_STRING; #define AddItem(x) \ mmi.wID++; \ mmi.dwTypeData = TranslateT(x); \ mmi.cch = ( UINT )mir_tstrlen(mmi.dwTypeData); \ InsertMenuItem(hMenu, mmi.wID, FALSE, &mmi); AddItem(LPGEN("5 mins")); AddItem(LPGEN("15 mins")); AddItem(LPGEN("30 mins")); AddItem(LPGEN("1 hour")); AddItem(LPGEN("1 day")); AddItem(LPGEN("1 week")); TPMPARAMS tpmp = {0}; tpmp.cbSize = sizeof(tpmp); LRESULT ret = (LRESULT)TrackPopupMenuEx(hMenu, TPM_RETURNCMD, pt.x, pt.y, hwndDlg, &tpmp); switch(ret) { case 0: DestroyMenu(hMenu); return 0; // dismis menu case 1: SendMessage(hwndDlg, WMU_ADDSNOOZER, (WPARAM)5, 0); break; case 2: SendMessage(hwndDlg, WMU_ADDSNOOZER, (WPARAM)15, 0); break; case 3: SendMessage(hwndDlg, WMU_ADDSNOOZER, (WPARAM)30, 0); break; case 4: SendMessage(hwndDlg, WMU_ADDSNOOZER, (WPARAM)60, 0); break; case 5: SendMessage(hwndDlg, WMU_ADDSNOOZER, (WPARAM)(60 * 24), 0); break; case 6: SendMessage(hwndDlg, WMU_ADDSNOOZER, (WPARAM)(60 * 24 * 7), 0); break; } DestroyMenu(hMenu); SendMessage(hwndDlg, WM_COMMAND, IDC_DISMISS, 0); } break; } } return TRUE; case WM_MOUSEMOVE: if (wParam & MK_LBUTTON) { SetCapture(hwndDlg); POINT newp; newp.x = (short)LOWORD(lParam); newp.y = (short)HIWORD(lParam); ClientToScreen(hwndDlg, &newp); WindowData *window_data = (WindowData *)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); if (!window_data->moving) window_data->moving = true; else { RECT r; GetWindowRect(hwndDlg, &r); SetWindowPos(hwndDlg, 0, r.left + (newp.x - window_data->p.x), r.top + (newp.y - window_data->p.y), 0, 0, SWP_NOSIZE | SWP_NOZORDER); } window_data->p.x = newp.x; window_data->p.y = newp.y; } else { ReleaseCapture(); WindowData *window_data = (WindowData *)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); window_data->moving = false; } return TRUE; } return FALSE; }
void LoadAlarms() { int num_alarms = db_get_w(0, MODULE, "Count", 0); char buff[256]; DBVARIANT dbv; ALARM alarm; SYSTEMTIME now; GetLocalTime(&now); mir_cslock lck(alarm_cs); alarms.clear(); for(int i = 0; i < num_alarms; i++) { memset(&alarm, 0, sizeof(ALARM)); mir_snprintf(buff, "Title%d", i); if (!db_get_ts(0, MODULE, buff, &dbv)) { alarm.szTitle = mir_tstrdup(dbv.ptszVal); db_free(&dbv); } mir_snprintf(buff, "Desc%d", i); if (!db_get_ts(0, MODULE, buff, &dbv)) { alarm.szDesc = mir_tstrdup(dbv.ptszVal); db_free(&dbv); } mir_snprintf(buff, "Occ%d", i); alarm.occurrence = (Occurrence)db_get_w(0, MODULE, buff, 0); mir_snprintf(buff, "STHour%d", i); alarm.time.wHour = db_get_w(0, MODULE, buff, 0); mir_snprintf(buff, "STMinute%d", i); alarm.time.wMinute = db_get_w(0, MODULE, buff, 0); mir_snprintf(buff, "STSecond%d", i); alarm.time.wSecond = db_get_w(0, MODULE, buff, 0); switch(alarm.occurrence) { case OC_ONCE: mir_snprintf(buff, "STYear%d", i); alarm.time.wYear = db_get_w(0, MODULE, buff, 0); mir_snprintf(buff, "STMonth%d", i); alarm.time.wMonth = db_get_w(0, MODULE, buff, 0); mir_snprintf(buff, "STDay%d", i); alarm.time.wDay = db_get_w(0, MODULE, buff, 0); break; case OC_WEEKLY: mir_snprintf(buff, "STDayOfWeek%d", i); alarm.time.wDayOfWeek = db_get_w(0, MODULE, buff, 0); break; case OC_WEEKDAYS: break; case OC_DAILY: break; case OC_MONTHLY: mir_snprintf(buff, "STDay%d", i); alarm.time.wDay = db_get_w(0, MODULE, buff, 0); break; case OC_YEARLY: mir_snprintf(buff, "STMonth%d", i); alarm.time.wMonth = db_get_w(0, MODULE, buff, 0); mir_snprintf(buff, "STDay%d", i); alarm.time.wDay = db_get_w(0, MODULE, buff, 0); break; } if (UpdateAlarm(alarm.time, alarm.occurrence)) { mir_snprintf(buff, "ActionFlags%d", i); alarm.action = (unsigned short)db_get_dw(0, MODULE, buff, AAF_POPUP | AAF_SOUND); if (alarm.action & AAF_COMMAND) { mir_snprintf(buff, "ActionCommand%d", i); if (!db_get_ts(0, MODULE, buff, &dbv)) { alarm.szCommand = mir_tstrdup(dbv.ptszVal); db_free(&dbv); mir_snprintf(buff, "ActionParams%d", i); if (!db_get_ts(0, MODULE, buff, &dbv)) { alarm.szCommandParams = mir_tstrdup(dbv.ptszVal); db_free(&dbv); } } } mir_snprintf(buff, "SoundNum%d", i); alarm.sound_num = (int)db_get_b(0, MODULE, buff, 1); mir_snprintf(buff, "Snoozer%d", i); alarm.snoozer = db_get_b(0, MODULE, buff, 0) == 1; mir_snprintf(buff, "Hidden%d", i); alarm.flags |= (db_get_b(0, MODULE, buff, 0) == 1 ? ALF_HIDDEN : 0); mir_snprintf(buff, "Suspended%d", i); alarm.flags |= (db_get_b(0, MODULE, buff, 0) == 1 ? ALF_SUSPENDED : 0); mir_snprintf(buff, "NoStartup%d", i); alarm.flags |= (db_get_b(0, MODULE, buff, 0) == 1 ? ALF_NOSTARTUP : 0); mir_snprintf(buff, "Flags%d", i); alarm.flags = db_get_dw(0, MODULE, buff, alarm.flags); alarm.id = next_alarm_id++; alarms.push_back(&alarm); } free_alarm_data(&alarm); } }