[Ttssh2-commit] [8126] URLのダブルクリックでブラウザなどが起動

Back to archive index
scmno****@osdn***** scmno****@osdn*****
2019年 9月 13日 (金) 00:58:43 JST


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;


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