• R/O
  • SSH
  • HTTPS

ttssh2: コミット


コミットメタ情報

リビジョン8630 (tree)
日時2020-03-27 00:40:24
作者zmatsuo

ログメッセージ

フォルダ選択ダイアログを Unicode版に置き換え

- doSelectFolderW()を使用するよう変更

- 内部で _SHBrowseForFolderW() を使用
- 元は doSelectFolder()、内部で SHBrowseForFolderA() を使用

変更サマリ

差分

--- branches/unicode_macro/teraterm/common/ttlib.c (revision 8629)
+++ branches/unicode_macro/teraterm/common/ttlib.c (revision 8630)
@@ -1079,7 +1079,7 @@
10791079 //
10801080 // cf. http://homepage2.nifty.com/DSS/VCPP/API/SHBrowseForFolder.htm
10811081 //
1082-int CALLBACK setDefaultFolder(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
1082+static int CALLBACK setDefaultFolder(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
10831083 {
10841084 if(uMsg == BFFM_INITIALIZED) {
10851085 SendMessage(hwnd, BFFM_SETSELECTION, (WPARAM)TRUE, lpData);
@@ -1114,10 +1114,10 @@
11141114 bi.lpfn = setDefaultFolder;
11151115 bi.lParam = (LPARAM)def;
11161116 // フォルダ選択ダイアログの表示
1117- pidlBrowse = SHBrowseForFolder(&bi);
1117+ pidlBrowse = SHBrowseForFolderA(&bi);
11181118 if (pidlBrowse != NULL) {
11191119 // PIDL形式の戻り値のファイルシステムのパスに変換
1120- if (SHGetPathFromIDList(pidlBrowse, buf)) {
1120+ if (SHGetPathFromIDListA(pidlBrowse, buf)) {
11211121 // 取得成功
11221122 strncpy_s(path, pathlen, buf, _TRUNCATE);
11231123 ret = TRUE;
--- branches/unicode_macro/teraterm/common/ttlib.h (revision 8629)
+++ branches/unicode_macro/teraterm/common/ttlib.h (revision 8630)
@@ -83,6 +83,7 @@
8383 void get_lang_msgW(const char *key, wchar_t *buf, int buf_len, const wchar_t *def, const char *iniFile);
8484 int get_lang_font(PCHAR key, HWND dlg, PLOGFONT logfont, HFONT *font, const char *iniFile);
8585 DllExport BOOL doSelectFolder(HWND hWnd, char *path, int pathlen, const char *def, const char *msg);
86+BOOL doSelectFolderW(HWND hWnd, wchar_t *path, int pathlen, const wchar_t *def, const wchar_t *msg);
8687 DllExport void OutputDebugPrintf(const char *fmt, ...);
8788 void OutputDebugPrintfW(const wchar_t *fmt, ...);
8889 DllExport DWORD get_OPENFILENAME_SIZEA();
@@ -127,14 +128,12 @@
127128 void SetDlgMenuTexts(HMENU hMenu, const DlgTextInfo *infos, int infoCount, const char *UILanguageFile);
128129 int GetMonitorDpiFromWindow(HWND hWnd);
129130
131+#define get_OPENFILENAME_SIZE() get_OPENFILENAME_SIZEA()
132+
130133 #if defined(_UNICODE)
131-#define doSelectFolderT(p1, p2, p3, p4, p5) doSelectFolderW(p1, p2, p3, p4, p5)
132134 #define get_lang_msgT(p1, p2, p3, p4, p5) get_lang_msgW(p1, p2, p3, p4, p5)
133-#define get_OPENFILENAME_SIZE() get_OPENFILENAME_SIZEW()
134135 #else
135-#define doSelectFolderT(p1, p2, p3, p4, p5) doSelectFolder(p1, p2, p3, p4, p5)
136136 #define get_lang_msgT(p1, p2, p3, p4, p5) get_lang_msg(p1, p2, p3, p4, p5)
137-#define get_OPENFILENAME_SIZE() get_OPENFILENAME_SIZEA()
138137 #endif
139138
140139 /*
--- branches/unicode_macro/teraterm/common/ttlib_static.c (revision 8629)
+++ branches/unicode_macro/teraterm/common/ttlib_static.c (revision 8630)
@@ -290,4 +290,56 @@
290290 _OutputDebugStringW(tmp);
291291 }
292292
293+static int CALLBACK setDefaultFolder(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
294+{
295+ if(uMsg == BFFM_INITIALIZED) {
296+ SendMessage(hwnd, BFFM_SETSELECTION, (WPARAM)TRUE, lpData);
297+ }
298+ return 0;
299+}
300+
301+BOOL doSelectFolderW(HWND hWnd, wchar_t *path, int pathlen, const wchar_t *def, const wchar_t *msg)
302+{
303+ BROWSEINFOW bi;
304+ LPITEMIDLIST pidlRoot; // ブラウズのルートPIDL
305+ LPITEMIDLIST pidlBrowse; // ユーザーが選択したPIDL
306+ wchar_t buf[MAX_PATH];
307+ BOOL ret = FALSE;
308+
309+ // ダイアログ表示時のルートフォルダのPIDLを取得
310+ // ※以下はデスクトップをルートとしている。デスクトップをルートとする
311+ // 場合は、単に bi.pidlRoot に0を設定するだけでもよい。その他の特
312+ // 殊フォルダをルートとする事もできる。詳細はSHGetSpecialFolderLoca
313+ // tionのヘルプを参照の事。
314+ if (!SUCCEEDED(SHGetSpecialFolderLocation(hWnd, CSIDL_DESKTOP, &pidlRoot))) {
315+ return FALSE;
316+ }
317+
318+ // BROWSEINFO構造体の初期値設定
319+ // ※BROWSEINFO構造体の各メンバの詳細説明もヘルプを参照
320+ bi.hwndOwner = hWnd;
321+ bi.pidlRoot = pidlRoot;
322+ bi.pszDisplayName = buf;
323+ bi.lpszTitle = msg;
324+ bi.ulFlags = 0;
325+ bi.lpfn = setDefaultFolder;
326+ bi.lParam = (LPARAM)def;
327+ // フォルダ選択ダイアログの表示
328+ pidlBrowse = _SHBrowseForFolderW(&bi);
329+ if (pidlBrowse != NULL) {
330+ // PIDL形式の戻り値のファイルシステムのパスに変換
331+ if (_SHGetPathFromIDListW(pidlBrowse, buf)) {
332+ // 取得成功
333+ wcsncpy_s(path, pathlen, buf, _TRUNCATE);
334+ ret = TRUE;
335+ }
336+ // SHBrowseForFolderの戻り値PIDLを解放
337+ CoTaskMemFree(pidlBrowse);
338+ }
339+ // クリーンアップ処理
340+ CoTaskMemFree(pidlRoot);
341+
342+ return ret;
343+}
344+
293345 /* vim: set ts=4 sw=4 ff=dos : */
--- branches/unicode_macro/teraterm/teraterm/addsetting.cpp (revision 8629)
+++ branches/unicode_macro/teraterm/teraterm/addsetting.cpp (revision 8630)
@@ -1422,15 +1422,15 @@
14221422
14231423 case IDC_DEFAULTPATH_PUSH | (BN_CLICKED << 16):
14241424 // ログディレクトリの選択ダイアログ
1425- get_lang_msg("FILEDLG_SELECT_LOGDIR_TITLE", ts.UIMsg, sizeof(ts.UIMsg),
1426- "Select log folder", ts.UILanguageFile);
14271425 {
1428- char buf[MAX_PATH];
1429- char buf2[MAX_PATH];
1430- GetDlgItemTextA(IDC_DEFAULTPATH_EDITOR, buf, sizeof(buf));
1431- if (doSelectFolder(GetSafeHwnd(), buf2, sizeof(buf2), buf, ts.UIMsg)) {
1432- SetDlgItemTextA(IDC_DEFAULTPATH_EDITOR, buf2);
1426+ wchar_t *title = TTGetLangStrW("Tera Term", "FILEDLG_SELECT_LOGDIR_TITLE", L"Select log folder", ts.UILanguageFile);
1427+ wchar_t buf[MAX_PATH];
1428+ wchar_t buf2[MAX_PATH];
1429+ GetDlgItemTextW(IDC_DEFAULTPATH_EDITOR, buf, _countof(buf));
1430+ if (doSelectFolderW(GetSafeHwnd(), buf2, _countof(buf2), buf, title)) {
1431+ SetDlgItemTextW(IDC_DEFAULTPATH_EDITOR, buf2);
14331432 }
1433+ free(title);
14341434 }
14351435
14361436 return TRUE;
@@ -1659,17 +1659,17 @@
16591659
16601660 BOOL CCygwinPropPageDlg::OnCommand(WPARAM wParam, LPARAM lParam)
16611661 {
1662- char buf[MAX_PATH], buf2[MAX_PATH];
1662+ wchar_t buf[MAX_PATH], buf2[MAX_PATH];
16631663
16641664 switch (wParam) {
16651665 case IDC_SELECT_FILE | (BN_CLICKED << 16):
16661666 // Cygwin install ディレクトリの選択ダイアログ
1667- get_lang_msg("DIRDLG_CYGTERM_DIR_TITLE", ts.UIMsg, sizeof(ts.UIMsg),
1668- "Select Cygwin directory", ts.UILanguageFile);
1669- GetDlgItemTextA(IDC_CYGWIN_PATH, buf, sizeof(buf));
1670- if (doSelectFolder(GetSafeHwnd(), buf2, sizeof(buf2), buf, ts.UIMsg)) {
1671- SetDlgItemTextA(IDC_CYGWIN_PATH, buf2);
1667+ wchar_t *title = TTGetLangStrW("Tera Term", "DIRDLG_CYGTERM_DIR_TITLE", L"Select Cygwin directory", ts.UILanguageFile);
1668+ GetDlgItemTextW(IDC_CYGWIN_PATH, buf, _countof(buf));
1669+ if (doSelectFolderW(GetSafeHwnd(), buf2, _countof(buf2), buf, title)) {
1670+ SetDlgItemTextW(IDC_CYGWIN_PATH, buf2);
16721671 }
1672+ free(title);
16731673 return TRUE;
16741674 }
16751675
--- branches/unicode_macro/teraterm/ttpmacro/ttl_gui.cpp (revision 8629)
+++ branches/unicode_macro/teraterm/ttpmacro/ttl_gui.cpp (revision 8630)
@@ -323,9 +323,9 @@
323323 if (CheckVar("inputstr", &ValType, &VarId) &&
324324 (ValType == TypString)) {
325325 BringupWindow(GetHWND());
326- TCHAR buf[MAX_PATH];
327- if (doSelectFolderT(GetHWND(), buf, _countof(buf), tc::fromUtf8(InitDir), tc::fromUtf8(Title))) {
328- const char *bufU8 = ToU8T(buf);
326+ wchar_t buf[MAX_PATH];
327+ if (doSelectFolderW(GetHWND(), buf, _countof(buf), wc::fromUtf8(InitDir), wc::fromUtf8(Title))) {
328+ const char *bufU8 = ToU8W(buf);
329329 SetInputStr((PCHAR)bufU8);
330330 free((void *)bufU8);
331331 ret = 1;
旧リポジトリブラウザで表示