~petersanchez/st

9162ba89d0ffcfa10022ae131770aefb8b95126b — Michael Buch 5 years ago 4ef0cbd
Port the copyurl patch to the 0.8.1 st release. Mainly fix usage of depracted selcopy
3 files changed, 65 insertions(+), 0 deletions(-)

M config.def.h
M st.c
M st.h
M config.def.h => config.def.h +2 -0
@@ 199,6 199,8 @@ static Shortcut shortcuts[] = {
	{ TERMMOD,              XK_Y,           selpaste,       {.i =  0} },
	{ ShiftMask,            XK_Insert,      selpaste,       {.i =  0} },
	{ TERMMOD,              XK_Num_Lock,    numlock,        {.i =  0} },
	{ TERMMOD,              XK_I,           iso14755,       {.i =  0} },
	{ MODKEY,               XK_l,           copyurl,        {.i =  0} },
};

/*

M st.c => st.c +62 -0
@@ 2603,3 2603,65 @@ redraw(void)
	tfulldirt();
	draw();
}

/* 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);
		xsetsel(getsel());
		xclipcopy();
	}

	free(linestr);
}

M st.h => st.h +1 -0
@@ 85,6 85,7 @@ void printscreen(const Arg *);
void printsel(const Arg *);
void sendbreak(const Arg *);
void toggleprinter(const Arg *);
void copyurl(const Arg *);

int tattrset(int);
void tnew(int, int);