X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/2371caac40766e7ab3d51669c885929135368a93..cfbeddf32c91e780d6d8627695d50f72a6cd29bd:/terminal.c?ds=sidebyside diff --git a/terminal.c b/terminal.c index 7fb20292..80d66dc2 100644 --- a/terminal.c +++ b/terminal.c @@ -735,6 +735,7 @@ static void erase_lots(int line_only, int from_begin, int to_end) } if (!to_end) { end = curs; + incpos(end); } check_selection(start, end); @@ -744,7 +745,7 @@ static void erase_lots(int line_only, int from_begin, int to_end) ldata = lineptr(start.y); while (poslt(start, end)) { - if (start.y == cols && !erase_lattr) + if (start.x == cols && !erase_lattr) ldata[start.x] &= ~LATTR_WRAPPED; else ldata[start.x] = erase_char; @@ -2969,6 +2970,54 @@ static void sel_spread(void) incpos(selend); } +void term_do_paste(void) +{ + wchar_t *data; + int len; + + get_clip(&data, &len); + if (data) { + wchar_t *p, *q; + + if (paste_buffer) + sfree(paste_buffer); + paste_pos = paste_hold = paste_len = 0; + paste_buffer = smalloc(len * sizeof(wchar_t)); + + p = q = data; + while (p < data + len) { + while (p < data + len && + !(p <= data + len - sel_nl_sz && + !memcmp(p, sel_nl, sizeof(sel_nl)))) + p++; + + { + int i; + for (i = 0; i < p - q; i++) { + paste_buffer[paste_len++] = q[i]; + } + } + + if (p <= data + len - sel_nl_sz && + !memcmp(p, sel_nl, sizeof(sel_nl))) { + paste_buffer[paste_len++] = '\r'; + p += sel_nl_sz; + } + q = p; + } + + /* Assume a small paste will be OK in one go. */ + if (paste_len < 256) { + luni_send(paste_buffer, paste_len); + if (paste_buffer) + sfree(paste_buffer); + paste_buffer = 0; + paste_pos = paste_hold = paste_len = 0; + } + } + get_clip(NULL, NULL); +} + void term_mouse(Mouse_Button b, Mouse_Action a, int x, int y, int shift, int ctrl) { @@ -3101,50 +3150,7 @@ void term_mouse(Mouse_Button b, Mouse_Action a, int x, int y, selstate = NO_SELECTION; } else if (b == MBT_PASTE && (a == MA_CLICK || a == MA_2CLK || a == MA_3CLK)) { - wchar_t *data; - int len; - - get_clip(&data, &len); - if (data) { - wchar_t *p, *q; - - if (paste_buffer) - sfree(paste_buffer); - paste_pos = paste_hold = paste_len = 0; - paste_buffer = smalloc(len * sizeof(wchar_t)); - - p = q = data; - while (p < data + len) { - while (p < data + len && - !(p <= data + len - sel_nl_sz && - !memcmp(p, sel_nl, sizeof(sel_nl)))) - p++; - - { - int i; - for (i = 0; i < p - q; i++) { - paste_buffer[paste_len++] = q[i]; - } - } - - if (p <= data + len - sel_nl_sz && - !memcmp(p, sel_nl, sizeof(sel_nl))) { - paste_buffer[paste_len++] = '\r'; - p += sel_nl_sz; - } - q = p; - } - - /* Assume a small paste will be OK in one go. */ - if (paste_len < 256) { - luni_send(paste_buffer, paste_len); - if (paste_buffer) - sfree(paste_buffer); - paste_buffer = 0; - paste_pos = paste_hold = paste_len = 0; - } - } - get_clip(NULL, NULL); + term_do_paste(); } term_update();