HICON LoadIconEx(const char* name, bool big) { char szSettingName[100]; mir_snprintf(szSettingName, "MSN_%s", name); return IcoLib_GetIcon(szSettingName, big); }
/** * This function rebuilds the mainmenu. If user selected to cascade menus, * a root menu item is created which holds the popup for all the other items. * Note: since miranda 0.8 genmenu is part of core (we don't need to check for). * * @param none * * @return nothing **/ void RebuildMain() { BYTE item = 0; HGENMENU mhRoot = NULL; HGENMENU mhExIm = NULL; static HGENMENU hMenuItem[8] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }; // load options int flag = db_get_b(NULL, MODNAME, SET_MI_MAIN, MCAS_NOTINITIATED); if (flag == MCAS_NOTINITIATED) { flag = MCAS_ALL | TRUE; db_set_b(NULL, MODNAME, SET_MI_MAIN, flag); } // delete all MenuItems and set all bytes 0 to avoid problems RemoveMenuItems(hMenuItem, _countof(hMenuItem)); // support new genmenu style CMenuItem mi; switch (flag) { case 3: //cascade off mhRoot = mhExIm = NULL; hMenuItem[item++] = NULL; break; case 5: //cascade all SET_UID(mi, 0x17d277d5, 0x2772, 0x40c6, 0xbd, 0xbb, 0x2c, 0x3a, 0xcc, 0xda, 0xc, 0x72); mi.position = 500050000; mi.hIcolibItem = IcoLib_GetIcon(ICO_COMMON_MAIN); mi.name.a = MODULELONGNAME; mhRoot = Menu_AddMainMenuItem(&mi); hMenuItem[item++] = mhRoot; mhExIm = mhRoot; break; case 9: //cascade Ex/Import SET_UID(mi, 0x80666af7, 0x1c92, 0x4ea6, 0xa8, 0xdc, 0x25, 0x88, 0x88, 0x27, 0x92, 0x68); mi.position = 500050000; mi.hIcolibItem = IcoLib_GetIcon(ICO_BTN_EXIMPORT); mi.name.a = LPGEN("Export/import contact"); mhExIm = Menu_AddMainMenuItem(&mi); hMenuItem[item++] = mhExIm; mhRoot = NULL; break; default: //disable Menue return; } // details dialog SET_UID(mi, 0x42852ca4, 0x4941, 0x4219, 0x8b, 0x98, 0x33, 0x46, 0x8c, 0x32, 0xd8, 0xb8); mi.root = mhRoot; mi.pszService = MS_USERINFO_SHOWDIALOG; mi.name.a = LPGEN("View/change my &details..."); mi.position = 500050000; mi.hIcolibItem = IcoLib_GetIcon(ICO_COMMON_MAIN); hMenuItem[item++] = Menu_AddMainMenuItem(&mi); // VCard's Ex/Import menuitems mi.root = mhExIm; // Export SET_UID(mi, 0xf7e939c0, 0xecd4, 0x46d4, 0x8f, 0x77, 0x81, 0xe6, 0xa1, 0x0, 0x1f, 0xde); mi.pszService = MS_USERINFO_VCARD_EXPORTALL; mi.name.a = LPGEN("Export all contacts"); mi.position = 500150000; mi.hIcolibItem = IcoLib_GetIcon(ICO_BTN_EXPORT); hMenuItem[item++] = Menu_AddMainMenuItem(&mi); // Import SET_UID(mi, 0x80f7441, 0xa907, 0x48ad, 0xa3, 0xf0, 0x13, 0x1e, 0xc0, 0xef, 0xd0, 0x4d); mi.pszService = MS_USERINFO_VCARD_IMPORTALL; mi.name.a = LPGEN("Import all contacts"); mi.position = 500151000; mi.hIcolibItem = IcoLib_GetIcon(ICO_BTN_IMPORT); hMenuItem[item++] = Menu_AddMainMenuItem(&mi); // reminder mi.root = mhRoot; const BYTE bRemindMenus = db_get_b(NULL, MODNAME, SET_REMIND_ENABLED, DEFVAL_REMIND_ENABLED) && db_get_b(NULL, MODNAME, SET_REMIND_MENUENABLED, DEFVAL_REMIND_MENUENABLED); if (bRemindMenus) { // make backup of each protocol based birthday SET_UID(mi, 0x67980bea, 0x8fca, 0x4642, 0x96, 0x78, 0x6a, 0xc0, 0xe3, 0x74, 0x4c, 0x2a); mi.pszService = MS_USERINFO_REMINDER_AGGRASIVEBACKUP; mi.name.a = LPGEN("Backup birthdays"); mi.position = 500253000; mi.hIcolibItem = IcoLib_GetIcon(ICO_BTN_BDAY_BACKUP); hMenuItem[item++] = Menu_AddMainMenuItem(&mi); // Check anniversaries SET_UID(mi, 0xcc1c8aa1, 0x7d1, 0x4554, 0x9c, 0xfe, 0xc4, 0x1e, 0xb9, 0x5d, 0x4a, 0xf); mi.pszService = MS_USERINFO_REMINDER_CHECK; mi.name.a = LPGEN("Check anniversaries"); mi.position = 500251000; mi.hIcolibItem = IcoLib_GetIcon(ICO_BTN_SEARCH); hMenuItem[item++] = Menu_AddMainMenuItem(&mi); } else { hMenuItem[item++] = NULL; hMenuItem[item++] = NULL; } // Refresh Contact Details SET_UID(mi, 0x8b03ac79, 0x958a, 0x4967, 0x9d, 0x89, 0xd1, 0x4d, 0xf0, 0x91, 0x1c, 0x78); mi.pszService = MS_USERINFO_REFRESH; mi.name.a = LPGEN("Refresh contact details"); mi.position = 500254000; mi.hIcolibItem = IcoLib_GetIcon(ICO_BTN_UPDATE); hMenuItem[item++] = Menu_AddMainMenuItem(&mi); // anniversary list SET_UID(mi, 0x1b5e5630, 0xdaef, 0x40e0, 0xae, 0xb1, 0x62, 0x85, 0x9, 0x8e, 0x5e, 0x45); mi.pszService = MS_USERINFO_REMINDER_LIST; mi.name.a = LPGEN("Anniversary list"); mi.position = 500252000; mi.hIcolibItem = IcoLib_GetIcon(ICO_COMMON_ANNIVERSARY); hMenuItem[item++] = Menu_AddMainMenuItem(&mi); }
/** * name: Icon * class: CPsTreeItem * desc: load the icon, add to icolib if required and add to imagelist of treeview * params: hIml - treeview's imagelist to add the icon to * odp - pointer to OPTIONSDIALOGPAGE providing the information about the icon to load * hDefaultIcon - default icon to use * return: nothing **/ int CPsTreeItem::Icon(HIMAGELIST hIml, OPTIONSDIALOGPAGE *odp, BYTE bInitIconsOnly) { // check parameter if (!_pszName || !odp) return 1; // load the icon if no icolib is installed or creating the required settingname failed LPCSTR pszIconName = IconKey(); // use icolib to handle icons HICON hIcon = IcoLib_GetIcon(pszIconName); if (!hIcon) { bool bNeedFree = false; SKINICONDESC sid = { 0 }; sid.flags = SIDF_ALL_TCHAR; sid.pszName = (LPSTR)pszIconName; sid.description.t = _ptszLabel; sid.section.t = LPGENT(SECT_TREE); // the item to insert brings along an icon? if (odp->flags & ODPF_ICON) { // is it uinfoex item? if (odp->hInstance == ghInst) { // the pszGroup holds the iconfile for items added by uinfoex sid.defaultFile.t = odp->ptszGroup; // icon library exists? if (sid.defaultFile.t) sid.iDefaultIndex = (INT_PTR)odp->hIcon; // no valid icon library else { bNeedFree = true; sid.hDefaultIcon = ImageList_GetIcon(hIml, 0, ILD_NORMAL); sid.iDefaultIndex = -1; } } // default icon is delivered by the page to add else { if (odp->hIcon) sid.hDefaultIcon = odp->hIcon; else sid.hDefaultIcon = ImageList_GetIcon(hIml, 0, ILD_NORMAL), bNeedFree = true; sid.iDefaultIndex = -1; } } // no icon to add, use default else { sid.iDefaultIndex = -1; sid.hDefaultIcon = ProtoIcon(); if (!sid.hDefaultIcon) sid.hDefaultIcon = ImageList_GetIcon(hIml, 0, ILD_NORMAL), bNeedFree = true; } // add file to icolib IcoLib_AddIcon(&sid); if (!bInitIconsOnly) hIcon = IcoLib_GetIcon(pszIconName); if (bNeedFree) DestroyIcon(sid.hDefaultIcon); } if (!bInitIconsOnly && hIml) { // set custom icon to image list if (hIcon) return ((_iImage = ImageList_AddIcon(hIml, hIcon)) == -1); _iImage = 0; } else _iImage = -1; return 0; }
void SwitchLayout(bool lastword) { HWND hwnd = GetForegroundWindow(); if (hwnd == NULL) return; DWORD dwProcessID; DWORD dwThreadID = GetWindowThreadProcessId(hwnd, &dwProcessID); HWND hwnd2 = GetFocus(); if (hwnd2 == NULL) return; TCHAR szClassName[MAX_PATH]; GetClassName(hwnd2, szClassName, _countof(szClassName)); if ((mir_tstrcmp(szClassName, _T("THppRichEdit.UnicodeClass")) == 0 || mir_tstrcmp(szClassName, _T("THistoryGrid.UnicodeClass")) == 0 || mir_tstrcmp(szClassName, _T("TExtHistoryGrid.UnicodeClass")) == 0 || mir_tstrcmp(szClassName, _T("Internet Explorer_Server")) == 0) && ServiceExists(MS_POPUP_SHOWMESSAGE)) { // make popup here TCHAR buf[2048]; if (mir_tstrcmp(szClassName, _T("Internet Explorer_Server")) == 0) { IEVIEWEVENT event; HWND hwnd3 = GetParent(GetParent(hwnd2)); memset(&event, 0, sizeof(event)); event.cbSize = sizeof(IEVIEWEVENT); event.hContact = 0; event.dwFlags = 0; event.iType = IEE_GET_SELECTION; event.hwnd = hwnd3; TCHAR *selected = (TCHAR *)CallService(MS_IEVIEW_EVENT, 0, (LPARAM)&event); mir_tstrncpy(buf, selected, _countof(buf)); } else GetWindowText(hwnd2, buf, _countof(buf)); // gimme, gimme, gimme... size_t slen = mir_tstrlen(buf); if (slen != 0) { HKL hkl; ActivateKeyboardLayout((HKL)HKL_NEXT, KLF_ACTIVATE); // go to next layout before.... hkl = GetKeyboardLayout(dwThreadID); ActivateKeyboardLayout((HKL)HKL_PREV, KLF_ACTIVATE); // return to prev layout if (ServiceExists(MS_SMILEYADD_BATCHPARSE)) { memset(&smgp, 0, sizeof(smgp)); smgp.cbSize = sizeof(smgp); smgp.str = buf; smgp.flag = SAFL_TCHAR; smileyPrs = (SMADD_BATCHPARSERES *)CallService(MS_SMILEYADD_BATCHPARSE, 0, (LPARAM)&smgp); } for (size_t i = 0; i < slen; i++) { SHORT vks; BYTE keys[256] = { 0 }; vks = VkKeyScanEx(buf[i], hkl); keys[VK_SHIFT] = (HIBYTE(vks) & 1) ? 0xFF : 0x00; // shift keys[VK_CONTROL] = (HIBYTE(vks) & 2) ? 0xFF : 0x00; // ctrl keys[VK_MENU] = (HIBYTE(vks) & 4) ? 0xFF : 0x00; // alt if (!isItSmiley(DWORD(i))) { TCHAR tchr; if (ToUnicodeEx(LOBYTE(vks), 0, keys, &tchr, 1, 0, GetKeyboardLayout(dwThreadID)) == 1) buf[i] = tchr; } } if (smileyPrs != NULL) CallService(MS_SMILEYADD_BATCHFREE, 0, (LPARAM)smileyPrs); POPUPDATAT pd = { 0 }; pd.lchIcon = IcoLib_GetIcon("Switch Layout and Send"); mir_tstrncpy(pd.lptzText, buf, _countof(pd.lptzText)); mir_tstrncpy(pd.lptzContactName, TranslateT("TranslitSwitcher"), _countof(pd.lptzContactName)); PUAddPopupT(&pd); } } else if (mir_tstrcmpi(szClassName, _T("RichEdit50W")) == 0) { size_t i, start = 0, end = 0; SHORT vks; BYTE keys[256] = { 0 }; HKL hkl = GetKeyboardLayout(dwThreadID); DWORD dwStart, dwEnd, dwFlags = SF_TEXT | SF_UNICODE; SendMessage(hwnd2, EM_GETSEL, (WPARAM)&dwStart, (LPARAM)&dwEnd); bool somethingIsSelected = (dwStart != dwEnd); if (somethingIsSelected) dwFlags += SFF_SELECTION; TCHAR *sel = Message_GetFromStream(hwnd2, dwFlags); size_t slen = mir_tstrlen(sel); if (slen != 0) { if (ServiceExists(MS_SMILEYADD_BATCHPARSE)) { memset(&smgp, 0, sizeof(smgp)); smgp.cbSize = sizeof(smgp); smgp.str = sel; smgp.flag = SAFL_TCHAR; smileyPrs = (SMADD_BATCHPARSERES *)CallService(MS_SMILEYADD_BATCHPARSE, 0, (LPARAM)&smgp); } end = slen; if (lastword && !somethingIsSelected) { end = (size_t)dwStart; while (end < slen) { if (_istspace(sel[end]) || isItSmiley((int)end)) break; end++; } start = dwStart - 1; while (start > 0 && start < dwStart) { if ((_istspace(sel[start]) && !_istspace(sel[start + 1])) || isItSmiley((int)start)) break; start--; } } ActivateKeyboardLayout((HKL)HKL_PREV, KLF_ACTIVATE); for (i = start; i < end; i++) { vks = VkKeyScanEx(sel[i], hkl); keys[VK_SHIFT] = (HIBYTE(vks) & 1) ? 0xFF : 0x00; // shift keys[VK_CONTROL] = (HIBYTE(vks) & 2) ? 0xFF : 0x00; // ctrl keys[VK_MENU] = (HIBYTE(vks) & 4) ? 0xFF : 0x00; // alt if (!isItSmiley((int)i)) { TCHAR tchr; if (ToUnicodeEx(LOBYTE(vks), 0, keys, &tchr, 1, 0, GetKeyboardLayout(dwThreadID)) == 1) sel[i] = tchr; } } if (smileyPrs != NULL) CallService(MS_SMILEYADD_BATCHFREE, 0, (LPARAM)smileyPrs); if (somethingIsSelected) SendMessage(hwnd2, EM_REPLACESEL, false, (LPARAM)sel); else SetWindowText(hwnd2, sel); SendMessage(hwnd2, EM_SETSEL, (WPARAM)dwStart, (LPARAM)dwEnd); } mir_free(sel); } }
HICON LoadIconEx(const char* name, bool big) { char szSettingName[100]; mir_snprintf(szSettingName, "%s_%s", WEATHERPROTONAME, name); return IcoLib_GetIcon(szSettingName, big); }
HICON Quotes_LoadIconEx(const char* name, bool bBig /*= false*/) { std::string sIconName = Quotes_MakeIconName(name); return IcoLib_GetIcon(sIconName.c_str(), bBig); }
/* * get icon by name from the core icon library service */ HICON LoadIconEx(char *pszIcoLibName) { char szTemp[256]; mir_snprintf(szTemp, "chat_%s", pszIcoLibName); return IcoLib_GetIcon(szTemp); }
MIR_APP_DLL(HICON) Skin_LoadProtoIcon(const char *szProto, int status, bool big) { char iconName[MAX_PATH]; INT_PTR caps2; if (szProto == NULL) caps2 = -1; else if ((caps2 = CallProtoServiceInt(NULL,szProto, PS_GETCAPS, PFLAGNUM_2, 0)) == CALLSERVICE_NOTFOUND) caps2 = 0; if (IsStatusConnecting(status)) { mir_snprintf(iconName, _countof(iconName), "%s%d", mainIconsFmt, 7); return IcoLib_GetIcon(iconName, big); } int statusIndx = -1; for (int i = 0; i < _countof(statusIcons); i++) if (statusIcons[i].id == status) { statusIndx = i; break; } if (statusIndx == -1) return NULL; if (!szProto) { // Only return a protocol specific icon if there is only one protocol // Otherwise return the global icon. This affects the global status menu mainly. if (accounts.getCount() == 1) { // format: core_status_%proto%statusindex mir_snprintf(iconName, _countof(iconName), "%s%s%d", statusIconsFmt, szProto, statusIndx); HICON hIcon = IcoLib_GetIcon(iconName, big); if (hIcon) return hIcon; } // format: core_status_%s%d mir_snprintf(iconName, _countof(iconName), "%s%s%d", statusIconsFmt, GLOBAL_PROTO_NAME, statusIndx); return IcoLib_GetIcon(iconName, big); } // format: core_status_%s%d mir_snprintf(iconName, _countof(iconName), "%s%s%d", statusIconsFmt, szProto, statusIndx); HICON hIcon = IcoLib_GetIcon(iconName, big); if (hIcon == NULL && (caps2 == 0 || (caps2 & statusIcons[statusIndx].pf2))) { PROTOACCOUNT *pa = Proto_GetAccount(szProto); if (pa) { TCHAR szPath[MAX_PATH], szFullPath[MAX_PATH], *str; GetModuleFileName(NULL, szPath, _countof(szPath)); // Queried protocol isn't in list, adding TCHAR tszSection[MAX_PATH]; mir_sntprintf(tszSection, _countof(tszSection), _T(PROTOCOLS_PREFIX)_T("/%s"), pa->tszAccountName); SKINICONDESC sid = { 0 }; sid.section.t = tszSection; sid.flags = SIDF_ALL_TCHAR; str = _tcsrchr(szPath, '\\'); if (str != NULL) *str = 0; mir_sntprintf(szFullPath, _countof(szFullPath), _T("%s\\Icons\\proto_%S.dll"), szPath, pa->szProtoName); if (GetFileAttributes(szFullPath) != INVALID_FILE_ATTRIBUTES) sid.defaultFile.t = szFullPath; else { mir_sntprintf(szFullPath, _countof(szFullPath), _T("%s\\Plugins\\%S.dll"), szPath, szProto); if (int(ExtractIconEx(szFullPath, statusIcons[statusIndx].resource_id, NULL, &hIcon, 1)) > 0) { DestroyIcon(hIcon); sid.defaultFile.t = szFullPath; hIcon = NULL; } if (sid.defaultFile.a == NULL) { if (str != NULL) *str = '\\'; sid.defaultFile.t = szPath; } } // Add global icons to list int lowidx, highidx; if (caps2 == 0) lowidx = statusIndx, highidx = statusIndx + 1; else lowidx = 0, highidx = _countof(statusIcons); for (int i = lowidx; i < highidx; i++) if (caps2 == 0 || (caps2 & statusIcons[i].pf2)) { // format: core_%s%d mir_snprintf(iconName, _countof(iconName), "%s%s%d", statusIconsFmt, szProto, i); sid.pszName = iconName; sid.description.t = cli.pfnGetStatusModeDescription(statusIcons[i].id, 0); sid.iDefaultIndex = statusIcons[i].resource_id; IcoLib_AddIcon(&sid, 0); } } // format: core_status_%s%d mir_snprintf(iconName, _countof(iconName), "%s%s%d", statusIconsFmt, szProto, statusIndx); hIcon = IcoLib_GetIcon(iconName, big); if (hIcon) return hIcon; } if (hIcon == NULL) { mir_snprintf(iconName, _countof(iconName), "%s%s%d", statusIconsFmt, GLOBAL_PROTO_NAME, statusIndx); hIcon = IcoLib_GetIcon(iconName, big); } return hIcon; }
/** * This is the message procedure for my nice looking message box * * @param hDlg - window handle * @param uMsg - message to handle * @param wParam - message specific parameter * @param lParam - message specific parameter * * @return TRUE, FALSE, IDOK, IDYES, IDALL, IDNO or IDCANCEL **/ static INT_PTR CALLBACK MsgBoxProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { static int retOk = IDOK; static int retAll = IDALL; static int retNon = IDNONE; static int retCancel = IDCANCEL; switch (uMsg) { case WM_INITDIALOG: { LPMSGBOX pMsgBox = (LPMSGBOX)lParam; if (PtrIsValid(pMsgBox)) { int icoWidth = 0; int InfoBarHeight = 0; HFONT hNormalFont; hNormalFont = (HFONT)SendDlgItemMessage(hDlg, TXT_NAME, WM_GETFONT, 0, 0); if (pMsgBox->uType & MB_INFOBAR) { LOGFONT lf; // set bold font for name in description area GetObject(hNormalFont, sizeof(lf), &lf); lf.lfWeight = FW_BOLD; hNormalFont = CreateFontIndirect(&lf); // set infobar's textfont SendDlgItemMessage(hDlg, TXT_NAME, WM_SETFONT, (WPARAM)hNormalFont, 0); // set infobar's logo icon SendDlgItemMessage(hDlg, ICO_DLGLOGO, STM_SETIMAGE, IMAGE_ICON, (pMsgBox->hiLogo ? (LPARAM)pMsgBox->hiLogo : (LPARAM)IcoLib_GetIcon(ICO_DLG_DETAILS,TRUE))); // enable headerbar ShowWindow(GetDlgItem(hDlg, TXT_NAME), SW_SHOW); ShowWindow(GetDlgItem(hDlg, ICO_DLGLOGO), SW_SHOW); } else { RECT rc; GetClientRect(GetDlgItem(hDlg, TXT_NAME), &rc); InfoBarHeight = rc.bottom; if (pMsgBox->hiLogo) SendMessage(hDlg, WM_SETICON, ICON_BIG, (LPARAM)pMsgBox->hiLogo); } // draw the desired status icon HICON hIcon = MsgLoadIcon(pMsgBox); if (hIcon) SendDlgItemMessage(hDlg, ICO_MSGDLG, STM_SETIMAGE, IMAGE_ICON, (LPARAM)hIcon); else { RECT ws; GetWindowRect(GetDlgItem(hDlg, ICO_MSGDLG), &ws); icoWidth = ws.right - ws.left; ShowWindow(GetDlgItem(hDlg, ICO_MSGDLG), SW_HIDE); } // resize the messagebox and reorganize the buttons if (HDC hDC = GetDC(hDlg)) { POINT mpt = { 0, 0 }; RECT ws = { 0, 0, 0, 0 }; int txtWidth=0, txtHeight=0, needX, needY; RECT rcDlg; SIZE ts; LPTSTR h, rs; SelectObject(hDC, hNormalFont); // get message text width and height if(pMsgBox->ptszMsg) for (rs=h=pMsgBox->ptszMsg; ; ++h) { if (*h=='\n' || !*h) { GetTextExtentPoint32(hDC, rs, h-rs, &ts); if (ts.cx > txtWidth) txtWidth = ts.cx; txtHeight += ts.cy; if (!*h) break; rs = h+1; } } // increase width if info text requires more if((pMsgBox->uType&MB_INFOBAR) && pMsgBox->ptszInfoText && *pMsgBox->ptszInfoText){ //int multiline = 0; RECT rcico; GetClientRect(GetDlgItem(hDlg,ICO_DLGLOGO), &rcico); rcico.right = rcico.right*100/66; // padding for(rs=h=pMsgBox->ptszInfoText; ; ++h) { if (*h=='\n' || !*h) { GetTextExtentPoint32(hDC, rs, h-rs, &ts); ts.cx += rcico.right; if (ts.cx > txtWidth) txtWidth = ts.cx; if (!*h) break; rs = h+1; //++multiline; } } /* used by SendSS, disabled for UserInfoEx for now if(!multiline) SetWindowLongPtr(GetDlgItem(hDlg,TXT_NAME), GWL_STYLE, GetWindowLongPtr(GetDlgItem(hDlg,TXT_NAME), GWL_STYLE)|SS_CENTERIMAGE); */ } ReleaseDC(hDlg, hDC); // calc new dialog size GetWindowRect(hDlg, &rcDlg); GetWindowRect(GetDlgItem(hDlg, TXT_MESSAGE), &ws); needX = txtWidth - (ws.right - ws.left) - icoWidth; needY = max(0, txtHeight - (ws.bottom - ws.top) + 5); rcDlg.left -= needX/2; rcDlg.right += needX/2; rcDlg.top -= (needY-InfoBarHeight)/2; rcDlg.bottom += (needY-InfoBarHeight)/2; // resize dialog window MoveWindow(hDlg, rcDlg.left, rcDlg.top, rcDlg.right - rcDlg.left, rcDlg.bottom - rcDlg.top, FALSE); ClientToScreen(hDlg, &mpt); MoveCtrl(hDlg, STATIC_WHITERECT, -mpt.x, -mpt.y, needX, needY - InfoBarHeight); MoveCtrl(hDlg, TXT_NAME, -mpt.x, -mpt.y, needX, 0); MoveCtrl(hDlg, ICO_DLGLOGO, -mpt.x + needX, -mpt.y, 0, 0); MoveCtrl(hDlg, ICO_MSGDLG, -mpt.x, -mpt.y - InfoBarHeight, 0, 0); MoveCtrl(hDlg, TXT_MESSAGE, -mpt.x - icoWidth, -mpt.y - InfoBarHeight, needX, needY); MoveCtrl(hDlg, STATIC_LINE2, -mpt.x, -mpt.y + needY - InfoBarHeight, needX, 0); // // Do pushbutton positioning // RECT rcOk, rcAll, rcNone, rcCancel; // get button rectangles GetWindowRect(GetDlgItem(hDlg, IDOK), &rcOk); OffsetRect(&rcOk, -mpt.x, -mpt.y + needY - InfoBarHeight); GetWindowRect(GetDlgItem(hDlg, IDALL), &rcAll); OffsetRect(&rcAll, -mpt.x, -mpt.y + needY - InfoBarHeight); GetWindowRect(GetDlgItem(hDlg, IDNONE), &rcNone); OffsetRect(&rcNone, -mpt.x, -mpt.y + needY - InfoBarHeight); GetWindowRect(GetDlgItem(hDlg, IDCANCEL), &rcCancel); OffsetRect(&rcCancel, -mpt.x, -mpt.y + needY - InfoBarHeight); LONG okWidth = rcOk.right - rcOk.left; LONG allWidth = rcAll.right - rcAll.left; LONG noneWidth = rcNone.right - rcNone.left; LONG caWidth = rcCancel.right - rcCancel.left; LONG dlgMid = (rcDlg.right - rcDlg.left) / 2; // load button configuration switch (MB_TYPE(pMsgBox->uType)) { case MB_OK: rcOk.left = dlgMid - (okWidth / 2); rcOk.right = rcOk.left + okWidth; ShowWindow(GetDlgItem(hDlg, IDOK), SW_SHOW); break; case MB_OKCANCEL: retOk = IDRETRY; SetDlgItemText(hDlg, IDOK, LPGENT("OK")); retCancel = IDCANCEL; SetDlgItemText(hDlg, IDCANCEL, LPGENT("Cancel")); rcOk.left = dlgMid - okWidth - 10; rcOk.right = rcOk.left + okWidth; rcCancel.left = dlgMid + 10; rcCancel.right = rcCancel.left + caWidth; ShowWindow(GetDlgItem(hDlg, IDOK), SW_SHOW); ShowWindow(GetDlgItem(hDlg, IDCANCEL), SW_SHOW); break; case MB_RETRYCANCEL: retOk = IDRETRY; SetDlgItemText(hDlg, IDOK, LPGENT("Retry")); retCancel = IDCANCEL; SetDlgItemText(hDlg, IDCANCEL, LPGENT("Cancel")); rcOk.left = dlgMid - okWidth - 10; rcOk.right = rcOk.left + okWidth; rcCancel.left = dlgMid + 10; rcCancel.right = rcCancel.left + caWidth; ShowWindow(GetDlgItem(hDlg, IDOK), SW_SHOW); ShowWindow(GetDlgItem(hDlg, IDCANCEL), SW_SHOW); break; case MB_YESNO: retOk = IDYES; SetDlgItemText(hDlg, IDOK, LPGENT("Yes")); retCancel = IDNO; SetDlgItemText(hDlg, IDCANCEL, LPGENT("No")); rcOk.left = dlgMid - okWidth - 10; rcOk.right = rcOk.left + okWidth; rcCancel.left = dlgMid + 10; rcCancel.right = rcCancel.left + caWidth; ShowWindow(GetDlgItem(hDlg, IDOK), SW_SHOW); ShowWindow(GetDlgItem(hDlg, IDCANCEL), SW_SHOW); break; case MB_ABORTRETRYIGNORE: retOk = IDABORT; SetDlgItemText(hDlg, IDOK, LPGENT("Abort")); retAll = IDABORT; SetDlgItemText(hDlg, IDALL, LPGENT("Retry")); retCancel = IDCANCEL; SetDlgItemText(hDlg, IDCANCEL, LPGENT("Ignore")); rcAll.left = dlgMid - (allWidth / 2); rcAll.right = rcAll.left + allWidth; rcOk.left = rcAll.left - okWidth - 5; rcOk.right = rcOk.left + okWidth; rcCancel.left = rcAll.right + 5; rcCancel.right = rcCancel.left + caWidth; ShowWindow(GetDlgItem(hDlg, IDOK), SW_SHOW); ShowWindow(GetDlgItem(hDlg, IDALL), SW_SHOW); ShowWindow(GetDlgItem(hDlg, IDCANCEL), SW_SHOW); break; case MB_YESNOCANCEL: retOk = IDYES; SetDlgItemText(hDlg, IDOK, LPGENT("Yes")); retAll = IDNO; SetDlgItemText(hDlg, IDALL, LPGENT("No")); retCancel = IDCANCEL; SetDlgItemText(hDlg, IDCANCEL, LPGENT("Cancel")); rcAll.left = dlgMid - (allWidth / 2); rcAll.right = rcAll.left + allWidth; rcOk.left = rcAll.left - okWidth - 5; rcOk.right = rcOk.left + okWidth; rcCancel.left = rcAll.right + 5; rcCancel.right = rcCancel.left + caWidth; ShowWindow(GetDlgItem(hDlg, IDOK), SW_SHOW); ShowWindow(GetDlgItem(hDlg, IDALL), SW_SHOW); ShowWindow(GetDlgItem(hDlg, IDCANCEL), SW_SHOW); break; case MB_YESALLNO: retOk = IDYES; SetDlgItemText(hDlg, IDOK, LPGENT("Yes")); retAll = IDALL; SetDlgItemText(hDlg, IDALL, LPGENT("All")); //retNon = IDNONE; SetDlgItemText(hDlg, IDNONE, LPGENT("None")); retCancel = IDNO; SetDlgItemText(hDlg, IDCANCEL, LPGENT("No")); rcCancel.right = rcDlg.right - rcDlg.left - 10; rcCancel.left = rcCancel.right - caWidth; rcNone.right = rcCancel.left - 5; rcNone.left = rcNone.right - noneWidth; rcAll.right = rcNone.left - 5; rcAll.left = rcAll.right - allWidth; rcOk.right = rcAll.left - 5; rcOk.left = rcOk.right - okWidth; // show buttons ShowWindow(GetDlgItem(hDlg, IDOK), SW_SHOW); ShowWindow(GetDlgItem(hDlg, IDALL), SW_SHOW); ShowWindow(GetDlgItem(hDlg, IDNONE), SW_SHOW); ShowWindow(GetDlgItem(hDlg, IDCANCEL), SW_SHOW); break; default: rcOk.left = dlgMid - (okWidth / 2); rcOk.right = rcOk.left + okWidth; } MoveWindow(GetDlgItem(hDlg, IDOK), rcOk.left, rcOk.top, rcOk.right - rcOk.left, rcOk.bottom - rcOk.top, FALSE); MoveWindow(GetDlgItem(hDlg, IDALL), rcAll.left, rcAll.top, rcAll.right - rcAll.left, rcAll.bottom - rcAll.top, FALSE); MoveWindow(GetDlgItem(hDlg, IDNONE), rcNone.left, rcNone.top, rcNone.right - rcNone.left, rcNone.bottom - rcNone.top, FALSE); MoveWindow(GetDlgItem(hDlg, IDCANCEL), rcCancel.left, rcCancel.top, rcCancel.right - rcCancel.left, rcCancel.bottom - rcCancel.top, FALSE); } // set text's SetWindowText(hDlg, pMsgBox->ptszTitle); SetDlgItemText(hDlg, TXT_NAME, pMsgBox->ptszInfoText); SetDlgItemText(hDlg, TXT_MESSAGE, pMsgBox->ptszMsg); TranslateDialogDefault(hDlg); return TRUE; } } break; case WM_CTLCOLORSTATIC: switch (GetWindowLongPtr((HWND)lParam, GWLP_ID)) { case STATIC_WHITERECT: case ICO_DLGLOGO: case ICO_MSGDLG: case TXT_MESSAGE: case TXT_NAME: SetTextColor((HDC)wParam, GetSysColor(COLOR_WINDOWTEXT)); return GetSysColor(COLOR_WINDOW); } break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: EndDialog(hDlg, retOk); break; case IDCANCEL: EndDialog(hDlg, retCancel); break; case IDALL: EndDialog(hDlg, retAll); break; case IDNONE: EndDialog(hDlg, retNon); } break; case WM_DESTROY: DeleteObject((HFONT)SendDlgItemMessage(hDlg, TXT_NAME, WM_GETFONT, 0, 0)); break; } return FALSE; }
static INT_PTR CALLBACK SettingsDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: TranslateDialogDefault(hwndDlg); { hwndSettingsDlg = hwndDlg; LCID locale = Langpack_GetDefaultLocale(); SendDlgItemMessage(hwndDlg, IDC_ICON_HEADER, STM_SETIMAGE, IMAGE_ICON, (LPARAM)IcoLib_GetIcon("AutoShutdown_Header")); { HFONT hBoldFont; LOGFONT lf; if (GetObject((HFONT)SendDlgItemMessage(hwndDlg, IDC_TEXT_HEADER, WM_GETFONT, 0, 0), sizeof(lf), &lf)) { lf.lfWeight = FW_BOLD; hBoldFont = CreateFontIndirect(&lf); } else hBoldFont = NULL; SendDlgItemMessage(hwndDlg, IDC_TEXT_HEADER, WM_SETFONT, (WPARAM)hBoldFont, FALSE); } /* read-in watcher flags */ { WORD watcherType = db_get_w(NULL, "AutoShutdown", "WatcherFlags", SETTING_WATCHERFLAGS_DEFAULT); CheckRadioButton(hwndDlg, IDC_RADIO_STTIME, IDC_RADIO_STCOUNTDOWN, (watcherType&SDWTF_ST_TIME) ? IDC_RADIO_STTIME : IDC_RADIO_STCOUNTDOWN); CheckDlgButton(hwndDlg, IDC_CHECK_SPECIFICTIME, (watcherType&SDWTF_SPECIFICTIME) != 0 ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_CHECK_MESSAGE, (watcherType&SDWTF_MESSAGE) != 0 ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_CHECK_FILETRANSFER, (watcherType&SDWTF_FILETRANSFER) != 0 ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_CHECK_IDLE, (watcherType&SDWTF_IDLE) != 0 ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_CHECK_STATUS, (watcherType&SDWTF_STATUS) != 0 ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_CHECK_CPUUSAGE, (watcherType&SDWTF_CPUUSAGE) != 0 ? BST_CHECKED : BST_UNCHECKED); } /* read-in countdown val */ { SYSTEMTIME st; if (!TimeStampToSystemTime((time_t)db_get_dw(NULL, "AutoShutdown", "TimeStamp", SETTING_TIMESTAMP_DEFAULT), &st)) GetLocalTime(&st); DateTime_SetSystemtime(GetDlgItem(hwndDlg, IDC_TIME_TIMESTAMP), GDT_VALID, &st); DateTime_SetSystemtime(GetDlgItem(hwndDlg, IDC_DATE_TIMESTAMP), GDT_VALID, &st); SendMessage(hwndDlg, M_CHECK_DATETIME, 0, 0); } { DWORD setting = db_get_dw(NULL, "AutoShutdown", "Countdown", SETTING_COUNTDOWN_DEFAULT); if (setting < 1) setting = SETTING_COUNTDOWN_DEFAULT; SendDlgItemMessage(hwndDlg, IDC_SPIN_COUNTDOWN, UDM_SETRANGE, 0, MAKELPARAM(UD_MAXVAL, 1)); SendDlgItemMessage(hwndDlg, IDC_EDIT_COUNTDOWN, EM_SETLIMITTEXT, (WPARAM)10, 0); SendDlgItemMessage(hwndDlg, IDC_SPIN_COUNTDOWN, UDM_SETPOS, 0, MAKELPARAM(setting, 0)); SetDlgItemInt(hwndDlg, IDC_EDIT_COUNTDOWN, setting, FALSE); } { HWND hwndCombo = GetDlgItem(hwndDlg, IDC_COMBO_COUNTDOWNUNIT); DWORD lastUnit = db_get_dw(NULL, "AutoShutdown", "CountdownUnit", SETTING_COUNTDOWNUNIT_DEFAULT); SendMessage(hwndCombo, CB_SETLOCALE, (WPARAM)locale, 0); /* sort order */ SendMessage(hwndCombo, CB_INITSTORAGE, _countof(unitNames), _countof(unitNames) * 16); /* approx. */ for (int i = 0; i < _countof(unitNames); ++i) { int index = SendMessage(hwndCombo, CB_ADDSTRING, 0, (LPARAM)TranslateTS(unitNames[i])); if (index != LB_ERR) { SendMessage(hwndCombo, CB_SETITEMDATA, index, (LPARAM)unitValues[i]); if (i == 0 || unitValues[i] == lastUnit) SendMessage(hwndCombo, CB_SETCURSEL, index, 0); } } } { DBVARIANT dbv; if (!db_get_ts(NULL, "AutoShutdown", "Message", &dbv)) { SetDlgItemText(hwndDlg, IDC_EDIT_MESSAGE, dbv.ptszVal); mir_free(dbv.ptszVal); } } /* cpuusage threshold */ { BYTE setting = DBGetContactSettingRangedByte(NULL, "AutoShutdown", "CpuUsageThreshold", SETTING_CPUUSAGETHRESHOLD_DEFAULT, 1, 100); SendDlgItemMessage(hwndDlg, IDC_SPIN_CPUUSAGE, UDM_SETRANGE, 0, MAKELPARAM(100, 1)); SendDlgItemMessage(hwndDlg, IDC_EDIT_CPUUSAGE, EM_SETLIMITTEXT, (WPARAM)3, 0); SendDlgItemMessage(hwndDlg, IDC_SPIN_CPUUSAGE, UDM_SETPOS, 0, MAKELPARAM(setting, 0)); SetDlgItemInt(hwndDlg, IDC_EDIT_CPUUSAGE, setting, FALSE); } /* shutdown types */ { HWND hwndCombo = GetDlgItem(hwndDlg, IDC_COMBO_SHUTDOWNTYPE); BYTE lastShutdownType = db_get_b(NULL, "AutoShutdown", "ShutdownType", SETTING_SHUTDOWNTYPE_DEFAULT); SendMessage(hwndCombo, CB_SETLOCALE, (WPARAM)locale, 0); /* sort order */ SendMessage(hwndCombo, CB_SETEXTENDEDUI, TRUE, 0); SendMessage(hwndCombo, CB_INITSTORAGE, SDSDT_MAX, SDSDT_MAX * 32); for (BYTE shutdownType = 1; shutdownType <= SDSDT_MAX; ++shutdownType) if (ServiceIsTypeEnabled(shutdownType, 0)) { TCHAR *pszText = (TCHAR*)ServiceGetTypeDescription(shutdownType, GSTDF_TCHAR); /* never fails */ int index = SendMessage(hwndCombo, CB_ADDSTRING, 0, (LPARAM)pszText); if (index != LB_ERR) { SendMessage(hwndCombo, CB_SETITEMDATA, index, (LPARAM)shutdownType); if (shutdownType == 1 || shutdownType == lastShutdownType) SendMessage(hwndCombo, CB_SETCURSEL, (WPARAM)index, 0); } } SendMessage(hwndDlg, M_UPDATE_SHUTDOWNDESC, 0, (LPARAM)hwndCombo); } /* check if proto is installed that supports instant messages and check if a message dialog plugin is installed */ if (!AnyProtoHasCaps(PF1_IMRECV) || !ServiceExists(MS_MSG_SENDMESSAGE)) { /* no srmessage present? */ CheckDlgButton(hwndDlg, IDC_CHECK_MESSAGE, BST_UNCHECKED); EnableWindow(GetDlgItem(hwndDlg, IDC_CHECK_MESSAGE), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_EDIT_MESSAGE), FALSE); } /* check if proto is installed that supports file transfers and check if a file transfer dialog is available */ if (!AnyProtoHasCaps(PF1_FILESEND) && !AnyProtoHasCaps(PF1_FILERECV)) { /* no srfile present? */ CheckDlgButton(hwndDlg, IDC_CHECK_FILETRANSFER, BST_UNCHECKED); EnableWindow(GetDlgItem(hwndDlg, IDC_CHECK_FILETRANSFER), FALSE); } /* check if cpu usage can be detected */ if (!PollCpuUsage(DisplayCpuUsageProc, (LPARAM)GetDlgItem(hwndDlg, IDC_TEXT_CURRENTCPU), 1800)) { CheckDlgButton(hwndDlg, IDC_CHECK_CPUUSAGE, BST_UNCHECKED); EnableWindow(GetDlgItem(hwndDlg, IDC_CHECK_CPUUSAGE), FALSE); } } SendMessage(hwndDlg, M_ENABLE_SUBCTLS, 0, 0); Utils_RestoreWindowPositionNoSize(hwndDlg, NULL, "AutoShutdown", "SettingsDlg_"); return TRUE; /* default focus */ case WM_DESTROY: Utils_SaveWindowPosition(hwndDlg, NULL, "AutoShutdown", "SettingsDlg_"); { HFONT hFont = (HFONT)SendDlgItemMessage(hwndDlg, IDC_TEXT_HEADER, WM_GETFONT, 0, 0); SendDlgItemMessage(hwndDlg, IDC_TEXT_HEADER, WM_SETFONT, 0, FALSE); /* no return value */ if (hFont != NULL) DeleteObject(hFont); hwndSettingsDlg = NULL; } return TRUE; case WM_CTLCOLORSTATIC: switch (GetDlgCtrlID((HWND)lParam)) { case IDC_ICON_HEADER: SetBkMode((HDC)wParam, TRANSPARENT); case IDC_RECT_HEADER: /* need to set COLOR_WINDOW manually for Win9x */ SetBkColor((HDC)wParam, GetSysColor(COLOR_WINDOW)); return (INT_PTR)GetSysColorBrush(COLOR_WINDOW); case IDC_TEXT_HEADER: case IDC_TEXT_HEADERDESC: SetBkMode((HDC)wParam, TRANSPARENT); return (INT_PTR)GetStockObject(NULL_BRUSH); } break; case M_ENABLE_SUBCTLS: { BOOL checked = IsDlgButtonChecked(hwndDlg, IDC_CHECK_MESSAGE) != 0; EnableDlgItem(hwndDlg, IDC_EDIT_MESSAGE, checked); checked = IsDlgButtonChecked(hwndDlg, IDC_CHECK_SPECIFICTIME) != 0; EnableDlgItem(hwndDlg, IDC_RADIO_STTIME, checked); EnableDlgItem(hwndDlg, IDC_RADIO_STCOUNTDOWN, checked); checked = (IsDlgButtonChecked(hwndDlg, IDC_CHECK_SPECIFICTIME) && IsDlgButtonChecked(hwndDlg, IDC_RADIO_STTIME)); EnableDlgItem(hwndDlg, IDC_TIME_TIMESTAMP, checked); EnableDlgItem(hwndDlg, IDC_DATE_TIMESTAMP, checked); checked = (IsDlgButtonChecked(hwndDlg, IDC_CHECK_SPECIFICTIME) && IsDlgButtonChecked(hwndDlg, IDC_RADIO_STCOUNTDOWN)); EnableDlgItem(hwndDlg, IDC_EDIT_COUNTDOWN, checked); EnableDlgItem(hwndDlg, IDC_SPIN_COUNTDOWN, checked); EnableDlgItem(hwndDlg, IDC_COMBO_COUNTDOWNUNIT, checked); checked = IsDlgButtonChecked(hwndDlg, IDC_CHECK_IDLE) != 0; EnableDlgItem(hwndDlg, IDC_URL_IDLE, checked); checked = IsDlgButtonChecked(hwndDlg, IDC_CHECK_CPUUSAGE) != 0; EnableDlgItem(hwndDlg, IDC_EDIT_CPUUSAGE, checked); EnableDlgItem(hwndDlg, IDC_SPIN_CPUUSAGE, checked); EnableDlgItem(hwndDlg, IDC_TEXT_PERCENT, checked); EnableDlgItem(hwndDlg, IDC_TEXT_CURRENTCPU, checked); checked = (IsDlgButtonChecked(hwndDlg, IDC_CHECK_SPECIFICTIME) || IsDlgButtonChecked(hwndDlg, IDC_CHECK_MESSAGE) || IsDlgButtonChecked(hwndDlg, IDC_CHECK_IDLE) || IsDlgButtonChecked(hwndDlg, IDC_CHECK_STATUS) || IsDlgButtonChecked(hwndDlg, IDC_CHECK_FILETRANSFER) || IsDlgButtonChecked(hwndDlg, IDC_CHECK_CPUUSAGE)); EnableDlgItem(hwndDlg, IDOK, checked); } return TRUE; case M_UPDATE_SHUTDOWNDESC: /* lParam=(LPARAM)(HWND)hwndCombo */ { BYTE shutdownType = (BYTE)SendMessage((HWND)lParam, CB_GETITEMDATA, SendMessage((HWND)lParam, CB_GETCURSEL, 0, 0), 0); SetDlgItemText(hwndDlg, IDC_TEXT_SHUTDOWNTYPE, (TCHAR*)ServiceGetTypeDescription(shutdownType, GSTDF_LONGDESC | GSTDF_TCHAR)); } return TRUE; case WM_TIMECHANGE: /* system time changed */ SendMessage(hwndDlg, M_CHECK_DATETIME, 0, 0); return TRUE; case M_CHECK_DATETIME: { SYSTEMTIME st, stBuf; time_t timestamp; DateTime_GetSystemtime(GetDlgItem(hwndDlg, IDC_DATE_TIMESTAMP), &stBuf); DateTime_GetSystemtime(GetDlgItem(hwndDlg, IDC_TIME_TIMESTAMP), &st); st.wDay = stBuf.wDay; st.wDayOfWeek = stBuf.wDayOfWeek; st.wMonth = stBuf.wMonth; st.wYear = stBuf.wYear; GetLocalTime(&stBuf); if (SystemTimeToTimeStamp(&st, ×tamp)) { /* set to current date if earlier */ if (timestamp < time(NULL)) { st.wDay = stBuf.wDay; st.wDayOfWeek = stBuf.wDayOfWeek; st.wMonth = stBuf.wMonth; st.wYear = stBuf.wYear; if (SystemTimeToTimeStamp(&st, ×tamp)) { /* step one day up if still earlier */ if (timestamp < time(NULL)) { timestamp += 24 * 60 * 60; TimeStampToSystemTime(timestamp, &st); } } } } DateTime_SetRange(GetDlgItem(hwndDlg, IDC_DATE_TIMESTAMP), GDTR_MIN, &stBuf); DateTime_SetRange(GetDlgItem(hwndDlg, IDC_TIME_TIMESTAMP), GDTR_MIN, &stBuf); DateTime_SetSystemtime(GetDlgItem(hwndDlg, IDC_DATE_TIMESTAMP), GDT_VALID, &st); DateTime_SetSystemtime(GetDlgItem(hwndDlg, IDC_TIME_TIMESTAMP), GDT_VALID, &st); } return TRUE; case WM_NOTIFY: switch (((NMHDR*)lParam)->idFrom) { case IDC_TIME_TIMESTAMP: case IDC_DATE_TIMESTAMP: switch (((NMHDR*)lParam)->code) { case DTN_CLOSEUP: case NM_KILLFOCUS: PostMessage(hwndDlg, M_CHECK_DATETIME, 0, 0); return TRUE; } } break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_CHECK_MESSAGE: case IDC_CHECK_FILETRANSFER: case IDC_CHECK_IDLE: case IDC_CHECK_CPUUSAGE: case IDC_CHECK_STATUS: case IDC_CHECK_SPECIFICTIME: case IDC_RADIO_STTIME: case IDC_RADIO_STCOUNTDOWN: SendMessage(hwndDlg, M_ENABLE_SUBCTLS, 0, 0); return TRUE; case IDC_EDIT_COUNTDOWN: if (HIWORD(wParam) == EN_KILLFOCUS) { if ((int)GetDlgItemInt(hwndDlg, IDC_EDIT_COUNTDOWN, NULL, TRUE) < 1) { SendDlgItemMessage(hwndDlg, IDC_SPIN_COUNTDOWN, UDM_SETPOS, 0, MAKELPARAM(1, 0)); SetDlgItemInt(hwndDlg, IDC_EDIT_COUNTDOWN, 1, FALSE); } return TRUE; } break; case IDC_EDIT_CPUUSAGE: if (HIWORD(wParam) == EN_KILLFOCUS) { WORD val = (WORD)GetDlgItemInt(hwndDlg, IDC_EDIT_CPUUSAGE, NULL, FALSE); if (val < 1) val = 1; else if (val>100) val = 100; SendDlgItemMessage(hwndDlg, IDC_SPIN_CPUUSAGE, UDM_SETPOS, 0, MAKELPARAM(val, 0)); SetDlgItemInt(hwndDlg, IDC_EDIT_CPUUSAGE, val, FALSE); return TRUE; } break; case IDC_URL_IDLE: { OPENOPTIONSDIALOG ood; ood.cbSize = sizeof(ood); ood.pszGroup = "Status"; /* autotranslated */ ood.pszPage = "Idle"; /* autotranslated */ ood.pszTab = NULL; Options_Open(&ood); return TRUE; } case IDC_COMBO_SHUTDOWNTYPE: if (HIWORD(wParam) == CBN_SELCHANGE) SendMessage(hwndDlg, M_UPDATE_SHUTDOWNDESC, 0, lParam); return TRUE; case IDOK: /* save settings and start watcher */ ShowWindow(hwndDlg, SW_HIDE); /* message text */ { HWND hwndEdit = GetDlgItem(hwndDlg, IDC_EDIT_MESSAGE); int len = GetWindowTextLength(hwndEdit) + 1; TCHAR *pszText = (TCHAR*)mir_alloc(len*sizeof(TCHAR)); if (pszText != NULL && GetWindowText(hwndEdit, pszText, len + 1)) { TrimString(pszText); db_set_ts(NULL, "AutoShutdown", "Message", pszText); } mir_free(pszText); /* does NULL check */ } /* timestamp */ { SYSTEMTIME st; time_t timestamp; DateTime_GetSystemtime(GetDlgItem(hwndDlg, IDC_TIME_TIMESTAMP), &st); /* time gets synchronized */ if (!SystemTimeToTimeStamp(&st, ×tamp)) timestamp = time(NULL); db_set_dw(NULL, "AutoShutdown", "TimeStamp", (DWORD)timestamp); } /* shutdown type */ { int index = SendDlgItemMessage(hwndDlg, IDC_COMBO_SHUTDOWNTYPE, CB_GETCURSEL, 0, 0); if (index != LB_ERR) db_set_b(NULL, "AutoShutdown", "ShutdownType", (BYTE)SendDlgItemMessage(hwndDlg, IDC_COMBO_SHUTDOWNTYPE, CB_GETITEMDATA, (WPARAM)index, 0)); index = SendDlgItemMessage(hwndDlg, IDC_COMBO_COUNTDOWNUNIT, CB_GETCURSEL, 0, 0); if (index != LB_ERR) db_set_dw(NULL, "AutoShutdown", "CountdownUnit", (DWORD)SendDlgItemMessage(hwndDlg, IDC_COMBO_COUNTDOWNUNIT, CB_GETITEMDATA, (WPARAM)index, 0)); db_set_dw(NULL, "AutoShutdown", "Countdown", (DWORD)GetDlgItemInt(hwndDlg, IDC_EDIT_COUNTDOWN, NULL, FALSE)); db_set_b(NULL, "AutoShutdown", "CpuUsageThreshold", (BYTE)GetDlgItemInt(hwndDlg, IDC_EDIT_CPUUSAGE, NULL, FALSE)); } /* watcher type */ { WORD watcherType = (WORD)(IsDlgButtonChecked(hwndDlg, IDC_RADIO_STTIME) ? SDWTF_ST_TIME : SDWTF_ST_COUNTDOWN); if (IsDlgButtonChecked(hwndDlg, IDC_CHECK_SPECIFICTIME)) watcherType |= SDWTF_SPECIFICTIME; if (IsDlgButtonChecked(hwndDlg, IDC_CHECK_MESSAGE)) watcherType |= SDWTF_MESSAGE; if (IsDlgButtonChecked(hwndDlg, IDC_CHECK_FILETRANSFER)) watcherType |= SDWTF_FILETRANSFER; if (IsDlgButtonChecked(hwndDlg, IDC_CHECK_IDLE)) watcherType |= SDWTF_IDLE; if (IsDlgButtonChecked(hwndDlg, IDC_CHECK_STATUS)) watcherType |= SDWTF_STATUS; if (IsDlgButtonChecked(hwndDlg, IDC_CHECK_CPUUSAGE)) watcherType |= SDWTF_CPUUSAGE; db_set_w(NULL, "AutoShutdown", "WatcherFlags", watcherType); ServiceStartWatcher(0, watcherType); } DestroyWindow(hwndDlg); return TRUE; // fall through case IDCANCEL: /* WM_CLOSE */ DestroyWindow(hwndDlg); SetShutdownToolbarButton(false); SetShutdownMenuItem(false); return TRUE; } break; } return FALSE; }
/** * ContactSettingChanged callback */ int SettingChanged(WPARAM hContact, LPARAM lParam) { DBCONTACTWRITESETTING *inf = (DBCONTACTWRITESETTING*)lParam; if (hContact == NULL || inf->value.type == DBVT_DELETED || strcmp(inf->szSetting, "Status") != 0) return 0; if (db_get_b(hContact, "CList", "NotOnList", 0) == 1) return 0; char *proto = GetContactProto(hContact); if (proto == 0 || (db_get_b(hContact, proto, "ChatRoom", 0) == 1) || !(CallProtoService(proto, PS_GETCAPS, PFLAGNUM_1, 0) & PF1_IMSEND)) return 0; int currentStatus = inf->value.wVal; int prevStatus = db_get_w(hContact, "UserOnline", "OldStatus", ID_STATUS_OFFLINE); if (currentStatus == prevStatus) return 0; // Last status db_set_dw(hContact, MODULE_NAME, "LastStatus", prevStatus); if (prevStatus == ID_STATUS_OFFLINE) { if (db_get_b(hContact, MODULE_NAME, "MissYou", 0)) { // Display Popup POPUPDATAT_V2 ppd = { 0 }; ppd.cbSize = sizeof(ppd); ppd.lchContact = hContact; ppd.lchIcon = IcoLib_GetIcon("enabled_icon"); _tcsncpy(ppd.lptzContactName, (TCHAR*)pcli->pfnGetContactDisplayName(hContact, 0), MAX_CONTACTNAME); _tcsncpy(ppd.lptzText, TranslateT("You awaited this contact!"), MAX_SECONDLINE); if (!options.iUsePopupColors) { ppd.colorBack = options.iPopupColorBack; ppd.colorText = options.iPopupColorFore; } ppd.PluginWindowProc = MissYouPopupDlgProc; ppd.PluginData = NULL; ppd.iSeconds = -1; missyouactions[0].flags = PAF_ENABLED; ppd.lpActions = missyouactions; ppd.actionCount = 1; CallService(MS_POPUP_ADDPOPUPT, (WPARAM)&ppd, APF_NEWDATA); SkinPlaySound("buddyExpectatorMissYou"); } } if (currentStatus == ID_STATUS_OFFLINE) { setLastSeen(hContact); return 0; } if (db_get_dw(hContact, MODULE_NAME, "LastSeen", (DWORD)-1) == (DWORD)-1 && options.notifyFirstOnline) { ReturnNotify(hContact, TranslateT("has gone online for the first time.")); setLastSeen(hContact); } unsigned int AbsencePeriod = db_get_dw(hContact, MODULE_NAME, "iAbsencePeriod", options.iAbsencePeriod); if (isContactGoneFor(hContact, AbsencePeriod)) { TCHAR* message = TranslateT("has returned after a long absence."); TCHAR tmpBuf[251] = { 0 }; time_t tmpTime = getLastSeen(hContact); if (tmpTime != -1) { _tcsftime(tmpBuf, 250, TranslateT("has returned after being absent since %#x"), gmtime(&tmpTime)); message = tmpBuf; } else { tmpTime = getLastInputMsg(hContact); if (tmpTime != -1) { _tcsftime(tmpBuf, 250, TranslateT("has returned after being absent since %#x"), gmtime(&tmpTime)); message = tmpBuf; } } ReturnNotify(hContact, message); if ((options.iShowMessageWindow == 0 && options.iShowUDetails == 0) || (options.iShowEvent == 0 && options.iShowPopup == 0)) setLastSeen(hContact); } else setLastSeen(hContact); return 0; }
/** * Load icons either from icolib or built in */ int onIconsChanged(WPARAM, LPARAM) { hIcon = IcoLib_GetIcon("main_icon"); return 0; }
HICON LoadIconEx(const char *name) { char szSettingName[100]; mir_snprintf(szSettingName, "SimpleStatusMsg_%s", name); return IcoLib_GetIcon(szSettingName); }
/** * This function rebuilds the clist context menu (clist main groupmenu). If user selected to * cascade menus, a root menu item is created which holds the popup for all the other items. * Note: since miranda 0.8 genmenu is part of core (we don't need to check for). * * @param none * * @return nothing **/ void RebuildGroup() { int flag = 0; BYTE item = 0; HGENMENU mhRoot = NULL; HGENMENU mhExIm = NULL; static HGENMENU hMenuItem[3] = { NULL, NULL, NULL }; // load options flag = db_get_b(NULL, MODNAME, SET_MI_GROUP, MCAS_NOTINITIATED); if (flag == MCAS_NOTINITIATED) { flag = MCAS_EXIMPORT | TRUE; db_set_b(NULL, MODNAME, SET_MI_GROUP, flag); } // delete all MenuItems and set all bytes 0 to avoid problems RemoveMenuItems(hMenuItem, _countof(hMenuItem)); // create service name main (prevent to generate {(Null)/Ex-/Import Group} in db) and set pointer to end it char text[200]; mir_strcpy(text, "UserInfo"); CMenuItem mi; mi.pszService = text; switch (flag) { case 3: //cascade off mhRoot = mhExIm = NULL; hMenuItem[item++] = NULL; break; case 5: //cascade all SET_UID(mi, 0xfefe20db, 0x431f, 0x4fef, 0x9d, 0xa6, 0x70, 0xcd, 0x25, 0xf1, 0x2f, 0x1d); mi.position = 250000; mi.hIcolibItem = IcoLib_GetIcon(ICO_COMMON_MAIN); mi.name.a = MODULELONGNAME; mhRoot = Menu_AddGroupMenuItem(&mi); hMenuItem[item++] = mhRoot; mhExIm = mhRoot; break; case 9: //cascade Ex/Import SET_UID(mi, 0x3ec4da1, 0x8a1a, 0x4734, 0xba, 0x99, 0x7, 0x9c, 0x2, 0x46, 0xff, 0xec); mi.position = 250100; mi.hIcolibItem = IcoLib_GetIcon(ICO_BTN_EXIMPORT); mi.name.a = LPGEN("Export/import contact"); mhExIm = Menu_AddGroupMenuItem(&mi); hMenuItem[item++] = mhExIm; mhRoot = NULL; break; default: //disable Menue return; } // VCard's Ex/Import menuitems mi.root = mhExIm; // Export SET_UID(mi, 0x9a0d81ec, 0x6795, 0x421a, 0xb2, 0x79, 0x41, 0xbd, 0xde, 0x29, 0x3b, 0xa4); mi.pszService = MS_USERINFO_VCARD_EXPORTALL; mi.name.a = LPGEN("Export all contacts"); mi.position = 250200; mi.hIcolibItem = IcoLib_GetIcon(ICO_BTN_EXPORT); hMenuItem[item++] = Menu_AddGroupMenuItem(&mi); // Import SET_UID(mi, 0xd6d98c8f, 0x5cdf, 0x4138, 0x88, 0x6c, 0x31, 0x1a, 0x5a, 0x9, 0x56, 0xbb); mi.pszService = MS_USERINFO_VCARD_IMPORTALL; mi.name.a = LPGEN("Import all contacts"); mi.position = 250300; mi.hIcolibItem = IcoLib_GetIcon(ICO_BTN_IMPORT); hMenuItem[item++] = Menu_AddGroupMenuItem(&mi); }
// // wParam = szProto // lParam = status // HICON LoadSkinProtoIcon( const char* szProto, int status, bool big ) { int i, statusIndx = -1; char iconName[MAX_PATH]; HICON hIcon; DWORD caps2 = ( szProto == NULL ) ? ( DWORD )-1 : CallProtoService(szProto,PS_GETCAPS,PFLAGNUM_2,0); if ( status >= ID_STATUS_CONNECTING && status < ID_STATUS_CONNECTING+MAX_CONNECT_RETRIES ) { mir_snprintf( iconName, SIZEOF(iconName), "%s%d", mainIconsFmt, 7 ); return IcoLib_GetIcon( iconName, big ); } for ( i = 0; i < SIZEOF(statusIcons); i++ ) { if ( statusIcons[i].id == status ) { statusIndx = i; break; } } if ( statusIndx == -1 ) return NULL; if ( !szProto ) { // Only return a protocol specific icon if there is only one protocol // Otherwise return the global icon. This affects the global status menu mainly. if ( accounts.getCount() == 1 ) { HICON hIcon; // format: core_status_%proto%statusindex mir_snprintf(iconName, SIZEOF(iconName), "%s%s%d", statusIconsFmt, szProto, statusIndx); hIcon = IcoLib_GetIcon( iconName, big ); if ( hIcon ) return hIcon; } // format: core_status_%s%d mir_snprintf(iconName, SIZEOF(iconName), "%s%s%d", statusIconsFmt, GLOBAL_PROTO_NAME, statusIndx); return IcoLib_GetIcon( iconName, big ); } // format: core_status_%s%d mir_snprintf(iconName, SIZEOF(iconName), "%s%s%d", statusIconsFmt, szProto, statusIndx); hIcon = IcoLib_GetIcon( iconName, big ); if ( hIcon == NULL && ( caps2 == 0 || ( caps2 & statusIcons[statusIndx].pf2 ))) { PROTOACCOUNT* pa = Proto_GetAccount( szProto ); if ( pa ) { TCHAR szPath[MAX_PATH], szFullPath[MAX_PATH], *str; SKINICONDESC sid = { 0 }; // // Queried protocol isn't in list, adding // TCHAR tszSection[MAX_PATH]; mir_sntprintf( tszSection, SIZEOF(tszSection), _T("%s%s"), _T(PROTOCOLS_PREFIX), pa->tszAccountName ); sid.ptszSection = tszSection; sid.cbSize = sizeof(sid); sid.flags = SIDF_ALL_TCHAR; GetModuleFileName( hMirandaInst, szPath, MAX_PATH ); str = _tcsrchr( szPath, '\\' ); if ( str != NULL ) *str = 0; mir_sntprintf( szFullPath, SIZEOF(szFullPath), _T("%s\\Icons\\proto_") _T(TCHAR_STR_PARAM) _T(".dll"), szPath, pa->szProtoName ); if ( GetFileAttributes( szFullPath ) != INVALID_FILE_ATTRIBUTES ) sid.ptszDefaultFile = szFullPath; else { mir_sntprintf( szFullPath, SIZEOF(szFullPath), _T("%s\\Plugins\\") _T(TCHAR_STR_PARAM) _T(".dll"), szPath, szProto ); if (( int )ExtractIconEx( szFullPath, statusIcons[i].resource_id, NULL, &hIcon, 1 ) > 0 ) { DestroyIcon( hIcon ); sid.ptszDefaultFile = szFullPath; hIcon = NULL; } if ( sid.pszDefaultFile == NULL ) { if ( str != NULL ) *str = '\\'; sid.ptszDefaultFile = szPath; } } // // Add global icons to list // { int lowidx, highidx; if ( caps2 == 0 ) lowidx = statusIndx, highidx = statusIndx+1; else lowidx = 0, highidx = SIZEOF(statusIcons); for ( i = lowidx; i < highidx; i++ ) { if ( caps2 == 0 || ( caps2 & statusIcons[i].pf2 )) { // format: core_%s%d mir_snprintf( iconName, SIZEOF(iconName), "%s%s%d", statusIconsFmt, szProto, i ); sid.pszName = iconName; sid.ptszDescription = cli.pfnGetStatusModeDescription( statusIcons[i].id, 0 ); sid.iDefaultIndex = statusIcons[i].resource_id; IcoLib_AddNewIcon( &sid ); } } } } // format: core_status_%s%d mir_snprintf( iconName, SIZEOF(iconName), "%s%s%d", statusIconsFmt, szProto, statusIndx ); hIcon = IcoLib_GetIcon( iconName, big ); if ( hIcon ) return hIcon; } if ( hIcon == NULL ) { mir_snprintf( iconName, SIZEOF(iconName), "%s%s%d", statusIconsFmt, GLOBAL_PROTO_NAME, statusIndx ); hIcon = IcoLib_GetIcon( iconName, big ); } return hIcon; }
/** * This function rebuilds the group context menu (clist main groupmenu). If user selected to * cascade menus, a root menu item is created which holds the popup for all the other items. * Note: since miranda 0.8 genmenu is part of core (we don't need to check for). * * @param none * * @return nothing **/ void RebuildSubGroup() { int flag = 0; BYTE item = 0; GroupMenuParam gmp = { 0 }; HGENMENU mhRoot = NULL; HGENMENU mhExIm = NULL; static HGENMENU hMenuItem[3] = { NULL, NULL, NULL }; // load options flag = db_get_b(NULL, MODNAME, SET_MI_SUBGROUP, MCAS_NOTINITIATED); if (flag == MCAS_NOTINITIATED) { flag = MCAS_DISABLED | TRUE; db_set_b(NULL, MODNAME, SET_MI_SUBGROUP, flag); } // delete all MenuItems and set all bytes 0 to avoid problems RemoveMenuItems(hMenuItem, _countof(hMenuItem)); // create service name main (prevent to generate {(Null)/Ex-/Import Group} in db) and set pointer to end it char text[200]; mir_strcpy(text, "UserInfo"); CMenuItem mi; mi.pszService = text; char* tDest = text + mir_strlen(text); switch (flag) { case 3: //cascade off mhRoot = mhExIm = NULL; hMenuItem[item++] = NULL; break; case 5: //cascade all SET_UID(mi, 0x77b46004, 0xe845, 0x41f4, 0x9a, 0x56, 0x72, 0xd9, 0xa5, 0x61, 0x4d, 0x5); mi.position = 1050000; mi.hIcolibItem = IcoLib_GetIcon(ICO_COMMON_MAIN); mi.name.a = MODULELONGNAME; mhRoot = Menu_AddSubGroupMenuItem(&mi); hMenuItem[item++] = mhRoot; mhExIm = mhRoot; break; case 9: //cascade Ex/Import SET_UID(mi, 0xac5e810b, 0x4b41, 0x477c, 0x98, 0xfe, 0x8, 0x88, 0xec, 0x6f, 0xc3, 0xcf); mi.position = 1050100; mi.hIcolibItem = IcoLib_GetIcon(ICO_BTN_EXIMPORT); mi.name.a = LPGEN("Export/import group"); mhExIm = Menu_AddSubGroupMenuItem(&mi); hMenuItem[item++] = mhExIm; mhRoot = NULL; break; default: //disable Menue return; } // VCard's Ex/Import menuitems mi.root = mhExIm; // Export SET_UID(mi, 0x65be2523, 0x15fd, 0x45ca, 0xae, 0xe6, 0xc2, 0x98, 0xd2, 0xa9, 0xff, 0xd5); mir_strcpy(tDest, "/ExportGroup"); //mi.pszService if (!ServiceExists(mi.pszService)) CreateServiceFunction(mi.pszService, svcExIm_Group_Service); mi.name.a = mhExIm != NULL ? LPGEN("&Export") : LPGEN("&Export group"); mi.position = 1050200; mi.hIcolibItem = IcoLib_GetIcon(ICO_BTN_EXPORT); gmp.wParam = TRUE; hMenuItem[item++] = Menu_AddSubGroupMenuItem(&mi, &gmp); // Import SET_UID(mi, 0xf6be7278, 0x4adb, 0x4e6a, 0x9f, 0x63, 0x79, 0xda, 0xbb, 0xcd, 0xbe, 0x42); mir_strcpy(tDest, "/ImportGroup"); //mi.pszService if (!ServiceExists(mi.pszService)) CreateServiceFunction(mi.pszService, svcExIm_Group_Service); mi.name.a = mhExIm != NULL ? LPGEN("&Import") : LPGEN("&Import group"); mi.position = 1050300; mi.hIcolibItem = IcoLib_GetIcon(ICO_BTN_IMPORT); gmp.wParam = FALSE; hMenuItem[item++] = Menu_AddSubGroupMenuItem(&mi, &gmp); }
HICON LoadIconEx(IconIndex i) { return IcoLib_GetIcon(iconList[i].szName); }