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, ¬ify_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",