patches/vte-07-selection-perf-improve.diff
author dcarbery
Fri, 24 Nov 2006 16:37:59 +0000
branch217update
changeset 19096 d542fc2c823e
parent 7752 4abd61edfaf7
permissions -rw-r--r--
Merged trunk changes r9797:9829 into 217update branch.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
7752
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
     1
--- vte-0.11.11/src/vte.c	2004-11-05 11:32:07.000000000 +0530
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
     2
+++ vte-0.11.11-new/src/vte.c	2004-11-05 11:55:19.350582000 +0530
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
     3
@@ -1530,6 +1530,91 @@ vte_terminal_match_add(VteTerminal *term
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
     4
 	return new_regex.tag;
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
     5
 }
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
     6
 
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
     7
+
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
     8
+
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
     9
+
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    10
+
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    11
+static gboolean find_url(const char *data, int cursor, int *start, int *end)
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    12
+{
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    13
+	const char *allowed = "-_$.+!*(),;:@&=/?~#%";
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    14
+	const char *trim = ".),";
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    15
+	const char *starts[] = { "news://", "telnet://", "nttp://", "file://",
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    16
+				 "http://", "ftp://", "https://",
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    17
+				 "www", "ftp" };
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    18
+	const int nstarts = sizeof(starts) / sizeof(*starts);
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    19
+	gboolean dot;
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    20
+	int i, j;
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    21
+
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    22
+	/* Back up to just after the most recent non-URL character. */
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    23
+	for (i = cursor; i > 0; i--) {
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    24
+		if (!isalnum(data[i - 1]) && !strchr(allowed, data[i - 1]))
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    25
+			break;
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    26
+	}
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    27
+
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    28
+	/* Find an appropriate beginning. */
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    29
+	for (; i <= cursor; i++) {
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    30
+		if (!strchr("fhntw", data[i]))
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    31
+			continue;
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    32
+		for (j = 0; j < nstarts; j++) {
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    33
+		  	if (strncmp(data + i, starts[j],
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    34
+				    strlen(starts[j])) == 0)
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    35
+				break;
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    36
+		}
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    37
+		if (j < nstarts)
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    38
+			break;
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    39
+	}
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    40
+	if (i > cursor)
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    41
+		return FALSE;
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    42
+	*start = i;
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    43
+	i += strlen(starts[j]);
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    44
+
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    45
+	/* Find end of domain part.  We must see at least one dot if
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    46
+	 * our beginning wasn't a real URL scheme. */
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    47
+	dot = FALSE;
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    48
+	for (; data[i]; i++) {
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    49
+		if (data[i] == '.')
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    50
+			dot = TRUE;
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    51
+		else if (!isalnum(data[i]) && data[i] != '-')
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    52
+			break;
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    53
+	}
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    54
+	if (!dot && !strchr(starts[j], ':'))
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    55
+		return FALSE;
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    56
+
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    57
+	if (data[i] == ':')
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    58
+	  {
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    59
+	    i++;
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    60
+	    while (isdigit(data[i]))
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    61
+	      i++;
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    62
+	  }
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    63
+
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    64
+	/* If we've passed the cursor, then we only want this part. */
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    65
+	if (i > cursor) {
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    66
+		*end = i;
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    67
+		return TRUE;
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    68
+	}
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    69
+
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    70
+	if (data[i++] != '/')
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    71
+		return FALSE;
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    72
+
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    73
+	/* Find the end of the URL. */
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    74
+	for (; data[i]; i++) {
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    75
+		if (!isalnum(data[i]) && !strchr(allowed, data[i]))
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    76
+			break;
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    77
+	}
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    78
+	if (i <= cursor)
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    79
+		return FALSE;
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    80
+
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    81
+	/* If the last character looks like ending punctuation, trim it. */
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    82
+	*end = (strchr(trim, data[i - 1]) != NULL) ? i - 1 : i;
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    83
+	return TRUE;
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    84
+}
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    85
+
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    86
+
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    87
+
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    88
+
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    89
+
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    90
+
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    91
+
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    92
 /**
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    93
  * vte_terminal_match_set_cursor:
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    94
  * @terminal: a #VteTerminal
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    95
@@ -1590,7 +1675,7 @@ vte_terminal_match_check_internal(VteTer
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    96
 				  long column, glong row,
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    97
 				  int *tag, int *start, int *end)
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    98
 {
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
    99
-	int i, j, ret, offset;
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   100
+	int i, j, ret, offset, st, en;
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   101
 	struct vte_match_regex *regex = NULL;
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   102
 	struct _VteCharAttributes *attr = NULL;
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   103
 	gssize coffset;
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   104
@@ -1655,98 +1740,17 @@ vte_terminal_match_check_internal(VteTer
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   105
 		return NULL;
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   106
 	}
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   107
 
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   108
-	/* Now iterate over each regex we need to match against. */
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   109
-	for (i = 0; i < terminal->pvt->match_regexes->len; i++) {
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   110
-		regex = &g_array_index(terminal->pvt->match_regexes,
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   111
-				       struct vte_match_regex,
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   112
-				       i);
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   113
-		/* Skip holes. */
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   114
-		if (regex->tag < 0) {
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   115
-			continue;
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   116
-		}
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   117
-		/* We'll only match the first item in the buffer which
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   118
-		 * matches, so we'll have to skip each match until we
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   119
-		 * stop getting matches. */
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   120
-		coffset = 0;
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   121
-		ret = _vte_regex_exec(regex->reg,
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   122
-				      terminal->pvt->match_contents + coffset,
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   123
-				      G_N_ELEMENTS(matches),
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   124
-				      matches);
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   125
-		while (ret == 0) {
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   126
-			for (j = 0;
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   127
-			     (j < G_N_ELEMENTS(matches)) &&
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   128
-			     (matches[j].rm_so != -1);
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   129
-			     j++) {
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   130
-				/* The offsets should be "sane". */
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   131
-				g_assert(matches[j].rm_so + coffset <
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   132
-					 terminal->pvt->match_attributes->len);
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   133
-				g_assert(matches[j].rm_eo + coffset <=
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   134
-					 terminal->pvt->match_attributes->len);
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   135
-#ifdef VTE_DEBUG
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   136
-				if (_vte_debug_on(VTE_DEBUG_MISC)) {
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   137
-					char *match;
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   138
-					struct _VteCharAttributes *sattr, *eattr;
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   139
-					match = g_strndup(terminal->pvt->match_contents + matches[j].rm_so + coffset,
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   140
-							  matches[j].rm_eo - matches[j].rm_so);
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   141
-					sattr = &g_array_index(terminal->pvt->match_attributes,
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   142
-							       struct _VteCharAttributes,
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   143
-							       matches[j].rm_so + coffset);
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   144
-					eattr = &g_array_index(terminal->pvt->match_attributes,
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   145
-							       struct _VteCharAttributes,
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   146
-							       matches[j].rm_eo + coffset - 1);
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   147
-					fprintf(stderr, "Match %d `%s' from %d(%ld,%ld) to %d(%ld,%ld) (%d).\n",
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   148
-						j, match,
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   149
-						matches[j].rm_so + coffset,
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   150
-						sattr->column,
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   151
-						sattr->row,
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   152
-						matches[j].rm_eo + coffset - 1,
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   153
-						eattr->column,
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   154
-						eattr->row,
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   155
-						offset);
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   156
-					g_free(match);
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   157
+
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   158
+	if (find_url(terminal->pvt->match_contents, offset, &st, &en)) {
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   159
+		if (tag)
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   160
+			*tag = 0;
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   161
+		if (start)
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   162
+			*start = st;
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   163
+		if (end)
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   164
+			*end = en - 1;
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   165
+		return g_strndup(terminal->pvt->match_contents + st, en - st);
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   166
 
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   167
 				}
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   168
-#endif
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   169
-				/* Snip off any final newlines. */
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   170
-				while ((matches[j].rm_eo > matches[j].rm_so) &&
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   171
-				       (terminal->pvt->match_contents[coffset + matches[j].rm_eo - 1] == '\n')) {
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   172
-					matches[j].rm_eo--;
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   173
-				}
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   174
-				/* If the pointer is in this substring,
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   175
-				 * then we're done. */
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   176
-				if ((offset >= (matches[j].rm_so + coffset)) &&
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   177
-				    (offset < (matches[j].rm_eo + coffset))) {
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   178
-					if (tag != NULL) {
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   179
-						*tag = regex->tag;
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   180
-					}
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   181
-					if (start != NULL) {
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   182
-						*start = coffset +
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   183
-							 matches[j].rm_so;
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   184
-					}
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   185
-					if (end != NULL) {
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   186
-						*end = coffset +
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   187
-						       matches[j].rm_eo - 1;
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   188
-					}
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   189
-					if (GTK_WIDGET_REALIZED(GTK_WIDGET(terminal))) {
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   190
-						gdk_window_set_cursor((GTK_WIDGET(terminal))->window,
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   191
-								      regex->cursor);
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   192
-					}
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   193
-					terminal->pvt->match_previous = regex->tag;
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   194
-					return g_strndup(terminal->pvt->match_contents + coffset + matches[j].rm_so,
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   195
-							 matches[j].rm_eo - matches[j].rm_so);
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   196
-				}
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   197
-			}
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   198
-			/* Skip past the beginning of this match to
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   199
-			 * look for more. */
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   200
-			coffset += (matches[0].rm_so + 1);
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   201
-			ret = _vte_regex_exec(regex->reg,
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   202
-					      terminal->pvt->match_contents +
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   203
-					      coffset,
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   204
-					      G_N_ELEMENTS(matches),
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   205
-					      matches);
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   206
-		}
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   207
-	}
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   208
-	terminal->pvt->match_previous = -1;
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   209
 	return NULL;
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   210
 }
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   211
 
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   212
@@ -11832,6 +11836,7 @@ vte_terminal_finalize(GObject *object)
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   213
 						     terminal);
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   214
 		g_object_unref(G_OBJECT(terminal->pvt->pty_reaper));
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   215
 	}
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   216
+	terminal->pvt->pty_pid = -1;
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   217
 	terminal->pvt->pty_reaper = NULL;
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   218
 
4abd61edfaf7 2006-07-25 Damien Carbery <[email protected]>
dc144907
parents:
diff changeset
   219
 	/* Stop processing input. */