[Ttssh2-commit] [7335] ttl内部をutf8化

Back to archive index
scmno****@osdn***** scmno****@osdn*****
2018年 12月 18日 (火) 23:47:02 JST


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
+
+


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