--- rxvt-unicode/src/screen.C 2006/04/11 11:07:48 1.263 +++ rxvt-unicode/src/screen.C 2007/05/01 21:30:01 1.268 @@ -49,7 +49,7 @@ * GENERAL SCREEN AND SELECTION UPDATE ROUTINES * * ------------------------------------------------------------------------- */ #define ZERO_SCROLLBACK() \ - if (OPTION (Opt_scrollTtyOutput)) \ + if (option (Opt_scrollTtyOutput)) \ view_start = 0 #define CLEAR_SELECTION() \ selection.beg.row = selection.beg.col \ @@ -411,7 +411,7 @@ tabs = (char *)rxvt_malloc (ncol * sizeof (char)); - for (int col = ncol; col--; ) + for (int col = ncol; --col; ) tabs [col] = col % TABSIZE == 0; if (current_screen != PRIMARY) @@ -512,7 +512,7 @@ void rxvt_term::scr_swap_screen () { - if (!OPTION (Opt_secondaryScreen)) + if (!option (Opt_secondaryScreen)) return; for (int i = prev_nrow; i--; ) @@ -544,7 +544,7 @@ int i = current_screen; current_screen = scrn; scrn = i; #if NSCREENS - if (OPTION (Opt_secondaryScreen)) + if (option (Opt_secondaryScreen)) { num_scr = 0; @@ -557,7 +557,7 @@ } else #endif - if (OPTION (Opt_secondaryScroll)) + if (option (Opt_secondaryScroll)) scr_scroll_text (0, prev_nrow - 1, prev_nrow); } @@ -626,7 +626,7 @@ if (count > 0 && row1 == 0 - && (current_screen == PRIMARY || OPTION (Opt_secondaryScroll))) + && (current_screen == PRIMARY || option (Opt_secondaryScroll))) { top_row = max (top_row - count, -saveLines); @@ -686,7 +686,7 @@ } // finally move the view window, if desired - if (OPTION (Opt_scrollWithBuffer) + if (option (Opt_scrollWithBuffer) && view_start != 0 && view_start != -saveLines) scr_page (UP, count); @@ -1073,7 +1073,7 @@ // store horizontal tab commands as characters inside the text // buffer so they can be selected and pasted. - if (ht && OPTION (Opt_pastableTabs)) + if (ht && option (Opt_pastableTabs)) { base_rend = SET_FONT (base_rend, 0); @@ -1654,7 +1654,7 @@ if (bgPixmap.pixmap == None) #endif #if TRANSPARENT - if (!OPTION (Opt_transparent) || am_transparent == 0) + if (!option (Opt_transparent) || am_transparent == 0) #endif XSetWindowBackground (dpy, vt, pix_colors[Color_bg]); @@ -1888,12 +1888,12 @@ # ifndef NO_MAPALERT # ifdef MAPALERT_OPTION - if (OPTION (Opt_mapAlert)) + if (option (Opt_mapAlert)) # endif XMapWindow (dpy, parent[0]); # endif - if (OPTION (Opt_visualBell)) + if (option (Opt_visualBell)) { rvideo_bell = true; scr_rvideo_mode (rvideo_mode); @@ -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 */ @@ -1996,7 +1998,7 @@ have_bg |= bgPixmap.pixmap != None; #endif #if TRANSPARENT - have_bg |= OPTION (Opt_transparent) && am_transparent; + have_bg |= option (Opt_transparent) && am_transparent; #endif ocrow = oldcursor.row; /* is there an old outline cursor on screen? */ @@ -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 } /* @@ -2337,16 +2351,14 @@ */ rxvt_font *font = (*fontset[GET_STYLE (rend)])[GET_FONT (rend)]; - if (back == fore) - font->clear_rect (*drawable, xpixel, ypixel, fwidth * count, fheight, back); - else if (back == Color_bg && have_bg) + if (have_bg && back == Color_bg) { // this is very ugly, maybe push it into ->draw? for (i = 0; i < count; i++) /* don't draw empty strings */ if (text[i] != ' ') { - font->draw (*drawable, xpixel, ypixel, text, count, fore, -1); + font->draw (*drawable, xpixel, ypixel, text, count, fore, Color_transparent); goto did_clear; } @@ -2384,7 +2396,7 @@ { if (focus) { - if (OPTION (Opt_cursorUnderline)) + if (option (Opt_cursorUnderline)) *crp ^= RS_Uline; else { @@ -2409,7 +2421,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), @@ -3402,7 +3416,7 @@ else if (selection.clicks == 3) { #if ENABLE_FRILLS - if (OPTION (Opt_tripleclickwords)) + if (option (Opt_tripleclickwords)) { selection_delimit_word (UP, &selection.beg, &selection.beg);