Revision: 8126 https://osdn.net/projects/ttssh2/scm/svn/commits/8126 Author: zmatsuo Date: 2019-09-13 00:58:43 +0900 (Fri, 13 Sep 2019) Log Message: ----------- URLのダブルクリックでブラウザなどが起動 Modified Paths: -------------- branches/unicode_buf/teraterm/teraterm/buffer.c -------------- next part -------------- Modified: branches/unicode_buf/teraterm/teraterm/buffer.c =================================================================== --- branches/unicode_buf/teraterm/teraterm/buffer.c 2019-09-12 15:58:32 UTC (rev 8125) +++ branches/unicode_buf/teraterm/teraterm/buffer.c 2019-09-12 15:58:43 UTC (rev 8126) @@ -71,9 +71,6 @@ } buff_char_t; #endif -// URL\x82\xF0\x8B\xAD\x92\xB2\x82\xB7\x82\xE9\x81i\x90莁\x83p\x83b\x83` 2005/4/2\x81j -#define URL_EMPHASIS 1 - #define BuffXMax TermWidthMax //#define BuffYMax 100000 //#define BuffSizeMax 8000000 @@ -2311,10 +2308,8 @@ return url_char[u32] == 0 ? FALSE : TRUE; } -/* begin - ishizaki */ static void markURL(int x) { -#ifdef URL_EMPHASIS LONG PrevCharPtr; CHAR PrevCharAttr, PrevCharCode; @@ -2403,9 +2398,7 @@ rc.bottom = CaretY + FontHeight; InvalidateRect(HVTWin, &rc, FALSE); } -#endif } -/* end - ishizaki */ void BuffPutChar(BYTE b, TCharAttr Attr, BOOL Insert) // Put a character in the buffer at the current position @@ -3636,12 +3629,32 @@ } } -/* start - ishizaki */ +static void invokeBrowserWithUrl(const char *url) +{ + if (strncmp(url, "http://", strlen("http://")) == 0 || + strncmp(url, "https://", strlen("https://")) == 0 || + strncmp(url, "ftp://", strlen("ftp://")) == 0) { + if (strlen(ts.ClickableUrlBrowser) > 0) { + char param[1024]; + _snprintf_s(param, sizeof(param), _TRUNCATE, "%s %s", + ts.ClickableUrlBrowserArg, url); + if (ShellExecuteA(NULL, NULL, ts.ClickableUrlBrowser, param, NULL,SW_SHOWNORMAL) >= (HINSTANCE)32) { + return; // \x8E\xC0\x8Ds\x82ł\xAB\x82\xBD + } + // \x83R\x83}\x83\x93\x83h\x82̎\xC0\x8Ds\x82Ɏ\xB8\x94s\x82\xB5\x82\xBD\x8Fꍇ\x82͒ʏ\xED\x82Ɠ\xAF\x82\xB6\x8F\x88\x97\x9D\x82\xF0\x82\xB7\x82\xE9 + } + ShellExecuteA(NULL, NULL, url, NULL, NULL,SW_SHOWNORMAL); + } + else { + ShellExecuteA(NULL, NULL, url, NULL, NULL,SW_SHOWNORMAL); + } +} + +#if !UNICODE_INTERNAL_BUFF static void invokeBrowser(LONG ptr) { -#ifdef URL_EMPHASIS LONG i, start, end; - char url[1024], param[1024]; + char url[1024]; char *uptr, ch; start = ptr; @@ -3671,27 +3684,35 @@ } *uptr = '\0'; - if (strncmp(url, "http://", strlen("http://")) == 0 || - strncmp(url, "https://", strlen("https://")) == 0 || - strncmp(url, "ftp://", strlen("ftp://")) == 0) { - if (strlen(ts.ClickableUrlBrowser) > 0) { - _snprintf_s(param, sizeof(param), _TRUNCATE, "%s %s", - ts.ClickableUrlBrowserArg, url); - if ((int)ShellExecuteA(NULL, NULL, ts.ClickableUrlBrowser, param, NULL,SW_SHOWNORMAL) < 32) { - // \x83R\x83}\x83\x93\x83h\x82̎\xC0\x8Ds\x82Ɏ\xB8\x94s\x82\xB5\x82\xBD\x8Fꍇ\x82͒ʏ\xED\x82Ɠ\xAF\x82\xB6\x8F\x88\x97\x9D\x82\xF0\x82\xB7\x82\xE9 - ShellExecuteA(NULL, NULL, url, NULL, NULL,SW_SHOWNORMAL); - } - } - else { - ShellExecuteA(NULL, NULL, url, NULL, NULL,SW_SHOWNORMAL); - } + invokeBrowserWithUrl(url); +} +#endif + +#if UNICODE_INTERNAL_BUFF +static void invokeBrowserW(int x, int y) +{ + const LONG TmpPtr = GetLinePtr(y); + int sx; + int ex; + + sx = x; + while (AttrBuff[TmpPtr + sx] & AttrURL) { + sx--; } - else { - ShellExecuteA(NULL, NULL, url, NULL, NULL,SW_SHOWNORMAL); + sx++; + + ex = x; + while (AttrBuff[TmpPtr + ex] & AttrURL) { + ex++; } + + wchar_t *url_w = BuffGetStringForCB(sx, y, ex, y, FALSE, NULL); + char *url = ToCharW(url_w); + invokeBrowserWithUrl(url); + free(url); + free(url_w); +} #endif -} -/* end - ishizaki */ void ChangeSelectRegion() { @@ -3802,7 +3823,11 @@ ChangeSelectRegion(); url_invoked = TRUE; +#if UNICODE_INTERNAL_BUFF + invokeBrowserW(X, Y); +#else invokeBrowser(TmpPtr+X); +#endif SelectStart.x = 0; SelectStart.y = 0;