bool CSetPgApps::CreateChildDlg() { if (mh_Child && !IsWindow(mh_Child)) { _ASSERTE(FALSE && "Invalid mh_Child"); mh_Child = NULL; } if (!mh_Child) { #if defined(_DEBUG) HWND hChild = GetDlgItem(mh_Dlg, IDD_SPG_APPDISTINCT2); _ASSERTE(hChild == NULL); #endif LogString(L"Creating child dialog IDD_SPG_APPDISTINCT2"); SafeDelete(mp_DlgDistinct2); // JIC mp_DlgDistinct2 = CDynDialog::ShowDialog(IDD_SPG_APPDISTINCT2, mh_Dlg, pageOpProc_AppsChild, 0/*dwInitParam*/); mh_Child = mp_DlgDistinct2 ? mp_DlgDistinct2->mh_Dlg : NULL; if (!mh_Child) { EnableWindow(mh_Dlg, FALSE); MBoxAssert(mh_Child && "CreateDialogParam(IDD_SPG_APPDISTINCT2) failed"); return 0; } SetWindowLongPtr(mh_Child, GWLP_ID, IDD_SPG_APPDISTINCT2); if (!mp_DpiDistinct2 && mp_ParentDpi) { mp_DpiDistinct2 = new CDpiForDialog(); mp_DpiDistinct2->Attach(mh_Child, mh_Dlg, mp_DlgDistinct2); } HWND hHolder = GetDlgItem(mh_Dlg, tAppDistinctHolder); RECT rcPos = {}; GetWindowRect(hHolder, &rcPos); MapWindowPoints(NULL, mh_Dlg, (LPPOINT)&rcPos, 2); POINT ptScroll = {}; HWND hEnd = GetDlgItem(mh_Child,stAppDistinctBottom); MapWindowPoints(hEnd, mh_Child, &ptScroll, 1); ShowWindow(hEnd, SW_HIDE); SCROLLINFO si = {sizeof(si), SIF_ALL}; si.nMax = ptScroll.y - (rcPos.bottom - rcPos.top); RECT rcChild = {}; GetWindowRect(GetDlgItem(mh_Child, DistinctControls[1].nOverrideID), &rcChild); si.nPage = rcChild.bottom - rcChild.top; SetScrollInfo(mh_Child, SB_VERT, &si, FALSE); MoveWindowRect(mh_Child, rcPos); ShowWindow(hHolder, SW_HIDE); ShowWindow(mh_Child, SW_SHOW); //_ASSERTE(mh_Child && IsWindow(mh_Child)); } return (mh_Child != NULL); }
// Общая для key_WinWidthDec/key_WinWidthInc/key_WinHeightDec/key_WinHeightInc // pRCon may be NULL bool CConEmuCtrl::key_WinSize(BYTE vk) { if (gpConEmu->isFullScreen() || gpConEmu->isZoomed() || gpConEmu->isIconic()) { // ничего не делать } else { CVConGuard VCon; CVirtualConsole* pVCon = (CVConGroup::GetActiveVCon(&VCon) >= 0) ? VCon.VCon() : NULL; RECT rcWindow = {}; if (GetWindowRect(ghWnd, &rcWindow)) { RECT rcMon = gpConEmu->CalcRect(CER_MONITOR, rcWindow, CER_MONITOR, pVCon); int nX = gpSetCls->FontWidth(); int nY = gpSetCls->FontHeight(); if (vk == VK_LEFT) { rcWindow.right = rcWindow.right - nX; } else if (vk == VK_RIGHT) { if ((rcWindow.right + nX) < rcMon.right) rcWindow.right = rcWindow.right + nX; } else if (vk == VK_UP) { rcWindow.bottom = rcWindow.bottom - nY; } else if (vk == VK_DOWN) { if ((rcWindow.bottom + nY) < rcMon.bottom) rcWindow.bottom = rcWindow.bottom + nY; } if (rcWindow.right > rcWindow.left && rcWindow.bottom > rcWindow.top) { MoveWindowRect(ghWnd, rcWindow, TRUE); } } // //CRealConsole* pRCon = pVCon ? pVCon->RCon() : NULL; //if (pRCon) //{ // // //if (!pRCon->GuiWnd()) // //{ // // // //} // //else // //{ // // // Ресайз в ГУИ режиме // //} //} } return true; }
void CDpiAware::CenterDialog(HWND hDialog) { RECT rect = {}, rectAfter = {}; if (!hDialog || !GetWindowRect(hDialog, &rect)) return; // If possible, open our startup dialogs on the monitor, // where user have clicked our icon (shortcut on the desktop or TaskBar) HMONITOR hDefault = ghWnd ? NULL : gpStartEnv->hStartMon; // Position dialog in the workarea center CDpiAware::GetCenteredRect(NULL, rect, hDefault); MoveWindowRect(hDialog, rect); if (IsPerMonitorDpi() && GetWindowRect(hDialog, &rectAfter)) { if ((RectWidth(rect) != RectWidth(rectAfter)) || (RectHeight(rect) != RectHeight(rectAfter))) { CDpiAware::GetCenteredRect(NULL, rectAfter, NULL); MoveWindowRect(hDialog, rectAfter); } } }
INT_PTR CEHelpPopup::helpProc(HWND hWnd2, UINT messg, WPARAM wParam, LPARAM lParam) { CEHelpPopup* pPopup = NULL; switch (messg) { case WM_INITDIALOG: { pPopup = (CEHelpPopup*)lParam; SetWindowLongPtr(hWnd2, DWLP_USER, (LONG_PTR)pPopup); pPopup->mh_Popup = hWnd2; if (pPopup->mp_DpiAware) pPopup->mp_DpiAware->Attach(hWnd2, ghOpWnd, pPopup->mp_Dlg); helpProc(hWnd2, WM_SIZE, 0, 0); break; } case WM_SIZE: { RECT rcClient; GetClientRect(hWnd2, &rcClient); MoveWindowRect(GetDlgItem(hWnd2, IDC_HELP_DESCR), rcClient, TRUE); break; } case WM_COMMAND: if (HIWORD(wParam) == BN_CLICKED) { switch (LOWORD(wParam)) { case IDCLOSE: case IDCANCEL: DestroyWindow(hWnd2); return 0; default: return 0; } } break; case WM_CLOSE: DestroyWindow(hWnd2); break; case WM_DESTROY: { pPopup = (CEHelpPopup*)GetWindowLongPtr(hWnd2, DWLP_USER); if (pPopup) { if (pPopup->mp_DpiAware) pPopup->mp_DpiAware->Detach(); pPopup->mh_Popup = NULL; SafeDelete(pPopup->mp_Dlg); } break; } default: if (pPopup && pPopup->mp_DpiAware && pPopup->mp_DpiAware->ProcessDpiMessages(hWnd2, messg, wParam, lParam)) { return TRUE; } } return 0; }
INT_PTR WINAPI ConEmuAbout::aboutProc(HWND hDlg, UINT messg, WPARAM wParam, LPARAM lParam) { INT_PTR lRc = 0; if (DonateBtns_Process(hDlg, messg, wParam, lParam, lRc) || EditIconHint_Process(hDlg, messg, wParam, lParam, lRc)) { SetWindowLongPtr(hDlg, DWLP_MSGRESULT, lRc); return TRUE; } PatchMsgBoxIcon(hDlg, messg, wParam, lParam); switch (messg) { case WM_INITDIALOG: { gpConEmu->OnOurDialogOpened(); mh_AboutDlg = hDlg; DonateBtns_Add(hDlg, pIconCtrl, IDOK); if (mp_DpiAware) { mp_DpiAware->Attach(hDlg, ghWnd, CDynDialog::GetDlgClass(hDlg)); } RECT rect = {}; if (GetWindowRect(hDlg, &rect)) { CDpiAware::GetCenteredRect(ghWnd, rect); MoveWindowRect(hDlg, rect); } if ((ghOpWnd && IsWindow(ghOpWnd)) || (WS_EX_TOPMOST & GetWindowLongPtr(ghWnd, GWL_EXSTYLE))) { SetWindowPos(hDlg, HWND_TOPMOST, 0,0,0,0, SWP_NOMOVE|SWP_NOSIZE); } LPCWSTR pszActivePage = (LPCWSTR)lParam; wchar_t* pszTitle = lstrmerge(gpConEmu->GetDefaultTitle(), L" About"); if (pszTitle) { SetWindowText(hDlg, pszTitle); SafeFree(pszTitle); } if (hClassIcon) { SendMessage(hDlg, WM_SETICON, ICON_BIG, (LPARAM)hClassIcon); SendMessage(hDlg, WM_SETICON, ICON_SMALL, (LPARAM)CreateNullIcon()); SetClassLongPtr(hDlg, GCLP_HICON, (LONG_PTR)hClassIcon); } SetDlgItemText(hDlg, stConEmuAbout, pAboutTitle); SetDlgItemText(hDlg, stConEmuUrl, gsHomePage); EditIconHint_Set(hDlg, GetDlgItem(hDlg, tAboutSearch), true, L"Search", false, UM_SEARCH, IDOK); EditIconHint_Subclass(hDlg); wchar_t* pszLabel = GetDlgItemTextPtr(hDlg, stConEmuVersion); if (pszLabel) { wchar_t* pszSet = NULL; if (gpUpd) { wchar_t* pszVerInfo = gpUpd->GetCurVerInfo(); if (pszVerInfo) { pszSet = lstrmerge(pszLabel, L" ", pszVerInfo); free(pszVerInfo); } } if (!pszSet) { pszSet = lstrmerge(pszLabel, L" ", L"Please check for updates manually"); } if (pszSet) { SetDlgItemText(hDlg, stConEmuVersion, pszSet); free(pszSet); } free(pszLabel); } HWND hTab = GetDlgItem(hDlg, tbAboutTabs); INT_PTR nPage = -1; for (size_t i = 0; i < countof(Pages); i++) { TCITEM tie = {}; tie.mask = TCIF_TEXT; tie.pszText = (LPWSTR)Pages[i].Title; TabCtrl_InsertItem(hTab, i, &tie); if (pszActivePage && (lstrcmpi(pszActivePage, Pages[i].Title) == 0)) nPage = i; } if (nPage >= 0) { TabSelected(hDlg, nPage); TabCtrl_SetCurSel(hTab, (int)nPage); } else if (!pszActivePage) { TabSelected(hDlg, 0); } else { _ASSERTE(pszActivePage==NULL && "Unknown page name?"); } SetFocus(hTab); return FALSE; } case WM_CTLCOLORSTATIC: if (GetWindowLongPtr((HWND)lParam, GWLP_ID) == stConEmuUrl) { SetTextColor((HDC)wParam, GetSysColor(COLOR_HOTLIGHT)); HBRUSH hBrush = GetSysColorBrush(COLOR_3DFACE); SetBkMode((HDC)wParam, TRANSPARENT); return (INT_PTR)hBrush; } else { SetTextColor((HDC)wParam, GetSysColor(COLOR_WINDOWTEXT)); HBRUSH hBrush = GetSysColorBrush(COLOR_3DFACE); SetBkMode((HDC)wParam, TRANSPARENT); return (INT_PTR)hBrush; } break; case WM_SETCURSOR: { if (GetWindowLongPtr((HWND)wParam, GWLP_ID) == stConEmuUrl) { SetCursor(LoadCursor(NULL, IDC_HAND)); SetWindowLongPtr(hDlg, DWLP_MSGRESULT, TRUE); return TRUE; } return FALSE; } break; case WM_COMMAND: switch (HIWORD(wParam)) { case BN_CLICKED: switch (LOWORD(wParam)) { case IDOK: case IDCANCEL: case IDCLOSE: aboutProc(hDlg, WM_CLOSE, 0, 0); return 1; case stConEmuUrl: ConEmuAbout::OnInfo_HomePage(); return 1; } // BN_CLICKED break; case EN_SETFOCUS: switch (LOWORD(wParam)) { case tAboutText: { // Do not autosel all text HWND hEdit = (HWND)lParam; DWORD nStart = 0, nEnd = 0; SendMessage(hEdit, EM_GETSEL, (WPARAM)&nStart, (LPARAM)&nEnd); if (nStart != nEnd) { SendMessage(hEdit, EM_SETSEL, nTextSelStart, nTextSelEnd); } } break; } } // switch (HIWORD(wParam)) break; case WM_NOTIFY: { LPNMHDR nmhdr = (LPNMHDR)lParam; if ((nmhdr->code == TCN_SELCHANGE) && (nmhdr->idFrom == tbAboutTabs)) { int iPage = TabCtrl_GetCurSel(nmhdr->hwndFrom); if ((iPage >= 0) && (iPage < (int)countof(Pages))) TabSelected(hDlg, iPage); } break; } case UM_SEARCH: searchProc(hDlg, (HWND)lParam, false); break; case UM_EDIT_KILL_FOCUS: SendMessage((HWND)lParam, EM_GETSEL, (WPARAM)&nTextSelStart, (LPARAM)&nTextSelEnd); break; case WM_CLOSE: //if (ghWnd == NULL) gpConEmu->OnOurDialogClosed(); if (mp_DpiAware) mp_DpiAware->Detach(); EndDialog(hDlg, IDOK); //else // DestroyWindow(hDlg); break; case WM_DESTROY: mh_AboutDlg = NULL; break; default: if (mp_DpiAware && mp_DpiAware->ProcessDpiMessages(hDlg, messg, wParam, lParam)) { return TRUE; } } return FALSE; }
// Общая 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; }
static INT_PTR Fast_OnInitDialog(HWND hDlg, UINT messg, WPARAM wParam, LPARAM lParam) { SendMessage(hDlg, WM_SETICON, ICON_BIG, (LPARAM)hClassIcon); SendMessage(hDlg, WM_SETICON, ICON_SMALL, (LPARAM)hClassIconSm); if (gp_DpiAware) { gp_DpiAware->Attach(hDlg, NULL, CDynDialog::GetDlgClass(hDlg)); } RECT rect = {}; if (GetWindowRect(hDlg, &rect)) { CDpiAware::GetCenteredRect(NULL, rect); MoveWindowRect(hDlg, rect); } if (lParam) { SetWindowText(hDlg, (LPCWSTR)lParam); } else { wchar_t szTitle[512]; wcscpy_c(szTitle, gpConEmu->GetDefaultTitle()); wcscat_c(szTitle, L" fast configuration"); SetWindowText(hDlg, szTitle); } // lbStorageLocation SettingsStorage Storage = {}; bool ReadOnly = false; gpSet->GetSettingsType(Storage, ReadOnly); // Same priority as in CConEmuMain::ConEmuXml (reverse order) wchar_t* pszSettingsPlaces[] = { lstrdup(L"HKEY_CURRENT_USER\\Software\\ConEmu"), ExpandEnvStr(L"%APPDATA%\\ConEmu.xml"), ExpandEnvStr(L"%ConEmuBaseDir%\\ConEmu.xml"), ExpandEnvStr(L"%ConEmuDir%\\ConEmu.xml"), NULL }; // Lets find first allowed item int iAllowed = 0; if (lstrcmp(Storage.szType, CONEMU_CONFIGTYPE_XML) == 0) { iAllowed = 1; // XML is used, registry is not allowed if (Storage.pszFile) { if (lstrcmpi(Storage.pszFile, pszSettingsPlaces[1]) == 0) // %APPDATA% iAllowed = 1; // Any other xml has greater priority else if (lstrcmpi(Storage.pszFile, pszSettingsPlaces[2]) == 0) // %ConEmuBaseDir% iAllowed = 2; // Only %ConEmuDir% has greater priority else if (lstrcmpi(Storage.pszFile, pszSettingsPlaces[3]) == 0) // %ConEmuDir% iAllowed = 3; // Most prioritized else { // Directly specified with "/LoadCfgFile ..." SafeFree(pszSettingsPlaces[3]); pszSettingsPlaces[3] = lstrdup(Storage.pszFile); iAllowed = 3; // Most prioritized } } } // Index of the default location (relative to listbox, but not a pszSettingsPlaces) // By default - suggest %APPDATA% or, if possible, %ConEmuDir% // Win2k does not have 'msxml3.dll'/'msxml3r.dll' libraries int iDefault = ((iAllowed == 0) && !IsWin2kEql()) ? (CConEmuUpdate::NeedRunElevation() ? 1 : 3) : 0; // Populate lbStorageLocation while (pszSettingsPlaces[iAllowed]) { SendDlgItemMessage(hDlg, lbStorageLocation, CB_ADDSTRING, 0, (LPARAM)pszSettingsPlaces[iAllowed]); iAllowed++; } SendDlgItemMessage(hDlg, lbStorageLocation, CB_SETCURSEL, iDefault, 0); // Release memory for (int i = 0; pszSettingsPlaces[i]; i++) { SafeFree(pszSettingsPlaces[i]); } // Tasks const CommandTasks* pGrp = NULL; for (int nGroup = 0; (pGrp = gpSet->CmdTaskGet(nGroup)) != NULL; nGroup++) { SendDlgItemMessage(hDlg, lbStartupShellFast, CB_ADDSTRING, 0, (LPARAM)pGrp->pszName); } // Show startup task or shell command line LPCWSTR pszStartup = (gpSet->nStartType == 2) ? gpSet->psStartTasksName : (gpSet->nStartType == 0) ? gpSet->psStartSingleApp : NULL; if (pszStartup && *pszStartup) CSetDlgLists::SelectStringExact(hDlg, lbStartupShellFast, pszStartup); // Palettes (console color sets) const ColorPalette* pPal = NULL; for (int nPal = 0; (pPal = gpSet->PaletteGet(nPal)) != NULL; nPal++) { SendDlgItemMessage(hDlg, lbColorSchemeFast, CB_ADDSTRING, 0, (LPARAM)pPal->pszName); } // Show active (default) palette gp_DefaultPalette = gpSet->PaletteFindCurrent(true); if (gp_DefaultPalette) { CSetDlgLists::SelectStringExact(hDlg, lbColorSchemeFast, gp_DefaultPalette->pszName); } else { _ASSERTE(FALSE && "Current paletted was not defined?"); } // Show its colors in box HWND hChild = GetDlgItem(hDlg, stPalettePreviewFast); if (hChild) gpfn_DefaultColorBoxProc = (WNDPROC)SetWindowLongPtr(hChild, GWLP_WNDPROC, (LONG_PTR)Fast_ColorBoxProc); // Single instance CheckDlgButton(hDlg, cbSingleInstance, gpSetCls->IsSingleInstanceArg()); // Quake style and show/hide key CheckDlgButton(hDlg, cbQuakeFast, gpSet->isQuakeStyle ? BST_CHECKED : BST_UNCHECKED); const ConEmuHotKey* pHK = NULL; if (gpSet->GetHotkeyById(vkMinimizeRestore, &pHK) && pHK) { wchar_t szKey[128] = L""; SetDlgItemText(hDlg, tQuakeKeyFast, pHK->GetHotkeyName(szKey)); ghk_MinMaxKey.SetVkMod(pHK->GetVkMod()); } // Keyhooks required for Win+Number, Win+Arrows, etc. CheckDlgButton(hDlg, cbUseKeyboardHooksFast, gpSet->isKeyboardHooks(true)); // Debug purposes only. ConEmu.exe switch "/nokeyhooks" #ifdef _DEBUG EnableWindow(GetDlgItem(hDlg, cbUseKeyboardHooksFast), !gpConEmu->DisableKeybHooks); #endif // Injects CheckDlgButton(hDlg, cbInjectConEmuHkFast, gpSet->isUseInjects); // Autoupdates if (!gpConEmu->isUpdateAllowed()) { EnableWindow(GetDlgItem(hDlg, cbEnableAutoUpdateFast), FALSE); EnableWindow(GetDlgItem(hDlg, rbAutoUpdateStableFast), FALSE); EnableWindow(GetDlgItem(hDlg, rbAutoUpdatePreviewFast), FALSE); EnableWindow(GetDlgItem(hDlg, rbAutoUpdateDeveloperFast), FALSE); EnableWindow(GetDlgItem(hDlg, stEnableAutoUpdateFast), FALSE); } else { if (gpSet->UpdSet.isUpdateUseBuilds != 0) CheckDlgButton(hDlg, cbEnableAutoUpdateFast, gpSet->UpdSet.isUpdateCheckOnStartup|gpSet->UpdSet.isUpdateCheckHourly); CheckRadioButton(hDlg, rbAutoUpdateStableFast, rbAutoUpdateDeveloperFast, (gpSet->UpdSet.isUpdateUseBuilds == 1) ? rbAutoUpdateStableFast : (gpSet->UpdSet.isUpdateUseBuilds == 3) ? rbAutoUpdatePreviewFast : rbAutoUpdateDeveloperFast); } // Vista - ConIme bugs if (!bCheckIme) { ShowWindow(GetDlgItem(hDlg, gbDisableConImeFast), SW_HIDE); ShowWindow(GetDlgItem(hDlg, cbDisableConImeFast), SW_HIDE); ShowWindow(GetDlgItem(hDlg, stDisableConImeFast1), SW_HIDE); ShowWindow(GetDlgItem(hDlg, stDisableConImeFast2), SW_HIDE); ShowWindow(GetDlgItem(hDlg, stDisableConImeFast3), SW_HIDE); RECT rcGroup, rcBtn, rcWnd; if (GetWindowRect(GetDlgItem(hDlg, gbDisableConImeFast), &rcGroup)) { int nShift = (rcGroup.bottom-rcGroup.top); HWND h = GetDlgItem(hDlg, IDOK); GetWindowRect(h, &rcBtn); MapWindowPoints(NULL, hDlg, (LPPOINT)&rcBtn, 2); SetWindowPos(h, NULL, rcBtn.left, rcBtn.top - nShift, 0,0, SWP_NOSIZE|SWP_NOZORDER); h = GetDlgItem(hDlg, IDCANCEL); GetWindowRect(h, &rcBtn); MapWindowPoints(NULL, hDlg, (LPPOINT)&rcBtn, 2); SetWindowPos(h, NULL, rcBtn.left, rcBtn.top - nShift, 0,0, SWP_NOSIZE|SWP_NOZORDER); h = GetDlgItem(hDlg, stHomePage); GetWindowRect(h, &rcBtn); MapWindowPoints(NULL, hDlg, (LPPOINT)&rcBtn, 2); SetWindowPos(h, NULL, rcBtn.left, rcBtn.top - nShift, 0,0, SWP_NOSIZE|SWP_NOZORDER); SetWindowText(h, gsHomePage); GetWindowRect(hDlg, &rcWnd); MoveWindow(hDlg, rcWnd.left, rcWnd.top+(nShift>>1), rcWnd.right-rcWnd.left, rcWnd.bottom-rcWnd.top-nShift, FALSE); }
static INT_PTR CALLBACK CheckOptionsFastProc(HWND hDlg, UINT messg, WPARAM wParam, LPARAM lParam) { switch (messg) { case WM_SETHOTKEY: gnWndSetHotkey = wParam; break; case WM_INITDIALOG: { SendMessage(hDlg, WM_SETICON, ICON_BIG, (LPARAM)hClassIcon); SendMessage(hDlg, WM_SETICON, ICON_SMALL, (LPARAM)hClassIconSm); if (gp_DpiAware) { gp_DpiAware->Attach(hDlg, NULL); } RECT rect = {}; if (GetWindowRect(hDlg, &rect)) { CDpiAware::GetCenteredRect(NULL, rect); MoveWindowRect(hDlg, rect); } LRESULT lbRc = FALSE; if (lParam) { SetWindowText(hDlg, (LPCWSTR)lParam); } else { wchar_t szTitle[512]; wcscpy_c(szTitle, gpConEmu->GetDefaultTitle()); wcscat_c(szTitle, L" fast configuration"); SetWindowText(hDlg, szTitle); } // lbStorageLocation SettingsStorage Storage = {}; bool ReadOnly = false; gpSet->GetSettingsType(Storage, ReadOnly); wchar_t* pszSettingsPlaces[] = { lstrdup(L"HKEY_CURRENT_USER\\Software\\ConEmu"), ExpandEnvStr(L"%APPDATA%\\ConEmu.xml"), ExpandEnvStr(L"%ConEmuBaseDir%\\ConEmu.xml"), ExpandEnvStr(L"%ConEmuDir%\\ConEmu.xml"), NULL }; int iAllowed = 0; if (lstrcmp(Storage.szType, CONEMU_CONFIGTYPE_XML) == 0) { iAllowed = 1; // Реестр уже низя if (Storage.pszFile) { if (lstrcmpi(Storage.pszFile, pszSettingsPlaces[1]) == 0) iAllowed = 1; // OK, перебить может любой другой xml else if (lstrcmpi(Storage.pszFile, pszSettingsPlaces[2]) == 0) iAllowed = 2; // "Перебить" может только %APPDATA% else if (lstrcmpi(Storage.pszFile, pszSettingsPlaces[3]) == 0) iAllowed = 3; // Приоритетнее настроек нет else { // Этот xml мог быть указан в "/LoadCfgFile ..." SafeFree(pszSettingsPlaces[3]); pszSettingsPlaces[3] = lstrdup(Storage.pszFile); iAllowed = 3; // Приоритетнее настроек нет } } } while (pszSettingsPlaces[iAllowed]) { SendDlgItemMessage(hDlg, lbStorageLocation, CB_ADDSTRING, 0, (LPARAM)pszSettingsPlaces[iAllowed]); iAllowed++; } SendDlgItemMessage(hDlg, lbStorageLocation, CB_SETCURSEL, 0, 0); for (int i = 0; pszSettingsPlaces[i]; i++) { SafeFree(pszSettingsPlaces[i]); } // continue CheckDlgButton(hDlg, cbSingleInstance, gpSetCls->IsSingleInstanceArg()); CheckDlgButton(hDlg, cbUseKeyboardHooksFast, gpSet->isKeyboardHooks(true)); // Debug purposes only. ConEmu.exe switch "/nokeyhooks" #ifdef _DEBUG EnableWindow(GetDlgItem(hDlg, cbUseKeyboardHooksFast), !gpConEmu->DisableKeybHooks); #endif CheckDlgButton(hDlg, cbInjectConEmuHkFast, gpSet->isUseInjects); if (!gpConEmu->isUpdateAllowed()) { EnableWindow(GetDlgItem(hDlg, cbEnableAutoUpdateFast), FALSE); EnableWindow(GetDlgItem(hDlg, rbAutoUpdateStableFast), FALSE); EnableWindow(GetDlgItem(hDlg, rbAutoUpdatePreviewFast), FALSE); EnableWindow(GetDlgItem(hDlg, rbAutoUpdateDeveloperFast), FALSE); EnableWindow(GetDlgItem(hDlg, stEnableAutoUpdateFast), FALSE); } else { if (gpSet->UpdSet.isUpdateUseBuilds != 0) CheckDlgButton(hDlg, cbEnableAutoUpdateFast, gpSet->UpdSet.isUpdateCheckOnStartup|gpSet->UpdSet.isUpdateCheckHourly); CheckRadioButton(hDlg, rbAutoUpdateStableFast, rbAutoUpdateDeveloperFast, (gpSet->UpdSet.isUpdateUseBuilds == 1) ? rbAutoUpdateStableFast : (gpSet->UpdSet.isUpdateUseBuilds == 3) ? rbAutoUpdatePreviewFast : rbAutoUpdateDeveloperFast); } if (!bCheckIme) { ShowWindow(GetDlgItem(hDlg, gbDisableConImeFast), SW_HIDE); ShowWindow(GetDlgItem(hDlg, cbDisableConImeFast), SW_HIDE); ShowWindow(GetDlgItem(hDlg, stDisableConImeFast1), SW_HIDE); ShowWindow(GetDlgItem(hDlg, stDisableConImeFast2), SW_HIDE); ShowWindow(GetDlgItem(hDlg, stDisableConImeFast3), SW_HIDE); RECT rcGroup, rcBtn, rcWnd; if (GetWindowRect(GetDlgItem(hDlg, gbDisableConImeFast), &rcGroup)) { int nShift = (rcGroup.bottom-rcGroup.top); HWND h = GetDlgItem(hDlg, IDOK); GetWindowRect(h, &rcBtn); MapWindowPoints(NULL, hDlg, (LPPOINT)&rcBtn, 2); SetWindowPos(h, NULL, rcBtn.left, rcBtn.top - nShift, 0,0, SWP_NOSIZE|SWP_NOZORDER); h = GetDlgItem(hDlg, IDCANCEL); GetWindowRect(h, &rcBtn); MapWindowPoints(NULL, hDlg, (LPPOINT)&rcBtn, 2); SetWindowPos(h, NULL, rcBtn.left, rcBtn.top - nShift, 0,0, SWP_NOSIZE|SWP_NOZORDER); h = GetDlgItem(hDlg, stHomePage); GetWindowRect(h, &rcBtn); MapWindowPoints(NULL, hDlg, (LPPOINT)&rcBtn, 2); SetWindowPos(h, NULL, rcBtn.left, rcBtn.top - nShift, 0,0, SWP_NOSIZE|SWP_NOZORDER); GetWindowRect(hDlg, &rcWnd); MoveWindow(hDlg, rcWnd.left, rcWnd.top+(nShift>>1), rcWnd.right-rcWnd.left, rcWnd.bottom-rcWnd.top-nShift, FALSE); } } return lbRc; }