summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorBerke Viktor <bviktor@hexchat.org>2012-10-07 03:00:52 +0200
committerBerke Viktor <bviktor@hexchat.org>2012-10-07 03:00:52 +0200
commit59f32ccb3a1f192c9faf8f51330db918c4ee3d46 (patch)
treed37b82f478310815d6e86805e42efd9fe6228445 /src
parentb4e78e04551fb9836d320f01143d6aa2661cc7f3 (diff)
Fix URL detection
Diffstat (limited to 'src')
-rw-r--r--src/common/url.c10
-rw-r--r--src/common/url.h2
-rw-r--r--src/fe-gtk/fe-gtk.c12
-rw-r--r--src/fe-gtk/maingui.c1
4 files changed, 20 insertions, 5 deletions
diff --git a/src/common/url.c b/src/common/url.c
index 31a45d49..9b4751ae 100644
--- a/src/common/url.c
+++ b/src/common/url.c
@@ -202,6 +202,16 @@ url_check_word (char *word, int len)
 	const char *at, *dot;
 	int i, dots;
 
+	/* this is pretty much the same as in logmask_is_fullpath() except with length checks */
+#ifdef WIN32
+	if ((len > 1 && word[0] == '\\') || (len > 2 && (((word[0] >= 'A' && word[0] <= 'Z') || (word[0] >= 'a' && word[0] <= 'z')) && word[1] == ':')))
+#else
+	if (len > 1 && word[0] != '/')
+#endif
+	{
+		return WORD_PATH;
+	}
+
 	if (len > 1 && word[1] == '#' && strchr("@+^%*#", word[0]))
 		return WORD_CHANNEL;
 
diff --git a/src/common/url.h b/src/common/url.h
index 487a2007..ab4247e0 100644
--- a/src/common/url.h
+++ b/src/common/url.h
@@ -8,7 +8,9 @@ extern void *url_tree;
 #define WORD_CHANNEL 3
 #define WORD_HOST    4
 #define WORD_EMAIL   5
+/* anything >0 will be displayed as a link by gtk_xtext_motion_notify() */
 #define WORD_DIALOG  -1
+#define WORD_PATH    -2
 
 void url_clear (void);
 void url_save (const char *fname, const char *mode, gboolean fullpath);
diff --git a/src/fe-gtk/fe-gtk.c b/src/fe-gtk/fe-gtk.c
index ad401bca..29748f0b 100644
--- a/src/fe-gtk/fe-gtk.c
+++ b/src/fe-gtk/fe-gtk.c
@@ -1080,16 +1080,18 @@ fe_open_url_inner (const char *url)
 static void
 fe_open_url_locale (const char *url)
 {
-#ifndef WIN32
-	if (url[0] != '/' && strchr (url, ':') == NULL)
+	/* the http:// part's missing, prepend it, otherwise it won't always work */
+	if (strchr (url, ':') == NULL)
 	{
 		url = g_strdup_printf ("http://%s", url);
 		fe_open_url_inner (url);
 		g_free ((char *)url);
-		return;
 	}
-#endif
-	fe_open_url_inner (url);
+	/* we have a sane URL, send it to the browser untouched */
+	else
+	{
+		fe_open_url_inner (url);
+	}
 }
 
 void
diff --git a/src/fe-gtk/maingui.c b/src/fe-gtk/maingui.c
index 32fa83cb..41cbb2a6 100644
--- a/src/fe-gtk/maingui.c
+++ b/src/fe-gtk/maingui.c
@@ -2291,6 +2291,7 @@ mg_word_clicked (GtkWidget *xtext, char *word, GdkEventButton *even)
 	switch (mg_word_check (xtext, word, strlen (word)))
 	{
 	case 0:
+	case WORD_PATH:
 		menu_middlemenu (sess, even);
 		break;
 	case WORD_URL: