sites

public wiki contents of suckless.org
git clone git://git.suckless.org/sites
Log | Files | Refs

commit 63110a55873fb01f95f19487570151834f4ac33c
parent 84079d67ae37d557a30c1d716ae01d57380d5a36
Author: Matthew Parnell <matt@parnmatt.co.uk>
Date:   Mon, 14 Aug 2017 15:50:45 +0100

[st][copyurl] add missing patches

st-copyurl-0.7.diff and st-copyurl-20170802-e2ee5ee.diff were missing
from 1543a443ad5f6254b82451b07a55a27308cfb125

As mentioned in 1543a44 message:

> copyurl relies on an X-specific function; a quick hack is in place
> to keep functionality; original author / current maintainer should
> investigate alternative approach.

Diffstat:
Ast.suckless.org/patches/copyurl/st-copyurl-0.7.diff | 88+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ast.suckless.org/patches/copyurl/st-copyurl-20170802-e2ee5ee.diff | 106+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 194 insertions(+), 0 deletions(-)

diff --git a/st.suckless.org/patches/copyurl/st-copyurl-0.7.diff b/st.suckless.org/patches/copyurl/st-copyurl-0.7.diff @@ -0,0 +1,88 @@ +diff --git a/config.def.h b/config.def.h +index b41747f..50321db 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -172,6 +172,7 @@ static Shortcut shortcuts[] = { + { MODKEY|ShiftMask, XK_C, clipcopy, {.i = 0} }, + { MODKEY|ShiftMask, XK_V, clippaste, {.i = 0} }, + { MODKEY, XK_Num_Lock, numlock, {.i = 0} }, ++ { MODKEY, XK_l, copyurl, {.i = 0} }, + }; + + /* +diff --git a/st.c b/st.c +index 2594c65..78201ff 100644 +--- a/st.c ++++ b/st.c +@@ -336,6 +336,7 @@ static void printsel(const Arg *); + static void printscreen(const Arg *) ; + static void toggleprinter(const Arg *); + static void sendbreak(const Arg *); ++static void copyurl(const Arg *); + + /* Config.h for applying patches and the configuration. */ + #include "config.h" +@@ -4402,3 +4403,63 @@ run: + return 0; + } + ++/* select and copy the previous url on screen (do nothing if there's no url). ++ * known bug: doesn't handle urls that span multiple lines (wontfix) ++ * known bug: only finds first url on line (mightfix) ++ */ ++void ++copyurl(const Arg *arg) { ++ /* () and [] can appear in urls, but excluding them here will reduce false ++ * positives when figuring out where a given url ends. ++ */ ++ static char URLCHARS[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" ++ "abcdefghijklmnopqrstuvwxyz" ++ "0123456789-._~:/?#@!$&'*+,;=%"; ++ ++ int i, row, startrow; ++ char *linestr = calloc(sizeof(char), term.col+1); /* assume ascii */ ++ char *c, *match = NULL; ++ ++ row = (sel.ob.x >= 0 && sel.nb.y > 0) ? sel.nb.y-1 : term.bot; ++ LIMIT(row, term.top, term.bot); ++ startrow = row; ++ ++ /* find the start of the last url before selection */ ++ do { ++ for (i = 0; i < term.col; ++i) { ++ if (term.line[row][i].u > 127) /* assume ascii */ ++ continue; ++ linestr[i] = term.line[row][i].u; ++ } ++ linestr[term.col] = '\0'; ++ if ((match = strstr(linestr, "http://")) ++ || (match = strstr(linestr, "https://"))) ++ break; ++ if (--row < term.top) ++ row = term.bot; ++ } while (row != startrow); ++ ++ if (match) { ++ /* must happen before trim */ ++ selclear(NULL); ++ sel.ob.x = strlen(linestr) - strlen(match); ++ ++ /* trim the rest of the line from the url match */ ++ for (c = match; *c != '\0'; ++c) ++ if (!strchr(URLCHARS, *c)) { ++ *c = '\0'; ++ break; ++ } ++ ++ /* select and copy */ ++ sel.mode = 1; ++ sel.type = SEL_REGULAR; ++ sel.oe.x = sel.ob.x + strlen(match)-1; ++ sel.ob.y = sel.oe.y = row; ++ selnormalize(); ++ tsetdirt(sel.nb.y, sel.ne.y); ++ selcopy(0); ++ } ++ ++ free(linestr); ++} diff --git a/st.suckless.org/patches/copyurl/st-copyurl-20170802-e2ee5ee.diff b/st.suckless.org/patches/copyurl/st-copyurl-20170802-e2ee5ee.diff @@ -0,0 +1,106 @@ +diff --git a/config.def.h b/config.def.h +index fd80923..a2eb85e 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -178,6 +178,7 @@ Shortcut shortcuts[] = { + { MODKEY|ShiftMask, XK_V, clippaste, {.i = 0} }, + { MODKEY, XK_Num_Lock, numlock, {.i = 0} }, + { MODKEY, XK_Control_L, iso14755, {.i = 0} }, ++ { MODKEY, XK_l, copyurl, {.i = 0} }, + }; + + /* +diff --git a/st.c b/st.c +index 1e4196e..df9cc7d 100644 +--- a/st.c ++++ b/st.c +@@ -138,6 +138,7 @@ static void printscreen(const Arg *) ; + static void iso14755(const Arg *); + static void toggleprinter(const Arg *); + static void sendbreak(const Arg *); ++static void copyurl(const Arg *); + + /* config.h for applying patches and the configuration. */ + #include "config.h" +@@ -2640,3 +2641,68 @@ usage(void) + " [-T title] [-t title] [-w windowid] -l line" + " [stty_args ...]\n", argv0, argv0); + } ++ ++ ++/* predeclare selcopy, defined in x.c, for copyurl */ ++void selcopy(Time); ++ ++/* select and copy the previous url on screen (do nothing if there's no url). ++ * known bug: doesn't handle urls that span multiple lines (wontfix) ++ * known bug: only finds first url on line (mightfix) ++ */ ++void ++copyurl(const Arg *arg) { ++ /* () and [] can appear in urls, but excluding them here will reduce false ++ * positives when figuring out where a given url ends. ++ */ ++ static char URLCHARS[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" ++ "abcdefghijklmnopqrstuvwxyz" ++ "0123456789-._~:/?#@!$&'*+,;=%"; ++ ++ int i, row, startrow; ++ char *linestr = calloc(sizeof(char), term.col+1); /* assume ascii */ ++ char *c, *match = NULL; ++ ++ row = (sel.ob.x >= 0 && sel.nb.y > 0) ? sel.nb.y-1 : term.bot; ++ LIMIT(row, term.top, term.bot); ++ startrow = row; ++ ++ /* find the start of the last url before selection */ ++ do { ++ for (i = 0; i < term.col; ++i) { ++ if (term.line[row][i].u > 127) /* assume ascii */ ++ continue; ++ linestr[i] = term.line[row][i].u; ++ } ++ linestr[term.col] = '\0'; ++ if ((match = strstr(linestr, "http://")) ++ || (match = strstr(linestr, "https://"))) ++ break; ++ if (--row < term.top) ++ row = term.bot; ++ } while (row != startrow); ++ ++ if (match) { ++ /* must happen before trim */ ++ selclear(); ++ sel.ob.x = strlen(linestr) - strlen(match); ++ ++ /* trim the rest of the line from the url match */ ++ for (c = match; *c != '\0'; ++c) ++ if (!strchr(URLCHARS, *c)) { ++ *c = '\0'; ++ break; ++ } ++ ++ /* select and copy */ ++ sel.mode = 1; ++ sel.type = SEL_REGULAR; ++ sel.oe.x = sel.ob.x + strlen(match)-1; ++ sel.ob.y = sel.oe.y = row; ++ selnormalize(); ++ tsetdirt(sel.nb.y, sel.ne.y); ++ selcopy(0); ++ } ++ ++ free(linestr); ++} +diff --git a/x.c b/x.c +index 6474a01..c60cf94 100644 +--- a/x.c ++++ b/x.c +@@ -106,7 +106,7 @@ static void selnotify(XEvent *); + static void selclear_(XEvent *); + static void selrequest(XEvent *); + +-static void selcopy(Time); ++void selcopy(Time); + static void getbuttoninfo(XEvent *); + static void mousereport(XEvent *); +