[Ttssh2-commit] [9053] ttpfile.dll のダイアログを使用しないようにした

Back to archive index
scmno****@osdn***** scmno****@osdn*****
2020年 12月 20日 (日) 21:06:16 JST


Revision: 9053
          https://osdn.net/projects/ttssh2/scm/svn/commits/9053
Author:   zmatsuo
Date:     2020-12-20 21:06:16 +0900 (Sun, 20 Dec 2020)
Log Message:
-----------
ttpfile.dll のダイアログを使用しないようにした

- filesys.cpp, filesys_proto.cpp, vtwin.cpp へ移動
  - GetSetupFname()
  - GetTransFname()
  - GetMultiFname()
  - GetGetFname()
  - SetFileVar()
  - GetXFname()

Modified Paths:
--------------
    trunk/teraterm/teraterm/filesys.cpp
    trunk/teraterm/teraterm/filesys.h
    trunk/teraterm/teraterm/filesys_log.rc
    trunk/teraterm/teraterm/filesys_log_res.h
    trunk/teraterm/teraterm/filesys_proto.cpp
    trunk/teraterm/teraterm/vtwin.cpp

-------------- next part --------------
Modified: trunk/teraterm/teraterm/filesys.cpp
===================================================================
--- trunk/teraterm/teraterm/filesys.cpp	2020-12-20 12:06:06 UTC (rev 9052)
+++ trunk/teraterm/teraterm/filesys.cpp	2020-12-20 12:06:16 UTC (rev 9053)
@@ -90,6 +90,7 @@
 static HMODULE HTTFILE = NULL;
 static int TTFILECount = 0;
 
+#if 0
 PGetSetupFname GetSetupFname;
 PGetTransFname GetTransFname;
 PGetMultiFname GetMultiFname;
@@ -96,6 +97,7 @@
 PGetGetFname GetGetFname;
 PSetFileVar SetFileVar;
 PGetXFname GetXFname;
+#endif
 PProtoInit ProtoInit;
 PProtoParse ProtoParse;
 PProtoTimeOutProc ProtoTimeOutProc;
@@ -103,6 +105,7 @@
 PTTFILESetUILanguageFile TTFILESetUILanguageFile;
 PTTFILESetFileSendFilter TTFILESetFileSendFilter;
 
+#if 0
 #define IdGetSetupFname  1
 #define IdGetTransFname  2
 #define IdGetMultiFname  3
@@ -109,6 +112,7 @@
 #define IdGetGetFname	 4
 #define IdSetFileVar	 5
 #define IdGetXFname	 6
+#endif
 
 #define IdProtoInit	 7
 #define IdProtoParse	 8
@@ -136,6 +140,7 @@
 
 	Err = FALSE;
 
+#if 0
 	GetSetupFname = (PGetSetupFname)GetProcAddress(HTTFILE,
 	                                               MAKEINTRESOURCE(IdGetSetupFname));
 	if (GetSetupFname==NULL)
@@ -165,6 +170,7 @@
 	                                       MAKEINTRESOURCE(IdGetXFname));
 	if (GetXFname==NULL)
 		Err = TRUE;
+#endif
 
 	ProtoInit = (PProtoInit)GetProcAddress(HTTFILE,
 	                                       MAKEINTRESOURCE(IdProtoInit));
@@ -305,6 +311,248 @@
 	}
 }
 
