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

Back to archive index
scmno****@osdn***** scmno****@osdn*****
2021年 11月 21日 (日) 00:13:33 JST


Revision: 9538
          https://osdn.net/projects/ttssh2/scm/svn/commits/9538
Author:   zmatsuo
Date:     2021-11-21 00:13:32 +0900 (Sun, 21 Nov 2021)
Log Message:
-----------
OSC 52 によるクリップボード操作制御の文字コードをANSIからUTF-8に変更した

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

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

Modified Paths:
--------------
    trunk/teraterm/common/ttlib_static_cpp.cpp
    trunk/teraterm/teraterm/vtterm.c

-------------- next part --------------
Modified: trunk/teraterm/common/ttlib_static_cpp.cpp
===================================================================
--- trunk/teraterm/common/ttlib_static_cpp.cpp	2021-11-18 16:01:00 UTC (rev 9537)
+++ trunk/teraterm/common/ttlib_static_cpp.cpp	2021-11-20 15:13:32 UTC (rev 9538)
@@ -194,31 +194,26 @@
  *	\x83N\x83\x8A\x83b\x83v\x83{\x81[\x83h\x82\xA9\x82\xE7wchar_t\x95\xB6\x8E\x9A\x97\xF1\x82\xF0\x8E擾\x82\xB7\x82\xE9
  *	\x95\xB6\x8E\x9A\x97񒷂\xAA\x95K\x97v\x82ȂƂ\xAB\x82\xCDwcslen()\x82\xB7\x82邱\x82\xC6
  *	@param	hWnd
- *	@param	emtpy	TRUE\x82̂Ƃ\xAB\x83N\x83\x8A\x83b\x83v\x83{\x81[\x83h\x82\xF0\x8B\xF3\x82ɂ\xB7\x82\xE9
- *	@retval	\x95\xB6\x8E\x9A\x97\xF1\x82ւ̃|\x83C\x83\x93\x83^ \x8Eg\x97p\x8C\xE3free()\x82\xB7\x82邱\x82\xC6
- *			\x95\xB6\x8E\x9A\x82\xAA\x82Ȃ\xA2(\x82܂\xBD\x82̓G\x83\x89\x81[\x8E\x9E)\x82\xCDNULL
+ *	@param	emtpy		TRUE\x82̂Ƃ\xAB\x83N\x83\x8A\x83b\x83v\x83{\x81[\x83h\x82\xF0\x8B\xF3\x82ɂ\xB7\x82\xE9
+ *	@retval	NULL		\x83G\x83\x89\x81[
+ *	@retval	NULL\x88ȊO	\x95\xB6\x8E\x9A\x97\xF1\x82ւ̃|\x83C\x83\x93\x83^ \x8Eg\x97p\x8C\xE3free()\x82\xB7\x82邱\x82\xC6
  */
 wchar_t *GetClipboardTextW(HWND hWnd, BOOL empty)
 {
-	UINT Cf;
-	wchar_t *str_w = NULL;
-	size_t str_w_len;
-	HGLOBAL TmpHandle;
-
-	// TODO GetPriorityClipboardFormat()
-	if (IsClipboardFormatAvailable(CF_UNICODETEXT)) {
-		Cf = CF_UNICODETEXT;
+	static const UINT list[] = {
+		CF_UNICODETEXT,
+		CF_TEXT,
+		CF_OEMTEXT,
+		CF_HDROP,
+	};
+	UINT Cf = GetPriorityClipboardFormat((UINT *)list, _countof(list));
+	if (Cf == 0) {
+		// \x83N\x83\x8A\x83b\x83v\x83{\x81[\x83h\x82\xAA\x8B󂾂\xC1\x82\xBD
+		// \x8B󕶎\x9A\x82\xF0\x95Ԃ\xB7
+		return wcsdup(L"");
 	}
-	else if (IsClipboardFormatAvailable(CF_TEXT)) {
-		Cf = CF_TEXT;
-	}
-	else if (IsClipboardFormatAvailable(CF_OEMTEXT)) {
-		Cf = CF_OEMTEXT;
-	}
-	else if (IsClipboardFormatAvailable(CF_HDROP)) {
-		Cf = CF_HDROP;
-	}
-	else {
+	if (Cf == -1) {
+		// \x88\xB5\x82\xA6\x82\xE9\x83f\x81[\x83^\x82\xAA\x82Ȃ\xA9\x82\xC1\x82\xBD
 		return NULL;
 	}
 
@@ -225,10 +220,12 @@
  	if (!OpenClipboard(hWnd)) {
 		return NULL;
 	}
-	TmpHandle = GetClipboardData(Cf);
+	HGLOBAL TmpHandle = GetClipboardData(Cf);
 	if (TmpHandle == NULL) {
 		return NULL;
 	}
+	wchar_t *str_w = NULL;
+	size_t str_w_len;
 	if (Cf == CF_HDROP) {
 		HDROP hDrop = (HDROP)TmpHandle;
 		UINT count = DragQueryFileW(hDrop, (UINT)-1, NULL, 0);

Modified: trunk/teraterm/teraterm/vtterm.c
===================================================================
--- trunk/teraterm/teraterm/vtterm.c	2021-11-18 16:01:00 UTC (rev 9537)
+++ trunk/teraterm/teraterm/vtterm.c	2021-11-20 15:13:32 UTC (rev 9538)
@@ -5071,13 +5071,8 @@
 
 static void XsProcClipboard(PCHAR buff)
 {
-	int len, blen;
-	char *p, *cbbuff, hdr[20];
+	char *p;
 	wchar_t *notify_buff, *notify_title;
-	HGLOBAL cbmem;
-	int wide_len;
-	HGLOBAL wide_cbmem;
-	LPWSTR wide_buf;
 
 	p = buff;
 	while (strchr("cps01234567", *p)) {
@@ -5087,6 +5082,7 @@
 	if (*p++ == ';') {
 		if (*p == '?' && *(p+1) == 0) { // Read access
 			if (ts.CtrlFlag & CSF_CBREAD) {
+				char hdr[20];
 				if (ts.NotifyClipboardAccess) {
 					GetI18nStrWW("Tera Term", "MSG_CBACCESS_TITLE",
 								 L"Clipboard Access", ts.UILanguageFileW, &notify_title);
@@ -5112,27 +5108,15 @@
 			}
 		}
 		else if (ts.CtrlFlag & CSF_CBWRITE) { // Write access
-			len = strlen(buff);
-			blen = len * 3 / 4 + 1;
-
-			if ((cbmem = GlobalAlloc(GMEM_MOVEABLE, blen)) == NULL) {
-				return;
-			};
-			if ((cbbuff = GlobalLock(cbmem)) == NULL) {
-				GlobalFree(cbmem);
-				return;
-			}
-
+			size_t len = strlen(buff);
+			size_t blen = len * 3 / 4 + 1;
+			char *cbbuff = malloc(blen);
 			len = b64decode(cbbuff, blen, p);
-
 			if (len < 0 || len >= blen) {
-				GlobalUnlock(cbmem);
-				GlobalFree(cbmem);
+				free(cbbuff);
 				return;
 			}
-
 			cbbuff[len] = 0;
-			GlobalUnlock(cbmem);
 
 			if (ts.NotifyClipboardAccess) {
 				wchar_t *buf;
@@ -5147,22 +5131,16 @@
 				free(notify_buff);
 			}
 
-			wide_len = MultiByteToWideChar(CP_ACP, 0, cbbuff, -1, NULL, 0);
-			wide_cbmem = GlobalAlloc(GMEM_MOVEABLE, sizeof(WCHAR) * wide_len);
-			if (wide_cbmem) {
-				wide_buf = (LPWSTR)GlobalLock(wide_cbmem);
-				MultiByteToWideChar(CP_ACP, 0, cbbuff, -1, wide_buf, wide_len);
-				GlobalUnlock(wide_cbmem);
+			// cbbuff \x82ɓ\xFC\x82\xC1\x82Ă\xA2\x82镶\x8E\x9A\x97\xF1\x82\xF0\x83N\x83\x8A\x83b\x83v\x83{\x81[\x83h\x82ɃZ\x83b\x83g\x82\xB7\x82\xE9
+			{
+				// wchar_t \x82֕ϊ\xB7\x82\xB5\x82Đݒ\xE8
+				//	\x82Ƃ肠\x82\xA6\x82\xB8UTF-8 \x82\xAA\x93\xFC\x82\xC1\x82Ă\xA2\x82\xE9\x91O\x92\xF1
+				// 	TODO \x8E\xF3\x90M\x95\xB6\x8E\x9A\x83R\x81[\x83h\x82ɍ\x87\x82킹\x82ĕύX\x82\xB7\x82\xEA\x82\xCEok?
+				wchar_t *cbbuffW = ToWcharU8(cbbuff);
+				CBSetTextW(NULL, cbbuffW, 0);
+				free(cbbuffW);
 			}
-
-			if (OpenClipboard(NULL)) {
-				EmptyClipboard();
-				SetClipboardData(CF_TEXT, cbmem);
-				if (wide_buf) {
-					SetClipboardData(CF_UNICODETEXT, wide_cbmem);
-				}
-				CloseClipboard();
-			}
+			free(cbbuff);
 		}
 		else if (ts.NotifyClipboardAccess) {
 			GetI18nStrWW("Tera Term", "MSG_CBACCESS_REJECT_TITLE",


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