[ttssh2-commit] [10787] リモートタイトルの扱いをUnicode化した

Back to archive index
scmno****@osdn***** scmno****@osdn*****
2023年 6月 29日 (木) 23:28:20 JST


Revision: 10787
          https://osdn.net/projects/ttssh2/scm/svn/commits/10787
Author:   zmatsuo
Date:     2023-06-29 23:28:19 +0900 (Thu, 29 Jun 2023)
Log Message:
-----------
リモートタイトルの扱いをUnicode化した

- リモートタイトルをUnicodeで保持するようにした
  - 従来はACPで保持していた
  - r10783 では受信したUnicodeをACPに変換して保持していた
  - 保持できる文字長制限をなくした
- VT Windowのウィンドウタイトルの設定をUnicode APIを使用するよう修正
- OSC 20 と OSC 21 で送信文字コードで送信するよう修正
  - どちらもウィンドウタイトルの報告
    - OSC 20 アイコンラベルの報告
    - OSC 21 ウィンドウタイトルを報告
  - 送信文字コードに変換して送信するよう修正
  - 修正前はACP文字列を送信していた
    - ASCII,Shift_JISだけで正しく動作していたと思われる
- OSC 22, 23 のリモートタイトルの保存をUnicodeで行うよう修正
  - OSC 22 ウィンドウタイトルをスタックに保存
  - OSC 23 ウィンドウタイトルをスタックから復元

ticket #39743

Revision Links:
--------------
    https://osdn.net/projects/ttssh2/scm/svn/commits/10783

Ticket Links:
------------
    https://osdn.net/projects/ttssh2/tracker/detail/39743

Modified Paths:
--------------
    trunk/teraterm/common/tttypes.h
    trunk/teraterm/teraterm/commlib.c
    trunk/teraterm/teraterm/ttdde.c
    trunk/teraterm/teraterm/ttwinman.c
    trunk/teraterm/teraterm/vtterm.c
    trunk/teraterm/teraterm/vtwin.cpp

-------------- next part --------------
Modified: trunk/teraterm/common/tttypes.h
===================================================================
--- trunk/teraterm/common/tttypes.h	2023-06-27 14:20:48 UTC (rev 10786)
+++ trunk/teraterm/common/tttypes.h	2023-06-29 14:28:19 UTC (rev 10787)
@@ -853,7 +853,7 @@
 
 	time_t LastSendTime;
 	WORD isSSH;
-	char TitleRemote[TitleBuffSize];
+	char reserve_TitleRemote[50];	// 50 = TitleBuffSize
 
 	BYTE LineModeBuff[OutBuffSize];
 	int LineModeBuffCount, FlushLen;
@@ -872,6 +872,8 @@
 	void (*LogBinSkip)(int add);
 
 	TTTSet *ts;
+
+	wchar_t *TitleRemoteW;
 } TComVar;
 typedef TComVar *PComVar;
 

Modified: trunk/teraterm/teraterm/commlib.c
===================================================================
--- trunk/teraterm/teraterm/commlib.c	2023-06-27 14:20:48 UTC (rev 10786)
+++ trunk/teraterm/teraterm/commlib.c	2023-06-29 14:28:19 UTC (rev 10787)
@@ -136,7 +136,7 @@
 	cv->NoMsg = 0;
 
 	cv->isSSH = 0;
-	cv->TitleRemote[0] = '\0';
+	cv->TitleRemoteW = NULL;
 
 	cv->NotifyIcon = NULL;
 

Modified: trunk/teraterm/teraterm/ttdde.c
===================================================================
--- trunk/teraterm/teraterm/ttdde.c	2023-06-27 14:20:48 UTC (rev 10786)
+++ trunk/teraterm/teraterm/ttdde.c	2023-06-29 14:28:19 UTC (rev 10787)
@@ -669,7 +669,8 @@
 	case CmdSetTitle:
 		strncpy_s(ts.Title, sizeof(ts.Title),ParamFileName, _TRUNCATE);
 		if (ts.AcceptTitleChangeRequest == IdTitleChangeRequestOverwrite) {
-			cv.TitleRemote[0] = '\0';
+			free(cv.TitleRemoteW);
+			cv.TitleRemoteW = NULL;
 		}
 		ChangeTitle();
 		break;

Modified: trunk/teraterm/teraterm/ttwinman.c
===================================================================
--- trunk/teraterm/teraterm/ttwinman.c	2023-06-27 14:20:48 UTC (rev 10786)
+++ trunk/teraterm/teraterm/ttwinman.c	2023-06-29 14:28:19 UTC (rev 10787)
@@ -94,10 +94,9 @@
 
 	{
 		wchar_t *title = ToWcharA(ts.Title);
-		wchar_t *title_remote = ToWcharA(cv.TitleRemote);
+		const wchar_t *title_remote = cv.TitleRemoteW;
 		if (title_remote == NULL) {
-			// TODO cv.TitleRemote \x82\xAA strncpy_s() \x82ŕs\x90\xB3\x82ȕ\xB6\x8E\x9A\x82\xAA\x8A܂܂ꂽ\x82Ƃ\xAB NULL \x82\xAA\x95Ԃ\xE9
-			title_remote = _wcsdup(L"-");
+			title_remote = L"-";
 		}
 		if (Connecting || !cv.Ready || wcslen(title_remote) == 0) {
 			wcsncpy_s(TempTitleWithRemote, _countof(TempTitleWithRemote), title, _TRUNCATE);
@@ -122,7 +121,6 @@
 			wcsncpy_s(TempTitle, _countof(TempTitle), TempTitleWithRemote, _TRUNCATE);
 		}
 		free(title);
-		free(title_remote);
 	}
 
 	if ((ts.TitleFormat & 1)!=0)

