--- rxvt-unicode/src/screen.C 2004/02/22 10:38:11 1.32 +++ rxvt-unicode/src/screen.C 2004/02/24 22:28:42 1.36 @@ -1837,21 +1837,20 @@ 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 */ - rvid, /* reverse video this position */ - showcursor; /* show the cursor */ - int16_t col, row, /* column/row we're processing */ - ocrow; /* old cursor row */ - int cursorwidth; - int i, /* tmp */ - row_offset; /* basic offset in screen structure */ + unsigned char clearfirst, /* first character writes before cell */ + clearlast, /* last character writes beyond cell */ + 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 */ + ocrow; /* old cursor row */ + int i, /* tmp */ + row_offset; /* basic offset in screen structure */ #ifndef NO_CURSORCOLOR - rend_t cc1; /* store colours at cursor position (s) */ + rend_t cc1; /* store colours at cursor position (s) */ #endif - rend_t *drp, *srp; /* drawn-rend-pointer, screen-rend-pointer */ - text_t *dtp, *stp; /* drawn-text-pointer, screen-text-pointer */ + rend_t *drp, *srp; /* drawn-rend-pointer, screen-rend-pointer */ + text_t *dtp, *stp; /* drawn-text-pointer, screen-text-pointer */ if (refresh_type == NO_REFRESH || !TermWin.mapped) return; @@ -1893,18 +1892,13 @@ ccol2; /* Cursor colour2 */ showcursor = (screen.flags & Screen_VisibleCursor); - cursorwidth = 0; #ifdef CURSOR_BLINK if (hidden_cursor) showcursor = 0; #endif - cursorwidth = 0; - if (showcursor) { - cursorwidth++; - srp = & (screen.rend[screen.cur.row + TermWin.saveLines] [screen.cur.col]); @@ -1932,7 +1926,6 @@ *srp = SET_FGCOLOR (*srp, ccol1); *srp = SET_BGCOLOR (*srp, ccol2); #endif - } } @@ -2123,21 +2116,8 @@ rend = GET_ATTR (rend); - rvid = !! (rend & RS_RVid); - if (rvid) - { - SWAP_IT (fore, back, int); - -#ifndef NO_BOLD_UNDERLINE_REVERSE - if (ISSET_PIXCOLOR (Color_RV) -# ifndef NO_CURSORCOLOR - && !ISSET_PIXCOLOR (Color_cursor) -# endif - ) - back = Color_RV; -#endif + rvid = !!(rend & RS_RVid); - } #ifdef TEXT_BLINK if (rend & RS_Blink) { @@ -2150,28 +2130,44 @@ fore = back; } #endif + #ifndef NO_BOLD_UNDERLINE_REVERSE - else if (rend & RS_Bold) + if (rend & RS_Bold && fore == Color_fg) { if (ISSET_PIXCOLOR (Color_BD)) fore = Color_BD; - else if (fore == Color_fg) - fore = Color_White; + else + rvid = !rvid; } - else if (rend & RS_Uline) + + if (rend & RS_Uline) { if (ISSET_PIXCOLOR (Color_UL)) fore = Color_UL; } #endif + if (rvid) + { + SWAP_IT (fore, back, int); + +#ifndef NO_BOLD_UNDERLINE_REVERSE + if (ISSET_PIXCOLOR (Color_RV) +# ifndef NO_CURSORCOLOR + && !ISSET_PIXCOLOR (Color_cursor) +# endif + ) + back = Color_RV; +#endif + } + /* * Actually do the drawing of the string here */ rxvt_font *font = (*TermWin.fontset)[fid]; if (back == fore) - font->clear_rect (xpixel, ypixel, + font->clear_rect (*TermWin.drawable, xpixel, ypixel, TermWin.fwidth * count, TermWin.fheight, back); else if (back == Color_bg) @@ -2183,15 +2179,15 @@ for (i = 0; i < count; i++) /* don't draw empty strings */ if (text[i] != ' ') { - font->draw (xpixel, ypixel, text, count, fore, -1); + font->draw (*TermWin.drawable, xpixel, ypixel, text, count, fore, -1); break; } } else - font->draw (xpixel, ypixel, text, count, fore, Color_bg); + font->draw (*TermWin.drawable, xpixel, ypixel, text, count, fore, Color_bg); } else - font->draw (xpixel, ypixel, text, count, fore, back); + font->draw (*TermWin.drawable, xpixel, ypixel, text, count, fore, back); if ((rend & RS_Uline) && (font->descent > 1)) XDrawLine (display->display, drawBuffer, TermWin.gc, @@ -2213,7 +2209,6 @@ #ifndef NO_CURSORCOLOR *srp = (*srp & ~ (RS_fgMask | RS_bgMask)) | cc1; #endif - } else if (oldcursor.row >= 0) { @@ -2221,6 +2216,11 @@ if (ISSET_PIXCOLOR (Color_cursor)) XSetForeground (display->display, TermWin.gc, PixColors[Color_cursor]); #endif + int cursorwidth = 1; + while (oldcursor.col + cursorwidth < TermWin.ncol + && drawn_text[oldcursor.row][oldcursor.col + cursorwidth] == NOCHAR) + cursorwidth++; + XDrawRectangle (display->display, drawBuffer, TermWin.gc, Col2Pixel (oldcursor.col), Row2Pixel (oldcursor.row), @@ -2692,8 +2692,7 @@ D_SELECT ((stderr, "rxvt_selection_clear ()")); want_refresh = 1; - if (selection.text) - free (selection.text); + free (selection.text); selection.text = NULL; selection.len = 0; CLEAR_SELECTION ();