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(); }