Modified: trunk/teraterm/teraterm/vtterm.c
===================================================================
--- trunk/teraterm/teraterm/vtterm.c	2023-06-27 14:20:48 UTC (rev 10786)
+++ trunk/teraterm/teraterm/vtterm.c	2023-06-29 14:28:19 UTC (rev 10787)
@@ -150,7 +150,7 @@
 static int ChangeEmu;
 
 typedef struct tstack {
-	char *title;
+	wchar_t *title;
 	struct tstack *next;
 } TStack;
 typedef TStack *PTStack;
@@ -577,6 +577,34 @@
 	CommBinaryOut(&cv, str, l);
 }
 
+static void SendOSCstrW(const wchar_t *str, char TermChar)
+{
+	size_t len;
+
+	if (str == NULL) {
+		return;
+	}
+
+	len = wcslen(str);
+
+	if (TermChar == BEL) {
+		CommBinaryOut(&cv,"\033]", 2);
+		CommTextOutW(&cv, str, len);
+		CommBinaryOut(&cv,"\007", 1);
+	}
+	else if (Send8BitMode) {
+		CommBinaryOut(&cv,"\235", 1);
+		CommTextOutW(&cv, str, len);
+		CommBinaryOut(&cv,"\234", 1);
+	}
+	else {
+		CommBinaryOut(&cv,"\033]", 2);
+		CommTextOutW(&cv, str, len);
+		CommBinaryOut(&cv,"\033\\", 2);
+	}
+
+}
+
 static void SendOSCstr(char *str, int len, char TermChar)
 {
 	size_t l;
@@ -2508,7 +2536,6 @@
 {
 	int x, y, len;
 	char Report[TitleBuffSize*2+10];
-	PTStack t;
 
 	switch (Param[1]) {
 	  case 1: // De-iconify window
@@ -2675,30 +2702,35 @@
 			// nothing to do
 			break;
 
-		  case IdTitleReportAccept:
+		  case IdTitleReportAccept: {
+			wchar_t *osc_str;
+			const wchar_t *remote = (cv.TitleRemoteW == NULL) ? L"" : cv.TitleRemoteW;
 			switch (ts.AcceptTitleChangeRequest) {
 			  case IdTitleChangeRequestOff:
-				len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "L%s", CLocale, ts.Title);
+				aswprintf(&osc_str, L"L%hs", ts.Title);
 				break;
 
 			  case IdTitleChangeRequestAhead:
-				len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "L%s %s", CLocale, cv.TitleRemote, ts.Title);
+				aswprintf(&osc_str, L"L%s %hs", remote, ts.Title);
 				break;
 
 			  case IdTitleChangeRequestLast:
-				len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "L%s %s", CLocale, ts.Title, cv.TitleRemote);
+				aswprintf(&osc_str, L"L%hs %s", ts.Title, remote);
 				break;
 
 			  default:
-				if (cv.TitleRemote[0] == 0) {
-					len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "L%s", CLocale, ts.Title);
+				if (cv.TitleRemoteW == NULL) {
+					aswprintf(&osc_str, L"L%hs", ts.Title);
 				}
 				else {
-					len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "L%s", CLocale, cv.TitleRemote);
+					aswprintf(&osc_str, L"L%s", remote);
 				}
+				break;
 			}
-			SendOSCstr(Report, len, ST);
+			SendOSCstrW(osc_str, ST);
+			free(osc_str);
 			break;
+		  }
 
 		  default: // IdTitleReportEmpty:
 			SendOSCstr("L", 0, ST);
@@ -2712,30 +2744,34 @@
 			// nothing to do
 			break;
 
-		  case IdTitleReportAccept:
+		  case IdTitleReportAccept: {
+			wchar_t *osc_str;
+			wchar_t *remote = (cv.TitleRemoteW == NULL) ? L"" : cv.TitleRemoteW;
 			switch (ts.AcceptTitleChangeRequest) {
 			  case IdTitleChangeRequestOff:
-				len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "l%s", CLocale, ts.Title);
+				aswprintf(&osc_str, L"l%hs", ts.Title);
 				break;
 
 			  case IdTitleChangeRequestAhead:
-				len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "l%s %s", CLocale, cv.TitleRemote, ts.Title);
+				aswprintf(&osc_str, L"l%s %hs", remote, ts.Title);
 				break;
 
 			  case IdTitleChangeRequestLast:
-				len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "l%s %s", CLocale, ts.Title, cv.TitleRemote);
+				aswprintf(&osc_str, L"l%hs %s", ts.Title, remote);
 				break;
 
 			  default:
