[ttssh2-commit] [10405] ファイル選択ダイアログの初期ディレクトリをファイルのパスから設定するようにした

Back to archive index
scmno****@osdn***** scmno****@osdn*****
2022年 12月 11日 (日) 21:08:27 JST


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()


ttssh2-commit メーリングリストの案内
Back to archive index