void CSetPgApps::DoAppMove(bool bUpward) { int iCur, iChg; iCur = (int)SendDlgItemMessage(mh_Dlg, lbAppDistinct, LB_GETCURSEL, 0,0); if (iCur < 0) return; if (bUpward) { if (!iCur) return; iChg = iCur - 1; } else { iChg = iCur + 1; if (iChg >= (int)SendDlgItemMessage(mh_Dlg, lbAppDistinct, LB_GETCOUNT, 0,0)) return; } if (!gpSet->AppSettingsXch(iCur, iChg)) return; MSetter lockSelChange(&mb_SkipSelChange); OnInitDialog(mh_Dlg, false); SendDlgItemMessage(mh_Dlg, lbAppDistinct, LB_SETCURSEL, iChg, 0); lockSelChange.Unlock(); OnAppSelectionChanged(); }
void CSetPgApps::DoAppDel() { int iCur = (int)SendDlgItemMessage(mh_Dlg, lbAppDistinct, LB_GETCURSEL, 0,0); if (iCur < 0) return; const AppSettings* p = gpSet->GetAppSettingsPtr(iCur); if (!p) return; if (MsgBox(L"Delete application?", MB_YESNO|MB_ICONQUESTION, p->AppNames, ghOpWnd) != IDYES) return; gpSet->AppSettingsDelete(iCur); MSetter lockSelChange(&mb_SkipSelChange); OnInitDialog(mh_Dlg, false); int iCount = (int)SendDlgItemMessage(mh_Dlg, lbAppDistinct, LB_GETCOUNT, 0,0); SendDlgItemMessage(mh_Dlg, lbAppDistinct, LB_SETCURSEL, min(iCur,(iCount-1)), 0); lockSelChange.Unlock(); OnAppSelectionChanged(); }
void CSetPgApps::DoAppAdd() { int iCount = (int)SendDlgItemMessage(mh_Dlg, lbAppDistinct, LB_GETCOUNT, 0,0); AppSettings* pNew = gpSet->GetAppSettingsPtr(iCount, TRUE); UNREFERENCED_PARAMETER(pNew); MSetter lockSelChange(&mb_SkipSelChange); OnInitDialog(mh_Dlg, false); SendDlgItemMessage(mh_Dlg, lbAppDistinct, LB_SETCURSEL, iCount, 0); lockSelChange.Unlock(); OnAppSelectionChanged(); }
LRESULT CSetPgApps::OnEditChanged(HWND hDlg, WORD nCtrlId) { int iCur = mb_SkipSelChange ? -1 : (int)SendDlgItemMessage(hDlg, lbAppDistinct, LB_GETCURSEL, 0,0); AppSettings* pApp = (iCur < 0) ? NULL : gpSet->GetAppSettingsPtr(iCur); _ASSERTE((iCur<0) || (pApp && pApp->AppNames)); if (pApp) { switch (nCtrlId) { case tAppDistinctName: if (!mb_SkipEditChange) { _ASSERTE(pApp && pApp->AppNames); wchar_t* pszApps = NULL; if (GetString(hDlg, nCtrlId, &pszApps)) { pApp->SetNames(pszApps); MSetter lockSelChange(&mb_SkipSelChange); SetListAppName(pApp, iCur+1, iCur); } SafeFree(pszApps); } // tAppDistinctName break; case tCursorFixedSize: case tInactiveCursorFixedSize: case tCursorMinSize: case tInactiveCursorMinSize: if (pApp) { mb_Redraw = CSetPgCursor::OnEditChangedCursor(mh_Child, nCtrlId, pApp); } //case tCursorFixedSize, tInactiveCursorFixedSize, tCursorMinSize, tInactiveCursorMinSize: break; } } return 0; }
// Общая DlgProc на _все_ вкладки INT_PTR CSetPgBase::pageOpProc(HWND hDlg, UINT messg, WPARAM wParam, LPARAM lParam) { TabHwndIndex pgId = thi_Last; CSetPgBase* pObj = NULL; if (messg != WM_INITDIALOG) { ConEmuSetupPages* pPage = NULL; pgId = gpSetCls->GetPageId(hDlg, &pPage); if ((pgId == thi_Last) || !pPage || !pPage->pPage) { _ASSERTE(FALSE && "Page was not created properly yet"); return TRUE; } pObj = pPage->pPage; _ASSERTE(pObj && (pObj->mn_ActivateTabMsg != WM_APP)); if (!pObj) { return TRUE; } if (pObj && pObj->mp_DpiAware && pObj->mp_DpiAware->ProcessDpiMessages(hDlg, messg, wParam, lParam)) { return TRUE; } } if ((messg == WM_INITDIALOG) || (pObj && (messg == pObj->mn_ActivateTabMsg))) { bool bInitial = (messg == WM_INITDIALOG); if (bInitial) { if (!lParam) { _ASSERTE(lParam != 0); return 0; } pObj = (CSetPgBase*)lParam; } if (!pObj || (pObj->GetPageType() < thi_Fonts) || (pObj->GetPageType() >= thi_Last)) { _ASSERTE(pObj && (pObj->GetPageType() >= thi_Fonts && pObj->GetPageType() < thi_Last)); return 0; } _ASSERTE(pObj->Dlg() == NULL || pObj->Dlg() == hDlg); pgId = pObj->GetPageType(); if (bInitial) { _ASSERTE(pObj->mp_InfoPtr && pObj->mp_InfoPtr->PageIndex >= 0 && pObj->mp_InfoPtr->hPage == NULL); pObj->mp_InfoPtr->hPage = hDlg; pObj->mh_Dlg = hDlg; CDynDialog* pDynDialog = CDynDialog::GetDlgClass(hDlg); _ASSERTE(pObj->mp_DynDialog==NULL || pObj->mp_DynDialog==pDynDialog); #ifdef _DEBUG // pObj->mp_DynDialog is NULL on first WM_INIT if (pObj->mp_DynDialog) { _ASSERTE(pObj->mp_DynDialog->mh_Dlg == hDlg); } #endif HWND hPlace = GetDlgItem(pObj->mh_Parent, tSetupPagePlace); RECT rcClient; GetWindowRect(hPlace, &rcClient); MapWindowPoints(NULL, pObj->mh_Parent, (LPPOINT)&rcClient, 2); if (pObj->mp_DpiAware) pObj->mp_DpiAware->Attach(hDlg, pObj->mh_Parent, pDynDialog); MoveWindowRect(hDlg, rcClient); } else { _ASSERTE(pObj->mp_InfoPtr->PageIndex >= 0 && pObj->mp_InfoPtr->hPage == hDlg); } MSetter lockSelChange(&pObj->mb_SkipSelChange); pObj->OnInitDialog(hDlg, bInitial); if (bInitial) { EditIconHint_Subclass(hDlg, pObj->mh_Parent); gpSetCls->RegisterTipsFor(hDlg); } pObj->OnPostLocalize(hDlg); } else if ((messg == WM_HELP) || (messg == HELP_WM_HELP)) { _ASSERTE(messg == WM_HELP); return gpSetCls->wndOpProc(hDlg, messg, wParam, lParam); } else if (pgId == thi_Apps) { // Страничка "App distinct" в некотором смысле особенная. // У многих контролов ИД дублируются с другими вкладками. CSetPgApps* pAppsPg; if (gpSetCls->GetPageObj(pAppsPg)) { return pAppsPg->PageDlgProc(hDlg, messg, wParam, lParam); } else { _ASSERTE(pAppsPg!=NULL); return 0; } } else if (pgId == thi_Integr) { return pObj->PageDlgProc(hDlg, messg, wParam, lParam); } else if (pgId == thi_Startup) { return pObj->PageDlgProc(hDlg, messg, wParam, lParam); } else // All other messages switch (messg) { #ifdef _DEBUG case WM_INITDIALOG: // Должно быть обработано выше _ASSERTE(messg != WM_INITDIALOG); break; #endif case WM_COMMAND: { switch (HIWORD(wParam)) { case BN_CLICKED: return CSetDlgButtons::OnButtonClicked(hDlg, wParam, lParam); case EN_CHANGE: // TODO: Remove duplicate condition! if (!pObj->mb_SkipSelChange && !pObj->mb_IgnoreEditChanged) pObj->OnEditChanged(hDlg, LOWORD(wParam)); return 0; case CBN_EDITCHANGE: case CBN_SELCHANGE/*LBN_SELCHANGE*/: if (!pObj->mb_SkipSelChange) pObj->OnComboBox(hDlg, LOWORD(wParam), HIWORD(wParam)); return 0; case LBN_DBLCLK: gpSetCls->OnListBoxDblClk(hDlg, wParam, lParam); return 0; case CBN_KILLFOCUS: if (gpSetCls->mn_LastChangingFontCtrlId && (LOWORD(wParam) == gpSetCls->mn_LastChangingFontCtrlId)) { _ASSERTE(pgId == thi_Fonts); PostMessage(hDlg, gpSetCls->mn_MsgRecreateFont, gpSetCls->mn_LastChangingFontCtrlId, 0); gpSetCls->mn_LastChangingFontCtrlId = 0; return 0; } break; default: if (HIWORD(wParam) == 0xFFFF && LOWORD(wParam) == lbConEmuHotKeys) { dynamic_cast<CSetPgKeys*>(pObj)->OnHotkeysNotify(hDlg, wParam, 0); } } // switch (HIWORD(wParam)) } // WM_COMMAND break; case WM_MEASUREITEM: return gpSetCls->OnMeasureFontItem(hDlg, messg, wParam, lParam); case WM_DRAWITEM: return gpSetCls->OnDrawFontItem(hDlg, messg, wParam, lParam); case WM_CTLCOLORSTATIC: return pObj->OnCtlColorStatic(hDlg, (HDC)wParam, (HWND)lParam, GetDlgCtrlID((HWND)lParam)); case WM_SETCURSOR: return pObj->OnSetCursor(hDlg, (HWND)wParam, GetDlgCtrlID((HWND)wParam), LOWORD(lParam), HIWORD(lParam)); case WM_HSCROLL: { if ((pgId == thi_Backgr) && (HWND)lParam == GetDlgItem(hDlg, slDarker)) { int newV = SendDlgItemMessage(hDlg, slDarker, TBM_GETPOS, 0, 0); if (newV != gpSet->bgImageDarker) { gpSetCls->SetBgImageDarker(newV, true); //gpSet->bgImageDarker = newV; //TCHAR tmp[10]; //_wsprintf(tmp, SKIPLEN(countof(tmp)) L"%i", gpSet->bgImageDarker); //SetDlgItemText(hDlg, tDarker, tmp); //// Картинку может установить и плагин //if (gpSet->isShowBgImage && gpSet->sBgImage[0]) // gpSetCls->LoadBackgroundFile(gpSet->sBgImage); //else // gpSetCls->NeedBackgroundUpdate(); //gpConEmu->Update(true); } } else if ((pgId == thi_Transparent) && (HWND)lParam == GetDlgItem(hDlg, slTransparent)) { int newV = SendDlgItemMessage(hDlg, slTransparent, TBM_GETPOS, 0, 0); if (newV != gpSet->nTransparent) { CSettings::checkDlgButton(hDlg, cbTransparent, (newV != MAX_ALPHA_VALUE) ? BST_CHECKED : BST_UNCHECKED); gpSet->nTransparent = newV; if (!gpSet->isTransparentSeparate) SendDlgItemMessage(hDlg, slTransparentInactive, TBM_SETPOS, (WPARAM)true, (LPARAM)gpSet->nTransparent); gpConEmu->OnTransparent(); } } else if ((pgId == thi_Transparent) && (HWND)lParam == GetDlgItem(hDlg, slTransparentInactive)) { int newV = SendDlgItemMessage(hDlg, slTransparentInactive, TBM_GETPOS, 0, 0); if (gpSet->isTransparentSeparate && (newV != gpSet->nTransparentInactive)) { //checkDlgButton(hDlg, cbTransparentInactive, (newV!=MAX_ALPHA_VALUE) ? BST_CHECKED : BST_UNCHECKED); gpSet->nTransparentInactive = newV; gpConEmu->OnTransparent(); } } } // WM_HSCROLL break; case WM_NOTIFY: { if (((NMHDR*)lParam)->code == TTN_GETDISPINFO) { return gpSetCls->ProcessTipHelp(hDlg, messg, wParam, lParam); } else switch (((NMHDR*)lParam)->idFrom) { case lbActivityLog: if (!pObj->mb_SkipSelChange) return gpSetCls->OnActivityLogNotify(hDlg, wParam, lParam); break; case lbConEmuHotKeys: if (!pObj->mb_SkipSelChange) return dynamic_cast<CSetPgKeys*>(pObj)->OnHotkeysNotify(hDlg, wParam, lParam); break; } return 0; } // WM_NOTIFY break; case WM_TIMER: if (wParam == BALLOON_MSG_TIMERID) { KillTimer(hDlg, BALLOON_MSG_TIMERID); SendMessage(gpSetCls->hwndBalloon, TTM_TRACKACTIVATE, FALSE, (LPARAM)&gpSetCls->tiBalloon); SendMessage(gpSetCls->hwndTip, TTM_ACTIVATE, TRUE, 0); } break; default: { if (messg == gpSetCls->mn_MsgRecreateFont) { gpSetCls->RecreateFont(LOWORD(wParam)); } else if (messg == gpSetCls->mn_MsgLoadFontFromMain) { CSetPgFonts* pFonts = NULL; if (gpSetCls->GetPageObj(pFonts)) { if (pgId == thi_Views) pFonts->CopyFontsTo(hDlg, tThumbsFontName, tTilesFontName, 0); else if (pgId == thi_Tabs) pFonts->CopyFontsTo(hDlg, tTabFontFace, 0); else if (pgId == thi_Status) pFonts->CopyFontsTo(hDlg, tStatusFontFace, 0); } } else if (messg == gpSetCls->mn_MsgUpdateCounter) { gpSetCls->PostUpdateCounters(true); } else if (messg == DBGMSG_LOG_ID && pgId == thi_Debug) { MSetter lockSelChange(&pObj->mb_SkipSelChange); if (wParam == DBGMSG_LOG_SHELL_MAGIC) { DebugLogShellActivity *pShl = (DebugLogShellActivity*)lParam; gpSetCls->debugLogShell(hDlg, pShl); } // DBGMSG_LOG_SHELL_MAGIC else if (wParam == DBGMSG_LOG_INPUT_MAGIC) { CESERVER_REQ_PEEKREADINFO* pInfo = (CESERVER_REQ_PEEKREADINFO*)lParam; gpSetCls->debugLogInfo(hDlg, pInfo); } // DBGMSG_LOG_INPUT_MAGIC else if (wParam == DBGMSG_LOG_CMD_MAGIC) { CSettings::LogCommandsData* pCmd = (CSettings::LogCommandsData*)lParam; gpSetCls->debugLogCommand(hDlg, pCmd); } // DBGMSG_LOG_CMD_MAGIC } // if (messg == DBGMSG_LOG_ID && hDlg == gpSetCls->hDebug) else { pObj->PageDlgProc(hDlg, messg, wParam, lParam); } } // default: } //switch (messg) return 0; }
LRESULT CSetPgApps::OnInitDialog(HWND hDlg, bool abInitial) { //mn_AppsEnableControlsMsg = RegisterWindowMessage(L"ConEmu::AppsEnableControls"); if (!mh_Child) { if (abInitial) { _ASSERTE(mh_Dlg == hDlg); CreateChildDlg(); } if (!mh_Child) { _ASSERTE(mh_Child != NULL); // Must be created already! return 0; } } if (abInitial) { int nTab[2] = {4*4, 7*4}; // represent the number of quarters of the average character width for the font SendDlgItemMessage(hDlg, lbAppDistinct, LB_SETTABSTOPS, countof(nTab), (LPARAM)nTab); LONG_PTR nStyles = GetWindowLongPtr(GetDlgItem(hDlg, lbAppDistinct), GWL_STYLE); if (!(nStyles & LBS_NOTIFY)) SetWindowLongPtr(GetDlgItem(hDlg, lbAppDistinct), GWL_STYLE, nStyles|LBS_NOTIFY); } MSetter lockSelChange(&mb_SkipSelChange); if (abInitial) { SendDlgItemMessage(mh_Child, lbColorsOverride, CB_RESETCONTENT, 0, 0); int iCurPalette = 0; const ColorPalette* pPal; for (int i = 0; (pPal = gpSet->PaletteGet(i)) != NULL; i++) { SendDlgItemMessage(mh_Child, lbColorsOverride, CB_ADDSTRING, 0, (LPARAM)pPal->pszName); if ((!iCurPalette) && (lstrcmp(pPal->pszName, gsDefaultColorScheme) == 0)) iCurPalette = i; } SendDlgItemMessage(mh_Child, lbColorsOverride, CB_SETCURSEL, iCurPalette, 0); CSetDlgLists::FillListBox(mh_Child, lbExtendFontBoldIdx, CSetDlgLists::eColorIdx); CSetDlgLists::FillListBox(mh_Child, lbExtendFontItalicIdx, CSetDlgLists::eColorIdx); CSetDlgLists::FillListBox(mh_Child, lbExtendFontNormalIdx, CSetDlgLists::eColorIdx); } // Сброс ранее загруженного списка (ListBox: lbAppDistinct) SendDlgItemMessage(hDlg, lbAppDistinct, LB_RESETCONTENT, 0,0); int nApp = 0; const AppSettings* pApp = NULL; while ((pApp = gpSet->GetAppSettings(nApp)) && pApp->AppNames) { nApp++; SetListAppName(pApp, nApp); } lockSelChange.Unlock(); OnAppSelectionChanged(); return 0; }
INT_PTR CSetPgApps::PageDlgProc(HWND hDlg, UINT messg, WPARAM wParam, LPARAM lParam) { INT_PTR iRc = 0; if (!mh_Child && ((messg == WM_INITDIALOG) || (messg == mn_ActivateTabMsg))) { if (!CreateChildDlg()) { return 0; } } if ((messg == WM_INITDIALOG) || (messg == mn_ActivateTabMsg)) { // Return here! Do not pass to mb_Redraw/mb_Refill routines! return OnInitDialog(hDlg, (messg == WM_INITDIALOG)); } else switch (messg) { case WM_NOTIFY: { LPNMHDR phdr = (LPNMHDR)lParam; if (phdr->code == TTN_GETDISPINFO) { return gpSetCls->ProcessTipHelp(hDlg, messg, wParam, lParam); } break; } case WM_COMMAND: { _ASSERTE(mh_Child && IsWindow(mh_Child)); _ASSERTE(hDlg == mh_Dlg); if (HIWORD(wParam) == BN_CLICKED) { OnButtonClicked(hDlg, (HWND)lParam, LOWORD(wParam)); } else if (HIWORD(wParam) == EN_CHANGE) { OnEditChanged(hDlg, LOWORD(wParam)); } else if (HIWORD(wParam) == LBN_SELCHANGE) { OnComboBox(hDlg, LOWORD(wParam), HIWORD(wParam)); } } // WM_COMMAND break; } // switch (messg) if (mb_Redraw) { mb_Redraw = false; NotifyVCon(); } if (mb_Refill) { mb_Refill = false; MSetter lockSelChange(&mb_SkipSelChange); MSetter lockEditSet(&mb_SkipEditSet); INT_PTR iSel = SendDlgItemMessage(hDlg, lbAppDistinct, LB_GETCURSEL, 0,0); OnInitDialog(hDlg, false); SendDlgItemMessage(hDlg, lbAppDistinct, LB_SETCURSEL, iSel,0); } // mb_Refill // To be sure mb_Refill = false; mb_Redraw = false; return iRc; }