diff options
| author | Nikita Langer <nikitalanger@icloud.com> | 2026-05-31 09:57:10 +0200 |
|---|---|---|
| committer | Nikita Langer <nikitalanger@icloud.com> | 2026-05-31 09:57:10 +0200 |
| commit | 22c5f5f866d967d3d41f651c14f3a2fd11da0038 (patch) | |
| tree | f205fe53d20330a34fe3ea29d45c16a18d22a52b /st.c | |
| parent | c46a160aa0618182c92f8a135fd8a35e53cdb4bf (diff) | |
| download | st-22c5f5f866d967d3d41f651c14f3a2fd11da0038.tar.gz st-22c5f5f866d967d3d41f651c14f3a2fd11da0038.tar.bz2 st-22c5f5f866d967d3d41f651c14f3a2fd11da0038.tar.xz st-22c5f5f866d967d3d41f651c14f3a2fd11da0038.zip | |
Cliuck url
Diffstat (limited to 'st.c')
| -rw-r--r-- | st.c | 89 |
1 files changed, 89 insertions, 0 deletions
@@ -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) { |
