--- rxvt-unicode/src/screen.C 2004/07/30 18:35:11 1.78 +++ rxvt-unicode/src/screen.C 2004/08/13 22:38:57 1.89 @@ -120,7 +120,7 @@ rxvt_term::scr_blank_line (text_t *et, rend_t *er, unsigned int width, rend_t efs) { efs &= ~RS_baseattrMask; - efs = SET_FONT (efs, TermWin.fontset->find_font (' ')); + efs = SET_FONT (efs, TermWin.ascii_map [' ' - 0x20]); while (width--) { @@ -174,10 +174,18 @@ if (ncol == prev_ncol && nrow == prev_nrow) return; + // we need at least two lines for wrapping to work correctly + if (nrow + TermWin.saveLines < 2) + { + TermWin.saveLines++; + prev_nrow--; + TermWin.nscrolled++; + } + want_refresh = 1; - total_rows = nrow + TermWin.saveLines; prev_total_rows = prev_nrow + TermWin.saveLines; + total_rows = nrow + TermWin.saveLines; screen.tscroll = 0; screen.bscroll = nrow - 1; @@ -188,7 +196,7 @@ ralloc = new rxvt_salloc (ncol * sizeof (rend_t)); } - if (prev_nrow == 0) + if (!screen.text) { /* * first time called so just malloc everything: don't rely on realloc @@ -707,19 +715,14 @@ /* A: scroll up */ /* A1: Copy lines that will get clobbered by the rotation */ - for (i = 0, j = row1; i < count; i++, j++) - { - buf_text[i] = screen.text[j]; - buf_rend[i] = screen.rend[j]; - } + memcpy (buf_text, screen.text + row1, count * sizeof (text_t *)); + memcpy (buf_rend, screen.rend + row1, count * sizeof (rend_t *)); /* A2: Rotate lines */ - for (j = row1, i = j + count; i <= row2; i++, j++) - { - screen.tlen[j] = screen.tlen[i]; - screen.text[j] = screen.text[i]; - screen.rend[j] = screen.rend[i]; - } + i = row2 - row1 - count + 1; + memmove (screen.tlen + row1, screen.tlen + row1 + count, i * sizeof (int16_t)); + memmove (screen.text + row1, screen.text + row1 + count, i * sizeof (text_t *)); + memmove (screen.rend + row1, screen.rend + row1 + count, i * sizeof (rend_t *)); j = row2 - count + 1, i = count; } @@ -747,15 +750,12 @@ } /* C: Resurrect lines */ - for (; i--; j++) - { - screen.tlen[j] = 0; - screen.text[j] = buf_text[i]; - screen.rend[j] = buf_rend[i]; - - if (!spec) /* line length may not equal TermWin.ncol */ - scr_blank_screen_mem (screen.text, screen.rend, (unsigned int)j, rstyle); - } + memset (screen.tlen + j, 0, i * sizeof (int16_t)); + memcpy (screen.text + j, buf_text, i * sizeof (text_t *)); + memcpy (screen.rend + j, buf_rend, i * sizeof (text_t *)); + if (!spec) /* line length may not equal TermWin.ncol */ + for (; i--; j++) + scr_blank_screen_mem (screen.text, screen.rend, (unsigned int)j, rstyle); return count; } @@ -783,7 +783,7 @@ ZERO_SCROLLBACK (); if (nlines > 0) { - nlines += (screen.cur.row - screen.bscroll); + nlines += screen.cur.row - screen.bscroll; if ((nlines > 0) && (screen.tscroll == 0) && (screen.bscroll == (TermWin.nrow - 1))) @@ -793,10 +793,11 @@ screen.cur.row -= nlines; } } + #ifdef DEBUG_STRICT assert (screen.cur.col < last_col); assert ((screen.cur.row < TermWin.nrow) - && (screen.cur.row >= - (int32_t)TermWin.nscrolled)); + && (screen.cur.row >= - (int32_t)TermWin.nscrolled)); #else /* drive with your eyes closed */ MIN_IT (screen.cur.col, last_col - 1); MIN_IT (screen.cur.row, (int32_t)TermWin.nrow - 1); @@ -873,7 +874,7 @@ // rely on wcwidth to tell us the character width, at least for non-latin1 // do wcwidth before further replacements, as wcwidth says that line-drawing // characters have width -1 (DOH!) on GNU/Linux sometimes. - int width = c < 256 ? 1 : wcwidth (c); + int width = c < 0x100 ? 1 : wcwidth (c); if (charsets[screen.charset] == '0') // DEC SPECIAL { @@ -900,7 +901,10 @@ c = rxvt_composite.compose (c); // map to lower 16 bits #endif bool bold = (Options & Opt_realBold) && ((rstyle & RS_Bold) != 0); - rend_t rend = SET_FONT (rstyle, TermWin.fontset->find_font (c, bold)); + rend_t rend = SET_FONT (rstyle, + c > 0x7f || bold || c < 0x20 + ? TermWin.fontset->find_font (c, bold) + : TermWin.ascii_map [c - 0x20]); do { @@ -1291,8 +1295,6 @@ return; } - refresh_type |= REFRESH_BOUNDS; - if (selection.op && current_screen == selection.screen && ((selection.beg.row >= row && selection.beg.row <= row + num) || (selection.end.row >= row @@ -1749,6 +1751,14 @@ if (drawn_text == NULL) /* sanity check */ return; +#ifndef NO_SLOW_LINK_SUPPORT + if (refresh_type == FAST_REFRESH && !display->is_local) + { + y = 0; + height = TermWin.height; + } +#endif + #ifdef DEBUG_STRICT x = max (x, 0); x = min (x, (int)TermWin.width); @@ -1776,7 +1786,7 @@ fill_text (&drawn_text[i][rc[PART_BEG].col], 0, rc[PART_END].col - rc[PART_BEG].col + 1); if (refresh) - scr_refresh (SLOW_REFRESH | REFRESH_BOUNDS); + scr_refresh (SLOW_REFRESH); } /* ------------------------------------------------------------------------- */ @@ -1821,8 +1831,8 @@ int rxvt_term::scr_page (enum page_dirn direction, int nlines) { - int n; - uint16_t oldviewstart; + int n; + uint16_t oldviewstart; D_SCREEN ((stderr, "rxvt_scr_page (%s, %d) view_start:%d", ((direction == UP) ? "UP" : "DN"), nlines, TermWin.view_start)); #ifdef DEBUG_STRICT @@ -1928,9 +1938,7 @@ void rxvt_term::scr_refresh (unsigned char refresh_type) { - unsigned char clearfirst, /* first character writes before cell */ - clearlast, /* last character writes beyond cell */ - must_clear, /* use draw_string not draw_image_string */ + unsigned char must_clear, /* use draw_string not draw_image_string */ rvid, /* reverse video this position */ showcursor; /* show the cursor */ int16_t col, row, /* column/row we're processing */ @@ -1949,18 +1957,12 @@ /* * A: set up vars */ - clearfirst = clearlast = must_clear = 0; + must_clear = 0; refresh_count = 0; row_offset = TermWin.saveLines - TermWin.view_start; - if ((refresh_type & REFRESH_BOUNDS)) - { - clearfirst = clearlast = 1; - refresh_type &= ~REFRESH_BOUNDS; - } - #ifdef XPM_BACKGROUND must_clear |= (bgPixmap.pixmap != None); #endif @@ -2057,7 +2059,8 @@ * This has been deliberately kept simple. */ i = num_scr; - if (refresh_type == FAST_REFRESH && num_scr_allow && i + if (!display->is_local + && refresh_type == FAST_REFRESH && num_scr_allow && i && abs (i) < TermWin.nrow && !must_clear) { int16_t nits; @@ -2237,7 +2240,7 @@ } #ifdef TEXT_BLINK - if (rend & RS_Blink && back == Color_bg) + if (rend & RS_Blink && (back == Color_bg || fore == Color_bg)) { if (!text_blink_ev.active) { @@ -2277,7 +2280,7 @@ else font->draw (*TermWin.drawable, xpixel, ypixel, text, count, fore, back); - if ((rend & RS_Uline) && (font->descent > 1)) + if (rend & RS_Uline && font->descent > 1 && fore != back) XDrawLine (display->display, drawBuffer, TermWin.gc, xpixel, ypixel + font->ascent + 1, xpixel + Width2Pixel (count) - 1, ypixel + font->ascent + 1); @@ -2322,32 +2325,8 @@ */ scr_reverse_selection (); - /* - * I: other general cleanup - */ -#if 0 - if (clearfirst && TermWin.int_bwidth) - /* - * clear the whole screen height, note that width == 0 is treated - * specially by XClearArea - */ - XClearArea (display->display, TermWin.vt, 0, 0, - (unsigned int)TermWin.int_bwidth, - (unsigned int)TermWin_TotalHeight (), False); - - if (clearlast && TermWin.int_bwidth) - /* - * clear the whole screen height, note that width == 0 is treated - * specially by XClearArea - */ - XClearArea (display->display, TermWin.vt, - TermWin.width + TermWin.int_bwidth, 0, - (unsigned int)TermWin.int_bwidth, - (unsigned int)TermWin_TotalHeight (), False); -#endif - if (refresh_type & SMOOTH_REFRESH) - XSync (display->display, False); + XFlush (display->display); num_scr = 0; num_scr_allow = 1; @@ -2590,6 +2569,14 @@ D_SELECT ((stderr, "rxvt_selection_paste: property didn't exist!")); break; } + else if (ct.encoding == xa[XA_INCR]) + { + // INCR selection, start handshake + XDeleteProperty (display->display, win, prop); + selection_wait = Sel_incr; + incr_ev.start (NOW + 10); + break; + } if (ct.value == NULL) { @@ -2660,52 +2647,16 @@ void rxvt_term::selection_property (Window win, Atom prop) { - int reget_time = 0; - - if (prop == None) + if (prop == None || selection_wait != Sel_incr) return; - D_SELECT ((stderr, "rxvt_selection_property (%08lx, %lu)", win, (unsigned long)prop)); - if (selection_wait == Sel_normal) - { - int a, afmt; - Atom atype; - unsigned long bytes_after, nitems; - unsigned char *s = NULL; - - a = XGetWindowProperty (display->display, win, prop, 0L, 1L, False, - xa[XA_INCR], &atype, &afmt, &nitems, - &bytes_after, &s); - if (s) - XFree (s); - if (a != Success) - return; - -#ifndef __CYGWIN32__ - if (atype == xa[XA_INCR]) - { /* start an INCR transfer */ - D_SELECT ((stderr, "rxvt_selection_property: INCR: starting transfer")); - XDeleteProperty (display->display, win, prop); - XFlush (display->display); - reget_time = 1; - selection_wait = Sel_incr; - } -#endif - - } - else if (selection_wait == Sel_incr) + if (selection_paste (win, prop, 1) > 0) + incr_ev.start (NOW + 10); + else { - reget_time = 1; - - if (selection_paste (win, prop, True) == -1) - { - D_SELECT ((stderr, "rxvt_selection_property: INCR: clean end")); - selection_wait = Sel_none; - incr_ev.stop (); - } + selection_wait = Sel_none; + incr_ev.stop (); } - if (reget_time) /* received more data so reget time */ - incr_ev.start (NOW + 10); } /* ------------------------------------------------------------------------- */ @@ -3420,10 +3371,12 @@ target - target_list); ev.property = rq.property; } +#if TODO // TODO else if (rq.target == xa[XA_MULTIPLE]) { /* TODO: Handle MULTIPLE */ } +#endif else if (rq.target == xa[XA_TIMESTAMP] && selection.text) { XChangeProperty (display->display, rq.requestor, rq.property, XA_INTEGER,