--- rxvt-unicode/src/screen.C 2004/05/09 18:19:49 1.74 +++ rxvt-unicode/src/screen.C 2004/08/04 03:33:53 1.82 @@ -31,7 +31,7 @@ #include /* get the typedef for CARD32 */ -#include +#include #include #include "salloc.C" // HACK, should be a seperate compile! @@ -50,41 +50,41 @@ * GENERAL SCREEN AND SELECTION UPDATE ROUTINES * * ------------------------------------------------------------------------- */ #define ZERO_SCROLLBACK() \ - if ((Options & Opt_scrollTtyOutput) == Opt_scrollTtyOutput) \ + if (Options & Opt_scrollTtyOutput) \ TermWin.view_start = 0 #define CLEAR_SELECTION() \ - selection.beg.row = selection.beg.col \ + selection.beg.row = selection.beg.col \ = selection.end.row = selection.end.col = 0 #define CLEAR_ALL_SELECTION() \ - selection.beg.row = selection.beg.col \ - = selection.mark.row = selection.mark.col \ + selection.beg.row = selection.beg.col \ + = selection.mark.row = selection.mark.col \ = selection.end.row = selection.end.col = 0 -#define ROW_AND_COL_IS_AFTER(A, B, C, D) \ +#define ROW_AND_COL_IS_AFTER(A, B, C, D) \ (((A) > (C)) || (((A) == (C)) && ((B) > (D)))) -#define ROW_AND_COL_IS_BEFORE(A, B, C, D) \ +#define ROW_AND_COL_IS_BEFORE(A, B, C, D) \ (((A) < (C)) || (((A) == (C)) && ((B) < (D)))) -#define ROW_AND_COL_IN_ROW_AFTER(A, B, C, D) \ +#define ROW_AND_COL_IN_ROW_AFTER(A, B, C, D) \ (((A) == (C)) && ((B) > (D))) -#define ROW_AND_COL_IN_ROW_AT_OR_AFTER(A, B, C, D) \ +#define ROW_AND_COL_IN_ROW_AT_OR_AFTER(A, B, C, D) \ (((A) == (C)) && ((B) >= (D))) -#define ROW_AND_COL_IN_ROW_BEFORE(A, B, C, D) \ +#define ROW_AND_COL_IN_ROW_BEFORE(A, B, C, D) \ (((A) == (C)) && ((B) < (D))) -#define ROW_AND_COL_IN_ROW_AT_OR_BEFORE(A, B, C, D) \ +#define ROW_AND_COL_IN_ROW_AT_OR_BEFORE(A, B, C, D) \ (((A) == (C)) && ((B) <= (D))) /* these must be row_col_t */ -#define ROWCOL_IS_AFTER(X, Y) \ +#define ROWCOL_IS_AFTER(X, Y) \ ROW_AND_COL_IS_AFTER ((X).row, (X).col, (Y).row, (Y).col) -#define ROWCOL_IS_BEFORE(X, Y) \ +#define ROWCOL_IS_BEFORE(X, Y) \ ROW_AND_COL_IS_BEFORE ((X).row, (X).col, (Y).row, (Y).col) -#define ROWCOL_IN_ROW_AFTER(X, Y) \ +#define ROWCOL_IN_ROW_AFTER(X, Y) \ ROW_AND_COL_IN_ROW_AFTER ((X).row, (X).col, (Y).row, (Y).col) -#define ROWCOL_IN_ROW_BEFORE(X, Y) \ +#define ROWCOL_IN_ROW_BEFORE(X, Y) \ ROW_AND_COL_IN_ROW_BEFORE ((X).row, (X).col, (Y).row, (Y).col) -#define ROWCOL_IN_ROW_AT_OR_AFTER(X, Y) \ +#define ROWCOL_IN_ROW_AT_OR_AFTER(X, Y) \ ROW_AND_COL_IN_ROW_AT_OR_AFTER ((X).row, (X).col, (Y).row, (Y).col) -#define ROWCOL_IN_ROW_AT_OR_BEFORE(X, Y) \ +#define ROWCOL_IN_ROW_AT_OR_BEFORE(X, Y) \ ROW_AND_COL_IN_ROW_AT_OR_BEFORE ((X).row, (X).col, (Y).row, (Y).col) /* @@ -94,22 +94,22 @@ */ #define drawBuffer TermWin.vt -#define CLEAR_ROWS(row, num) \ - if (TermWin.mapped) \ - XClearArea (display->display, drawBuffer, TermWin.int_bwidth, \ +#define CLEAR_ROWS(row, num) \ + if (TermWin.mapped) \ + XClearArea (display->display, drawBuffer, 0, \ Row2Pixel (row), (unsigned int)TermWin.width, \ (unsigned int)Height2Pixel (num), False) -#define CLEAR_CHARS(x, y, num) \ - if (TermWin.mapped) \ - XClearArea (display->display, drawBuffer, x, y, \ - (unsigned int)Width2Pixel (num), \ +#define CLEAR_CHARS(x, y, num) \ + if (TermWin.mapped) \ + XClearArea (display->display, drawBuffer, x, y, \ + (unsigned int)Width2Pixel (num), \ (unsigned int)Height2Pixel (1), False) -#define ERASE_ROWS(row, num) \ - XFillRectangle (display->display, drawBuffer, TermWin.gc, \ - TermWin.int_bwidth, Row2Pixel (row), \ - (unsigned int)TermWin.width, \ +#define ERASE_ROWS(row, num) \ + XFillRectangle (display->display, drawBuffer, TermWin.gc, \ + 0, Row2Pixel (row), \ + (unsigned int)TermWin.width, \ (unsigned int)Height2Pixel (num)) /* ------------------------------------------------------------------------- * @@ -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--) { @@ -796,7 +796,7 @@ #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); @@ -899,7 +899,11 @@ if (c >= 0x10000) c = rxvt_composite.compose (c); // map to lower 16 bits #endif - rend_t rend = SET_FONT (rstyle, TermWin.fontset->find_font (c)); + bool bold = (Options & Opt_realBold) && ((rstyle & RS_Bold) != 0); + rend_t rend = SET_FONT (rstyle, + c > 0x7f || bold || c < 0x20 + ? TermWin.fontset->find_font (c, bold) + : TermWin.ascii_map [c - 0x20]); do { @@ -1748,10 +1752,18 @@ 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, (int)TermWin.int_bwidth); + x = max (x, 0); x = min (x, (int)TermWin.width); - y = max (y, (int)TermWin.int_bwidth); + y = max (y, 0); y = min (y, (int)TermWin.height); #endif @@ -2056,7 +2068,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; @@ -2208,7 +2221,7 @@ rvid = !!(rend & RS_RVid); #ifndef NO_BOLD_UNDERLINE_REVERSE - if (rend & RS_Bold && fore == Color_fg) + if (rend & RS_Bold && fore == Color_fg && !(Options & Opt_realBold)) { if (ISSET_PIXCOLOR (Color_BD)) fore = Color_BD; @@ -2236,7 +2249,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) { @@ -2276,7 +2289,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); @@ -2324,6 +2337,7 @@ /* * I: other general cleanup */ +#if 0 if (clearfirst && TermWin.int_bwidth) /* * clear the whole screen height, note that width == 0 is treated @@ -2342,9 +2356,10 @@ 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;