--- rxvt-unicode/src/screen.C 2006/04/11 11:07:48 1.263 +++ rxvt-unicode/src/screen.C 2006/10/03 11:56:48 1.265 @@ -1980,6 +1980,8 @@ rend_t cc1; /* store colours at cursor position (s) */ #endif rend_t *crp; // cursor rendition pointer + rend_t ccol1, /* Cursor colour */ + ccol2; /* Cursor colour2 */ want_refresh = 0; /* screen is current */ @@ -2010,8 +2012,6 @@ */ { unsigned char setoldcursor; - rend_t ccol1, /* Cursor colour */ - ccol2; /* Cursor colour2 */ showcursor = (screen.flags & Screen_VisibleCursor); #ifdef CURSOR_BLINK @@ -2028,35 +2028,38 @@ crp = &ROW(screen.cur.row).r[col]; - if (showcursor && focus) - { - if (OPTION (Opt_cursorUnderline)) - *crp ^= RS_Uline; - else - { - *crp ^= RS_RVid; - #ifndef NO_CURSORCOLOR - cc1 = *crp & (RS_fgMask | RS_bgMask); - if (ISSET_PIXCOLOR (Color_cursor)) - ccol1 = Color_cursor; - else + cc1 = *crp & (RS_fgMask | RS_bgMask); + if (ISSET_PIXCOLOR (Color_cursor)) + ccol1 = Color_cursor; + else +#endif #ifdef CURSOR_COLOR_IS_RENDITION_COLOR - ccol1 = fgcolor_of (rstyle); + ccol1 = fgcolor_of (rstyle); #else - ccol1 = Color_fg; + ccol1 = Color_fg; +#endif + +#ifndef NO_CURSORCOLOR + if (ISSET_PIXCOLOR (Color_cursor2)) + ccol2 = Color_cursor2; + else #endif - if (ISSET_PIXCOLOR (Color_cursor2)) - ccol2 = Color_cursor2; - else #ifdef CURSOR_COLOR_IS_RENDITION_COLOR - ccol2 = bgcolor_of (rstyle); + ccol2 = bgcolor_of (rstyle); #else - ccol2 = Color_bg; + ccol2 = Color_bg; #endif + + if (showcursor && focus) + { + if (OPTION (Opt_cursorUnderline)) + *crp ^= RS_Uline; + else + { + *crp ^= RS_RVid; *crp = SET_FGCOLOR (*crp, ccol1); *crp = SET_BGCOLOR (*crp, ccol2); -#endif } } } @@ -2255,24 +2258,6 @@ // only do special processing if any attributes are set, which is unlikely if (rend & (RS_Bold | RS_Italic | RS_Uline | RS_RVid | RS_Blink | RS_Careful)) { -#if ENABLE_STYLES - // "careful" (too wide) character handling - - // include previous careful character(s) if possible, looks nicer (best effort...) - while (text > stp - && srp[text - stp - 1] & RS_Careful - && RS_SAME (rend, srp[text - stp - 1])) - text--, count++, xpixel -= fwidth; - - // force redraw after "careful" characters to avoid pixel droppings - for (int i = 0; srp[col + i] & RS_Careful && col + i < ncol - 1; i++) - drp[col + i + 1] = srp[col + i + 1] ^ RS_redraw; - - // force redraw before "careful" characters to avoid pixel droppings - for (int i = 0; srp[text - stp - i] & RS_Careful && text - i > stp; i++) - drp[text - stp - i - 1] = srp[text - stp - i - 1] ^ RS_redraw; -#endif - bool invert = rend & RS_RVid; #ifndef NO_BOLD_UNDERLINE_REVERSE @@ -2304,12 +2289,23 @@ if (invert) { - ::swap (fore, back); +#ifdef OPTION_HC + if ((showcursor && row == screen.cur.row && text - stp == screen.cur.col) + || !ISSET_PIXCOLOR (Color_HC)) +#endif + /* invert the column if no highlightColor is set or it is the + * current cursor column */ + ::swap (fore, back); +#ifdef OPTION_HC + else if (ISSET_PIXCOLOR (Color_HC)) + back = Color_HC; +#endif #ifndef NO_BOLD_UNDERLINE_REVERSE +# ifndef OPTION_HC if (ISSET_PIXCOLOR (Color_RV)) back = Color_RV; - +# endif if (fore == back) { fore = Color_bg; @@ -2330,6 +2326,24 @@ fore = back; } #endif + +#if ENABLE_STYLES + // "careful" (too wide) character handling + + // include previous careful character(s) if possible, looks nicer (best effort...) + while (text > stp + && srp[text - stp - 1] & RS_Careful + && RS_SAME (rend, srp[text - stp - 1])) + text--, count++, xpixel -= fwidth; + + // force redraw after "careful" characters to avoid pixel droppings + for (int i = 0; srp[col + i] & RS_Careful && col + i < ncol - 1; i++) + drp[col + i + 1] = srp[col + i + 1] ^ RS_redraw; + + // force redraw before "careful" characters to avoid pixel droppings + for (int i = 0; srp[text - stp - i] & RS_Careful && text - i > stp; i++) + drp[text - stp - i - 1] = srp[text - stp - i - 1] ^ RS_redraw; +#endif } /* @@ -2409,7 +2423,9 @@ #ifndef NO_CURSORCOLOR if (ISSET_PIXCOLOR (Color_cursor)) XSetForeground (dpy, gc, pix_colors[Color_cursor]); + else #endif + XSetForeground (dpy, gc, pix_colors[ccol1]); XDrawRectangle (dpy, drawBuffer, gc, Col2Pixel (col),