• R/O
  • SSH
  • HTTPS

ttssh2: Commit


Commit MetaInfo

Revision9538 (tree)
Time2021-11-21 00:13:32
Authorzmatsuo

Log Message

OSC 52 によるクリップボード操作制御の文字コードをANSIからUTF-8に変更した

- 今のところ UTF-8 固定
- ticket #39745

Change Summary

Incremental Difference

--- trunk/teraterm/common/ttlib_static_cpp.cpp (revision 9537)
+++ trunk/teraterm/common/ttlib_static_cpp.cpp (revision 9538)
@@ -194,31 +194,26 @@
194194 * クリップボードからwchar_t文字列を取得する
195195 * 文字列長が必要なときはwcslen()すること
196196 * @param hWnd
197- * @param emtpy TRUEのときクリップボードを空にする
198- * @retval 文字列へのポインタ 使用後free()すること
199- * 文字がない(またはエラー時)はNULL
197+ * @param emtpy TRUEのときクリップボードを空にする
198+ * @retval NULL エラー
199+ * @retval NULL以外 文字列へのポインタ 使用後free()すること
200200 */
201201 wchar_t *GetClipboardTextW(HWND hWnd, BOOL empty)
202202 {
203- UINT Cf;
204- wchar_t *str_w = NULL;
205- size_t str_w_len;
206- HGLOBAL TmpHandle;
207-
208- // TODO GetPriorityClipboardFormat()
209- if (IsClipboardFormatAvailable(CF_UNICODETEXT)) {
210- Cf = CF_UNICODETEXT;
203+ static const UINT list[] = {
204+ CF_UNICODETEXT,
205+ CF_TEXT,
206+ CF_OEMTEXT,
207+ CF_HDROP,
208+ };
209+ UINT Cf = GetPriorityClipboardFormat((UINT *)list, _countof(list));
210+ if (Cf == 0) {
211+ // クリップボードが空だった
212+ // 空文字を返す
213+ return wcsdup(L"");
211214 }
212- else if (IsClipboardFormatAvailable(CF_TEXT)) {
213- Cf = CF_TEXT;
214- }
215- else if (IsClipboardFormatAvailable(CF_OEMTEXT)) {
216- Cf = CF_OEMTEXT;
217- }
218- else if (IsClipboardFormatAvailable(CF_HDROP)) {
219- Cf = CF_HDROP;
220- }
221- else {
215+ if (Cf == -1) {
216+ // 扱えるデータがなかった
222217 return NULL;
223218 }
224219
@@ -225,10 +220,12 @@
225220 if (!OpenClipboard(hWnd)) {
226221 return NULL;
227222 }
228- TmpHandle = GetClipboardData(Cf);
223+ HGLOBAL TmpHandle = GetClipboardData(Cf);
229224 if (TmpHandle == NULL) {
230225 return NULL;
231226 }
227+ wchar_t *str_w = NULL;
228+ size_t str_w_len;
232229 if (Cf == CF_HDROP) {
233230 HDROP hDrop = (HDROP)TmpHandle;
234231 UINT count = DragQueryFileW(hDrop, (UINT)-1, NULL, 0);
--- trunk/teraterm/teraterm/vtterm.c (revision 9537)
+++ trunk/teraterm/teraterm/vtterm.c (revision 9538)
@@ -5071,13 +5071,8 @@
50715071
50725072 static void XsProcClipboard(PCHAR buff)
50735073 {
5074- int len, blen;
5075- char *p, *cbbuff, hdr[20];
5074+ char *p;
50765075 wchar_t *notify_buff, *notify_title;
5077- HGLOBAL cbmem;
5078- int wide_len;
5079- HGLOBAL wide_cbmem;
5080- LPWSTR wide_buf;
50815076
50825077 p = buff;
50835078 while (strchr("cps01234567", *p)) {
@@ -5087,6 +5082,7 @@
50875082 if (*p++ == ';') {
50885083 if (*p == '?' && *(p+1) == 0) { // Read access
50895084 if (ts.CtrlFlag & CSF_CBREAD) {
5085+ char hdr[20];
50905086 if (ts.NotifyClipboardAccess) {
50915087 GetI18nStrWW("Tera Term", "MSG_CBACCESS_TITLE",
50925088 L"Clipboard Access", ts.UILanguageFileW, &notify_title);
@@ -5112,27 +5108,15 @@
51125108 }
51135109 }
51145110 else if (ts.CtrlFlag & CSF_CBWRITE) { // Write access
5115- len = strlen(buff);
5116- blen = len * 3 / 4 + 1;
5117-
5118- if ((cbmem = GlobalAlloc(GMEM_MOVEABLE, blen)) == NULL) {
5119- return;
5120- };
5121- if ((cbbuff = GlobalLock(cbmem)) == NULL) {
5122- GlobalFree(cbmem);
5123- return;
5124- }
5125-
5111+ size_t len = strlen(buff);
5112+ size_t blen = len * 3 / 4 + 1;
5113+ char *cbbuff = malloc(blen);
51265114 len = b64decode(cbbuff, blen, p);
5127-
51285115 if (len < 0 || len >= blen) {
5129- GlobalUnlock(cbmem);
5130- GlobalFree(cbmem);
5116+ free(cbbuff);
51315117 return;
51325118 }
5133-
51345119 cbbuff[len] = 0;
5135- GlobalUnlock(cbmem);
51365120
51375121 if (ts.NotifyClipboardAccess) {
51385122 wchar_t *buf;
@@ -5147,22 +5131,16 @@
51475131 free(notify_buff);
51485132 }
51495133
5150- wide_len = MultiByteToWideChar(CP_ACP, 0, cbbuff, -1, NULL, 0);
5151- wide_cbmem = GlobalAlloc(GMEM_MOVEABLE, sizeof(WCHAR) * wide_len);
5152- if (wide_cbmem) {
5153- wide_buf = (LPWSTR)GlobalLock(wide_cbmem);
5154- MultiByteToWideChar(CP_ACP, 0, cbbuff, -1, wide_buf, wide_len);
5155- GlobalUnlock(wide_cbmem);
5134+ // cbbuff に入っている文字列をクリップボードにセットする
5135+ {
5136+ // wchar_t へ変換して設定
5137+ // とりあえずUTF-8 が入っている前提
5138+ // TODO 受信文字コードに合わせて変更すればok?
5139+ wchar_t *cbbuffW = ToWcharU8(cbbuff);
5140+ CBSetTextW(NULL, cbbuffW, 0);
5141+ free(cbbuffW);
51565142 }
5157-
5158- if (OpenClipboard(NULL)) {
5159- EmptyClipboard();
5160- SetClipboardData(CF_TEXT, cbmem);
5161- if (wide_buf) {
5162- SetClipboardData(CF_UNICODETEXT, wide_cbmem);
5163- }
5164- CloseClipboard();
5165- }
5143+ free(cbbuff);
51665144 }
51675145 else if (ts.NotifyClipboardAccess) {
51685146 GetI18nStrWW("Tera Term", "MSG_CBACCESS_REJECT_TITLE",
Show on old repository browser