Preserve more attributes of text copied as RTF. Thanks to Stephen Balousek.
[u/mdw/putty] / terminal.c
index 7552e39..117ac74 100644 (file)
@@ -1535,6 +1535,11 @@ void term_size(Terminal *term, int newrows, int newcols, int newsavelines)
        newsavelines == term->savelines)
        return;                        /* nothing to do */
 
+    /* Behave sensibly if we're given zero (or negative) rows/cols */
+
+    if (newrows < 1) newrows = 1;
+    if (newcols < 1) newcols = 1;
+
     deselect(term);
     swap_screen(term, 0, FALSE, FALSE);
 
@@ -2748,7 +2753,7 @@ static void term_out(Terminal *term)
                     * Perform an actual beep if we're not overloaded.
                     */
                    if (!term->cfg.bellovl || !term->beep_overloaded) {
-                       beep(term->frontend, term->cfg.beep);
+                       do_beep(term->frontend, term->cfg.beep);
 
                        if (term->cfg.beep == BELL_VISUAL) {
                            term_schedule_vbell(term, FALSE, 0);
@@ -5042,10 +5047,15 @@ static void clipme(Terminal *term, pos top, pos bottom, int rect, int desel)
     int old_top_x;
     int wblen = 0;                    /* workbuf len */
     int buflen;                               /* amount of memory allocated to workbuf */
+    int *attrbuf;                      /* Attribute buffer */
+    int *attrptr;
+    int attr;
 
     buflen = 5120;                    /* Default size */
     workbuf = snewn(buflen, wchar_t);
+    attrbuf = buflen ? snewn(buflen, int) : 0;
     wbptr = workbuf;                  /* start filling here */
+    attrptr = attrbuf;
     old_top_x = top.x;                /* needed for rect==1 */
 
     while (poslt(top, bottom)) {
@@ -5108,6 +5118,7 @@ static void clipme(Terminal *term, pos top, pos bottom, int rect, int desel)
 
            while (1) {
                int uc = ldata->chars[x].chr;
+                attr = ldata->chars[x].attr;
 
                switch (uc & CSET_MASK) {
                  case CSET_LINEDRW:
@@ -5165,9 +5176,12 @@ static void clipme(Terminal *term, pos top, pos bottom, int rect, int desel)
                        buflen += 100;
                        workbuf = sresize(workbuf, buflen, wchar_t);
                        wbptr = workbuf + wblen;
+                       attrbuf = sresize(attrbuf, buflen, int);
+                       attrptr = attrbuf + wblen;
                    }
                    wblen++;
                    *wbptr++ = *p;
+                    *attrptr++ = attr;
                }
 
                if (ldata->chars[x].cc_next)
@@ -5182,6 +5196,7 @@ static void clipme(Terminal *term, pos top, pos bottom, int rect, int desel)
            for (i = 0; i < sel_nl_sz; i++) {
                wblen++;
                *wbptr++ = sel_nl[i];
+                *attrptr++ = 0;
            }
        }
        top.y++;
@@ -5193,7 +5208,7 @@ static void clipme(Terminal *term, pos top, pos bottom, int rect, int desel)
     wblen++;
     *wbptr++ = 0;
 #endif
-    write_clip(term->frontend, workbuf, wblen, desel); /* transfer to clipbd */
+    write_clip(term->frontend, workbuf, attrbuf, wblen, desel); /* transfer to clipbd */
     if (buflen > 0)                   /* indicates we allocated this buffer */
        sfree(workbuf);
 }