-				if (cv.TitleRemote[0] == 0) {
-					len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "l%s", CLocale, ts.Title);
+				if (cv.TitleRemoteW == NULL) {
+					aswprintf(&osc_str, L"l%hs", ts.Title);
 				}
 				else {
-					len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "l%s", CLocale, cv.TitleRemote);
+					aswprintf(&osc_str, L"l%s", cv.TitleRemoteW);
 				}
 			}
-			SendOSCstr(Report, len, ST);
+			SendOSCstrW(osc_str, ST);
+			free(osc_str);
 			break;
+		  }
 
 		  default: // IdTitleReportEmpty:
 			SendOSCstr("l", 0, ST);
@@ -2748,9 +2784,10 @@
 		switch (Param[2]) {
 		  case 0:
 		  case 1:
-		  case 2:
+		  case 2: {
+			PTStack t;
 			if (ts.AcceptTitleChangeRequest && (t=malloc(sizeof(TStack))) != NULL) {
-				if ((t->title = _strdup(cv.TitleRemote)) != NULL) {
+				if ((t->title = _wcsdup(cv.TitleRemoteW)) != NULL) {
 					t->next = TitleStack;
 					TitleStack = t;
 				}
@@ -2759,6 +2796,7 @@
 				}
 			}
 			break;
+		  }
 		}
 		break;
 
@@ -2767,16 +2805,18 @@
 		switch (Param[2]) {
 		  case 0:
 		  case 1:
-		  case 2:
+		  case 2: {
 			if (ts.AcceptTitleChangeRequest && TitleStack != NULL) {
+				PTStack t;
 				t = TitleStack;
 				TitleStack = t->next;
-				strncpy_s(cv.TitleRemote, sizeof(cv.TitleRemote), t->title, _TRUNCATE);
+				free(cv.TitleRemoteW);
+				cv.TitleRemoteW = t->title;
 				ChangeTitle();
-				free(t->title);
 				free(t);
 			}
 			break;
+		  }
 		}
 	}
 }
@@ -4921,7 +4961,7 @@
  *	\x8E\xF3\x90M\x95\xB6\x8E\x9A\x97\xF1\x82\xF0UTF16\x95\xB6\x8E\x9A\x97\xF1\x82ɕϊ\xB7\x82\xB7\x82\xE9
  *
  *	@param	ptr		\x95\xB6\x8E\x9A\x97\xF1
- *	@param	len		\x95\xB6\x8E\x9A\x97\xF1\x92\xB7(\n\x82\xF0\x8A܂܂Ȃ\xA2)
+ *	@param	len		\x95\xB6\x8E\x9A\x97\xF1\x92\xB7('\0'\x82\xF0\x8A܂܂Ȃ\xA2)
  *	@retval			\x95ϊ\xB7\x82\xB3\x82ꂽ\x95\xB6\x8E\x9A\x97\xF1(\x95s\x97v\x82ɂȂ\xC1\x82\xBD\x82\xE7free()\x82\xB7\x82邱\x82\xC6)
  *
  */
@@ -5076,12 +5116,8 @@
 			if (StrBuff && ts.AcceptTitleChangeRequest) {
 				size_t len = strlen(StrBuff);
 				wchar_t *titleW = ConvertUTF16(StrBuff, len);
-				char *titleA = ToCharW(titleW);
-				free(titleW);
-				if (titleA) {
-					strncpy_s(cv.TitleRemote, sizeof(cv.TitleRemote), titleA, _TRUNCATE);
-					free(titleA);
-				}
+				free(cv.TitleRemoteW);
+				cv.TitleRemoteW = titleW;
 				ChangeTitle();
 			}
 			break;

Modified: trunk/teraterm/teraterm/vtwin.cpp
===================================================================
--- trunk/teraterm/teraterm/vtwin.cpp	2023-06-27 14:20:48 UTC (rev 10786)
+++ trunk/teraterm/teraterm/vtwin.cpp	2023-06-29 14:28:19 UTC (rev 10787)
@@ -4318,7 +4318,8 @@
 		// \x83^\x83C\x83g\x83\x8B\x82\xAA\x95ύX\x82\xB3\x82\xEA\x82Ă\xA2\x82\xBD\x82\xE7\x81A\x83\x8A\x83\x82\x81[\x83g\x83^\x83C\x83g\x83\x8B\x82\xF0\x83N\x83\x8A\x83A\x82\xB7\x82\xE9
 		if ((ts.AcceptTitleChangeRequest == IdTitleChangeRequestOverwrite) &&
 		    (strcmp(orgTitle, ts.Title) != 0)) {
-			cv.TitleRemote[0] = '\0';
+			free(cv.TitleRemoteW);
+			cv.TitleRemoteW = NULL;
 		}
 
 		ChangeFont();
@@ -4729,7 +4730,8 @@
 
 void CVTWindow::OnControlResetRemoteTitle()
 {
-	cv.TitleRemote[0] = '\0';
+	free(cv.TitleRemoteW);
+	cv.TitleRemoteW = NULL;
 	ChangeTitle();
 }
 


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