+/* \x83_\x83C\x83A\x83\x8D\x83O\x82𒆉\x9B\x82Ɉړ\xAE\x82\xB7\x82\xE9 */
+static void CenterCommonDialog(HWND hDlg)
+{
+	/* hDlg\x82̐e\x82\xAA\x83_\x83C\x83A\x83\x8D\x83O\x82̃E\x83B\x83\x93\x83h\x83E\x83n\x83\x93\x83h\x83\x8B */
+	HWND hWndDlgRoot = GetParent(hDlg);
+	CenterWindow(hWndDlgRoot, GetParent(hWndDlgRoot));
+}
+
+static HFONT DlgFoptFont;
+static UINT_PTR CALLBACK TransFnHook(HWND Dialog, UINT Message, WPARAM wParam, LPARAM lParam)
+{
+	static const DlgTextInfo text_info[] = {
+		{ IDC_FOPT, "DLG_FOPT" },
+		{ IDC_FOPTBIN, "DLG_FOPT_BINARY" },
+	};
+	LPOPENFILENAME ofn;
+	LPWORD pw;
+	LPOFNOTIFY notify;
+	LOGFONT logfont;
+	HFONT font;
+	const char *UILanguageFile = ts.UILanguageFile;
+
+	switch (Message) {
+	case WM_INITDIALOG:
+		ofn = (LPOPENFILENAME)lParam;
+		pw = (LPWORD)ofn->lCustData;
+		SetWindowLongPtr(Dialog, DWLP_USER, (LONG_PTR)pw);
+
+		font = (HFONT)SendMessage(Dialog, WM_GETFONT, 0, 0);
+		GetObject(font, sizeof(LOGFONT), &logfont);
+		if (get_lang_font("DLG_TAHOMA_FONT", Dialog, &logfont, &DlgFoptFont, UILanguageFile)) {
+			SendDlgItemMessage(Dialog, IDC_FOPT, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
+			SendDlgItemMessage(Dialog, IDC_FOPTBIN, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
+			SendDlgItemMessage(Dialog, IDC_FOPTAPPEND, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
+			SendDlgItemMessage(Dialog, IDC_PLAINTEXT, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
+			SendDlgItemMessage(Dialog, IDC_TIMESTAMP, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
+		}
+		else {
+			DlgFoptFont = NULL;
+		}
+
+		SetI18nDlgStrs("Tera Term", Dialog, text_info, _countof(text_info), UILanguageFile);
+
+		SetRB(Dialog,*pw & 1,IDC_FOPTBIN,IDC_FOPTBIN);
+
+		CenterCommonDialog(Dialog);
+
+		return TRUE;
+	case WM_COMMAND: // for old style dialog
+		switch (LOWORD(wParam)) {
+		case IDOK:
+			pw = (LPWORD)GetWindowLongPtr(Dialog,DWLP_USER);
+			if (pw!=NULL)
+				GetRB(Dialog,pw,IDC_FOPTBIN,IDC_FOPTBIN);
+			if (DlgFoptFont != NULL) {
+				DeleteObject(DlgFoptFont);
+			}
+			break;
+		case IDCANCEL:
+			if (DlgFoptFont != NULL) {
+				DeleteObject(DlgFoptFont);
+			}
+			break;
+		}
+		break;
+	case WM_NOTIFY: // for Explorer-style dialog
+		notify = (LPOFNOTIFY)lParam;
+		switch (notify->hdr.code) {
+		case CDN_FILEOK:
+			pw = (LPWORD)GetWindowLongPtr(Dialog,DWLP_USER);
+			if (pw!=NULL)
+				GetRB(Dialog,pw,IDC_FOPTBIN,IDC_FOPTBIN);
+			if (DlgFoptFont != NULL) {
+				DeleteObject(DlgFoptFont);
+			}
+			break;
+		}
+		break;
+	}
+	return FALSE;
+}
+
+static BOOL _GetTransFname(PFileVar fv, PCHAR CurDir, WORD FuncId, LPLONG Option)
+{
+	char uimsg[MAX_UIMSG];
+	char *FNFilter;
+	OPENFILENAME ofn;
+	WORD optw;
+	wchar_t TempDir[MAXPATHLEN];
+	BOOL Ok;
+	char FileName[MAX_PATH];
+	const char *UILanguageFile = ts.UILanguageFile;
+
+	/* save current dir */
+	_GetCurrentDirectoryW(_countof(TempDir), TempDir);
+
+	memset(&ofn, 0, sizeof(OPENFILENAME));
+
+	strncpy_s(fv->DlgCaption, sizeof(fv->DlgCaption),"Tera Term: ", _TRUNCATE);
+	switch (FuncId) {
+	case GTF_SEND:
+		get_lang_msg("FILEDLG_TRANS_TITLE_SENDFILE", uimsg, sizeof(uimsg), TitSendFile, UILanguageFile);
+		strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+		break;
+	case GTF_BP:
+		get_lang_msg("FILEDLG_TRANS_TITLE_BPSEND", uimsg, sizeof(uimsg), TitBPSend, UILanguageFile);
+		strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+		break;
+	default:
+		return FALSE;
+	}
+
+	FNFilter = GetCommonDialogFilterA(ts.FileSendFilter, UILanguageFile);
+
+	ExtractFileName(fv->FullName, FileName ,sizeof(FileName));
+	strncpy_s(fv->FullName, sizeof(fv->FullName), FileName, _TRUNCATE);
+	ofn.lStructSize = get_OPENFILENAME_SIZE();
+	ofn.hwndOwner   = fv->HMainWin;
+	ofn.lpstrFilter = FNFilter;
+	ofn.nFilterIndex = 1;
+	ofn.lpstrFile = fv->FullName;
+	ofn.nMaxFile = sizeof(fv->FullName);
+	ofn.lpstrInitialDir = CurDir;
+
+	switch (FuncId) {
+	case GTF_SEND:
+		ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
+		ofn.Flags |= OFN_ENABLETEMPLATE | OFN_ENABLEHOOK | OFN_EXPLORER | OFN_ENABLESIZING;
+		ofn.lpTemplateName = MAKEINTRESOURCE(IDD_FOPT);
+
+		ofn.lpfnHook = (LPOFNHOOKPROC)(&TransFnHook);
+		optw = (WORD)*Option;
+		ofn.lCustData = (LPARAM)&optw;
+		break;
+	case GTF_BP:
+		ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
+		break;
+	}
+
+	ofn.Flags |= OFN_SHOWHELP;
+
+	ofn.lpstrTitle = fv->DlgCaption;
+
+	ofn.hInstance = hInst;
+
+	Ok = GetOpenFileName(&ofn);
+	free(FNFilter);
+
+	if (Ok) {
+		*Option = (long)optw;
+
+		fv->DirLen = ofn.nFileOffset;
+
+		if (CurDir!=NULL) {
+			memcpy(CurDir,fv->FullName,fv->DirLen-1);
+			CurDir[fv->DirLen-1] = 0;
+		}
+	}
+	/* restore dir */
+	_SetCurrentDirectoryW(TempDir);
+	return Ok;
+}
+
+static void _SetFileVar(PFileVar fv)
+{
+	int i;
+	char uimsg[MAX_UIMSG];
+	char c;
+	const char *UILanguageFile = ts.UILanguageFile;
+
+	GetFileNamePos(fv->FullName,&(fv->DirLen),&i);
+	c = fv->FullName[fv->DirLen];
+	if (c=='\\'||c=='/') fv->DirLen++;
+	strncpy_s(fv->DlgCaption, sizeof(fv->DlgCaption),"Tera Term: ", _TRUNCATE);
+	switch (fv->OpId) {
+	case OpLog:
+		get_lang_msg("FILEDLG_TRANS_TITLE_LOG", uimsg, sizeof(uimsg), TitLog, UILanguageFile);
+		strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+		break;
+	case OpSendFile:
+		get_lang_msg("FILEDLG_TRANS_TITLE_SENDFILE", uimsg, sizeof(uimsg), TitSendFile, UILanguageFile);
+		strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+		break;
+	case OpKmtRcv:
+		get_lang_msg("FILEDLG_TRANS_TITLE_KMTRCV", uimsg, sizeof(uimsg), TitKmtRcv, UILanguageFile);
+		strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+		break;
+	case OpKmtGet:
+		get_lang_msg("FILEDLG_TRANS_TITLE_KMTGET", uimsg, sizeof(uimsg), TitKmtGet, UILanguageFile);
+		strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+		break;
+	case OpKmtSend:
+		get_lang_msg("FILEDLG_TRANS_TITLE_KMTSEND", uimsg, sizeof(uimsg), TitKmtSend, UILanguageFile);
+		strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+		break;
+	case OpKmtFin:
+		get_lang_msg("FILEDLG_TRANS_TITLE_KMTFIN", uimsg, sizeof(uimsg), TitKmtFin, UILanguageFile);
+		strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+		break;
+	case OpXRcv:
+		get_lang_msg("FILEDLG_TRANS_TITLE_XRCV", uimsg, sizeof(uimsg), TitXRcv, UILanguageFile);
+		strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+		break;
+	case OpXSend:
+		get_lang_msg("FILEDLG_TRANS_TITLE_XSEND", uimsg, sizeof(uimsg), TitXSend, UILanguageFile);
+		strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+		break;
+	case OpYRcv:
+		get_lang_msg("FILEDLG_TRANS_TITLE_YRCV", uimsg, sizeof(uimsg), TitYRcv, UILanguageFile);
+		strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+		break;
+	case OpYSend:
+		get_lang_msg("FILEDLG_TRANS_TITLE_YSEND", uimsg, sizeof(uimsg), TitYSend, UILanguageFile);
+		strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+		break;
+	case OpZRcv:
+		get_lang_msg("FILEDLG_TRANS_TITLE_ZRCV", uimsg, sizeof(uimsg), TitZRcv, UILanguageFile);
+		strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+		break;
+	case OpZSend:
+		get_lang_msg("FILEDLG_TRANS_TITLE_ZSEND", uimsg, sizeof(uimsg), TitZSend, UILanguageFile);
+		strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+		break;
+	case OpBPRcv:
+		get_lang_msg("FILEDLG_TRANS_TITLE_BPRCV", uimsg, sizeof(uimsg), TitBPRcv, UILanguageFile);
+		strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+		break;
+	case OpBPSend:
+		get_lang_msg("FILEDLG_TRANS_TITLE_BPSEND", uimsg, sizeof(uimsg), TitBPSend, UILanguageFile);
+		strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+		break;
+	case OpQVRcv:
+		get_lang_msg("FILEDLG_TRANS_TITLE_QVRCV", uimsg, sizeof(uimsg), TitQVRcv, UILanguageFile);
+		strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+		break;
+	case OpQVSend:
+		get_lang_msg("FILEDLG_TRANS_TITLE_QVSEND", uimsg, sizeof(uimsg), TitQVSend, UILanguageFile);
+		strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+		break;
+	}
+}
+
 void FileSendStart(void)
 {
 	LONG Option = 0;
@@ -333,7 +581,7 @@
 		if (ts.TransBin)
 			Option |= LOGDLG_BINARY;
 		SendVar->FullName[0] = 0;
-		if (! (*GetTransFname)(SendVar, FileDirExpanded, GTF_SEND, &Option)) {
+		if (! _GetTransFname(SendVar, FileDirExpanded, GTF_SEND, &Option)) {
 			FileTransEnd(OpSendFile);
 			return;
 		}
@@ -340,7 +588,7 @@
 		ts.TransBin = CheckFlag(Option, LOGDLG_BINARY);
 	}
 	else
-		(*SetFileVar)(SendVar);
+		_SetFileVar(SendVar);
 
 	SendVar->FileHandle = CreateFile(SendVar->FullName, GENERIC_READ, FILE_SHARE_READ, NULL,
 	                                 OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);

Modified: trunk/teraterm/teraterm/filesys.h
===================================================================
--- trunk/teraterm/teraterm/filesys.h	2020-12-20 12:06:06 UTC (rev 9052)
+++ trunk/teraterm/teraterm/filesys.h	2020-12-20 12:06:16 UTC (rev 9053)
@@ -33,6 +33,8 @@
 #ifdef __cplusplus
 extern "C" {
 #endif
+
+#if 0
 typedef BOOL (PASCAL *PGetSetupFname)
   (HWND HWin, WORD FuncId, PTTSet ts);
 typedef BOOL (PASCAL *PGetTransFname)
@@ -44,6 +46,7 @@
 typedef void (PASCAL *PSetFileVar) (PFileVar fv);
 typedef BOOL (PASCAL *PGetXFname)
   (HWND HWin, BOOL Receive, LPLONG Option, PFileVar fv, PCHAR CurDir);
+#endif
 typedef void (PASCAL *PProtoInit)
   (int Proto, PFileVar fv, PCHAR pv, PComVar cv, PTTSet ts);
 typedef BOOL (PASCAL *PProtoParse)
@@ -57,6 +60,7 @@
 typedef BOOL (PASCAL *PTTFILESetFileSendFilter)
   (char *file);
 
+#if 0
 extern PGetSetupFname GetSetupFname;
 extern PGetTransFname GetTransFname;
 extern PGetMultiFname GetMultiFname;
@@ -63,12 +67,15 @@
 extern PGetGetFname GetGetFname;
 extern PSetFileVar SetFileVar;
 extern PGetXFname GetXFname;
+#endif
 extern PProtoInit ProtoInit;
 extern PProtoParse ProtoParse;
 extern PProtoTimeOutProc ProtoTimeOutProc;
 extern PProtoCancel ProtoCancel;
+#if 0
 extern PTTFILESetUILanguageFile TTFILESetUILanguageFile;
 extern PTTFILESetFileSendFilter TTFILESetFileSendFilter;
+#endif
 
 BOOL LoadTTFILE(void);
 BOOL FreeTTFILE(void);

Modified: trunk/teraterm/teraterm/filesys_log.rc
===================================================================
--- trunk/teraterm/teraterm/filesys_log.rc	2020-12-20 12:06:06 UTC (rev 9052)
+++ trunk/teraterm/teraterm/filesys_log.rc	2020-12-20 12:06:16 UTC (rev 9053)
@@ -93,7 +93,44 @@
     EDITTEXT        IDC_EDIT_COMMENT,6,3,189,12,ES_AUTOHSCROLL
 END
 
+IDD_FOPT DIALOGEX 0, 0, 300, 67
+STYLE DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS
+FONT 8, "Tahoma", 0, 0, 0x0
+BEGIN
+    GROUPBOX        "Option",IDC_FOPT,5,2,290,59
+    CONTROL         "Bina&ry",IDC_FOPTBIN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,10,60,16
+    CONTROL         "&Append",IDC_FOPTAPPEND,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,100,10,60,16
+    CONTROL         "&Plain text",IDC_PLAINTEXT,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,179,10,80,16
+    CONTROL         "Hide &dialog",IDC_HIDEDIALOG,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,10,24,88,16
+    CONTROL         "In&clude screen buffer",IDC_ALLBUFF_INFIRST,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,100,24,96,16
+    CONTROL         "&Timestamp",IDC_TIMESTAMP,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,10,38,80,16
+    COMBOBOX        IDC_TIMESTAMPTYPE,90,40,120,60,CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | NOT WS_VISIBLE | WS_VSCROLL | WS_TABSTOP
+END
 
+IDD_XOPT DIALOGEX 0, 0, 300, 30
+STYLE DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS
+FONT 8, "Tahoma", 0, 0, 0x0
+BEGIN
+    GROUPBOX        "Option",IDC_XOPT,5,2,290,25
+    CONTROL         "Check&sum",IDC_XOPTCHECK,"Button",BS_AUTORADIOBUTTON | NOT WS_VISIBLE | WS_GROUP,10,10,70,16
+    CONTROL         "&CRC",IDC_XOPTCRC,"Button",BS_AUTORADIOBUTTON | NOT WS_VISIBLE,80,10,50,16
+    CONTROL         "1&K",IDC_XOPT1K,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,10,10,50,16
+    CONTROL         "Bina&ry",IDC_XOPTBIN,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,130,10,60,16
+END
+
+IDD_GETFNDLG DIALOGEX 20, 20, 150, 59
+STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Tera Term: Kermit Get"
+FONT 10, "System", 0, 0, 0x0
+BEGIN
+    RTEXT           "&Filename:",IDC_FILENAME,12,13,47,10
+    EDITTEXT        IDC_GETFN,62,11,72,12,ES_AUTOHSCROLL
+    DEFPUSHBUTTON   "OK",IDOK,12,36,34,14
+    PUSHBUTTON      "Cancel",IDCANCEL,54,36,40,14
+    PUSHBUTTON      "&Help",IDC_GETFNHELP,101,36,34,14
+END
+
+
 /////////////////////////////////////////////////////////////////////////////
 //
 // DESIGNINFO

Modified: trunk/teraterm/teraterm/filesys_log_res.h
===================================================================
--- trunk/teraterm/teraterm/filesys_log_res.h	2020-12-20 12:06:06 UTC (rev 9052)
+++ trunk/teraterm/teraterm/filesys_log_res.h	2020-12-20 12:06:16 UTC (rev 9053)
@@ -2,12 +2,11 @@
 // Microsoft Visual C++ \x82Ő\xB6\x90\xAC\x82\xB3\x82ꂽ\x83C\x83\x93\x83N\x83\x8B\x81[\x83h \x83t\x83@\x83C\x83\x8B\x81B
 // filesys_log.rc \x82Ŏg\x97p
 //
-// IDD_COMMENT_DIALOG \x82\xC6 IDD_LOGDLG \x82\xCD
-// common/tt_res.h \x82Ɠ\xAF\x82\xB6\x92l\x82ɂ\xB7\x82邱\x82\xC6
-//
 #define IDD_COMMENT_DIALOG              110
 #define IDD_LOGDLG                      115
+#define IDD_FOPT                        130
 #define IDC_EDIT_COMMENT                1000
+#define IDC_FOPTAPPEND                  1002
 #define IDC_PLAINTEXT                   1003
 #define IDC_TIMESTAMP                   1004
 #define IDC_HIDEDIALOG                  1005
@@ -14,6 +13,14 @@
 #define IDC_ALLBUFF_INFIRST             1006
 #define IDC_TIMESTAMPTYPE               1007
 #define IDC_BOM                         1008
+#define IDC_XOPTCHECK                   1101
+#define IDC_XOPTCRC                     1102
+#define IDC_XOPT1K                      1103
+#define IDC_XOPTBIN                     1104
+#define IDD_XOPT                        1105
+#define IDD_GETFNDLG                    2000
+#define IDC_GETFN                       2001
+#define IDC_GETFNHELP                   2099
 #define IDC_FOPT_FILENAME_BUTTON        2596
 #define IDC_SENDFILE_FILENAME_TITLE     2598
 #define IDC_FOPT_FILENAME_EDIT          2599
@@ -22,9 +29,13 @@
 #define IDC_FOPTTEXT                    2609
 #define IDC_NEW_OVERWRITE               2612
 #define IDC_APPEND                      2613
+#define IDC_FOPT_BINARY                 2614
+#define IDC_FOPT                        65535
+#define IDC_XOPT                        65535
+#define IDC_FILENAME                    65535
 
 // Next default values for new objects
-//
+// 
 #ifdef APSTUDIO_INVOKED
 #ifndef APSTUDIO_READONLY_SYMBOLS
 #define _APS_NO_MFC                     1

Modified: trunk/teraterm/teraterm/filesys_proto.cpp
===================================================================
--- trunk/teraterm/teraterm/filesys_proto.cpp	2020-12-20 12:06:06 UTC (rev 9052)
+++ trunk/teraterm/teraterm/filesys_proto.cpp	2020-12-20 12:06:16 UTC (rev 9053)
@@ -772,6 +772,225 @@
 	FreeFileVar_(&FileVar);
 }
 
+/* \x83_\x83C\x83A\x83\x8D\x83O\x82𒆉\x9B\x82Ɉړ\xAE\x82\xB7\x82\xE9 */
+static void CenterCommonDialog(HWND hDlg)
+{
+	/* hDlg\x82̐e\x82\xAA\x83_\x83C\x83A\x83\x8D\x83O\x82̃E\x83B\x83\x93\x83h\x83E\x83n\x83\x93\x83h\x83\x8B */
+	HWND hWndDlgRoot = GetParent(hDlg);
+	CenterWindow(hWndDlgRoot, GetParent(hWndDlgRoot));
+}
+
+//static char FileSendFilter[128];
+static HFONT DlgXoptFont;
+
+/* Hook function for XMODEM file name dialog box */
+static UINT_PTR CALLBACK XFnHook(HWND Dialog, UINT Message, WPARAM wParam, LPARAM lParam)
+{
+	static const DlgTextInfo text_info[] = {
+		{ IDC_XOPT, "DLG_XOPT" },
+		{ IDC_XOPTCHECK, "DLG_XOPT_CHECKSUM" },
+		{ IDC_XOPTCRC, "DLG_XOPT_CRC" },
+		{ IDC_XOPT1K, "DLG_XOPT_1K" },
+		{ IDC_XOPTBIN, "DLG_XOPT_BINARY" },
+	};
+	LPOPENFILENAME ofn;
+	WORD Hi, Lo;
+	LPLONG pl;
+	LPOFNOTIFY notify;
+	LOGFONT logfont;
+	HFONT font;
+	const char *UILanguageFile = ts.UILanguageFile;
+
+	switch (Message) {
+	case WM_INITDIALOG:
+		ofn = (LPOPENFILENAME)lParam;
+		pl = (LPLONG)ofn->lCustData;
+		SetWindowLongPtr(Dialog, DWLP_USER, (LONG_PTR)pl);
+
+		font = (HFONT)SendMessage(Dialog, WM_GETFONT, 0, 0);
+		GetObject(font, sizeof(LOGFONT), &logfont);
+		if (get_lang_font("DLG_TAHOMA_FONT", Dialog, &logfont, &DlgXoptFont, UILanguageFile)) {
+			SendDlgItemMessage(Dialog, IDC_XOPT, WM_SETFONT, (WPARAM)DlgXoptFont, MAKELPARAM(TRUE,0));
+			SendDlgItemMessage(Dialog, IDC_XOPTCHECK, WM_SETFONT, (WPARAM)DlgXoptFont, MAKELPARAM(TRUE,0));
+			SendDlgItemMessage(Dialog, IDC_XOPTCRC, WM_SETFONT, (WPARAM)DlgXoptFont, MAKELPARAM(TRUE,0));
+			SendDlgItemMessage(Dialog, IDC_XOPT1K, WM_SETFONT, (WPARAM)DlgXoptFont, MAKELPARAM(TRUE,0));
+			SendDlgItemMessage(Dialog, IDC_XOPTBIN, WM_SETFONT, (WPARAM)DlgXoptFont, MAKELPARAM(TRUE,0));
+		}
+		else {
+			DlgXoptFont = NULL;
+		}
+
+		SetI18nDlgStrs("Tera Term", Dialog, text_info, _countof(text_info), UILanguageFile);
+
+		if (LOWORD(*pl)==0xFFFF) { // Send
+			ShowDlgItem(Dialog, IDC_XOPT1K, IDC_XOPT1K);
+			Hi = 0;
+			if (HIWORD(*pl) == Xopt1kCRC || HIWORD(*pl) == Xopt1kCksum) {
+				Hi = 1;
+			}
+			SetRB(Dialog, Hi, IDC_XOPT1K, IDC_XOPT1K);
+		}
+		else { // Recv
+			ShowDlgItem(Dialog, IDC_XOPTCHECK, IDC_XOPTCRC);
+			Hi = HIWORD(*pl);
+			if (Hi == Xopt1kCRC) {
+				Hi = XoptCRC;
+			}
+			else if (Hi == Xopt1kCksum) {
+				Hi = XoptCheck;
+			}
+			SetRB(Dialog, Hi, IDC_XOPTCHECK, IDC_XOPTCRC);
+
+			ShowDlgItem(Dialog,IDC_XOPTBIN,IDC_XOPTBIN);
+			SetRB(Dialog,LOWORD(*pl),IDC_XOPTBIN,IDC_XOPTBIN);
+		}
+		CenterCommonDialog(Dialog);
+		return TRUE;
+	case WM_COMMAND: // for old style dialog
+		switch (LOWORD(wParam)) {
+		case IDOK:
+			pl = (LPLONG)GetWindowLongPtr(Dialog,DWLP_USER);
+			if (pl!=NULL)
+			{
+				if (LOWORD(*pl)==0xFFFF) { // Send
+					Lo = 0xFFFF;
+
+					GetRB(Dialog, &Hi, IDC_XOPT1K, IDC_XOPT1K);
+					if (Hi > 0) { // force CRC if 1K
+						Hi = Xopt1kCRC;
+					}
+					else {
+						Hi = XoptCRC;
+					}
+				}
+				else { // Recv
+					GetRB(Dialog, &Lo, IDC_XOPTBIN, IDC_XOPTBIN);
+					GetRB(Dialog, &Hi, IDC_XOPTCHECK, IDC_XOPTCRC);
+				}
+				*pl = MAKELONG(Lo,Hi);
+			}
+			if (DlgXoptFont != NULL) {
+				DeleteObject(DlgXoptFont);
+			}
+			break;
+		case IDCANCEL:
+			if (DlgXoptFont != NULL) {
+				DeleteObject(DlgXoptFont);
+			}
+			break;
+		}
+		break;
+	case WM_NOTIFY:	// for Explorer-style dialog
+		notify = (LPOFNOTIFY)lParam;
+		switch (notify->hdr.code) {
+		case CDN_FILEOK:
+			pl = (LPLONG)GetWindowLongPtr(Dialog,DWLP_USER);
+			if (pl!=NULL) {
+				if (LOWORD(*pl) == 0xFFFF) { // Send
+					Lo = 0xFFFF;
+
+					GetRB(Dialog, &Hi, IDC_XOPT1K, IDC_XOPT1K);
+					if (Hi > 0) { // force CRC if 1K
+						Hi = Xopt1kCRC;
+					}
+					else {
+						Hi = XoptCRC;
+					}
+				}
+				else { // Recv
+					GetRB(Dialog, &Lo, IDC_XOPTBIN, IDC_XOPTBIN);
+					GetRB(Dialog, &Hi, IDC_XOPTCHECK, IDC_XOPTCRC);
+				}
+				*pl = MAKELONG(Lo, Hi);
+			}
+			if (DlgXoptFont != NULL) {
+				DeleteObject(DlgXoptFont);
+			}
+			break;
+		}
+		break;
+	}
+	return FALSE;
+}
+
+static BOOL _GetXFname(HWND HWin, BOOL Receive, LPLONG Option, PFileVar fv, PCHAR CurDir)
+{
+	LONG opt;
+	BOOL Ok;
+	const char *FileSendFilter = ts.FileSendFilter;
+	const char *UILanguageFile = ts.UILanguageFile;
+
+	char *FNFilter = GetCommonDialogFilterA(!Receive ? FileSendFilter : NULL, UILanguageFile);
+
+	fv->FullName[0] = 0;
+	if (!Receive) {
+		if (strlen(FileSendFilter) > 0) {
+			// \x83t\x83B\x83\x8B\x83^\x82\xAA\x83\x8F\x83C\x83\x8B\x83h\x83J\x81[\x83h\x82ł͂Ȃ\xAD\x81A\x82\xBB\x82̃t\x83@\x83C\x83\x8B\x82\xAA\x91\xB6\x8D݂\xB7\x82\xE9\x8Fꍇ
+			// \x82\xA0\x82炩\x82\xB6\x82߃f\x83t\x83H\x83\x8B\x83g\x82̃t\x83@\x83C\x83\x8B\x96\xBC\x82\xF0\x93\xFC\x82\xEA\x82Ă\xA8\x82\xAD (2008.5.18 maya)
+			if (!isInvalidFileNameChar(FileSendFilter)) {
+				char file[MAX_PATH];
+				strncpy_s(file, sizeof(file), CurDir, _TRUNCATE);
+				AppendSlash(file, sizeof(file));
+				strncat_s(file, sizeof(file), FileSendFilter, _TRUNCATE);
+				if (_access(file, 0) == 0) {
+					strncpy_s(fv->FullName, sizeof(fv->FullName), FileSendFilter, _TRUNCATE);
+				}
+			}
+		}
+	}
+
+	OPENFILENAME ofn = {};
+	ofn.lStructSize = get_OPENFILENAME_SIZE();
+	ofn.hwndOwner   = HWin;
+	ofn.lpstrFilter = FNFilter;
+	ofn.nFilterIndex = 1;
+	ofn.lpstrFile = fv->FullName;
+	ofn.nMaxFile = sizeof(fv->FullName);
+	ofn.lpstrInitialDir = CurDir;
+	opt = *Option;
+	if (! Receive)
+	{
+		ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
+		opt = opt | 0xFFFF;
+	}
+	else {
+		ofn.Flags = OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT;
+	}
+	ofn.Flags |= OFN_ENABLETEMPLATE | OFN_ENABLEHOOK | OFN_EXPLORER | OFN_ENABLESIZING;
+	ofn.Flags |= OFN_SHOWHELP;
+	ofn.lCustData = (LPARAM)&opt;
+	ofn.lpstrTitle = fv->DlgCaption;
+	ofn.lpfnHook = XFnHook;
+	ofn.lpTemplateName = MAKEINTRESOURCE(IDD_XOPT);
+	ofn.hInstance = hInst;
+
+	/* save current dir */
+	wchar_t TempDir[MAXPATHLEN];
+	_GetCurrentDirectoryW(_countof(TempDir), TempDir);
+	if (!Receive)
+	{
+		Ok = GetOpenFileName(&ofn);
+	}
+	else {
+		Ok = GetSaveFileName(&ofn);
+	}
+	_SetCurrentDirectoryW(TempDir);
+
+	if (Ok) {
+		fv->DirLen = ofn.nFileOffset;
+		fv->FnPtr = ofn.nFileOffset;
+		memcpy(CurDir,fv->FullName,fv->DirLen-1);
+		CurDir[fv->DirLen-1] = 0;
+
+		if (Receive)
+			*Option = opt;
+		else
+			*Option = MAKELONG(LOWORD(*Option),HIWORD(opt));
+	}
+
+	return Ok;
+}
+
 /**
  *	OnIdle()#teraterm.cpp\x82\xA9\x82\xE7\x83R\x81[\x83\x8B\x82\xB3\x82\xEA\x82\xE9
  *		cv.ProtoFlag \x82\xAA 0 \x88ȊO\x82̂Ƃ\xAB
@@ -809,6 +1028,362 @@
 		ProtoEnd();
 }
 
+static INT_PTR CALLBACK GetFnDlg(HWND Dialog, UINT Message, WPARAM wParam, LPARAM lParam)
+{
+	static const DlgTextInfo text_info[] = {
+		{ 0, "DLG_GETFN_TITLE" },
+		{ IDC_FILENAME, "DLG_GETFN_FILENAME" },
+		{ IDOK, "BTN_OK" },
+		{ IDCANCEL, "BTN_CANCEL" },
+		{ IDC_GETFNHELP, "BTN_HELP" },
+	};
+	PFileVar fv;
+	char TempFull[MAX_PATH];
+	int i, j;
+	const char *UILanguageFile = ts.UILanguageFile;
+
+	switch (Message) {
+	case WM_INITDIALOG:
+		fv = (PFileVar)lParam;
+		SetWindowLongPtr(Dialog, DWLP_USER, lParam);
+		SendDlgItemMessage(Dialog, IDC_GETFN, EM_LIMITTEXT, sizeof(TempFull)-1,0);
+		SetI18nDlgStrs("Tera Term", Dialog, text_info, _countof(text_info), UILanguageFile);
+		return TRUE;
+
+	case WM_COMMAND:
+		fv = (PFileVar)GetWindowLongPtr(Dialog,DWLP_USER);
+		switch (LOWORD(wParam)) {
+		case IDOK:
+			if (fv!=NULL) {
+				GetDlgItemText(Dialog, IDC_GETFN, TempFull, sizeof(TempFull));
+				if (strlen(TempFull)==0) return TRUE;
+				GetFileNamePos(TempFull,&i,&j);
+				FitFileName(&(TempFull[j]),sizeof(TempFull) - j, NULL);
+				strncat_s(fv->FullName,sizeof(fv->FullName),&(TempFull[j]),_TRUNCATE);
+			}
+			EndDialog(Dialog, 1);
+			return TRUE;
+		case IDCANCEL:
+			EndDialog(Dialog, 0);
+			return TRUE;
+		case IDC_GETFNHELP:
+			if (fv!=NULL) {
+				// \x8CĂяo\x82\xB5\x8C\xB3\x82\xAA\x83w\x83\x8B\x83vID\x82\xF0\x8F\x80\x94\x{142DC2}\xE9
+				PostMessage(fv->HMainWin,WM_USER_DLGHELP2,0,0);
+			}
+			break;
+		}
+	}
+	return FALSE;
+}
+
+static BOOL _GetGetFname(HWND HWin, PFileVar fv, PTTSet ts)
+{
+	SetDialogFont(ts->DialogFontName, ts->DialogFontPoint, ts->DialogFontCharSet,
+				  ts->UILanguageFile, "Tera Term", "DLG_SYSTEM_FONT");
+	return (BOOL)TTDialogBoxParam(hInst,
+								  MAKEINTRESOURCE(IDD_GETFNDLG),
+								  HWin, GetFnDlg, (LPARAM)fv);
+}
+
+static HFONT DlgFoptFont;
+
+static UINT_PTR CALLBACK TransFnHook(HWND Dialog, UINT Message, WPARAM wParam, LPARAM lParam)
+{
+	static const DlgTextInfo text_info[] = {
+		{ IDC_FOPT, "DLG_FOPT" },
+		{ IDC_FOPTBIN, "DLG_FOPT_BINARY" },
+	};
+	LPOPENFILENAME ofn;
+	LPWORD pw;
+	LPOFNOTIFY notify;
+	LOGFONT logfont;
+	HFONT font;
+	const char *UILanguageFile = ts.UILanguageFile;
+
+	switch (Message) {
+	case WM_INITDIALOG:
+		ofn = (LPOPENFILENAME)lParam;
+		pw = (LPWORD)ofn->lCustData;
+		SetWindowLongPtr(Dialog, DWLP_USER, (LONG_PTR)pw);
+
+		font = (HFONT)SendMessage(Dialog, WM_GETFONT, 0, 0);
+		GetObject(font, sizeof(LOGFONT), &logfont);
+		if (get_lang_font("DLG_TAHOMA_FONT", Dialog, &logfont, &DlgFoptFont, UILanguageFile)) {
+			SendDlgItemMessage(Dialog, IDC_FOPT, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
+			SendDlgItemMessage(Dialog, IDC_FOPTBIN, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
+			SendDlgItemMessage(Dialog, IDC_FOPTAPPEND, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
+			SendDlgItemMessage(Dialog, IDC_PLAINTEXT, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
+			SendDlgItemMessage(Dialog, IDC_TIMESTAMP, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
+		}
+		else {
+			DlgFoptFont = NULL;
+		}
+
+		SetI18nDlgStrs("Tera Term", Dialog, text_info, _countof(text_info), UILanguageFile);
+
+		SetRB(Dialog,*pw & 1,IDC_FOPTBIN,IDC_FOPTBIN);
+
+		CenterCommonDialog(Dialog);
+
+		return TRUE;
+	case WM_COMMAND: // for old style dialog
+		switch (LOWORD(wParam)) {
+		case IDOK:
+			pw = (LPWORD)GetWindowLongPtr(Dialog,DWLP_USER);
+			if (pw!=NULL)
+				GetRB(Dialog,pw,IDC_FOPTBIN,IDC_FOPTBIN);
+			if (DlgFoptFont != NULL) {
+				DeleteObject(DlgFoptFont);
+			}
+			break;
+		case IDCANCEL:
+			if (DlgFoptFont != NULL) {
+				DeleteObject(DlgFoptFont);
+			}
+			break;
+		}
+		break;
+	case WM_NOTIFY: // for Explorer-style dialog
+		notify = (LPOFNOTIFY)lParam;
+		switch (notify->hdr.code) {
+		case CDN_FILEOK:
+			pw = (LPWORD)GetWindowLongPtr(Dialog,DWLP_USER);
+			if (pw!=NULL)
+				GetRB(Dialog,pw,IDC_FOPTBIN,IDC_FOPTBIN);
+			if (DlgFoptFont != NULL) {
+				DeleteObject(DlgFoptFont);
+			}
+			break;
+		}
+		break;
+	}
+	return FALSE;
+}
+
+static BOOL _GetMultiFname(PFileVar fv, PCHAR CurDir, WORD FuncId, LPWORD Option)
+{
+	int i, len;
+	char uimsg[MAX_UIMSG];
+	char *FNFilter;
+	OPENFILENAME ofn;
+	wchar_t TempDir[MAXPATHLEN];
+	BOOL Ok;
+	char defaultFName[MAX_PATH];
+	const char *FileSendFilter = ts.FileSendFilter;
+	const char *UILanguageFile = ts.UILanguageFile;
+
+	/* save current dir */
+	_GetCurrentDirectoryW(_countof(TempDir), TempDir);
+
+	fv->NumFname = 0;
+
+	strncpy_s(fv->DlgCaption, sizeof(fv->DlgCaption),"Tera Term: ", _TRUNCATE);
+	switch (FuncId) {
+	case GMF_KERMIT:
+		get_lang_msg("FILEDLG_TRANS_TITLE_KMTSEND", uimsg, sizeof(uimsg), TitKmtSend, UILanguageFile);
+		strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+		break;
+	case GMF_Z:
+		get_lang_msg("FILEDLG_TRANS_TITLE_ZSEND", uimsg, sizeof(uimsg), TitZSend, UILanguageFile);
+		strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+		break;
+	case GMF_QV:
+		get_lang_msg("FILEDLG_TRANS_TITLE_QVSEND", uimsg, sizeof(uimsg), TitQVSend, UILanguageFile);
+		strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+		break;
+	case GMF_Y:
+		get_lang_msg("FILEDLG_TRANS_TITLE_YSEND", uimsg, sizeof(uimsg), TitYSend, UILanguageFile);
+		strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+		break;
+	default:
+		return FALSE;
+	}
+
+	/* moemory should be zero-initialized */
+	fv->FnStrMemHandle = GlobalAlloc(GHND, FnStrMemSize);
+	if (fv->FnStrMemHandle == NULL) {
+		MessageBeep(0);
+		return FALSE;
+	}
+	else {
+		fv->FnStrMem = (char *)GlobalLock(fv->FnStrMemHandle);
+		if (fv->FnStrMem == NULL) {
+			GlobalFree(fv->FnStrMemHandle);
+			fv->FnStrMemHandle = 0;
+			MessageBeep(0);
+			return FALSE;
+		}
+	}
+
+	FNFilter = GetCommonDialogFilterA(FileSendFilter, UILanguageFile);
+
+	memset(&ofn, 0, sizeof(OPENFILENAME));
+	ofn.lStructSize = get_OPENFILENAME_SIZE();
+	ofn.hwndOwner   = fv->HMainWin;
+	ofn.lpstrFilter = FNFilter;
+	ofn.nFilterIndex = 1;
+	ofn.lpstrFile = fv->FnStrMem;
+	ofn.nMaxFile = FnStrMemSize;
+	ofn.lpstrTitle= fv->DlgCaption;
+	ofn.lpstrInitialDir = CurDir;
+	ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
+	ofn.Flags |= OFN_ALLOWMULTISELECT | OFN_EXPLORER;
+	ofn.Flags |= OFN_SHOWHELP;
+	ofn.lCustData = 0;
+	if (FuncId==GMF_Z) {
+		ofn.Flags |= OFN_ENABLETEMPLATE | OFN_ENABLEHOOK | OFN_EXPLORER | OFN_ENABLESIZING;
+		ofn.lCustData = (LPARAM)Option;
+		ofn.lpfnHook = TransFnHook;
+		ofn.lpTemplateName = MAKEINTRESOURCE(IDD_FOPT);
+	} else if (FuncId==GMF_Y) {
+		// TODO: YMODEM
+
+	}
+
+	ofn.hInstance = hInst;
+
+	// \x83t\x83B\x83\x8B\x83^\x82\xAA\x83\x8F\x83C\x83\x8B\x83h\x83J\x81[\x83h\x82ł͂Ȃ\xAD\x81A\x82\xBB\x82̃t\x83@\x83C\x83\x8B\x82\xAA\x91\xB6\x8D݂\xB7\x82\xE9\x8Fꍇ
+	// \x82\xA0\x82炩\x82\xB6\x82߃f\x83t\x83H\x83\x8B\x83g\x82̃t\x83@\x83C\x83\x8B\x96\xBC\x82\xF0\x93\xFC\x82\xEA\x82Ă\xA8\x82\xAD (2008.5.18 maya)
+	if (strlen(FileSendFilter) > 0 && !isInvalidFileNameChar(FileSendFilter)) {
+		char file[MAX_PATH];
+		strncpy_s(file, sizeof(file), CurDir, _TRUNCATE);
+		AppendSlash(file, sizeof(file));
+		strncat_s(file, sizeof(file), FileSendFilter, _TRUNCATE);
+		if (_access(file, 0) == 0) {
+			strncpy_s(defaultFName, sizeof(defaultFName), FileSendFilter, _TRUNCATE);
+			ofn.lpstrFile = defaultFName;
+		}
+	}
+
+	Ok = GetOpenFileName(&ofn);
+	free(FNFilter);
+
+	if (Ok) {
+		/* count number of file names */
+		len = strlen(fv->FnStrMem);
+		i = 0;
+		while (len>0) {
+			i = i + len + 1;
+			fv->NumFname++;
+			len = strlen(&fv->FnStrMem[i]);
+		}
+
+		fv->NumFname--;
+
+		if (fv->NumFname<1) { // single selection
+			fv->NumFname = 1;
+			fv->DirLen = ofn.nFileOffset;
+			strncpy_s(fv->FullName, sizeof(fv->FullName),fv->FnStrMem, _TRUNCATE);
+			fv->FnPtr = 0;
+		}
+		else { // multiple selection
+			strncpy_s(fv->FullName, sizeof(fv->FullName),fv->FnStrMem, _TRUNCATE);
+			AppendSlash(fv->FullName,sizeof(fv->FullName));
+			fv->DirLen = strlen(fv->FullName);
+			fv->FnPtr = strlen(fv->FnStrMem)+1;
+		}
+
+		memcpy(CurDir,fv->FullName,fv->DirLen);
+		CurDir[fv->DirLen] = 0;
+		if ((fv->DirLen>3) &&
+		    (CurDir[fv->DirLen-1]=='\\'))
+			CurDir[fv->DirLen-1] = 0;
+
+		fv->FNCount = 0;
+	}
+
+	GlobalUnlock(fv->FnStrMemHandle);
+	if (! Ok) {
+		GlobalFree(fv->FnStrMemHandle);
+		fv->FnStrMemHandle = NULL;
+	}
+
+	/* restore dir */
+	_SetCurrentDirectoryW(TempDir);
+
+	return Ok;
+}
+
+static void _SetFileVar(PFileVar fv)
+{
+	int i;
+	char uimsg[MAX_UIMSG];
+	char c;
+	const char *UILanguageFile = ts.UILanguageFile;
+
+	GetFileNamePos(fv->FullName,&(fv->DirLen),&i);
+	c = fv->FullName[fv->DirLen];
+	if (c=='\\'||c=='/') fv->DirLen++;
+	strncpy_s(fv->DlgCaption, sizeof(fv->DlgCaption),"Tera Term: ", _TRUNCATE);
+	switch (fv->OpId) {
+	case OpLog:
+		get_lang_msg("FILEDLG_TRANS_TITLE_LOG", uimsg, sizeof(uimsg), TitLog, UILanguageFile);
+		strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+		break;
+	case OpSendFile:
+		get_lang_msg("FILEDLG_TRANS_TITLE_SENDFILE", uimsg, sizeof(uimsg), TitSendFile, UILanguageFile);
+		strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+		break;
+	case OpKmtRcv:
+		get_lang_msg("FILEDLG_TRANS_TITLE_KMTRCV", uimsg, sizeof(uimsg), TitKmtRcv, UILanguageFile);
+		strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+		break;
+	case OpKmtGet:
+		get_lang_msg("FILEDLG_TRANS_TITLE_KMTGET", uimsg, sizeof(uimsg), TitKmtGet, UILanguageFile);
+		strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+		break;
+	case OpKmtSend:
+		get_lang_msg("FILEDLG_TRANS_TITLE_KMTSEND", uimsg, sizeof(uimsg), TitKmtSend, UILanguageFile);
+		strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+		break;
+	case OpKmtFin:
+		get_lang_msg("FILEDLG_TRANS_TITLE_KMTFIN", uimsg, sizeof(uimsg), TitKmtFin, UILanguageFile);
+		strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+		break;
+	case OpXRcv:
+		get_lang_msg("FILEDLG_TRANS_TITLE_XRCV", uimsg, sizeof(uimsg), TitXRcv, UILanguageFile);
+		strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+		break;
+	case OpXSend:
+		get_lang_msg("FILEDLG_TRANS_TITLE_XSEND", uimsg, sizeof(uimsg), TitXSend, UILanguageFile);
+		strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+		break;
+	case OpYRcv:
+		get_lang_msg("FILEDLG_TRANS_TITLE_YRCV", uimsg, sizeof(uimsg), TitYRcv, UILanguageFile);
+		strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+		break;
+	case OpYSend:
+		get_lang_msg("FILEDLG_TRANS_TITLE_YSEND", uimsg, sizeof(uimsg), TitYSend, UILanguageFile);
+		strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+		break;
+	case OpZRcv:
+		get_lang_msg("FILEDLG_TRANS_TITLE_ZRCV", uimsg, sizeof(uimsg), TitZRcv, UILanguageFile);
+		strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+		break;
+	case OpZSend:
+		get_lang_msg("FILEDLG_TRANS_TITLE_ZSEND", uimsg, sizeof(uimsg), TitZSend, UILanguageFile);
+		strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+		break;
+	case OpBPRcv:
+		get_lang_msg("FILEDLG_TRANS_TITLE_BPRCV", uimsg, sizeof(uimsg), TitBPRcv, UILanguageFile);
+		strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+		break;
+	case OpBPSend:
+		get_lang_msg("FILEDLG_TRANS_TITLE_BPSEND", uimsg, sizeof(uimsg), TitBPSend, UILanguageFile);
+		strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+		break;
+	case OpQVRcv:
+		get_lang_msg("FILEDLG_TRANS_TITLE_QVRCV", uimsg, sizeof(uimsg), TitQVRcv, UILanguageFile);
+		strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+		break;
+	case OpQVSend:
+		get_lang_msg("FILEDLG_TRANS_TITLE_QVSEND", uimsg, sizeof(uimsg), TitQVSend, UILanguageFile);
+		strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+		break;
+	}
+}
+
 void KermitStart(int mode)
 {
 	WORD w;
@@ -823,7 +1398,7 @@
 			{
 				char FileDirExpanded[MAX_PATH];
 				ExpandEnvironmentStrings(ts.FileDir, FileDirExpanded, sizeof(FileDirExpanded));
-				if (!(*GetMultiFname)(FileVar, FileDirExpanded, GMF_KERMIT, &w) ||
+				if (!_GetMultiFname(FileVar, FileDirExpanded, GMF_KERMIT, &w) ||
 				    (FileVar->NumFname==0))
 				{
 					ProtoEnd();
@@ -831,7 +1406,7 @@
 				}
 			}
 			else
-				(*SetFileVar)(FileVar);
+				_SetFileVar(FileVar);
 			break;
 		case IdKmtReceive:
 			FileVar->OpId = OpKmtRcv;
@@ -840,7 +1415,7 @@
 			FileVar->OpId = OpKmtSend;
 			if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
 			{
-				if (! (*GetGetFname)(FileVar->HMainWin,FileVar, &ts) ||
+				if (! _GetGetFname(FileVar->HMainWin,FileVar, &ts) ||
 				    (strlen(FileVar->FullName)==0))
 				{
 					ProtoEnd();
@@ -848,7 +1423,7 @@
 				}
 			}
 			else
-				(*SetFileVar)(FileVar);
+				_SetFileVar(FileVar);
 			break;
 		case IdKmtFinish:
 			FileVar->OpId = OpKmtFin;
@@ -942,8 +1517,8 @@
 		char FileDirExpanded[MAX_PATH];
 		ExpandEnvironmentStrings(ts.FileDir, FileDirExpanded, sizeof(FileDirExpanded));
 		Option = MAKELONG(ts.XmodemBin,ts.XmodemOpt);
-		if (! (*GetXFname)(FileVar->HMainWin,
-		                   mode==IdXReceive,&Option,FileVar,FileDirExpanded))
+		if (! _GetXFname(FileVar->HMainWin,
+						 mode==IdXReceive,&Option,FileVar,FileDirExpanded))
 		{
 			ProtoEnd();
 			return;
@@ -988,7 +1563,7 @@
 		}
 	}
 	else
-		(*SetFileVar)(FileVar);
+		_SetFileVar(FileVar);
 
 	if (mode==IdXReceive)
 		FileVar->FileHandle = _lcreat(FileVar->FullName,0);
@@ -1093,7 +1668,7 @@
 		FileVar->OpId = OpYSend;
 		if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
 		{
-			if (! (*GetMultiFname)(FileVar,FileDirExpanded,GMF_Y,&Opt) ||
+			if (! _GetMultiFname(FileVar,FileDirExpanded,GMF_Y,&Opt) ||
 			    (FileVar->NumFname==0))
 			{
 				ProtoEnd();
@@ -1102,13 +1677,13 @@
 			//ts.XmodemBin = Opt;
 		}
 		else
-		(*SetFileVar)(FileVar);
+		_SetFileVar(FileVar);
 	}
 	else {
 		FileVar->OpId = OpYRcv;
 		// \x83t\x83@\x83C\x83\x8B\x93]\x91\x97\x8E\x9E\x82̃I\x83v\x83V\x83\x87\x83\x93\x82\xCD"Yopt1K"\x82Ɍ\x88\x82ߑł\xBF\x81B
 		Opt = Yopt1K;
-		(*SetFileVar)(FileVar);
+		_SetFileVar(FileVar);
 	}
 
 	TalkStatus = IdTalkQuiet;
@@ -1165,7 +1740,7 @@
 		{
 			char FileDirExpanded[MAX_PATH];
 			ExpandEnvironmentStrings(ts.FileDir, FileDirExpanded, sizeof(FileDirExpanded));
-			if (! (*GetMultiFname)(FileVar,FileDirExpanded,GMF_Z,&Opt) ||
+			if (! _GetMultiFname(FileVar,FileDirExpanded,GMF_Z,&Opt) ||
 			    (FileVar->NumFname==0))
 			{
 				if (mode == IdZAutoS) {
@@ -1177,7 +1752,7 @@
 			ts.XmodemBin = Opt;
 		}
 		else
-		(*SetFileVar)(FileVar);
+		_SetFileVar(FileVar);
 	}
 	else /* IdZReceive or IdZAutoR */
 		FileVar->OpId = OpZRcv;
@@ -1226,6 +1801,87 @@
 	return TRUE;
 }
 
+static BOOL _GetTransFname(PFileVar fv, PCHAR CurDir, WORD FuncId, LPLONG Option)
+{
+	char uimsg[MAX_UIMSG];
+	char *FNFilter;
+	OPENFILENAME ofn;
+	WORD optw;
+	wchar_t TempDir[MAXPATHLEN];
+	BOOL Ok;
+	char FileName[MAX_PATH];
+	const char *UILanguageFile = ts.UILanguageFile;
+
+	/* save current dir */
+	_GetCurrentDirectoryW(_countof(TempDir), TempDir);
+
+	memset(&ofn, 0, sizeof(OPENFILENAME));
+
+	strncpy_s(fv->DlgCaption, sizeof(fv->DlgCaption),"Tera Term: ", _TRUNCATE);
+	switch (FuncId) {
+	case GTF_SEND:
+		get_lang_msg("FILEDLG_TRANS_TITLE_SENDFILE", uimsg, sizeof(uimsg), TitSendFile, UILanguageFile);
+		strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+		break;
+	case GTF_BP:
+		get_lang_msg("FILEDLG_TRANS_TITLE_BPSEND", uimsg, sizeof(uimsg), TitBPSend, UILanguageFile);
+		strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+		break;
+	default:
+		return FALSE;
+	}
+
+	FNFilter = GetCommonDialogFilterA(ts.FileSendFilter, UILanguageFile);
+
+	ExtractFileName(fv->FullName, FileName ,sizeof(FileName));
+	strncpy_s(fv->FullName, sizeof(fv->FullName), FileName, _TRUNCATE);
+	ofn.lStructSize = get_OPENFILENAME_SIZE();
+	ofn.hwndOwner   = fv->HMainWin;
+	ofn.lpstrFilter = FNFilter;
+	ofn.nFilterIndex = 1;
+	ofn.lpstrFile = fv->FullName;
+	ofn.nMaxFile = sizeof(fv->FullName);
+	ofn.lpstrInitialDir = CurDir;
+
+	switch (FuncId) {
+	case GTF_SEND:
+		ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
+		ofn.Flags |= OFN_ENABLETEMPLATE | OFN_ENABLEHOOK | OFN_EXPLORER | OFN_ENABLESIZING;
+		ofn.lpTemplateName = MAKEINTRESOURCE(IDD_FOPT);
+
+		ofn.lpfnHook = (LPOFNHOOKPROC)(&TransFnHook);
+		optw = (WORD)*Option;
+		ofn.lCustData = (LPARAM)&optw;
+		break;
+	case GTF_BP:
+		ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
+		break;
+	}
+
+	ofn.Flags |= OFN_SHOWHELP;
+
+	ofn.lpstrTitle = fv->DlgCaption;
+
+	ofn.hInstance = hInst;
+
+	Ok = GetOpenFileName(&ofn);
+	free(FNFilter);
+
+	if (Ok) {
+		*Option = (long)optw;
+
+		fv->DirLen = ofn.nFileOffset;
+
+		if (CurDir!=NULL) {
+			memcpy(CurDir,fv->FullName,fv->DirLen-1);
+			CurDir[fv->DirLen-1] = 0;
+		}
+	}
+	/* restore dir */
+	_SetCurrentDirectoryW(TempDir);
+	return Ok;
+}
+
 void BPStart(int mode)
 {
 	LONG Option = 0;
@@ -1240,7 +1896,7 @@
 			char FileDirExpanded[MAX_PATH];
 			ExpandEnvironmentStrings(ts.FileDir, FileDirExpanded, sizeof(FileDirExpanded));
 			FileVar->FullName[0] = 0;
-			if (! (*GetTransFname)(FileVar, FileDirExpanded, GTF_BP, &Option))
+			if (! _GetTransFname(FileVar, FileDirExpanded, GTF_BP, &Option))
 			{
 				ProtoEnd();
 				return;
@@ -1247,7 +1903,7 @@
 			}
 		}
 		else
-			(*SetFileVar)(FileVar);
+			_SetFileVar(FileVar);
 	}
 	else /* IdBPReceive or IdBPAuto */
 		FileVar->OpId = OpBPRcv;
@@ -1306,7 +1962,7 @@
 		{
 			char FileDirExpanded[MAX_PATH];
 			ExpandEnvironmentStrings(ts.FileDir, FileDirExpanded, sizeof(FileDirExpanded));
-			if (! (*GetMultiFname)(FileVar,FileDirExpanded,GMF_QV, &W) ||
+			if (! _GetMultiFname(FileVar,FileDirExpanded,GMF_QV, &W) ||
 			    (FileVar->NumFname==0))
 			{
 				ProtoEnd();
@@ -1314,7 +1970,7 @@
 			}
 		}
 		else
-			(*SetFileVar)(FileVar);
+			_SetFileVar(FileVar);
 	}
 	else
 		FileVar->OpId = OpQVRcv;

Modified: trunk/teraterm/teraterm/vtwin.cpp
===================================================================
--- trunk/teraterm/teraterm/vtwin.cpp	2020-12-20 12:06:06 UTC (rev 9052)
+++ trunk/teraterm/teraterm/vtwin.cpp	2020-12-20 12:06:16 UTC (rev 9053)
@@ -4820,6 +4820,124 @@
 	FreeTTDLG();
 }
 
+static BOOL _GetSetupFname(HWND HWin, WORD FuncId, PTTSet ts)
+{
+	int i, j;
+	OPENFILENAME ofn;
+	char uimsg[MAX_UIMSG];
+
+	//  char FNameFilter[HostNameMaxLength + 1]; // 81(yutaka)
+	char FNameFilter[81]; // 81(yutaka)
+	wchar_t TempDir[MAXPATHLEN];
+	char Dir[MAXPATHLEN];
+	char Name[MAX_PATH];
+	BOOL Ok;
+	const char *UILanguageFile = ts->UILanguageFile;
+
+	/* save current dir */
+	_GetCurrentDirectoryW(_countof(TempDir), TempDir);
+
+	/* File name filter */
+	memset(FNameFilter, 0, sizeof(FNameFilter));
+	if (FuncId==GSF_LOADKEY) {
+		get_lang_msg("FILEDLG_KEYBOARD_FILTER", uimsg, sizeof(uimsg), "keyboard setup files (*.cnf)\\0*.cnf\\0\\0", UILanguageFile);
+		memcpy(FNameFilter, uimsg, sizeof(FNameFilter));
+	}
+	else {
+		get_lang_msg("FILEDLG_SETUP_FILTER", uimsg, sizeof(uimsg), "setup files (*.ini)\\0*.ini\\0\\0", UILanguageFile);
+		memcpy(FNameFilter, uimsg, sizeof(FNameFilter));
+	}
+
+	/* OPENFILENAME record */
+	memset(&ofn, 0, sizeof(OPENFILENAME));
+
+	ofn.lStructSize = get_OPENFILENAME_SIZE();
+	ofn.hwndOwner   = HWin;
+	ofn.lpstrFile   = Name;
+	ofn.nMaxFile    = sizeof(Name);
+	ofn.lpstrFilter = FNameFilter;
+	ofn.nFilterIndex = 1;
+	ofn.hInstance = hInst;
+
+	if (FuncId==GSF_LOADKEY) {
+		ofn.lpstrDefExt = "cnf";
+		GetFileNamePos(ts->KeyCnfFN,&i,&j);
+		strncpy_s(Name, sizeof(Name),&(ts->KeyCnfFN[j]), _TRUNCATE);
+		memcpy(Dir,ts->KeyCnfFN,i);
+		Dir[i] = 0;
+
+		if ((strlen(Name)==0) || (_stricmp(Name,"KEYBOARD.CNF")==0))
+			strncpy_s(Name, sizeof(Name),"KEYBOARD.CNF", _TRUNCATE);
+	}
+	else {
+		ofn.lpstrDefExt = "ini";
+		GetFileNamePos(ts->SetupFName,&i,&j);
+		strncpy_s(Name, sizeof(Name),&(ts->SetupFName[j]), _TRUNCATE);
+		memcpy(Dir,ts->SetupFName,i);
+		Dir[i] = 0;
+
+		if ((strlen(Name)==0) || (_stricmp(Name,"TERATERM.INI")==0))
+			strncpy_s(Name, sizeof(Name),"TERATERM.INI", _TRUNCATE);
+	}
+
+	if (strlen(Dir)==0)
+		strncpy_s(Dir, sizeof(Dir),ts->HomeDir, _TRUNCATE);
+
+	SetCurrentDirectoryA(Dir);
+
+	switch (FuncId) {
+	case GSF_SAVE:
+		ofn.Flags = OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY | OFN_SHOWHELP;
+		// \x8F\x89\x8A\xFA\x83t\x83@\x83C\x83\x8B\x83f\x83B\x83\x8C\x83N\x83g\x83\x8A\x82\xF0\x83v\x83\x8D\x83O\x83\x89\x83\x80\x96{\x91̂\xAA\x82\xA0\x82\xE9\x89ӏ\x8A\x82ɌŒ肷\x82\xE9 (2005.1.6 yutaka)
+		// \x93ǂݍ\x9E\x82܂ꂽteraterm.ini\x82\xAA\x82\xA0\x82\xE9\x83f\x83B\x83\x8C\x83N\x83g\x83\x8A\x82ɌŒ肷\x82\xE9\x81B
+		// \x82\xB1\x82\xEA\x82ɂ\xE6\x82\xE8\x81A/F= \x82Ŏw\x92肳\x82ꂽ\x88ʒu\x82ɕۑ\xB6\x82\xB3\x82\xEA\x82\xE9\x82悤\x82ɂȂ\xE9\x81B(2005.1.26 yutaka)
+		// Windows Vista \x82ł̓t\x83@\x83C\x83\x8B\x96\xBC\x82܂Ŏw\x92肷\x82\xE9\x82\xC6 NULL \x82Ɠ\xAF\x82\xB6\x8B\x93\x93\xAE\x82\xF0\x82\xB7\x82\xE9\x82悤\x82Ȃ̂ŁA
+		// \x83t\x83@\x83C\x83\x8B\x96\xBC\x82\xF0\x8A܂܂Ȃ\xA2\x8C`\x82Ńf\x83B\x83\x8C\x83N\x83g\x83\x8A\x82\xF0\x8Ew\x92肷\x82\xE9\x82悤\x82ɂ\xB5\x82\xBD\x81B(2006.9.16 maya)
+//		ofn.lpstrInitialDir = __argv[0];
+//		ofn.lpstrInitialDir = ts->SetupFName;
+		ofn.lpstrInitialDir = Dir;
+		get_lang_msg("FILEDLG_SAVE_SETUP_TITLE", uimsg, sizeof(uimsg), "Tera Term: Save setup", UILanguageFile);
+		ofn.lpstrTitle = uimsg;
+		Ok = GetSaveFileName(&ofn);
+		if (Ok)
+			strncpy_s(ts->SetupFName, sizeof(ts->SetupFName),Name, _TRUNCATE);
+		break;
+	case GSF_RESTORE:
+		ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_SHOWHELP;
+		get_lang_msg("FILEDLG_RESTORE_SETUP_TITLE", uimsg, sizeof(uimsg), "Tera Term: Restore setup", UILanguageFile);
+		ofn.lpstrTitle = uimsg;
+		Ok = GetOpenFileName(&ofn);
+		if (Ok)
+			strncpy_s(ts->SetupFName, sizeof(ts->SetupFName),Name, _TRUNCATE);
+		break;
+	case GSF_LOADKEY:
+		ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_SHOWHELP;
+		get_lang_msg("FILEDLG_LOAD_KEYMAP_TITLE", uimsg, sizeof(uimsg), "Tera Term: Load key map", UILanguageFile);
+		ofn.lpstrTitle = uimsg;
+		Ok = GetOpenFileName(&ofn);
+		if (Ok)
+			strncpy_s(ts->KeyCnfFN, sizeof(ts->KeyCnfFN),Name, _TRUNCATE);
+		break;
+	default:
+		assert(FALSE);
+		Ok = FALSE;
+		break;
+	}
+
+#if defined(_DEBUG)
+	if (!Ok) {
+		DWORD Err = GetLastError();
+		DWORD DlgErr = CommDlgExtendedError();
+		assert(Err == 0 && DlgErr == 0);
+	}
+#endif
+
+	/* restore dir */
+	_SetCurrentDirectoryW(TempDir);
+
+	return Ok;
+}
+
 void CVTWindow::OnSetupSave()
 {
 	BOOL Ok;
@@ -4827,12 +4945,8 @@
 	int ret;
 
 	strncpy_s(TmpSetupFN, sizeof(TmpSetupFN),ts.SetupFName, _TRUNCATE);
-	if (! LoadTTFILE()) {
-		return;
-	}
 	HelpId = HlpSetupSave;
-	Ok = (*GetSetupFname)(HVTWin,GSF_SAVE,&ts);
-	FreeTTFILE();
+	Ok = _GetSetupFname(HVTWin,GSF_SAVE,&ts);
 	if (! Ok) {
 		return;
 	}
@@ -4891,7 +5005,7 @@
 	if (! LoadTTFILE()) {
 		return;
 	}
-	Ok = (*GetSetupFname)(HVTWin,GSF_RESTORE,&ts);
+	Ok = _GetSetupFname(HVTWin,GSF_RESTORE,&ts);
 	FreeTTFILE();
 	if (Ok) {
 		RestoreSetup();
@@ -5381,7 +5495,7 @@
 	if (! LoadTTFILE()) {
 		return;
 	}
-	Ok = (*GetSetupFname)(HVTWin,GSF_LOADKEY,&ts);
+	Ok = _GetSetupFname(HVTWin,GSF_LOADKEY,&ts);
 	FreeTTFILE();
 	if (! Ok) {
 		return;


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