svnno****@sourc*****
svnno****@sourc*****
2016年 8月 1日 (月) 18:01:30 JST
Revision: 6456 http://sourceforge.jp/projects/ttssh2/scm/svn/commits/6456 Author: doda Date: 2016-08-01 18:01:30 +0900 (Mon, 01 Aug 2016) Log Message: ----------- クリップボードの内容に改行が含まれているかの確認を、CBStartPaste() の 中から行うようにした。 確認をクリップボードにアクセスするのではなく、CBStartPaste() でコピー した領域をチェックするようにした。 他のクリップボードの内容確認/加工を行う場合を考えた場合、この形式の方が 統一性が取れていいと思う。 変更によってダイアログの(変更)内容をクリップボードに書き戻さなくなったが、 この書き戻しの挙動は必要? ・クリップボードに余計な干渉はしないという観点からは書き戻さない方がよさそう。 ・複数回繰り返して貼り付ける場合は、毎回ダイアログでの編集が必要となる。 この点に関しては書き戻した方が便利。 CBStartPaste() でのコピー先の領域を GlobalAlloc() で確保する必要はある? 以前はクリップボードのデータを直接読む場合も有ったので互換性のある確保の仕方が必要だったが、 現在は完全に切り離されたので、malloc() で確保したり、GlobalAlloc() を使うにしても、 GMEM_FIXED で固定メモリにする方が扱い易くないか? Modified Paths: -------------- trunk/teraterm/teraterm/clipboar.c trunk/teraterm/teraterm/clipboar.h trunk/teraterm/teraterm/vtwin.cpp -------------- next part -------------- Modified: trunk/teraterm/teraterm/clipboar.c =================================================================== --- trunk/teraterm/teraterm/clipboar.c 2016-08-01 09:01:28 UTC (rev 6455) +++ trunk/teraterm/teraterm/clipboar.c 2016-08-01 09:01:30 UTC (rev 6456) @@ -37,6 +37,8 @@ static HFONT DlgClipboardFont; +static LRESULT CALLBACK OnClipboardDlgProc(HWND hDlgWnd, UINT msg, WPARAM wp, LPARAM lp); + PCHAR CBOpen(LONG MemSize) { if (MemSize==0) { @@ -154,6 +156,105 @@ return TRUE; } +// \x83t\x83@\x83C\x83\x8B\x82ɒ\xE8\x8B`\x82\xB3\x82ꂽ\x95\xB6\x8E\x9A\x97Atext\x82Ɋ܂܂\xEA\x82邩\x82ׂ\xE9\x81B +BOOL search_dict(char *filename, char *text) +{ + BOOL ret = FALSE; + FILE *fp = NULL; + char buf[256]; + int len; + + if (filename == NULL || filename[0] == '\0') + return FALSE; + + if ((fp = fopen(filename, "r")) == NULL) + return FALSE; + + // TODO: \x88\xEA\x8Ds\x82\xAA256byte\x82\xA6\x82Ă\xA2\x82\xE9\x8Fꍇ\x82̍l\x97\xB6 + while (fgets(buf, sizeof(buf), fp) != NULL) { + len = strlen(buf); + if (len <= 1) { + continue; + } + if (buf[len - 1] == '\n') { + buf[len - 1] = '\0'; + } + if (strstr(text, buf)) { // hit + ret = 1; + break; + } + } + + fclose(fp); + + return (ret); +} + +/* + * \x83N\x83\x8A\x83b\x83v\x83{\x81[\x83h\x82̓\xE0\x97e\x82\xF0\x8Am\x94F\x82\xB5\x81A\x93\\x82\xE8\x95t\x82\xAF\x82\xF0\x8Ds\x82\xA4\x82\xA9\x8Am\x94F\x83_\x83C\x83A\x83\x8D\x83O\x82\xF0\x8Fo\x82\xB7\x81B + * + * \x95Ԃ\xE8\x92l: + * TRUE -> \x96\xE2\x91\xE8\x82Ȃ\xB5\x81A\x93\\x82\xE8\x95t\x82\xAF\x82\xF0\x8E\xC0\x8E{ + * FALSE -> \x93\\x82\xE8\x95t\x82\xAF\x92\x86\x8E~ + */ +BOOL CheckClipboardContent(BOOL AddCR, BOOL Bracketed) +{ + int pos; + int ret = IDOK; + BOOL confirm = FALSE; + + if (!ts.ConfirmChangePaste) { + return TRUE; + } + +/* + * ConfirmChangePasteCR \x82̋\x93\x93\xAE\x96\xE2\x91\xE8 + * \x88ȉ\xBA\x82̓\xAE\x8D\xEC\x82Ŗ\xE2\x91\xE8\x82Ȃ\xA2\x82\xA9\x81B + * + * ChangePasteCR !ChangePasteCR + * AddCR !AddCR AddCR !AddCR + * \x89\xFC\x8Ds\x82\xA0\x82\xE8 o o x(2) o + * \x89\xFC\x8Ds\x96\xB3\x82\xB5 o(1) x x x + * + * ChangePasteCR \x82\xCD AddCR \x82̎\x9E\x82Ɋm\x94F\x82\xF0\x8Ds\x82\xA4\x82\xA9(1\x82Ŋm\x94F\x82\xB7\x82\xE9)\x82Ƃ\xA2\x82\xA4\x90ݒ肾\x82\xAA\x81A + * !ChangePasteCR \x82̎\x9E\x82\xF0\x8Dl\x82\xA6\x82\xE9\x82ƁAAddCR \x82̎\x9E\x82͏\xED\x82\xC9 CR \x82\xAA\x93\xFC\x82\xC1\x82Ă\xA2\x82\xE9\x82̂\xC9 + * \x8Am\x94F\x82\xF0\x8Ds\x82\xED\x82Ȃ\xA2\x8E\x96\x82\xA9\x82\xE7 2 \x82̏ꍇ\x82ł\xE0\x8Am\x94F\x82͕s\x97p\x82Ƃ\xA2\x82\xA4\x88ӎv\x95\\x8E\xA6\x82Ƃ\xE0\x82Ƃ\xEA\x82\xE9\x81B + * 2 \x82̓\xAE\x8D\xEC\x82͂ǂ\xBF\x82炪\x82\xA2\x82\xA2\x82\xA9? + */ + + if (AddCR) { + if (ts.ConfirmChangePasteCR) { + confirm = TRUE; + } + } + else { + pos = strcspn(CBMemPtr, "\r\n"); // \x89\xFC\x8Ds\x82\xAA\x8A܂܂\xEA\x82Ă\xA2\x82\xBD\x82\xE7 + if (CBMemPtr[pos] != '\0') { + confirm = TRUE; + } + } + + // \x8E\xAB\x8F\x91\x82\xF0\x83T\x81[\x83`\x82\xB7\x82\xE9 + if (!confirm && search_dict(ts.ConfirmChangePasteStringFile, CBMemPtr)) { + confirm = TRUE; + } + + if (confirm) { + ret = DialogBox(hInst, MAKEINTRESOURCE(IDD_CLIPBOARD_DIALOG), + HVTWin, (DLGPROC)OnClipboardDlgProc); + /* + * \x88ȑO\x82̓_\x83C\x83A\x83\x8D\x83O\x82̓\xE0\x97e\x82\xF0\x83N\x83\x8A\x83b\x83v\x83{\x81[\x83h\x82ɏ\x91\x82\xAB\x96߂\xB5\x82Ă\xA2\x82\xBD\x82\xAF\x82\xEA\x82ǁA\x95K\x97v? + */ + } + + if (ret == IDOK) { + return TRUE; + } + else { + return FALSE; + } +} + #define BracketStartLen (sizeof(BracketStart)-1) #define BracketEndLen (sizeof(BracketEnd)-1) void CBStartPaste(HWND HWin, BOOL AddCR, BOOL Bracketed) @@ -257,6 +358,11 @@ return; } + if (!CheckClipboardContent(AddCR, Bracketed)) { + CBEndPaste(); + return; + } + // AddCR / Bracket \x97p\x82̗̈悪\x82\xA0\x82邩\x82̊m\x94F\x81A\x96\xB3\x82\xAF\x82\xEA\x82Βlj\xC1\x8Am\x95\xDB StrLen = strlen(CBMemPtr); BuffLen = StrLen + 1; // strlen + NUL @@ -633,15 +739,11 @@ return hMem; } -static char *ClipboardPtr = NULL; -static int PasteCanceled = 0; - static LRESULT CALLBACK OnClipboardDlgProc(HWND hDlgWnd, UINT msg, WPARAM wp, LPARAM lp) { LOGFONT logfont; HFONT font; char uimsg[MAX_UIMSG]; - //char *p; POINT p; RECT rc_dsk, rc_dlg; int dlg_height, dlg_width; @@ -653,14 +755,6 @@ switch (msg) { case WM_INITDIALOG: -#if 0 - for (p = ClipboardPtr; *p ; p++) { - char buf[20]; - _snprintf_s(buf, sizeof(buf), _TRUNCATE, "%02x ", *p); - OutputDebugString(buf); - } -#endif - font = (HFONT)SendMessage(hDlgWnd, WM_GETFONT, 0, 0); GetObject(font, sizeof(LOGFONT), &logfont); if (get_lang_font("DLG_TAHOMA_FONT", hDlgWnd, &logfont, &DlgClipboardFont, ts.UILanguageFile)) { @@ -682,7 +776,7 @@ get_lang_msg("BTN_OK", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile); SetDlgItemText(hDlgWnd, IDOK, ts.UIMsg); - SendMessage(GetDlgItem(hDlgWnd, IDC_EDIT), WM_SETTEXT, 0, (LPARAM)ClipboardPtr); + SendMessage(GetDlgItem(hDlgWnd, IDC_EDIT), WM_SETTEXT, 0, (LPARAM)CBMemPtr); DispConvScreenToWin(CursorX, CursorY, &p.x, &p.y); ClientToScreen(HVTWin, &p); @@ -760,21 +854,46 @@ switch (LOWORD(wp)) { case IDOK: { - int len = SendMessage(GetDlgItem(hDlgWnd, IDC_EDIT), WM_GETTEXTLENGTH, 0, 0); + unsigned len = SendMessage(GetDlgItem(hDlgWnd, IDC_EDIT), WM_GETTEXTLENGTH, 0, 0); HGLOBAL hMem; - char *buf; + INT_PTR result = IDCANCEL; - hMem = GlobalAlloc(GMEM_MOVEABLE, len + 1); - if (hMem) { - buf = GlobalLock(hMem); - SendMessage(GetDlgItem(hDlgWnd, IDC_EDIT), WM_GETTEXT, len + 1, (LPARAM)buf); - GlobalUnlock(hMem); + if (CBMemHandle == NULL) { + CBMemHandle = GlobalAlloc(GHND, len+1); + } + else if (GlobalSize(CBMemHandle) <= len) { + if (CBMemPtr) { + GlobalUnlock(CBMemHandle); + CBMemPtr = NULL; + } + hMem = GlobalReAlloc(CBMemHandle, len+1, 0); + if (hMem) { + CBMemHandle = hMem; + CBMemPtr = GlobalLock(CBMemHandle); + } + else { + /* + * \x83\x81\x83\x82\x83\x8A\x82\xAA\x8Am\x95ۂł\xAB\x82Ȃ\xA9\x82\xC1\x82\xBD\x8Fꍇ\x82͂ǂ\xA4\x82\xB7\x82\xE9\x82ׂ\xAB\x82\xA9\x81B + * + * \x83_\x83C\x83A\x83\x8D\x83O\x82ŏ\x91\x82\xAB\x8A\xB7\x82\xA6\x82\xAA\x8Ds\x82\xED\x82ꂽ\x8Fꍇ\x82\xF0\x8Dl\x82\xA6\x82\xE9\x82\xC6 + * \x83L\x83\x83\x83\x93\x83Z\x83\x8B\x88\xB5\x82\xA2\x82ɂ\xB7\x82\xE9\x95\x{30AA5B3}\x93\x82\xAA\x81A\x91\xE5\x92\xEF\x82͏\x91\x82\xAB\x8A\xB7\x82\xA6\x82\xF0 + * \x8Ds\x82\xED\x82Ȃ\xA2\x82Ǝv\x82\xED\x82\xEA\x82\xE9\x82̂ŁA\x82\xBB\x82̏ꍇ\x82͋\x8C\x97̈\xE6\x82̓\xE0\x97e\x82\xF0 + * \x93\\x82\xE8\x95t\x82\xAF\x82\xBD\x95\xFB\x82\xAA\x90e\x90B + * + * \x8E\xE6\x82肠\x82\xA6\x82\xB8\x82͈\xC0\x91S\x91\xA4\x82ɓ|\x82\xB5\x81A\x8B\x8C\x97̈\xE6\x82\xF0\x8AJ\x95\xFA\x82\xB5\x82ē\\x82\xE8\x95t\x82\xAF\x82\xAA + * \x8Ds\x82\xED\x82\xEA\x82Ȃ\xA2\x82悤\x82ɂ\xB7\x82\xE9\x81B + */ + GlobalFree(CBMemHandle); + CBMemHandle = NULL; + } + } - if (! CBSetClipboard(hDlgWnd, hMem)) { - // \x83N\x83\x8A\x83b\x83v\x83{\x81[\x83h\x82ւ̃Z\x83b\x83g\x82\xAA\x8E\xB8\x94s\x82\xB5\x82\xBD\x8E\x9E\x82\xCD hMem \x82\xF0\x94j\x8A\xFC\x82\xB7\x82\xE9 - // \x90\xAC\x8C\x{1C2D42}\xBD\x8Fꍇ\x82̓N\x83\x8A\x83b\x83v\x83{\x81[\x83h\x82\xAA\x8F\x8A\x8E\x9D\x82\xB5\x82Ă\xA2\x82\xE9\x82̂ŁA\x94j\x8A\xFC\x82\xB5\x82Ă͂\xA2\x82\xAF\x82Ȃ\xA2 - GlobalFree(hMem); + if (CBMemHandle) { + if (CBMemPtr == NULL) { + CBMemPtr = GlobalLock(CBMemHandle); } + SendMessage(GetDlgItem(hDlgWnd, IDC_EDIT), WM_GETTEXT, GlobalSize(CBMemHandle), (LPARAM)CBMemPtr); + result = IDOK; } if (DlgClipboardFont != NULL) { @@ -782,13 +901,11 @@ } DestroyWindow(hStatus); - EndDialog(hDlgWnd, IDOK); + EndDialog(hDlgWnd, result); } break; case IDCANCEL: - PasteCanceled = 1; - if (DlgClipboardFont != NULL) { DeleteObject(DlgClipboardFont); } @@ -801,13 +918,6 @@ return FALSE; } -#if 0 - case WM_CLOSE: - PasteCanceled = 1; - EndDialog(hDlgWnd, 0); - return TRUE; -#endif - case WM_SIZE: { // \x8DĔz\x92u @@ -871,150 +981,3 @@ } return TRUE; } - -// \x83t\x83@\x83C\x83\x8B\x82ɒ\xE8\x8B`\x82\xB3\x82ꂽ\x95\xB6\x8E\x9A\x97Atext\x82Ɋ܂܂\xEA\x82邩\x82ׂ\xE9\x81B -static int search_clipboard(char *filename, char *text) -{ - int ret = 0; // no hit - FILE *fp = NULL; - char buf[256]; - int len; - - if (filename == NULL || filename[0] == '\0') - goto error; - - fp = fopen(filename, "r"); - if (fp == NULL) - goto error; - - // TODO: \x88\xEA\x8Ds\x82\xAA256byte\x82\xA6\x82Ă\xA2\x82\xE9\x8Fꍇ\x82̍l\x97\xB6 - while (fgets(buf, sizeof(buf), fp) != NULL) { - len = strlen(buf); - if (buf[len - 1] == '\n') - buf[len - 1] = '\0'; - if (buf[0] == '\0') - continue; - if (strstr(text, buf)) { // hit - ret = 1; - break; - } - } - -error: - if (fp) - fclose(fp); - - return (ret); -} - - -// -// \x83N\x83\x8A\x83b\x83v\x83{\x81[\x83h\x82ɉ\xFC\x8Ds\x83R\x81[\x83h\x82\xAA\x8A܂܂\xEA\x82Ă\xA2\x82\xBD\x82\xE7\x81A\x8Am\x94F\x83_\x83C\x83A\x83\x8D\x83O\x82\xF0\x95\\x8E\xA6\x82\xB7\x82\xE9\x81B -// \x83N\x83\x8A\x83b\x83v\x83{\x81[\x83h\x82̕ύX\x82\xE0\x89\\x81B -// -// return 0: Cancel -// 1: Paste OK -// -// (2008.2.3 yutaka) -// -int CBStartPasteConfirmChange(HWND HWin, BOOL AddCR) -{ - UINT Cf; - HANDLE hText; - char *pText; - int pos; - int ret = 0; - BOOL confirm = FALSE; - HANDLE wide_hText; - LPWSTR wide_buf; - int mb_len; - - if (!ts.ConfirmChangePaste) - return 1; - - if (! cv.Ready) - goto error; - if (TalkStatus!=IdTalkKeyb) - goto error; - - if (IsClipboardFormatAvailable(CF_UNICODETEXT)) - Cf = CF_UNICODETEXT; - else if (IsClipboardFormatAvailable(CF_TEXT)) - Cf = CF_TEXT; - else if (IsClipboardFormatAvailable(CF_OEMTEXT)) - Cf = CF_OEMTEXT; - else - goto error; - - if (!OpenClipboard(HWin)) - goto error; - - if (Cf == CF_UNICODETEXT) { - wide_hText = GetClipboardData(CF_UNICODETEXT); - if (wide_hText != NULL) { - wide_buf = GlobalLock(wide_hText); - mb_len = WideCharToMultiByte(CP_ACP, 0, wide_buf, -1, NULL, 0, NULL, NULL); - ClipboardPtr = (char *)calloc(sizeof(char), mb_len); - WideCharToMultiByte(CP_ACP, 0, wide_buf, -1, ClipboardPtr, mb_len, NULL, NULL); - GlobalUnlock(wide_hText); - } - else { - CloseClipboard(); - goto error; - } - } - else { - hText = GetClipboardData(Cf); - if (hText != NULL) { - pText = (char *)GlobalLock(hText); - ClipboardPtr = (char *)calloc(sizeof(char), strlen(pText)+1); - memcpy(ClipboardPtr, pText, strlen(pText)); - GlobalUnlock(hText); - } - else { - CloseClipboard(); - goto error; - } - } - CloseClipboard(); - - if (AddCR) { - if (ts.ConfirmChangePasteCR) { - confirm = TRUE; - } - } - else { - pos = strcspn(ClipboardPtr, "\r\n"); // \x89\xFC\x8Ds\x82\xAA\x8A܂܂\xEA\x82Ă\xA2\x82\xBD\x82\xE7 - if (ClipboardPtr[pos] != '\0' || AddCR) { - confirm = TRUE; - } - } - - // \x8E\xAB\x8F\x91\x82\xF0\x83T\x81[\x83`\x82\xB7\x82\xE9 - if (!confirm && search_clipboard(ts.ConfirmChangePasteStringFile, ClipboardPtr)) { - confirm = TRUE; - } - - if (confirm) { - PasteCanceled = 0; - ret = DialogBox(hInst, MAKEINTRESOURCE(IDD_CLIPBOARD_DIALOG), - HVTWin, (DLGPROC)OnClipboardDlgProc); - if (ret == 0 || ret == -1) { - ret = GetLastError(); - } - - if (PasteCanceled) { - ret = 0; - goto error; - } - } - - ret = 1; - -error: - if (ClipboardPtr != NULL) { - free(ClipboardPtr); - ClipboardPtr = NULL; - } - return (ret); -} Modified: trunk/teraterm/teraterm/clipboar.h =================================================================== --- trunk/teraterm/teraterm/clipboar.h 2016-08-01 09:01:28 UTC (rev 6455) +++ trunk/teraterm/teraterm/clipboar.h 2016-08-01 09:01:30 UTC (rev 6456) @@ -17,7 +17,6 @@ void CBSend(); void CBEcho(); void CBEndPaste(); -int CBStartPasteConfirmChange(HWND HWin, BOOL AddCR); #ifdef __cplusplus } Modified: trunk/teraterm/teraterm/vtwin.cpp =================================================================== --- trunk/teraterm/teraterm/vtwin.cpp 2016-08-01 09:01:28 UTC (rev 6455) +++ trunk/teraterm/teraterm/vtwin.cpp 2016-08-01 09:01:30 UTC (rev 6456) @@ -941,12 +941,10 @@ } if (Paste) { - if (CBStartPasteConfirmChange(HVTWin, FALSE)) { - CBStartPaste(HVTWin, FALSE, BracketedPasteMode()); - // \x83X\x83N\x83\x8D\x81[\x83\x8B\x88ʒu\x82\xF0\x83\x8A\x83Z\x83b\x83g - if (WinOrgY != 0) { - DispVScroll(SCROLL_BOTTOM, 0); - } + CBStartPaste(HVTWin, FALSE, BracketedPasteMode()); + // \x83X\x83N\x83\x8D\x81[\x83\x8B\x88ʒu\x82\xF0\x83\x8A\x83Z\x83b\x83g + if (WinOrgY != 0) { + DispVScroll(SCROLL_BOTTOM, 0); } } } @@ -4439,24 +4437,20 @@ void CVTWindow::OnEditPaste() { // add confirm (2008.2.4 yutaka) - if (CBStartPasteConfirmChange(HVTWin, FALSE)) { - CBStartPaste(HVTWin, FALSE, BracketedPasteMode()); - // \x83X\x83N\x83\x8D\x81[\x83\x8B\x88ʒu\x82\xF0\x83\x8A\x83Z\x83b\x83g - if (WinOrgY != 0) { - DispVScroll(SCROLL_BOTTOM, 0); - } + CBStartPaste(HVTWin, FALSE, BracketedPasteMode()); + // \x83X\x83N\x83\x8D\x81[\x83\x8B\x88ʒu\x82\xF0\x83\x8A\x83Z\x83b\x83g + if (WinOrgY != 0) { + DispVScroll(SCROLL_BOTTOM, 0); } } void CVTWindow::OnEditPasteCR() { // add confirm (2008.3.11 maya) - if (CBStartPasteConfirmChange(HVTWin, TRUE)) { - CBStartPaste(HVTWin, TRUE, BracketedPasteMode()); - // \x83X\x83N\x83\x8D\x81[\x83\x8B\x88ʒu\x82\xF0\x83\x8A\x83Z\x83b\x83g - if (WinOrgY != 0) { - DispVScroll(SCROLL_BOTTOM, 0); - } + CBStartPaste(HVTWin, TRUE, BracketedPasteMode()); + // \x83X\x83N\x83\x8D\x81[\x83\x8B\x88ʒu\x82\xF0\x83\x8A\x83Z\x83b\x83g + if (WinOrgY != 0) { + DispVScroll(SCROLL_BOTTOM, 0); } }