diff --git a/terminal.c b/terminal.c index 2f9b7826..da5fe9da 100644 --- a/terminal.c +++ b/terminal.c @@ -325,7 +325,7 @@ static void update_sbar(void) { /* * Check whether the region bounded by the two pointers intersects - * the scroll region, and de-select the on-screen selection if so. + * the selection, and de-select the on-screen selection if so. */ static void check_selection (unsigned long *from, unsigned long *to) { if (from < selend && selstart < to) @@ -1425,67 +1425,73 @@ void term_mouse (Mouse_Button b, Mouse_Action a, int x, int y) { selend = selpoint + 1; } sel_spread(); - } else if ((b == MB_SELECT || b == MB_EXTEND) && a == MA_RELEASE) { + } else if ((b == MB_SELECT || b == MB_EXTEND) && a == MA_RELEASE) if (selstate == DRAGGING) { - /* - * We've completed a selection. We now transfer the - * data to the clipboard. - */ - unsigned char *p = selspace; - unsigned long *q = selstart; - - while (q < selend) { - int nl = FALSE; - unsigned long *lineend = q - (q-text) % (cols+1) + cols; - unsigned long *nlpos = lineend; - - if (!(*nlpos & ATTR_WRAPPED)) { - while ((nlpos[-1] & CHAR_MASK) == 0x20 && nlpos > q) - nlpos--; - if (nlpos < selend) - nl = TRUE; - } - while (q < nlpos && q < selend) - *p++ = (unsigned char) (*q++ & CHAR_MASK); - if (nl) { - int i; - for (i=0; isend (q, p-q); - if (p <= data+len-sizeof(sel_nl) && - !memcmp(p, sel_nl, sizeof(sel_nl))) { - back->send ("\015", 1); - p += sizeof(sel_nl); - } - q = p; - } - } - get_clip(NULL, NULL); - } - + else if (b == MB_PASTE && (a==MA_CLICK || a==MA_2CLK || a==MA_3CLK)) + term_paste(); term_update(); } +/* + * We've completed a selection. We now transfer the + * data to the clipboard. + */ +void term_copy() { + unsigned char *p = selspace; + unsigned long *q = selstart; + + while (q < selend) { + int nl = FALSE; + unsigned long *lineend = q - (q-text) % (cols+1) + cols; + unsigned long *nlpos = lineend; + + if (!(*nlpos & ATTR_WRAPPED)) { + while ((nlpos[-1] & CHAR_MASK) == 0x20 && nlpos > q) + nlpos--; + if (nlpos < selend) + nl = TRUE; + } + while (q < nlpos && q < selend) + *p++ = (unsigned char) (*q++ & CHAR_MASK); + if (nl) { + int i; + for (i=0; isend (q, p-q); + if (p <= data+len-sizeof(sel_nl) && + !memcmp(p, sel_nl, sizeof(sel_nl))) { + back->send ("\015", 1); + p += sizeof(sel_nl); + } + q = p; + } + } + get_clip(NULL, NULL); +} + static void deselect (void) { selstate = NO_SELECTION; selstart = selend = scrtop;