From bc1235d46977981e2ce7a8684f123da84d07286b Mon Sep 17 00:00:00 2001 From: simon Date: Tue, 21 Nov 2000 19:28:25 +0000 Subject: [PATCH] Ron Kuris's "copy everything to clipboard" patch git-svn-id: svn://svn.tartarus.org/sgt/putty@808 cda61777-01e9-0310-a592-d414129be87e --- putty.h | 1 + terminal.c | 128 ++++++++++++++++++++++++++++++++++++++----------------------- window.c | 5 +++ 3 files changed, 86 insertions(+), 48 deletions(-) diff --git a/putty.h b/putty.h index 08f1d60b..45f762f7 100644 --- a/putty.h +++ b/putty.h @@ -314,6 +314,7 @@ void term_blink(int set_cursor); void term_paste(void); void term_nopaste(void); void from_backend(int is_stderr, char *data, int len); +void term_copyall(void); /* * Exports from raw.c. diff --git a/terminal.c b/terminal.c index f5ffa262..116d6974 100644 --- a/terminal.c +++ b/terminal.c @@ -1917,6 +1917,85 @@ void term_scroll (int rel, int where) { term_update(); } +static void clipme(long *top, long *bottom, char *workbuf) { + char *wbptr; /* where next char goes within workbuf */ + int wblen = 0; /* workbuf len */ + int buflen; /* amount of memory allocated to workbuf */ + + if ( workbuf != NULL ) { /* user supplied buffer? */ + buflen = -1; /* assume buffer passed in is big enough */ + wbptr = workbuf; /* start filling here */ + } + else + buflen = 0; /* No data is available yet */ + + while (top < bottom) { + int nl = FALSE; + unsigned long *lineend = top - (top-text) % (cols+1) + cols; + unsigned long *nlpos = lineend; + + if (!(*nlpos & ATTR_WRAPPED)) { + while ((nlpos[-1] & CHAR_MASK) == 0x20 && nlpos > top) + nlpos--; + if (nlpos < bottom) + nl = TRUE; + } + while (top < nlpos && top < bottom) + { +#if 0 + /* VT Specials -> ISO8859-1 */ + static const char poorman2[] = +"* # HTFFCRLF\xB0 \xB1 NLVT+ + + + + - - - - - + + + + | <=>=PI!=\xA3 \xB7 "; +#endif + + int ch = (*top & CHAR_MASK); + +#if 0 + if ((*top & ATTR_LINEDRW) && ch >= 0x60 && ch < 0x7F) { + int x; + *wbptr++ = poorman2[2*(ch-0x60)]; + if ( (x = poorman2[2*(ch-0x60)+1]) != ' ') + *wbptr++ = x; + } else +#endif +#if 0 + if ((*top & ATTR_GBCHR) && ch == '#') + *wbptr++ = (unsigned char) 0xA3; + else +#endif + if ( wblen == buflen ) + { + workbuf = srealloc(workbuf, buflen += 100); + wbptr = workbuf + wblen; + } + wblen++; + *wbptr++ = (unsigned char) ch; + top++; + } + if (nl) { + int i; + for (i=0; i 0 ) /* indicates we allocated this buffer */ + sfree(workbuf); + +} +void term_copyall (void) { + clipme(sbtop, cpos, NULL /* dynamic allocation */); +} + /* * Spread the selection outwards according to the selection mode. */ @@ -2034,54 +2113,7 @@ void term_mouse (Mouse_Button b, Mouse_Action a, int x, int y) { * 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) - { -#if 0 - /* VT Specials -> ISO8859-1 */ - static const char poorman2[] = - "* # HTFFCRLF\xB0 \xB1 NLVT+ + + + + - - - - - + + + + | <=>=PI!=\xA3 \xB7 "; -#endif - - int ch = (*q & CHAR_MASK); - -#if 0 - if ((*q & ATTR_LINEDRW) && ch >= 0x60 && ch < 0x7F) { - int x; - *p++ = poorman2[2*(ch-0x60)]; - if ( (x = poorman2[2*(ch-0x60)+1]) != ' ') - *p++ = x; - } else -#endif -#if 0 - if ((*q & ATTR_GBCHR) && ch == '#') - *p++ = (unsigned char) 0xA3; - else -#endif - *p++ = (unsigned char) ch; - q++; - } - if (nl) { - int i; - for (i=0; i