From c721d57688e8f5413df7c179eac54c315343fbb0 Mon Sep 17 00:00:00 2001 From: dequis Date: Fri, 25 Sep 2015 03:09:14 -0300 Subject: Handle a paste start marker right after an end one (ignore both) This actually workarounds a bug with the "st" terminal, for which i've already submitted a patch, but irssi needs to be able to handle it decently too. --- src/fe-text/gui-readline.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) (limited to 'src/fe-text') diff --git a/src/fe-text/gui-readline.c b/src/fe-text/gui-readline.c index 5d859ede..4616e919 100644 --- a/src/fe-text/gui-readline.c +++ b/src/fe-text/gui-readline.c @@ -681,7 +681,8 @@ static void paste_bracketed_end(int i, gboolean rest) static void paste_bracketed_middle() { int i; - int len = paste_buffer->len - G_N_ELEMENTS(bp_end); + int marklen = G_N_ELEMENTS(bp_end); + int len = paste_buffer->len - marklen; unichar *ptr = (unichar *) paste_buffer->data; if (len <= 0) { @@ -690,6 +691,23 @@ static void paste_bracketed_middle() for (i = 0; i <= len; i++, ptr++) { if (ptr[0] == bp_end[0] && memcmp(ptr, bp_end, sizeof(bp_end)) == 0) { + + /* if there are at least 6 bytes after the end, + * check for another start marker right afterwards */ + if (i <= (len - marklen) && + memcmp(ptr + marklen, bp_start, sizeof(bp_start)) == 0) { + + /* remove both markers*/ + g_array_remove_range(paste_buffer, i, marklen * 2); + len -= marklen * 2; + + /* go one step back */ + if (i > 0) { + i--; + ptr--; + } + continue; + } paste_bracketed_end(i, i != len); break; } -- cgit v1.2.3