Revision: 7335 http://sourceforge.jp/projects/ttssh2/scm/svn/commits/7335 Author: zmatsuo Date: 2018-12-18 23:47:02 +0900 (Tue, 18 Dec 2018) Log Message: ----------- ttl内部をutf8化 ddeout()をutf8化がまだ Modified Paths: -------------- branches/cmake/teraterm/common/ttlib.c branches/cmake/teraterm/common/ttlib.h branches/cmake/teraterm/ttpmacro/ttl.c branches/cmake/teraterm/ttpmacro/ttl_gui.cpp Added Paths: ----------- branches/cmake/tests/gui_commands_test_utf8.ttl -------------- next part -------------- Modified: branches/cmake/teraterm/common/ttlib.c =================================================================== --- branches/cmake/teraterm/common/ttlib.c 2018-12-18 14:46:51 UTC (rev 7334) +++ branches/cmake/teraterm/common/ttlib.c 2018-12-18 14:47:02 UTC (rev 7335) @@ -1062,7 +1062,7 @@ return 0; } -BOOL doSelectFolder(HWND hWnd, char *path, int pathlen, char *def, char *msg) +BOOL doSelectFolder(HWND hWnd, char *path, int pathlen, const char *def, const char *msg) { BROWSEINFOA bi; LPITEMIDLIST pidlRoot; // \x83u\x83\x89\x83E\x83Y\x82̃\x8B\x81[\x83gPIDL @@ -1106,6 +1106,50 @@ return ret; } +BOOL doSelectFolderW(HWND hWnd, wchar_t *path, int pathlen, const wchar_t *def, const wchar_t *msg) +{ + BROWSEINFOW bi; + LPITEMIDLIST pidlRoot; // \x83u\x83\x89\x83E\x83Y\x82̃\x8B\x81[\x83gPIDL + LPITEMIDLIST pidlBrowse; // \x83\x86\x81[\x83U\x81[\x82\xAA\x91I\x91\xF0\x82\xB5\x82\xBDPIDL + wchar_t buf[MAX_PATH]; + BOOL ret = FALSE; + + // \x83_\x83C\x83A\x83\x8D\x83O\x95\\x8E\xA6\x8E\x9E\x82̃\x8B\x81[\x83g\x83t\x83H\x83\x8B\x83_\x82\xCCPIDL\x82\xF0\x8E擾 + // \x81\xA6\x88ȉ\xBA\x82̓f\x83X\x83N\x83g\x83b\x83v\x82\xF0\x83\x8B\x81[\x83g\x82Ƃ\xB5\x82Ă\xA2\x82\xE9\x81B\x83f\x83X\x83N\x83g\x83b\x83v\x82\xF0\x83\x8B\x81[\x83g\x82Ƃ\xB7\x82\xE9 + // \x8Fꍇ\x82́A\x92P\x82\xC9 bi.pidlRoot \x82ɂO\x82\xF0\x90ݒ肷\x82邾\x82\xAF\x82ł\xE0\x82悢\x81B\x82\xBB\x82̑\xBC\x82̓\xC1 + // \x8E\xEA\x83t\x83H\x83\x8B\x83_\x82\xF0\x83\x8B\x81[\x83g\x82Ƃ\xB7\x82鎖\x82\xE0\x82ł\xAB\x82\xE9\x81B\x8Fڍׂ\xCDSHGetSpecialFolderLoca + // tion\x82̃w\x83\x8B\x83v\x82\xF0\x8EQ\x8FƂ̎\x96\x81B + if (!SUCCEEDED(SHGetSpecialFolderLocation(hWnd, CSIDL_DESKTOP, &pidlRoot))) { + return FALSE; + } + + // BROWSEINFO\x8D\\x91\xA2\x91̂̏\x89\x8A\xFA\x92l\x90ݒ\xE8 + // \x81\xA6BROWSEINFO\x8D\\x91\xA2\x91̂̊e\x83\x81\x83\x93\x83o\x82̏ڍא\xE0\x96\xBE\x82\xE0\x83w\x83\x8B\x83v\x82\xF0\x8EQ\x8F\xC6 + bi.hwndOwner = hWnd; + bi.pidlRoot = pidlRoot; + bi.pszDisplayName = buf; + bi.lpszTitle = msg; + bi.ulFlags = 0; + bi.lpfn = setDefaultFolder; + bi.lParam = (LPARAM)def; + // \x83t\x83H\x83\x8B\x83_\x91I\x91\xF0\x83_\x83C\x83A\x83\x8D\x83O\x82̕\\x8E\xA6 + pidlBrowse = SHBrowseForFolderW(&bi); + if (pidlBrowse != NULL) { + // PIDL\x8C`\x8E\xAE\x82̖߂\xE8\x92l\x82̃t\x83@\x83C\x83\x8B\x83V\x83X\x83e\x83\x80\x82̃p\x83X\x82ɕϊ\xB7 + if (SHGetPathFromIDListW(pidlBrowse, buf)) { + // \x8E擾\x90\xAC\x8C\xF7 + wcsncpy_s(path, pathlen, buf, _TRUNCATE); + ret = TRUE; + } + // SHBrowseForFolder\x82̖߂\xE8\x92lPIDL\x82\xF0\x89\xF0\x95\xFA + CoTaskMemFree(pidlBrowse); + } + // \x83N\x83\x8A\x81[\x83\x93\x83A\x83b\x83v\x8F\x88\x97\x9D + CoTaskMemFree(pidlRoot); + + return ret; +} + void OutputDebugPrintf(const char *fmt, ...) { char tmp[1024]; va_list arg; Modified: branches/cmake/teraterm/common/ttlib.h =================================================================== --- branches/cmake/teraterm/common/ttlib.h 2018-12-18 14:46:51 UTC (rev 7334) +++ branches/cmake/teraterm/common/ttlib.h 2018-12-18 14:47:02 UTC (rev 7335) @@ -90,7 +90,8 @@ DllExport void get_lang_msgW(const char *key, wchar_t *buf, int buf_len, const wchar_t *def, const char *iniFile); #endif int get_lang_font(PCHAR key, HWND dlg, PLOGFONTA logfont, HFONT *font, const char *iniFile); -DllExport BOOL doSelectFolder(HWND hWnd, char *path, int pathlen, char *def, char *msg); +DllExport BOOL doSelectFolder(HWND hWnd, char *path, int pathlen, const char *def, const char *msg); +DllExport BOOL doSelectFolderW(HWND hWnd, wchar_t *path, int pathlen, const wchar_t *def, const wchar_t *msg); DllExport void OutputDebugPrintf(const char *fmt, ...); DllExport BOOL is_NT4(); int get_OPENFILENAME_SIZE(); @@ -127,8 +128,10 @@ #define CheckFlag(var, flag) (((var) & (flag)) != 0) #if defined(_UNICODE) +#define doSelectFolderT(p1, p2, p3, p4, p5) doSelectFolderW(p1, p2, p3, p4, p5) #define get_lang_msgT(p1, p2, p3, p4, p5) get_lang_msgW(p1, p2, p3, p4, p5) #else +#define doSelectFolderT(p1, p2, p3, p4, p5) doSelectFolder(p1, p2, p3, p4, p5) #define get_lang_msgT(p1, p2, p3, p4, p5) get_lang_msg(p1, p2, p3, p4, p5) #endif Modified: branches/cmake/teraterm/ttpmacro/ttl.c =================================================================== --- branches/cmake/teraterm/ttpmacro/ttl.c 2018-12-18 14:46:51 UTC (rev 7334) +++ branches/cmake/teraterm/ttpmacro/ttl.c 2018-12-18 14:47:02 UTC (rev 7335) @@ -3447,11 +3447,13 @@ return Err; } +#if 0 #define IdMsgBox 1 #define IdYesNoBox 2 #define IdStatusBox 3 #define IdListBox 4 #define LISTBOX_ITEM_NUM 10 +#endif int MessageCommand(int BoxId, LPWORD Err) { Modified: branches/cmake/teraterm/ttpmacro/ttl_gui.cpp =================================================================== --- branches/cmake/teraterm/ttpmacro/ttl_gui.cpp 2018-12-18 14:46:51 UTC (rev 7334) +++ branches/cmake/teraterm/ttpmacro/ttl_gui.cpp 2018-12-18 14:47:02 UTC (rev 7335) @@ -235,11 +235,10 @@ BOOL SaveFlag = FALSE; TStrVal InitDir = ""; tc InitDirT; - BOOL ret; Err = 0; GetStrVal(Str1,&Err); - tc Str1T = Str1; + tc Str1T = tc::fromUtf8(Str1); if (Err!=0) return Err; @@ -262,20 +261,15 @@ SetInputStr(""); if (CheckVar("inputstr", &ValType, &VarId) && (ValType==TypString)) { -#if defined(UNICODE) TCHAR filename[MaxStrLen]; -#endif + filename[0] = 0; memset(&ofn, 0, sizeof(OPENFILENAME)); - ofn.lStructSize = sizeof(OPENFILENAME); + //ofn.lStructSize = sizeof(OPENFILENAME); + ofn.lStructSize = OPENFILENAME_SIZE_VERSION_400; // TODO ofn.hwndOwner = GetHWND(); ofn.lpstrTitle = Str1T; -#if defined(UNICODE) ofn.lpstrFile = filename; ofn.nMaxFile = _countof(filename); -#else - ofn.lpstrFile = StrVarPtr(VarId); - ofn.nMaxFile = MaxStrLen; -#endif get_lang_msgT("FILEDLG_ALL_FILTER", uimsg, _countof(uimsg), _T("All(*.*)\\0*.*\\0\\0"), UILanguageFile); ofn.lpstrFilter = uimsg; ofn.lpstrInitialDir = NULL; @@ -283,6 +277,7 @@ ofn.lpstrInitialDir = InitDirT; } BringupWindow(GetHWND()); + BOOL ret; if (SaveFlag) { ofn.Flags = OFN_OVERWRITEPROMPT; ret = GetSaveFileName(&ofn); @@ -291,13 +286,11 @@ ret = GetOpenFileName(&ofn); } -#if defined(UNICODE) + const char *filenameU8 = ToU8T(filename); char *dest = StrVarPtr(VarId); - ::WideCharToMultiByte(CP_ACP, 0, - filename, MaxStrLen, - dest, MaxStrLen, - NULL,NULL); -#endif + strcpy(dest, filenameU8); + free((void *)filenameU8); + SetResult(ret); } return Err; @@ -308,7 +301,6 @@ TStrVal Title; WORD Err, ValType; TVarId VarId; - char buf[MAX_PATH]; TStrVal InitDir = ""; BOOL ret; @@ -330,8 +322,11 @@ if (CheckVar("inputstr", &ValType, &VarId) && (ValType == TypString)) { BringupWindow(GetHWND()); - if (doSelectFolder(GetHWND(), buf, sizeof(buf), InitDir, Title)) { - SetInputStr(buf); + TCHAR buf[MAX_PATH]; + if (doSelectFolderT(GetHWND(), buf, _countof(buf), tc::fromUtf8(InitDir), tc::fromUtf8(Title))) { + const char *bufU8 = ToU8T(buf); + SetInputStr((PCHAR)bufU8); + free((void *)bufU8); ret = 1; } else { @@ -414,7 +409,7 @@ TVarId VarId2; VarId2 = GetStrVarFromArray(VarId, i, Err); if (*Err!=0) return -1; - s[i] = ToTcharA(StrVarPtr(VarId2)); + s[i] = ToTcharU8(StrVarPtr(VarId2)); } if (s[0] == NULL) { *Err = ErrSyntax; @@ -533,10 +528,9 @@ if (Temp[0]==0) // password not exist { #if defined(UNICODE) - tc Str2T = Str2; TCHAR input_string[MaxStrLen]; - OpenInpDlg(input_string, Str2T, _T("Enter password"), _T(""), TRUE); - WideCharToMultiByte(CP_ACP, 0, + OpenInpDlg(input_string, tc::fromUtf8(Str2), _T("Enter password"), _T(""), TRUE); + WideCharToMultiByte(CP_UTF8, 0, input_string, -1, Temp2, _countof(Temp2), NULL, NULL); @@ -603,13 +597,10 @@ SetInputStr(""); if (CheckVar("inputstr",&ValType,&VarId) && (ValType==TypString)) { #if defined(UNICODE) - tc Str1T = Str1; - tc Str2T = Str2; - tc Str3T = Str3; TCHAR input_string[MaxStrLen]; - OpenInpDlg(input_string,Str1T,Str2T,Str3T,Paswd); + OpenInpDlg(input_string,tc::fromUtf8(Str1),tc::fromUtf8(Str2),tc::fromUtf8(Str3),Paswd); char *output = StrVarPtr(VarId); - WideCharToMultiByte(CP_ACP, 0, + WideCharToMultiByte(CP_UTF8, 0, input_string, -1, output, MaxStrLen, NULL, NULL); Added: branches/cmake/tests/gui_commands_test_utf8.ttl =================================================================== --- branches/cmake/tests/gui_commands_test_utf8.ttl (rev 0) +++ branches/cmake/tests/gui_commands_test_utf8.ttl 2018-12-18 14:47:02 UTC (rev 7335) @@ -0,0 +1,286 @@ +;;; +;;; test gui commands +;;; +; +;call test_messagebox +;call test_errordialogbox +;call test_yesnobox +;call test_inputbox +;call test_passwordbox +;call test_statusbox +;call test_macrodialogbox +;call test_listbox +;call test_filenamebox +call test_dirnamebox +messagebox "finish all tests" "test" +end + +;;;;;;;;;;;;;;;; +;;; messagebox +:test_messagebox +s = "メッセージボックス\nthis is basic test\n3 행" +strspecial s +messagebox s "メッセージボックス" +messagebox "finish messagebox test" "test messagebox" +return + +;;;;;;;;;;;;;;;; +;;; error dialog +;;; - Dependence +;;; messagebox +:test_errordialogbox +messagebox "Please push `continue` button in next window" "test errordialogbox" +this_line_is_error_push_continue +messagebox "finish error dialog test" "test error dialog" +return + +;;;;;;;;;;;;;;;; +;;; yesnobox +;;; - Dependence +;;; messagebox +:test_yesnobox +yes = 0 +no = 0 +while ((yes == 0) or (no == 0)) + yesnobox "push 是的(yes) or 没有(no)" "test yesnobox" + if result == 1 yes = yes + 1 + if result == 0 no = no + 1 + sprintf "yes=%d no=%d" yes no + messagebox inputstr "test yesnobox" +endwhile +sprintf "finish yesnobox test\nyes=%d no=%d" yes no +s = inputstr +strspecial s +messagebox s "test yesnobox" +return + +;;;;;;;;;;;;;;;; +;;; inputbox +;;; - Dependence +;;; messagebox +:test_inputbox +s = "default string" +match = 0 +while match == 0 + inputbox "入力 `ok` to finish" "test inputbox" s + s = inputstr + sprintf "入力文字列 は `%s`" s + messagebox inputstr "test inputbox" + strmatch s "^ok$" + match = result +endwhile +messagebox "finish inputbox test" "test inputbox" +return + +;;;;;;;;;;;;;;;; +;;; passwordbox +;;; - Dependence +;;; messagebox +:test_passwordbox +match = 0 +while match == 0 + passwordbox "`password` と入力すると終了" "test passwordbox" + s = inputstr + sprintf "入力文字列 は `%s`" s + messagebox inputstr "test inputbox" + strmatch s "^password$" + match = result +endwhile +messagebox "finish passwordbox test" "test passwordbox" +return + +;;;;;;;;;;;;;;;; +;;; statusbox +;;; setdlgpos +;;; closesbox +;;; - Dependence +;;; messagebox +:test_statusbox +call test_statusbox_centerwindow +;call test_statusbox_setdlgpos +return + +; 表示されていない→表示する 時 センタリングされる +; 表示されている時 width=変化しない height=変化する(フィット) pos=変化しない +:test_statusbox_centerwindow +pause_time = 3 +statusbox "statusbox message" "test statusbox" +pause pause_time +sprintf2 s "1 line1\n2 line2 \n3 line3\n4 long long long long long line" +strspecial s +statusbox s "test statusbox" +pause pause_time +closesbox +statusbox s "test statusbox" +pause pause_time +statusbox "statusbox message" "test statusbox" +pause pause_time +closesbox +statusbox "statusbox message" "test statusbox" +pause pause_time +closesbox +messagebox "finish statusbox centerwindow test" "test statusbox" +return + +:test_statusbox_setdlgpos +pause_time = 1 +last_val = 3 +statusbox "statusbox message" "test statusbox" +pause pause_time +for i 1 last_val + x = i*10 + y = i*10 + setdlgpos x y + sprintf2 s "setdlgpos\ni=%d/%d\n(%d,%d)" i last_val x y + strspecial s + statusbox s "test statusbox/setdlgpos" + pause pause_time +next +closesbox +s = "Please overwrap other window\nwait 5 sec\nbringupbox test" +strspecial s +setdlgpos 0 0 +statusbox s "test statusbox" +pause 5 +bringupbox +statusbox "bringupbox" "test statusbox" +pause 5 +closesbox +setdlgpos -10000 0 ; go center +messagebox "finish statusbox setdlgpos test" "test statusbox" +return + +;;;;;;;;;;;;;;;; +;;; macrodialog box +;;; show +;;; - Dependence +;;; messagebox +:test_macrodialogbox +call test_macrodialogbox_show +call test_macrodialogbox_move_resize +messagebox "finish macro dialogbox test" "test macro dialogbox" +return + +:test_macrodialogbox_show +N = 5 +intdim show_flag_list N +show_flag_list[0] = 1 +show_flag_list[1] = -1 +show_flag_list[2] = 1 +show_flag_list[3] = 0 +show_flag_list[4] = 1 +for i 0 N-1 + show_flag = show_flag_list[i] + show show_flag + if show_flag < 0 then + s = "macro dialog box was hidden\ncheck task bar" + elseif show_flag == 0 then + s = "macro dialog box was minimize\ncheck task bar" + elseif show_flag > 0 then + s = "macro dialog box was shown\nmove this messagebox and check macro dialog box" + endif + sprintf "show %d\n%s" show_flag s + s = inputstr + strspecial s + messagebox s "test macrodialog/show" +next +return + +:test_macrodialogbox_move_resize +w = 15 +sprintf "move and resize test\nwait %d sec" w +s = inputstr +strspecial s +messagebox s "test macro dialog" +pause w +messagebox "finish move and resize test" "test macro dialog/move and resize" +return + +;;;;;;;;;;;;;;;; +;;; listbox +;;; - Dependence +;;; messagebox +:test_listbox +N = 7 +intdim done N +strdim strs N +strdim srcs N +for i 0 N-1 + done[i] = 0 +next +srcs[0] = "本気の失敗には価値がある" +srcs[1] = "俺の敵は だいたい俺です" +srcs[2] = "ちょっとだけ無理なことに挑戦してこーぜ" +srcs[3] = "リーダーというのはやはり安心と興奮を同時にくれる" +srcs[4] = "”止まる”も”進む”もコントロールするのはお前だ" +srcs[5] = "どっちが楽しいかで決めなさい。" +srcs[6] = "悩むなら、なってから悩みなさい" +done_all = 0 +done_cancel = 0 +prev = 0 +while ((done_all == 0) or (done_cancel == 0)) + for i 0 N-1 + if done[i] == 0 then + s = "" + else + s = "[selected]" + endif + sprintf2 s "%s %s" s srcs[i] + strs[i] = s + next + if done_all == 0 then + msg = "select one from list and `ok`" + if done_cancel == 0 then + strconcat msg " or `cancel`" + endif + else + msg = "push `cancel`" + endif + listbox msg "test listbox" strs prev + if result < 0 then + done_cancel = 1 + continue + endif + prev = result + if done[result] == 0 then + done[result] = 1 + else + done[result] = 0 + endif + done_all = 1 + for i 0 N-1 + if done[i] == 0 then + done_all = 0 + break + endif + next +endwhile +messagebox "finish listbox test" "test listbox" +return + +;;;;;;;;;;;;;;;; +;;; filenamebox +;;; - Dependence +;;; messagebox +:test_filenamebox +filenamebox "ファイルを選んでください(load)" 0 "c:\" +sprintf2 s "result %d inputstr %s" result inputstr +messagebox s "test fienamebox" +filenamebox "ファイルを選んでください(save)" 1 "c:\windows" +sprintf2 s "result %d inputstr %s" result inputstr +messagebox s "test fienamebox" +messagebox "finish filenaebox test" "test filenamebox" +return + +;;;;;;;;;;;;;;;; +;;; dirnamebox +;;; - Dependence +;;; messagebox +:test_dirnamebox +dirnamebox "whereディレクトリ" "c:\" +sprintf2 s "result %d inputstr %s" result inputstr +messagebox s "test fienamebox" +messagebox "finish dirnamebox test" "test dirnambox" +return + +