From 22c5f5f866d967d3d41f651c14f3a2fd11da0038 Mon Sep 17 00:00:00 2001 From: Nikita Langer Date: Sun, 31 May 2026 09:57:10 +0200 Subject: Cliuck url --- st.c | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) (limited to 'st.c') diff --git a/st.c b/st.c index d7afdf5..8876a14 100644 --- a/st.c +++ b/st.c @@ -643,6 +643,95 @@ getsel(void) return str; } +char * +strstrany(char* s, char** strs) { + char *match; + for (int i = 0; strs[i]; i++) { + if ((match = strstr(s, strs[i]))) { + return match; + } + } + return NULL; +} + +void +highlighturls(void) +{ + char *match; + char *linestr = calloc(sizeof(char), term.col+1); /* assume ascii */ + for (int i = term.top; i < term.bot; i++) { + int url_start = -1; + for (int j = 0; j < term.col; j++) { + if (term.line[i][j].u < 127) { + linestr[j] = term.line[i][j].u; + } + linestr[term.col] = '\0'; + } + while ((match = strstrany(linestr + url_start + 1, urlprefixes))) { + url_start = match - linestr; + for (int c = url_start; c < term.col && strchr(urlchars, linestr[c]); c++) { + term.line[i][c].mode |= ATTR_URL; + tsetdirt(i, c); + } + } + } + free(linestr); +} + +void +unhighlighturls(void) +{ + for (int i = term.top; i < term.bot; i++) { + for (int j = 0; j < term.col; j++) { + Glyph* g = &term.line[i][j]; + if (g->mode & ATTR_URL) { + g->mode &= ~ATTR_URL; + tsetdirt(i, j); + } + } + } + return; +} + +void +followurl(int x, int y) { + char *linestr = calloc(sizeof(char), term.col+1); /* assume ascii */ + char *match; + for (int i = 0; i < term.col; i++) { + if (term.line[x][i].u < 127) { + linestr[i] = term.line[x][i].u; + } + linestr[term.col] = '\0'; + } + int url_start = -1; + while ((match = strstrany(linestr + url_start + 1, urlprefixes))) { + url_start = match - linestr; + int url_end = url_start; + for (int c = url_start; c < term.col && strchr(urlchars, linestr[c]); c++) { + url_end++; + } + if (url_start <= y && y < url_end) { + linestr[url_end] = '\0'; + break; + } + } + if (url_start == -1) { + free(linestr); + return; + } + + pid_t chpid; + if ((chpid = fork()) == 0) { + if (fork() == 0) + execlp(urlhandler, urlhandler, linestr + url_start, NULL); + exit(1); + } + if (chpid > 0) + waitpid(chpid, NULL, 0); + free(linestr); + unhighlighturls(); +} + void selclear(void) { -- cgit