Revision: 10405 https://osdn.net/projects/ttssh2/scm/svn/commits/10405 Author: zmatsuo Date: 2022-12-11 21:08:27 +0900 (Sun, 11 Dec 2022) Log Message: ----------- ファイル選択ダイアログの初期ディレクトリをファイルのパスから設定するようにした - ttcommdlgからコモンダイアログを使用するよう修正 ticket #45554 Ticket Links: ------------ https://osdn.net/projects/ttssh2/tracker/detail/45554 Modified Paths: -------------- trunk/teraterm/teraterm/vtwin.cpp -------------- next part -------------- Modified: trunk/teraterm/teraterm/vtwin.cpp =================================================================== --- trunk/teraterm/teraterm/vtwin.cpp 2022-12-11 12:08:18 UTC (rev 10404) +++ trunk/teraterm/teraterm/vtwin.cpp 2022-12-11 12:08:27 UTC (rev 10405) @@ -109,6 +109,7 @@ #include "ttcmn_static.h" #include "ttcmn_notify2.h" #include "scp.h" +#include "ttcommdlg.h" #include <initguid.h> #if _MSC_VER < 1600 @@ -4506,184 +4507,34 @@ } } -/* GetSetupFname function id */ -typedef enum { - GSF_RESTORE, // Restore setup - GSF_LOADKEY, // Load key map -} GetSetupFnameFuncId; - -static BOOL _GetSetupFname(HWND HWin, GetSetupFnameFuncId FuncId, PTTSet ts) -{ - wchar_t *FNameFilter; - wchar_t *TempDir; - wchar_t *DirW = NULL; - wchar_t NameW[MAX_PATH]; - const wchar_t *UILanguageFileW = ts->UILanguageFileW; - - /* save current dir */ - hGetCurrentDirectoryW(&TempDir); - - /* File name filter */ - if (FuncId==GSF_LOADKEY) { - FNameFilter = _get_lang_msg("FILEDLG_KEYBOARD_FILTER", L"keyboard setup files (*.cnf)\\0*.cnf\\0\\0", UILanguageFileW); - } - else { - FNameFilter = _get_lang_msg("FILEDLG_SETUP_FILTER", L"setup files (*.ini)\\0*.ini\\0\\0", UILanguageFileW); - } - - if (FuncId==GSF_LOADKEY) { - size_t i, j; - wchar_t *KeyCnfFNW = ts->KeyCnfFNW; - GetFileNamePosW(KeyCnfFNW,&i,&j); - wcsncpy_s(NameW, _countof(NameW),&KeyCnfFNW[j], _TRUNCATE); - DirW = ExtractDirNameW(KeyCnfFNW); - - if ((wcslen(NameW) == 0) || (_wcsicmp(NameW, L"KEYBOARD.CNF") == 0)) { - wcsncpy_s(NameW, _countof(NameW),L"KEYBOARD.CNF", _TRUNCATE); - } - } - else { - size_t i, j; - wchar_t *SetupFNameW = ts->SetupFNameW; - GetFileNamePosW(SetupFNameW,&i,&j); - wcsncpy_s(NameW, _countof(NameW),&SetupFNameW[j], _TRUNCATE); - DirW = ExtractDirNameW(SetupFNameW); - - if ((wcslen(NameW) == 0) || (_wcsicmp(NameW, L"TERATERM.INI") == 0)) { - wcsncpy_s(NameW, _countof(NameW), L"TERATERM.INI", _TRUNCATE); - } - } - - if (DirW == NULL) { - DirW = _wcsdup(ts->HomeDirW); - } - - SetCurrentDirectoryW(DirW); - - /* OPENFILENAME record */ - OPENFILENAMEW ofn = {}; - ofn.lStructSize = get_OPENFILENAME_SIZEW(); - ofn.hwndOwner = HWin; - ofn.lpstrFile = NameW; - ofn.nMaxFile = _countof(NameW); - ofn.lpstrFilter = FNameFilter; - ofn.nFilterIndex = 1; - ofn.hInstance = hInst; - - BOOL Ok; - switch (FuncId) { - case GSF_RESTORE: - ofn.lpstrDefExt = L"ini"; - ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_SHOWHELP; - ofn.lpstrTitle = _get_lang_msg("FILEDLG_RESTORE_SETUP_TITLE", L"Tera Term: Restore setup", UILanguageFileW); - Ok = GetOpenFileNameW(&ofn); - if (Ok) { - free(ts->SetupFNameW); - ts->SetupFNameW = _wcsdup(NameW); - char *Name = ToCharW(NameW); - strncpy_s(ts->SetupFName, sizeof(ts->SetupFName), Name, _TRUNCATE); - free(Name); - } - break; - case GSF_LOADKEY: - ofn.lpstrDefExt = L"cnf"; - ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_SHOWHELP; - ofn.lpstrTitle = _get_lang_msg("FILEDLG_LOAD_KEYMAP_TITLE", L"Tera Term: Load key map", UILanguageFileW); - Ok = GetOpenFileNameW(&ofn); - if (Ok) { - free(ts->KeyCnfFNW); - ts->KeyCnfFNW = _wcsdup(NameW); - char *Name = ToCharW(NameW); - strncpy_s(ts->KeyCnfFN, sizeof(ts->KeyCnfFN), Name, _TRUNCATE); - free(Name); - } - break; - default: - assert(FALSE); - Ok = FALSE; - break; - } - -#if defined(_DEBUG) - if (!Ok) { - DWORD Err = GetLastError(); - DWORD DlgErr = CommDlgExtendedError(); - assert(Err == 0 && DlgErr == 0); - } -#endif - - free(FNameFilter); - free((void *)ofn.lpstrTitle); - - /* restore dir */ - SetCurrentDirectoryW(TempDir); - free(TempDir); - free(DirW); - - return Ok; -} - void CVTWindow::OnSetupSave() { PTTSet pts = &ts; const wchar_t *UILanguageFileW = pts->UILanguageFileW; - // save current dir - // GetSaveFileNameW() \x82\xAA\x83J\x83\x8C\x83\x93\x83g\x83t\x83H\x83\x8B\x83_\x82\xF0\x95ύX\x82\xB5\x82Ă\xB5\x82܂\xA4\x82\xBD\x82\xDF - wchar_t *cur_dir; - hGetCurrentDirectoryW(&cur_dir); - wchar_t *filter = _get_lang_msg("FILEDLG_SETUP_FILTER", L"setup files (*.ini)\\0*.ini\\0\\0", UILanguageFileW); wchar_t *title = _get_lang_msg("FILEDLG_SAVE_SETUP_TITLE", L"Tera Term: Save setup", UILanguageFileW); - // ini\x83t\x83@\x83C\x83\x8B\x82̂\xA0\x82\xE9\x83t\x83H\x83\x8B\x83_ - wchar_t *DirW = ExtractDirNameW(pts->SetupFNameW); - - // \x83J\x83\x8C\x83\x93\x83g\x82\xF0ini\x83t\x83@\x83C\x83\x8B\x82̂\xA0\x82\xE9\x83t\x83H\x83\x8B\x83_\x82ɂ\xB5\x82Ă\xA8\x82\xAD - // \x83_\x83C\x83A\x83\x8D\x83O\x82\xAA\x8AJ\x82\xAD\x82Ƃ\xAB\x82ɁA - // \x83J\x83\x8C\x83\x93\x83g\x82\xF0\x83I\x81[\x83v\x83\x93\x82\xB7\x82邽\x82\xDF(7\x88ȑO?) - SetCurrentDirectoryW(DirW); - - // \x83t\x83@\x83C\x83\x8B\x96\xBC\x82\xF0\x83t\x83\x8B\x83p\x83X\x82ŏ\x89\x8A\x{227B0B5}\x82Ă\xA8\x82\xAD - // \x83_\x83C\x83A\x83\x8D\x83O\x82\xAA\x8AJ\x82\xAD\x82Ƃ\xAB\x82ɁA - // \x83t\x83@\x83C\x83\x8B\x82̃p\x83X\x82\xF0\x83I\x81[\x83v\x83\x93\x82\xB7\x82邽\x82\xDF(7\x88ȍ~?) - wchar_t NameW[MAX_PATH]; - wcsncpy_s(NameW, _countof(NameW), pts->SetupFNameW, _TRUNCATE); - /* OPENFILENAME record */ - OPENFILENAMEW ofn = {}; - ofn.lStructSize = get_OPENFILENAME_SIZEW(); + TTOPENFILENAMEW ofn = {}; ofn.hwndOwner = m_hWnd; - ofn.lpstrFile = NameW; - ofn.nMaxFile = _countof(NameW); + ofn.lpstrFile = pts->SetupFNameW; ofn.lpstrFilter = filter; ofn.nFilterIndex = 1; ofn.hInstance = hInst; ofn.lpstrDefExt = L"ini"; ofn.Flags = OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY | OFN_SHOWHELP; - ofn.lpstrInitialDir = DirW; // \x8F\x89\x82߂ĊJ\x82\xAD\x82Ƃ\xAB\x82Ɏg\x97p\x82\xB3\x82\xEA\x82\xE9,2\x89\xF1\x96ڈȍ~\x82͍Ō\xE3\x82ɗ\x98\x97p\x82\xB5\x82\xBD\x83t\x83H\x83\x8B\x83_\x82ɂȂ\xE9(7\x88ȍ~?) ofn.lpstrTitle = title; HelpId = HlpSetupSave; - BOOL Ok = GetSaveFileNameW(&ofn); -#if defined(_DEBUG) - if (!Ok) { - DWORD Err = GetLastError(); - DWORD DlgErr = CommDlgExtendedError(); - assert(Err == 0 && DlgErr == 0); - } -#endif + wchar_t *NameW; + BOOL Ok = TTGetSaveFileNameW(&ofn, &NameW); free(filter); free(title); - free(DirW); - /* restore dir */ - SetCurrentDirectoryW(cur_dir); - free(cur_dir); - if (! Ok) { // \x83L\x83\x83\x83\x93\x83Z\x83\x8B return; @@ -4693,9 +4544,7 @@ wchar_t *PrevSetupFNW = _wcsdup(ts.SetupFNameW); // \x91O\x82̃t\x83@\x83C\x83\x8B\x82\xF0\x8Ao\x82\xA6\x82Ă\xA8\x82\xAD free(pts->SetupFNameW); pts->SetupFNameW = _wcsdup(NameW); - char *Name = ToCharW(NameW); - strncpy_s(pts->SetupFName, sizeof(pts->SetupFName), Name, _TRUNCATE); - free(Name); + WideCharToACP_t(pts->SetupFNameW, pts->SetupFName, sizeof(pts->SetupFName)); // \x8F\x91\x82\xAB\x8D\x9E\x82݂ł\xAB\x82邩? const DWORD attr = GetFileAttributesW(ts.SetupFNameW); @@ -4770,9 +4619,31 @@ void CVTWindow::OnSetupRestore() { + const wchar_t *UILanguageFileW = ts.UILanguageFileW; + wchar_t *FNameFilter = _get_lang_msg("FILEDLG_SETUP_FILTER", L"setup files (*.ini)\\0*.ini\\0\\0", UILanguageFileW); + + TTOPENFILENAMEW ofn = {}; + ofn.hwndOwner = m_hWnd; + ofn.lpstrFile = ts.SetupFNameW; + ofn.lpstrFilter = FNameFilter; + ofn.nFilterIndex = 1; + ofn.hInstance = hInst; + ofn.lpstrDefExt = L"ini"; + ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_SHOWHELP; + ofn.lpstrTitle = _get_lang_msg("FILEDLG_RESTORE_SETUP_TITLE", L"Tera Term: Restore setup", UILanguageFileW); + HelpId = HlpSetupRestore; - BOOL Ok = _GetSetupFname(HVTWin, GSF_RESTORE, &ts); + wchar_t *filename; + BOOL Ok = TTGetOpenFileNameW(&ofn, &filename); + + free(FNameFilter); + free((void *)ofn.lpstrTitle); + if (Ok) { + free(ts.SetupFNameW); + ts.SetupFNameW = filename; + WideCharToACP_t(ts.SetupFNameW, ts.SetupFName, sizeof(ts.SetupFName)); + RestoreSetup(); } } @@ -4790,14 +4661,35 @@ void CVTWindow::OnSetupLoadKeyMap() { + const wchar_t *UILanguageFileW = ts.UILanguageFileW; + wchar_t *FNameFilter = + _get_lang_msg("FILEDLG_KEYBOARD_FILTER", L"keyboard setup files (*.cnf)\\0*.cnf\\0\\0", UILanguageFileW); + + TTOPENFILENAMEW ofn = {}; + ofn.hwndOwner = m_hWnd; + ofn.lpstrFile = ts.KeyCnfFNW; + ofn.lpstrFilter = FNameFilter; + ofn.nFilterIndex = 1; + ofn.hInstance = hInst; + ofn.lpstrDefExt = L"cnf"; + ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_SHOWHELP; + ofn.lpstrTitle = _get_lang_msg("FILEDLG_LOAD_KEYMAP_TITLE", L"Tera Term: Load key map", UILanguageFileW); + HelpId = HlpSetupLoadKeyMap; - BOOL Ok = _GetSetupFname(HVTWin,GSF_LOADKEY,&ts); - if (! Ok) { - return; + wchar_t *NameW; + BOOL Ok = TTGetOpenFileNameW(&ofn, &NameW); + + free(FNameFilter); + free((void *)ofn.lpstrTitle); + + if (Ok) { + free(ts.KeyCnfFNW); + ts.KeyCnfFNW = NameW; + WideCharToACP_t(ts.KeyCnfFNW, ts.KeyCnfFN, _countof(ts.KeyCnfFN)); + + // load key map + SetKeyMap(); } - - // load key map - SetKeyMap(); } void CVTWindow::OnControlResetTerminal()