LRESULT CSetPgIntegr::OnInitDialog(HWND hDlg, bool abInitial) { MSetter lSkip(&mb_SkipSelChange); int iHere = 0, iInside = 0; ReloadHereList(&iHere, &iInside); // Возвращает NULL, если строка пустая wchar_t* pszCurInside = GetDlgItemTextPtr(hDlg, cbInsideName); _ASSERTE((pszCurInside==NULL) || (*pszCurInside!=0)); wchar_t* pszCurHere = GetDlgItemTextPtr(hDlg, cbHereName); _ASSERTE((pszCurHere==NULL) || (*pszCurHere!=0)); wchar_t szIcon[MAX_PATH+32]; _wsprintf(szIcon, SKIPLEN(countof(szIcon)) L"%s,0", gpConEmu->ms_ConEmuExe); if ((iInside > 0) && pszCurInside) { FillHereValues(cbInsideName); } else if (abInitial) { SetDlgItemText(hDlg, cbInsideName, L"ConEmu Inside"); SetDlgItemText(hDlg, tInsideConfig, L"shell"); SetDlgItemText(hDlg, tInsideShell, CONEMU_HERE_POSH); //SetDlgItemText(hDlg, tInsideIcon, szIcon); SetDlgItemText(hDlg, tInsideIcon, L"powershell.exe"); checkDlgButton(hDlg, cbInsideSyncDir, gpConEmu->mp_Inside && gpConEmu->mp_Inside->mb_InsideSynchronizeCurDir); SetDlgItemText(hDlg, tInsideSyncDir, L""); // Auto } if ((iHere > 0) && pszCurHere) { FillHereValues(cbHereName); } else if (abInitial) { SetDlgItemText(hDlg, cbHereName, L"ConEmu Here"); SetDlgItemText(hDlg, tHereConfig, L""); SetDlgItemText(hDlg, tHereShell, CONEMU_HERE_CMD); SetDlgItemText(hDlg, tHereIcon, szIcon); } SafeFree(pszCurInside); SafeFree(pszCurHere); return 0; }
INT_PTR CRecreateDlg::OnSysCommand(HWND hDlg, UINT messg, WPARAM wParam, LPARAM lParam) { switch (LOWORD(wParam)) { case ID_RESETCMDHISTORY: // Подтверждение спросит ResetCmdHistory if (gpSetCls->ResetCmdHistory(hDlg)) { wchar_t* pszCmd = GetDlgItemTextPtr(hDlg, IDC_RESTART_CMD); SendDlgItemMessage(hDlg, IDC_RESTART_CMD, CB_RESETCONTENT, 0,0); SendMessage(hDlg, UM_FILL_CMDLIST, FALSE, 0); if (pszCmd) { SetDlgItemText(hDlg, IDC_RESTART_CMD, pszCmd); free(pszCmd); } } SetWindowLongPtr(hDlg, DWLP_MSGRESULT, 0); return TRUE; case ID_STORECMDHISTORY: if (MsgBox(gpSet->isSaveCmdHistory ? L"Do you want to disable history?" : L"Do you want to enable history?", MB_YESNO|MB_ICONQUESTION, NULL, hDlg) == IDYES) { gpSetCls->SetSaveCmdHistory(!gpSet->isSaveCmdHistory); HMENU hSysMenu = GetSystemMenu(hDlg, FALSE); CheckMenuItem(hSysMenu, ID_STORECMDHISTORY, MF_BYCOMMAND|(gpSet->isSaveCmdHistory ? MF_CHECKED : 0)); } SetWindowLongPtr(hDlg, DWLP_MSGRESULT, 0); return TRUE; } return FALSE; }
void CSetPgBase::setHotkeyCheckbox(HWND hDlg, WORD nCtrlId, int iHotkeyId, LPCWSTR pszFrom, LPCWSTR pszTo, UINT uChecked) { wchar_t szKeyFull[128] = L""; gpSet->GetHotkeyNameById(iHotkeyId, szKeyFull, false); if (szKeyFull[0] == 0) { EnableWindow(GetDlgItem(hDlg, nCtrlId), FALSE); checkDlgButton(hDlg, nCtrlId, BST_UNCHECKED); } else { if (pszFrom) { wchar_t* ptr = (wchar_t*)wcsstr(szKeyFull, pszFrom); if (ptr) { *ptr = 0; if (pszTo) { wcscat_c(szKeyFull, pszTo); } } } CEStr lsText(GetDlgItemTextPtr(hDlg, nCtrlId)); LPCWSTR pszTail = lsText.IsEmpty() ? NULL : wcsstr(lsText, L" - "); if (pszTail) { CEStr lsNew(szKeyFull, pszTail); SetDlgItemText(hDlg, nCtrlId, lsNew); } checkDlgButton(hDlg, nCtrlId, uChecked); } }
LRESULT CSetPgFeatures::OnEditChanged(HWND hDlg, WORD nCtrlId) { switch (nCtrlId) { case tAnsiLogPath: { SafeFree(gpSet->pszAnsiLog); gpSet->pszAnsiLog = GetDlgItemTextPtr(hDlg, tAnsiLogPath); } break; default: _ASSERTE(FALSE && "EditBox was not processed"); } return 0; }
LRESULT CSetPgMarkCopy::OnEditChanged(HWND hDlg, WORD nCtrlId) { switch (nCtrlId) { case tCTSIntelligentExceptions: // *** Console text selections - intelligent exclusions *** { wchar_t* pszApps = GetDlgItemTextPtr(hDlg, tCTSIntelligentExceptions); gpSet->SetIntelligentExceptions(pszApps); SafeFree(pszApps); } break; default: _ASSERTE(FALSE && "EditBox was not processed"); } return 0; }
INT_PTR CRecreateDlg::OnButtonClicked(HWND hDlg, UINT messg, WPARAM wParam, LPARAM lParam) { switch (LOWORD(wParam)) { case IDC_CHOOSE: { wchar_t *pszFilePath = SelectFile(L"Choose program to run", NULL, NULL, hDlg, L"Executables (*.exe)\0*.exe\0All files (*.*)\0*.*\0\0", sff_AutoQuote); if (pszFilePath) { SetDlgItemText(hDlg, IDC_RESTART_CMD, pszFilePath); SafeFree(pszFilePath); } return TRUE; } // case IDC_CHOOSE: case IDC_CHOOSE_DIR: { wchar_t* pszDefFolder = GetDlgItemTextPtr(hDlg, IDC_STARTUP_DIR); wchar_t* pszFolder = SelectFolder(L"Choose startup directory", pszDefFolder, hDlg, sff_Default); if (pszFolder) { SetDlgItemText(hDlg, IDC_STARTUP_DIR, pszFolder); SafeFree(pszFolder); } SafeFree(pszDefFolder); return TRUE; } // case IDC_CHOOSE_DIR: case cbRunAsAdmin: { // BCM_SETSHIELD = 5644 BOOL bRunAs = SendDlgItemMessage(hDlg, cbRunAsAdmin, BM_GETCHECK, 0, 0); if (gOSVer.dwMajorVersion >= 6) { SendDlgItemMessage(hDlg, IDC_START, 5644/*BCM_SETSHIELD*/, 0, bRunAs && (mp_Args->aRecreate != cra_EditTab)); } if (bRunAs) { CheckRadioButton(hDlg, rbCurrentUser, rbAnotherUser, rbCurrentUser); CheckDlgButton(hDlg, cbRunAsRestricted, BST_UNCHECKED); RecreateDlgProc(hDlg, UM_USER_CONTROLS, 0, 0); } return TRUE; } // case cbRunAsAdmin: case rbCurrentUser: case rbAnotherUser: case cbRunAsRestricted: { RecreateDlgProc(hDlg, UM_USER_CONTROLS, LOWORD(wParam), 0); return TRUE; } case rbRecreateSplitNone: case rbRecreateSplit2Right: case rbRecreateSplit2Bottom: { RConStartArgs* pArgs = mp_Args; switch (LOWORD(wParam)) { case rbRecreateSplitNone: pArgs->eSplit = RConStartArgs::eSplitNone; break; case rbRecreateSplit2Right: pArgs->eSplit = RConStartArgs::eSplitHorz; break; case rbRecreateSplit2Bottom: pArgs->eSplit = RConStartArgs::eSplitVert; break; } EnableWindow(GetDlgItem(hDlg, tRecreateSplit), (pArgs->eSplit != pArgs->eSplitNone)); EnableWindow(GetDlgItem(hDlg, stRecreateSplit), (pArgs->eSplit != pArgs->eSplitNone)); if (pArgs->eSplit != pArgs->eSplitNone) SetFocus(GetDlgItem(hDlg, tRecreateSplit)); return TRUE; } // case rbRecreateSplitXXX case IDC_START: { RConStartArgs* pArgs = mp_Args; _ASSERTE(pArgs); SafeFree(pArgs->pszUserName); SafeFree(pArgs->pszDomain); //SafeFree(pArgs->pszUserPassword); if (SendDlgItemMessage(hDlg, rbAnotherUser, BM_GETCHECK, 0, 0)) { pArgs->RunAsRestricted = crb_Off; pArgs->pszUserName = GetDlgItemTextPtr(hDlg, tRunAsUser); if (pArgs->pszUserName) { //pArgs->pszUserPassword = GetDlgItemText(hDlg, tRunAsPassword); // Попытаться проверить правильность введенного пароля и возможность запуска bool bCheckPwd = pArgs->CheckUserToken(GetDlgItem(hDlg, tRunAsPassword)); DWORD nErr = bCheckPwd ? 0 : GetLastError(); if (!bCheckPwd) { DisplayLastError(L"Invalid user name or password was specified!", nErr, MB_ICONSTOP, NULL, hDlg); return 1; } } } else { pArgs->RunAsRestricted = SendDlgItemMessage(hDlg, cbRunAsRestricted, BM_GETCHECK, 0, 0) ? crb_On : crb_Off; } // Vista+ (As Admin...) pArgs->RunAsAdministrator = SendDlgItemMessage(hDlg, cbRunAsAdmin, BM_GETCHECK, 0, 0) ? crb_On : crb_Off; // StartupDir (may be specified as argument) wchar_t* pszDir = GetDlgItemTextPtr(hDlg, IDC_STARTUP_DIR); wchar_t* pszExpand = (pszDir && wcschr(pszDir, L'%')) ? ExpandEnvStr(pszDir) : NULL; LPCWSTR pszDirResult = pszExpand ? pszExpand : pszDir; // Another user? We may fail with access denied. Check only for "current user" account if (!pArgs->pszUserName && pszDirResult && *pszDirResult && !DirectoryExists(pszDirResult)) { wchar_t* pszErrInfo = lstrmerge(L"Specified directory does not exists!\n", pszDirResult, L"\n" L"Do you want to choose another directory?\n\n"); DWORD nErr = GetLastError(); int iDirBtn = DisplayLastError(pszErrInfo, nErr, MB_ICONEXCLAMATION|MB_YESNO, NULL, hDlg); if (iDirBtn == IDYES) { SafeFree(pszDir); SafeFree(pszExpand); SafeFree(pszErrInfo); return 1; } // User want to run "as is". Most likely it will fail, but who knows... } SafeFree(pArgs->pszStartupDir); pArgs->pszStartupDir = pszExpand ? pszExpand : pszDir; if (pszExpand) { SafeFree(pszDir) } // Command // pszSpecialCmd мог быть передан аргументом - умолчание для строки ввода SafeFree(pArgs->pszSpecialCmd); // GetDlgItemText выделяет память через calloc pArgs->pszSpecialCmd = GetDlgItemTextPtr(hDlg, IDC_RESTART_CMD); if (pArgs->pszSpecialCmd) gpSet->HistoryAdd(pArgs->pszSpecialCmd); if ((pArgs->aRecreate != cra_RecreateTab) && (pArgs->aRecreate != cra_EditTab)) { if (SendDlgItemMessage(hDlg, cbRunInNewWindow, BM_GETCHECK, 0, 0)) pArgs->aRecreate = cra_CreateWindow; else pArgs->aRecreate = cra_CreateTab; } if (((pArgs->aRecreate == cra_CreateTab) || (pArgs->aRecreate == cra_EditTab)) && (pArgs->eSplit != RConStartArgs::eSplitNone)) { BOOL bOk = FALSE; int nPercent = GetDlgItemInt(hDlg, tRecreateSplit, &bOk, FALSE); if (bOk && (nPercent >= 1) && (nPercent <= 99)) { pArgs->nSplitValue = (100-nPercent) * 10; } //pArgs->nSplitPane = 0; Сбрасывать не будем? } mn_DlgRc = IDC_START; EndDialog(hDlg, IDC_START); return TRUE; } // case IDC_START: case IDC_TERMINATE: mn_DlgRc = IDC_TERMINATE; EndDialog(hDlg, IDC_TERMINATE); return TRUE; case IDCANCEL: mn_DlgRc = IDCANCEL; EndDialog(hDlg, IDCANCEL); return TRUE; } return FALSE; }
void ConEmuAbout::searchProc(HWND hDlg, HWND hSearch, bool bReentr) { HWND hEdit = GetDlgItem(hDlg, tAboutText); wchar_t* pszPart = GetDlgItemTextPtr(hSearch, 0); wchar_t* pszText = GetDlgItemTextPtr(hEdit, 0); bool bRetry = false; if (pszPart && *pszPart && pszText && *pszText) { LPCWSTR pszFrom = pszText; DWORD nStart = 0, nEnd = 0; SendMessage(hEdit, EM_GETSEL, (WPARAM)&nStart, (LPARAM)&nEnd); size_t cchMax = wcslen(pszText); size_t cchFrom = max(nStart,nEnd); if (cchMax > cchFrom) pszFrom += cchFrom; LPCWSTR pszFind = StrStrI(pszFrom, pszPart); if (!pszFind && bReentr && (pszFrom != pszText)) pszFind = StrStrI(pszText, pszPart); if (pszFind) { const wchar_t szBrkChars[] = L"()[]<>{}:;,.-=\\/ \t\r\n"; LPCWSTR pszEnd = wcspbrk(pszFind, szBrkChars); INT_PTR nPartLen = wcslen(pszPart); if (!pszEnd || ((pszEnd - pszFind) > max(nPartLen,60))) pszEnd = pszFind + nPartLen; while ((pszFind > pszFrom) && !wcschr(szBrkChars, *(pszFind-1))) pszFind--; //SetFocus(hEdit); nTextSelStart = (DWORD)(pszEnd-pszText); nTextSelEnd = (DWORD)(pszFind-pszText); SendMessage(hEdit, EM_SETSEL, nTextSelStart, nTextSelEnd); SendMessage(hEdit, EM_SCROLLCARET, 0, 0); } else if (!bReentr) { HWND hTab = GetDlgItem(hDlg, tbAboutTabs); int iPage = TabCtrl_GetCurSel(hTab); int iFound = -1; for (int s = 0; (iFound == -1) && (s <= 1); s++) { int iFrom = (s == 0) ? (iPage+1) : 0; int iTo = (s == 0) ? (int)countof(Pages) : (iPage-1); for (int i = iFrom; i < iTo; i++) { if (StrStrI(Pages[i].Title, pszPart) || StrStrI(Pages[i].Text, pszPart)) { iFound = i; break; } } } if (iFound >= 0) { TabSelected(hDlg, iFound); TabCtrl_SetCurSel(hTab, iFound); //SetFocus(hEdit); bRetry = true; } } } SafeFree(pszPart); SafeFree(pszText); if (bRetry) { searchProc(hDlg, hSearch, true); } }
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; }
LRESULT CSetPgSizePos::OnEditChanged(HWND hDlg, WORD nCtrlId) { switch (nCtrlId) { case tWndX: case tWndY: if (isChecked(hDlg, rNormal) == BST_CHECKED) { wchar_t *pVal = GetDlgItemTextPtr(hDlg, nCtrlId); bool bValid = (pVal && isDigit(*pVal)); enableDlgItem(hDlg, cbApplyPos, bValid); SafeFree(pVal); } break; // case tWndX: case tWndY: case tWndWidth: case tWndHeight: if (isChecked(hDlg, rNormal) == BST_CHECKED) { CESize sz = {0}; wchar_t *pVal = GetDlgItemTextPtr(hDlg, nCtrlId); bool bValid = (pVal && sz.SetFromString(false, pVal)); enableDlgItem(hDlg, cbApplyPos, bValid); SafeFree(pVal); } break; // case tWndWidth: case tWndHeight: case tPadSize: { BOOL bPadOk = FALSE; UINT nNewPad = GetDlgItemInt(hDlg, nCtrlId, &bPadOk, FALSE); if (nNewPad >= CENTERCONSOLEPAD_MIN && nNewPad <= CENTERCONSOLEPAD_MAX) gpSet->nCenterConsolePad = nNewPad; else if (nNewPad > CENTERCONSOLEPAD_MAX) SetDlgItemInt(hDlg, nCtrlId, CENTERCONSOLEPAD_MAX, FALSE); // Если юзер ставит "бордюр" то нужно сразу включить опцию, чтобы он работал if (gpSet->nCenterConsolePad && !isChecked(hDlg, cbTryToCenter)) { gpSet->isTryToCenter = true; checkDlgButton(hDlg, cbTryToCenter, BST_CHECKED); } // Update window/console size if (gpSet->isTryToCenter) gpConEmu->OnSize(); break; } case tLongOutputHeight: { BOOL lbOk = FALSE; wchar_t szTemp[16]; UINT nNewVal = GetDlgItemInt(hDlg, nCtrlId, &lbOk, FALSE); if (lbOk) { if (nNewVal >= LONGOUTPUTHEIGHT_MIN && nNewVal <= LONGOUTPUTHEIGHT_MAX) gpSet->DefaultBufferHeight = nNewVal; else if (nNewVal > LONGOUTPUTHEIGHT_MAX) SetDlgItemInt(hDlg, nCtrlId, gpSet->DefaultBufferHeight, FALSE); } else { SetDlgItemText(hDlg, nCtrlId, _ltow(gpSet->DefaultBufferHeight, szTemp, 10)); } break; } //case tLongOutputHeight: default: _ASSERTE(FALSE && "EditBox was not processed"); } return 0; }
INT_PTR CSetPgIntegr::PageDlgProc(HWND hDlg, UINT messg, WPARAM wParam, LPARAM lParam) { static bool bSkipCbSel = FALSE; INT_PTR iRc = 0; switch (messg) { case WM_NOTIFY: { LPNMHDR phdr = (LPNMHDR)lParam; if (phdr->code == TTN_GETDISPINFO) { return gpSetCls->ProcessTipHelp(hDlg, messg, wParam, lParam); } break; } case WM_INITDIALOG: { bSkipCbSel = true; PageDlgProc(hDlg, UM_RELOAD_HERE_LIST, UM_RELOAD_HERE_LIST, 0); //-- moved to "ComSpec" page //PageDlgProc(hDlg, UM_RELOAD_AUTORUN, UM_RELOAD_AUTORUN, 0); // Возвращает NULL, если строка пустая wchar_t* pszCurInside = GetDlgItemTextPtr(hDlg, cbInsideName); _ASSERTE((pszCurInside==NULL) || (*pszCurInside!=0)); wchar_t* pszCurHere = GetDlgItemTextPtr(hDlg, cbHereName); _ASSERTE((pszCurHere==NULL) || (*pszCurHere!=0)); wchar_t szIcon[MAX_PATH+32]; _wsprintf(szIcon, SKIPLEN(countof(szIcon)) L"%s,0", gpConEmu->ms_ConEmuExe); if (pszCurInside) { bSkipCbSel = false; PageDlgProc(hDlg, WM_COMMAND, MAKELONG(cbInsideName,CBN_SELCHANGE), 0); bSkipCbSel = true; } else { SetDlgItemText(hDlg, cbInsideName, L"ConEmu Inside"); SetDlgItemText(hDlg, tInsideConfig, L"shell"); SetDlgItemText(hDlg, tInsideShell, CONEMU_HERE_POSH); //SetDlgItemText(hDlg, tInsideIcon, szIcon); SetDlgItemText(hDlg, tInsideIcon, L"powershell.exe"); checkDlgButton(hDlg, cbInsideSyncDir, gpConEmu->mp_Inside && gpConEmu->mp_Inside->mb_InsideSynchronizeCurDir); SetDlgItemText(hDlg, tInsideSyncDir, L""); // Auto } if (pszCurHere) { bSkipCbSel = false; PageDlgProc(hDlg, WM_COMMAND, MAKELONG(cbHereName,CBN_SELCHANGE), 0); bSkipCbSel = true; } else { SetDlgItemText(hDlg, cbHereName, L"ConEmu Here"); SetDlgItemText(hDlg, tHereConfig, L""); SetDlgItemText(hDlg, tHereShell, CONEMU_HERE_CMD); SetDlgItemText(hDlg, tHereIcon, szIcon); } bSkipCbSel = false; SafeFree(pszCurInside); SafeFree(pszCurHere); } break; // WM_INITDIALOG case WM_COMMAND: switch (HIWORD(wParam)) { case BN_CLICKED: { WORD CB = LOWORD(wParam); switch (CB) { case cbInsideSyncDir: if (gpConEmu->mp_Inside) { gpConEmu->mp_Inside->mb_InsideSynchronizeCurDir = isChecked(hDlg, CB); } break; case bInsideRegister: case bInsideUnregister: ShellIntegration(hDlg, ShellIntgr_Inside, CB==bInsideRegister); PageDlgProc(hDlg, UM_RELOAD_HERE_LIST, UM_RELOAD_HERE_LIST, 0); if (CB==bInsideUnregister) PageDlgProc(hDlg, WM_COMMAND, MAKELONG(cbInsideName,CBN_SELCHANGE), 0); break; case bHereRegister: case bHereUnregister: ShellIntegration(hDlg, ShellIntgr_Here, CB==bHereRegister); PageDlgProc(hDlg, UM_RELOAD_HERE_LIST, UM_RELOAD_HERE_LIST, 0); if (CB==bHereUnregister) PageDlgProc(hDlg, WM_COMMAND, MAKELONG(cbHereName,CBN_SELCHANGE), 0); break; } } break; // BN_CLICKED case EN_CHANGE: { WORD EB = LOWORD(wParam); switch (EB) { case tInsideSyncDir: if (gpConEmu->mp_Inside) { SafeFree(gpConEmu->mp_Inside->ms_InsideSynchronizeCurDir); gpConEmu->mp_Inside->ms_InsideSynchronizeCurDir = GetDlgItemTextPtr(hDlg, tInsideSyncDir); } break; } } break; // EN_CHANGE case CBN_SELCHANGE: { WORD CB = LOWORD(wParam); switch (CB) { case cbInsideName: case cbHereName: if (!bSkipCbSel) { wchar_t *pszCfg = NULL, *pszIco = NULL, *pszFull = NULL, *pszDirSync = NULL; LPCWSTR pszCmd = NULL; INT_PTR iSel = SendDlgItemMessage(hDlg, CB, CB_GETCURSEL, 0,0); if (iSel >= 0) { INT_PTR iLen = SendDlgItemMessage(hDlg, CB, CB_GETLBTEXTLEN, iSel, 0); size_t cchMax = iLen+128; wchar_t* pszName = (wchar_t*)calloc(cchMax,sizeof(*pszName)); if ((iLen > 0) && pszName) { _wcscpy_c(pszName, cchMax, L"Directory\\shell\\"); SendDlgItemMessage(hDlg, CB, CB_GETLBTEXT, iSel, (LPARAM)(pszName+_tcslen(pszName))); HKEY hkShell = NULL; if (0 == RegOpenKeyEx(HKEY_CLASSES_ROOT, pszName, 0, KEY_READ, &hkShell)) { DWORD nType; DWORD nSize = MAX_PATH*2*sizeof(wchar_t); pszIco = (wchar_t*)calloc(nSize+2,1); if (0 != RegQueryValueEx(hkShell, L"Icon", NULL, &nType, (LPBYTE)pszIco, &nSize) || nType != REG_SZ) SafeFree(pszIco); HKEY hkCmd = NULL; if (0 == RegOpenKeyEx(hkShell, L"command", 0, KEY_READ, &hkCmd)) { DWORD nSize = MAX_PATH*8*sizeof(wchar_t); pszFull = (wchar_t*)calloc(nSize+2,1); if (0 != RegQueryValueEx(hkCmd, NULL, NULL, &nType, (LPBYTE)pszFull, &nSize) || nType != REG_SZ) { SafeFree(pszIco); } else { LPCWSTR psz = pszFull; LPCWSTR pszPrev = pszFull; CEStr szArg; while (0 == NextArg(&psz, szArg, &pszPrev)) { if (*szArg != L'/') continue; if ((lstrcmpi(szArg, L"/inside") == 0) || (lstrcmpi(szArg, L"/here") == 0) ) { // Nop } else if (lstrcmpni(szArg, L"/inside=", 8) == 0) { pszDirSync = lstrdup(szArg+8); // may be empty! } else if (lstrcmpi(szArg, L"/config") == 0) { if (0 != NextArg(&psz, szArg)) break; pszCfg = lstrdup(szArg); } else if (lstrcmpi(szArg, L"/dir") == 0) { if (0 != NextArg(&psz, szArg)) break; _ASSERTE(lstrcmpi(szArg, L"%1")==0); } else //if (lstrcmpi(szArg, L"/cmd") == 0) { if (lstrcmpi(szArg, L"/cmd") == 0) pszCmd = psz; else pszCmd = pszPrev; break; } } } RegCloseKey(hkCmd); } RegCloseKey(hkShell); } } SafeFree(pszName); } SetDlgItemText(hDlg, (CB==cbInsideName) ? tInsideConfig : tHereConfig, pszCfg ? pszCfg : L""); SetDlgItemText(hDlg, (CB==cbInsideName) ? tInsideShell : tHereShell, pszCmd ? pszCmd : L""); SetDlgItemText(hDlg, (CB==cbInsideName) ? tInsideIcon : tHereIcon, pszIco ? pszIco : L""); if (CB==cbInsideName) { SetDlgItemText(hDlg, tInsideSyncDir, pszDirSync ? pszDirSync : L""); checkDlgButton(hDlg, cbInsideSyncDir, (pszDirSync && *pszDirSync) ? BST_CHECKED : BST_UNCHECKED); } SafeFree(pszCfg); SafeFree(pszFull); SafeFree(pszIco); SafeFree(pszDirSync); } break; } } break; // CBN_SELCHANGE } // switch (HIWORD(wParam)) break; // WM_COMMAND case UM_RELOAD_HERE_LIST: if (wParam == UM_RELOAD_HERE_LIST) { HKEY hkDir = NULL; size_t cchCmdMax = 65535; wchar_t* pszCmd = (wchar_t*)calloc(cchCmdMax,sizeof(*pszCmd)); if (!pszCmd) break; // Возвращает NULL, если строка пустая wchar_t* pszCurInside = GetDlgItemTextPtr(hDlg, cbInsideName); _ASSERTE((pszCurInside==NULL) || (*pszCurInside!=0)); wchar_t* pszCurHere = GetDlgItemTextPtr(hDlg, cbHereName); _ASSERTE((pszCurHere==NULL) || (*pszCurHere!=0)); bool lbOldSkip = bSkipCbSel; bSkipCbSel = true; SendDlgItemMessage(hDlg, cbInsideName, CB_RESETCONTENT, 0, 0); SendDlgItemMessage(hDlg, cbHereName, CB_RESETCONTENT, 0, 0); if (0 == RegOpenKeyEx(HKEY_CLASSES_ROOT, L"Directory\\shell", 0, KEY_READ, &hkDir)) { for (DWORD i = 0; i < 512; i++) { wchar_t szName[MAX_PATH+32] = {}; DWORD cchMax = countof(szName) - 32; if (0 != RegEnumKeyEx(hkDir, i, szName, &cchMax, NULL, NULL, NULL, NULL)) break; wchar_t* pszSlash = szName + _tcslen(szName); wcscat_c(szName, L"\\command"); HKEY hkCmd = NULL; if (0 == RegOpenKeyEx(hkDir, szName, 0, KEY_READ, &hkCmd)) { DWORD cbMax = (cchCmdMax-2) * sizeof(*pszCmd); if (0 == RegQueryValueEx(hkCmd, NULL, NULL, NULL, (LPBYTE)pszCmd, &cbMax)) { pszCmd[cbMax>>1] = 0; *pszSlash = 0; LPCWSTR pszInside = StrStrI(pszCmd, L"/inside"); LPCWSTR pszConEmu = StrStrI(pszCmd, L"conemu"); if (pszConEmu) { SendDlgItemMessage(hDlg, pszInside ? cbInsideName : cbHereName, CB_ADDSTRING, 0, (LPARAM)szName); if ((pszInside ? pszCurInside : pszCurHere) == NULL) { if (pszInside) pszCurInside = lstrdup(szName); else pszCurHere = lstrdup(szName); } } } RegCloseKey(hkCmd); } } RegCloseKey(hkDir); }
INT_PTR CSetPgIntegr::PageDlgProc(HWND hDlg, UINT messg, WPARAM wParam, LPARAM lParam) { INT_PTR iRc = 0; switch (messg) { case WM_NOTIFY: { LPNMHDR phdr = (LPNMHDR)lParam; if (phdr->code == TTN_GETDISPINFO) { return gpSetCls->ProcessTipHelp(hDlg, messg, wParam, lParam); } break; } case WM_INITDIALOG: { _ASSERTE(FALSE && "Unexpected, CSetPgIntegr::OnInitDialog must be called instead!"); } break; // WM_INITDIALOG case WM_COMMAND: switch (HIWORD(wParam)) { case BN_CLICKED: { WORD CB = LOWORD(wParam); switch (CB) { case cbInsideSyncDir: if (gpConEmu->mp_Inside) { gpConEmu->mp_Inside->mb_InsideSynchronizeCurDir = isChecked2(hDlg, CB); } break; case bInsideRegister: case bInsideUnregister: ShellIntegration(hDlg, ShellIntgr_Inside, CB==bInsideRegister); ReloadHereList(); if (CB==bInsideUnregister) FillHereValues(cbInsideName); break; case bHereRegister: case bHereUnregister: ShellIntegration(hDlg, ShellIntgr_Here, CB==bHereRegister); ReloadHereList(); if (CB==bHereUnregister) FillHereValues(cbHereName); break; } } break; // BN_CLICKED case EN_CHANGE: { WORD EB = LOWORD(wParam); switch (EB) { case tInsideSyncDir: if (gpConEmu->mp_Inside) { SafeFree(gpConEmu->mp_Inside->ms_InsideSynchronizeCurDir); gpConEmu->mp_Inside->ms_InsideSynchronizeCurDir = GetDlgItemTextPtr(hDlg, tInsideSyncDir); } break; } } break; // EN_CHANGE case CBN_SELCHANGE: { WORD CB = LOWORD(wParam); switch (CB) { case cbInsideName: case cbHereName: if (!mb_SkipSelChange) { FillHereValues(CB); } break; } } break; // CBN_SELCHANGE } // switch (HIWORD(wParam)) break; // WM_COMMAND } return iRc; }