--- rxvt-unicode/src/screen.C 2006/01/25 21:09:21 1.252 +++ rxvt-unicode/src/screen.C 2008/01/23 06:49:30 1.299 @@ -1,9 +1,9 @@ -/*--------------------------------*-C-*--------------------------------------* +/*---------------------------------------------------------------------------* * File: screen.C *---------------------------------------------------------------------------* * * Copyright (c) 1997-2001 Geoff Wing - * Copyright (c) 2003-2006 Marc Lehmann + * Copyright (c) 2003-2007 Marc Lehmann * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -28,13 +28,11 @@ #include "rxvt.h" /* NECESSARY */ #include "rxvtperl.h" /* NECESSARY */ -#include /* get the typedef for CARD32 */ - #include #include "salloc.C" // HACK, should be a seperate compile! -inline void fill_text (text_t *start, text_t value, int len) +static inline void fill_text (text_t *start, text_t value, int len) { while (len--) *start++ = value; @@ -49,7 +47,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 \ @@ -91,24 +89,22 @@ * CLEAR_CHARS: clear chars starting from pixel position * ERASE_ROWS : set rows starting from row to the foreground colour */ -#define drawBuffer vt - #define CLEAR_ROWS(row, num) \ - if (mapped) \ - XClearArea (xdisp, drawBuffer, 0, \ - Row2Pixel (row), (unsigned int)width, \ + if (mapped) \ + XClearArea (dpy, vt, 0, \ + Row2Pixel (row), (unsigned int)width, \ (unsigned int)Height2Pixel (num), False) #define CLEAR_CHARS(x, y, num) \ - if (mapped) \ - XClearArea (xdisp, drawBuffer, x, y, \ + if (mapped) \ + XClearArea (dpy, vt, x, y, \ (unsigned int)Width2Pixel (num), \ (unsigned int)Height2Pixel (1), False) #define ERASE_ROWS(row, num) \ - XFillRectangle (xdisp, drawBuffer, gc, \ + XFillRectangle (dpy, vt, gc, \ 0, Row2Pixel (row), \ - (unsigned int)width, \ + (unsigned int)width, \ (unsigned int)Height2Pixel (num)) /* ------------------------------------------------------------------------- * @@ -128,7 +124,7 @@ l.touch (); - efs &= ~RS_baseattrMask; + efs &= ~RS_baseattrMask; // remove italic etc. fontstyles efs = SET_FONT (efs, FONTSET (efs)->find_font (' ')); text_t *et = l.t + col; @@ -163,6 +159,7 @@ scr_overlay_off (); #endif + rvideo_mode = false; view_start = 0; num_scr = 0; @@ -239,7 +236,6 @@ selection.op = SELECTION_CLEAR; selection.screen = PRIMARY; selection.clicks = 0; - rvideo_state = rvideo_mode = false; } else { @@ -278,7 +274,7 @@ line_t *old_buf = row_buf; row_buf = (line_t *)rxvt_calloc (total_rows + nrow, sizeof (line_t)); - + int p = MOD (term_start + prev_nrow, prev_total_rows); // previous row int pend = MOD (term_start + top_row , prev_total_rows); int q = total_rows; // rewrapped row @@ -332,7 +328,7 @@ // see below for cursor adjustment rationale if (p == ocur.row) screen.cur.row = q - (total_rows - nrow); - + // fill a single destination line while (lofs < llen && qcol < ncol) { @@ -368,7 +364,7 @@ term_start = total_rows - nrow; top_row = q - term_start; - + // make sure all terminal lines exist while (top_row > 0) scr_blank_screen_mem (ROW (--top_row), DEFAULT_RSTYLE); @@ -376,7 +372,7 @@ else { // if no scrollback exists (yet), wing, instead of wrap - + for (int row = min (nrow, prev_nrow); row--; ) { line_t &pline = old_buf [MOD (term_start + row, prev_total_rows)]; @@ -409,9 +405,9 @@ prev_nrow = nrow; prev_ncol = ncol; - tabs = (char *)rxvt_malloc (ncol * sizeof (char)); + tabs = (char *)rxvt_malloc (ncol); - for (int col = ncol; col--; ) + for (int col = ncol; --col; ) tabs [col] = col % TABSIZE == 0; if (current_screen != PRIMARY) @@ -512,7 +508,7 @@ void rxvt_term::scr_swap_screen () { - if (!OPTION (Opt_secondaryScreen)) + if (!option (Opt_secondaryScreen)) return; for (int i = prev_nrow; i--; ) @@ -544,7 +540,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 +553,7 @@ } else #endif - if (OPTION (Opt_secondaryScroll)) + if (option (Opt_secondaryScroll)) scr_scroll_text (0, prev_nrow - 1, prev_nrow); } @@ -600,14 +596,14 @@ */ void rxvt_term::scr_rendition (int set, int style) NOTHROW - { - if (set) - rstyle |= style; - else if (style == ~RS_None) - rstyle = DEFAULT_RSTYLE; - else - rstyle &= ~style; - } +{ + if (set) + rstyle |= style; + else if (style == ~RS_None) + rstyle = DEFAULT_RSTYLE; + else + rstyle &= ~style; +} /* ------------------------------------------------------------------------- */ /* @@ -626,7 +622,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); @@ -643,14 +639,18 @@ // erase newly scrolled-in lines for (int i = count; i--; ) { - // basically this is a slightly optimized scr_blank_screen_mem - // it is worth the effort on slower machines line_t &l = ROW(nrow - 1 - i); - scr_blank_line (l, 0, l.l, rstyle); - - l.l = 0; - l.f = 0; + // optimize if already cleared, can be significant on slow machines + // could be rolled into scr_blank_screen_mem + if (l.r && l.l < ncol - 1 && !((l.r[l.l + 1] ^ rstyle) & (RS_fgMask | RS_bgMask))) + { + scr_blank_line (l, 0, l.l, rstyle); + l.l = 0; + l.f = 0; + } + else + scr_blank_screen_mem (l, rstyle); } // now copy lines below the scroll region bottom to the @@ -664,7 +664,7 @@ ::swap (l1, l2); l2.touch (); } - + // move and/or clear selection, if any if (selection.op && current_screen == selection.screen) { @@ -682,7 +682,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); @@ -710,7 +710,7 @@ selection.beg.row -= count; selection.end.row -= count; selection.mark.row -= count; - + selection_check (0); } } @@ -832,7 +832,7 @@ if (screen.flags & Screen_WrapNext) { scr_do_wrap (); - + line->l = ncol; line->is_longer (1); @@ -1011,23 +1011,20 @@ void rxvt_term::scr_backspace () NOTHROW { - want_refresh = 1; - if (screen.cur.col == 0) { if (screen.cur.row > 0) { #ifdef TERMCAP_HAS_BW screen.cur.col = ncol - 1; - screen.cur.row--; - return; + --screen.cur.row; + + want_refresh = 1; #endif } } - else if (!(screen.flags & Screen_WrapNext)) + else scr_gotorc (0, -1, RELATIVE); - - screen.flags &= ~Screen_WrapNext; } /* ------------------------------------------------------------------------- */ @@ -1060,7 +1057,7 @@ if (!--count) break; } - else + else ht &= l.t[i] == ' ' && RS_SAME (l.r[i], base_rend); @@ -1069,7 +1066,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); @@ -1112,7 +1109,7 @@ * Move cursor left in row. If we're at the left boundary, shift everything * in that row right. Clear left column. */ -#if ENABLE_FRILLS +#if !ENABLE_MINIMAL void rxvt_term::scr_backindex () NOTHROW { @@ -1129,7 +1126,7 @@ * Move cursor right in row. If we're at the right boundary, shift everything * in that row left. Clear right column. */ -#if ENABLE_FRILLS +#if !ENABLE_MINIMAL void rxvt_term::scr_forwardindex () NOTHROW { @@ -1186,7 +1183,8 @@ else { if (screen.flags & Screen_Relative) - { /* relative origin mode */ + { + /* relative origin mode */ screen.cur.row = row + screen.tscroll; min_it (screen.cur.row, screen.bscroll); } @@ -1340,10 +1338,10 @@ { ren = rstyle & (RS_fgMask | RS_bgMask); gcvalue.foreground = pix_colors[bgcolor_of (rstyle)]; - XChangeGC (xdisp, gc, GCForeground, &gcvalue); + XChangeGC (dpy, gc, GCForeground, &gcvalue); ERASE_ROWS (row, num); gcvalue.foreground = pix_colors[Color_fg]; - XChangeGC (xdisp, gc, GCForeground, &gcvalue); + XChangeGC (dpy, gc, GCForeground, &gcvalue); } for (; num--; row++) @@ -1353,7 +1351,7 @@ } } -#if ENABLE_FRILLS +#if !ENABLE_MINIMAL void rxvt_term::scr_erase_savelines () NOTHROW { @@ -1472,7 +1470,8 @@ || (selection.end.col + count >= ncol)) CLEAR_SELECTION (); else - { /* shift selection */ + { + /* shift selection */ selection.beg.col += count; selection.mark.col += count; /* XXX: yes? */ selection.end.col += count; @@ -1621,7 +1620,7 @@ rxvt_term::scr_set_tab (int mode) NOTHROW { if (mode < 0) - memset (tabs, 0, ncol * sizeof (char)); + memset (tabs, 0, ncol); else if (screen.cur.col < ncol) tabs [screen.cur.col] = !!mode; } @@ -1646,18 +1645,15 @@ rvideo_state = on; ::swap (pix_colors[Color_fg], pix_colors[Color_bg]); -#if XPM_BACKGROUND +#ifdef HAVE_BG_PIXMAP if (bgPixmap.pixmap == None) #endif -#if TRANSPARENT - if (!OPTION (Opt_transparent) || am_transparent == 0) -#endif - XSetWindowBackground (xdisp, vt, pix_colors[Color_bg]); + XSetWindowBackground (dpy, vt, pix_colors[Color_bg]); XGCValues gcvalue; gcvalue.foreground = pix_colors[Color_fg]; gcvalue.background = pix_colors[Color_bg]; - XChangeGC (xdisp, gc, GCBackground | GCForeground, &gcvalue); + XChangeGC (dpy, gc, GCBackground | GCForeground, &gcvalue); scr_clear (); scr_touch (true); @@ -1752,10 +1748,9 @@ for (int i = 0; i < nrow; i++) { - int col = 0; rend_t *drp = drawn_buf[i].r; - for (; col < ncol; col++, drp++) + for (int col = 0; col < ncol; col++, drp++) if ((*drp & mask) == value) { found = true; @@ -1805,7 +1800,7 @@ min_it (rc[i].col, ncol - 1); min_it (rc[i].row, nrow - 1); } - +// TODO: this line somehow causes segfault if scr_expose() is called just after resize for (i = rc[PART_BEG].row; i <= rc[PART_END].row; i++) fill_text (&drawn_buf[i].t[rc[PART_BEG].col], 0, rc[PART_END].col - rc[PART_BEG].col + 1); @@ -1870,10 +1865,11 @@ #ifndef NO_BELL void -rxvt_term::bell_cb (time_watcher &w) +rxvt_term::bell_cb (ev::timer &w, int revents) { rvideo_bell = false; scr_rvideo_mode (rvideo_mode); + refresh_check (); } #endif @@ -1885,22 +1881,32 @@ # ifndef NO_MAPALERT # ifdef MAPALERT_OPTION - if (OPTION (Opt_mapAlert)) + if (option (Opt_mapAlert)) # endif - XMapWindow (xdisp, parent[0]); + XMapWindow (dpy, parent[0]); +# endif + +# if ENABLE_FRILLS + if (option (Opt_urgentOnBell)) + { + if (XWMHints *h = XGetWMHints(dpy, parent[0])) + { + h->flags |= XUrgencyHint; + XSetWMHints (dpy, parent[0], h); + } + } # endif - if (OPTION (Opt_visualBell)) + if (option (Opt_visualBell)) { rvideo_bell = true; scr_rvideo_mode (rvideo_mode); - display->flush (); + flush (); - bell_ev.start (NOW + VISUAL_BELL_DURATION); + bell_ev.start (VISUAL_BELL_DURATION); } else - XBell (xdisp, 0); - + XBell (dpy, 0); #endif } @@ -1968,7 +1974,7 @@ void rxvt_term::scr_refresh () NOTHROW { - unsigned char must_clear, /* use draw_string not draw_image_string */ + unsigned char have_bg, showcursor; /* show the cursor */ int16_t col, row, /* column/row we're processing */ ocrow; /* old cursor row */ @@ -1977,6 +1983,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 */ @@ -1986,14 +1994,11 @@ /* * A: set up vars */ - must_clear = 0; + have_bg = 0; refresh_count = 0; -#if XPM_BACKGROUND - must_clear |= bgPixmap.pixmap != None; -#endif -#if TRANSPARENT - must_clear |= OPTION (Opt_transparent) && am_transparent; +#ifdef HAVE_BG_PIXMAP + have_bg |= bgPixmap.pixmap != None; #endif ocrow = oldcursor.row; /* is there an old outline cursor on screen? */ @@ -2007,8 +2012,6 @@ */ { unsigned char setoldcursor; - rend_t ccol1, /* Cursor colour */ - ccol2; /* Cursor colour2 */ showcursor = (screen.flags & Screen_VisibleCursor); #ifdef CURSOR_BLINK @@ -2025,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 } } } @@ -2102,9 +2108,10 @@ */ if (!display->is_local && refresh_type == FAST_REFRESH && num_scr_allow && num_scr - && abs (num_scr) < nrow && !must_clear) + && abs (num_scr) < nrow && !have_bg) { int16_t nits; + int i = num_scr; int j; int len, wlen; dLocal (int, num_scr); @@ -2112,6 +2119,7 @@ j = nrow; wlen = len = -1; row = i > 0 ? 0 : j - 1; + for (; j-- >= 0; row += (i > 0 ? 1 : -1)) { if (row + i >= 0 && row + i < nrow && row + i != ocrow) @@ -2142,17 +2150,22 @@ } } - if (len != -1) + if (len >= 0) { /* also comes here at end if needed because of >= above */ if (wlen < len) ::swap (wlen, len); - XCopyArea (xdisp, vt, vt, + XGCValues gcv; + + gcv.graphics_exposures = 1; XChangeGC (dpy, gc, GCGraphicsExposures, &gcv); + XCopyArea (dpy, vt, vt, gc, 0, Row2Pixel (len + i), (unsigned int)this->width, (unsigned int)Height2Pixel (wlen - len + 1), 0, Row2Pixel (len)); + gcv.graphics_exposures = 0; XChangeGC (dpy, gc, GCGraphicsExposures, &gcv); + len = -1; } } @@ -2218,14 +2231,14 @@ if (stp[col] != dtp[col] || !RS_SAME (srp[col], drp[col])) { - if (must_clear && (i++ > count / 2)) + if (have_bg && (i++ > count / 2)) break; dtp[col] = stp[col]; drp[col] = rend; i = 0; } - else if (must_clear || (stp[col] != ' ' && ++i >= 16)) + else if (have_bg || (stp[col] != ' ' && ++i >= 16)) break; } @@ -2245,29 +2258,10 @@ // 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]; - - // 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]; -#endif - bool invert = rend & RS_RVid; #ifndef NO_BOLD_UNDERLINE_REVERSE - if (rend & RS_Bold - && fore == Color_fg) + if (rend & RS_Bold && fore == Color_fg) { if (ISSET_PIXCOLOR (Color_BD)) fore = Color_BD; @@ -2277,8 +2271,7 @@ # endif } - if (rend & RS_Italic - && fore == Color_fg) + if (rend & RS_Italic && fore == Color_fg) { if (ISSET_PIXCOLOR (Color_IT)) fore = Color_IT; @@ -2288,18 +2281,29 @@ # endif } - if (rend & RS_Uline && ISSET_PIXCOLOR (Color_UL)) + if (rend & RS_Uline && fore == Color_fg && ISSET_PIXCOLOR (Color_UL)) fore = Color_UL; #endif 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; @@ -2311,15 +2315,33 @@ #ifdef TEXT_BLINK if (rend & RS_Blink && (back == Color_bg || fore == Color_bg)) { - if (!text_blink_ev.active) + if (!text_blink_ev.is_active ()) { - text_blink_ev.start (NOW + TEXT_BLINK_INTERVAL); + text_blink_ev.again (); hidden_text = 0; } else if (hidden_text) 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 } /* @@ -2327,25 +2349,19 @@ */ 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) + if (have_bg && back == Color_bg) { - if (must_clear) - { - CLEAR_CHARS (xpixel, ypixel, count); + // 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); - break; - } - } - else - font->draw (*drawable, xpixel, ypixel, text, count, fore, Color_bg); + for (i = 0; i < count; i++) /* don't draw empty strings */ + if (text[i] != ' ') + { + font->draw (*drawable, xpixel, ypixel, text, count, fore, Color_transparent); + goto did_clear; + } + + CLEAR_CHARS (xpixel, ypixel, count); + did_clear: ; } else font->draw (*drawable, xpixel, ypixel, text, count, fore, back); @@ -2354,12 +2370,12 @@ { #if ENABLE_FRILLS if (ISSET_PIXCOLOR (Color_underline)) - XSetForeground (xdisp, gc, pix_colors[Color_underline]); + XSetForeground (dpy, gc, pix_colors[Color_underline]); else #endif - XSetForeground (xdisp, gc, pix_colors[fore]); + XSetForeground (dpy, gc, pix_colors[fore]); - XDrawLine (xdisp, drawBuffer, gc, + XDrawLine (dpy, vt, gc, xpixel, ypixel + font->ascent + 1, xpixel + Width2Pixel (count) - 1, ypixel + font->ascent + 1); } @@ -2378,7 +2394,7 @@ { if (focus) { - if (OPTION (Opt_cursorUnderline)) + if (option (Opt_cursorUnderline)) *crp ^= RS_Uline; else { @@ -2402,10 +2418,12 @@ #ifndef NO_CURSORCOLOR if (ISSET_PIXCOLOR (Color_cursor)) - XSetForeground (xdisp, gc, pix_colors[Color_cursor]); + XSetForeground (dpy, gc, pix_colors[Color_cursor]); + else #endif + XSetForeground (dpy, gc, pix_colors[ccol1]); - XDrawRectangle (xdisp, drawBuffer, gc, + XDrawRectangle (dpy, vt, gc, Col2Pixel (col), Row2Pixel (oldcursor.row), (unsigned int) (Width2Pixel (cursorwidth) - 1), @@ -2450,31 +2468,28 @@ void rxvt_term::scr_recolour () NOTHROW { - if (1 -#if TRANSPARENT - && !am_transparent -#endif -#if XPM_BACKGROUND - && !bgPixmap.pixmap -#endif - ) - { - XSetWindowBackground (xdisp, parent[0], pix_colors[Color_border]); - XClearWindow (xdisp, parent[0]); - XSetWindowBackground (xdisp, vt, pix_colors[Color_bg]); -#if HAVE_SCROLLBARS - if (scrollBar.win) - { - XSetWindowBackground (xdisp, scrollBar.win, pix_colors[Color_border]); - scrollBar.setIdle (); - scrollbar_show (0); - } -#endif - } +#ifdef HAVE_BG_PIXMAP + bgPixmap.apply (); +#else + + XSetWindowBackground (dpy, parent[0], pix_colors[Color_border]); + XClearWindow (dpy, parent[0]); + XSetWindowBackground (dpy, vt, pix_colors[Color_bg]); + +# if HAVE_SCROLLBARS + if (scrollBar.win) + { + XSetWindowBackground (dpy, scrollBar.win, pix_colors[Color_border]); + scrollBar.setIdle (); + scrollbar_show (0); + } +# endif scr_clear (); scr_touch (true); want_refresh = 1; + +#endif } /* ------------------------------------------------------------------------- */ @@ -2488,7 +2503,7 @@ want_refresh = 1; if (really) - XClearWindow (xdisp, vt); + XClearWindow (dpy, vt); } void @@ -2547,7 +2562,7 @@ && current_screen == selection.screen && selection.end.row >= view_start) { -#if ENABLE_FRILLS +#if !ENABLE_MINIMAL if (selection.rect) scr_xor_rect (selection.beg.row, selection.beg.col, selection.end.row, selection.end.col, @@ -2634,7 +2649,13 @@ if (data[i] == C0_LF) data[i] = C0_CR; + if (priv_modes & PrivMode_BracketPaste) + tt_printf ("\e[200~"); + tt_write (data, len); + + if (priv_modes & PrivMode_BracketPaste) + tt_printf ("\e[201~"); } /* ------------------------------------------------------------------------- */ @@ -2673,7 +2694,7 @@ unsigned long bytes_after; XTextProperty ct; - if (XGetWindowProperty (xdisp, win, prop, + if (XGetWindowProperty (dpy, win, prop, 0, PROP_SIZE / 4, delete_prop, AnyPropertyType, &ct.encoding, &ct.format, @@ -2692,7 +2713,7 @@ // fetch and append remaining data XTextProperty ct2; - if (XGetWindowProperty (xdisp, win, prop, + if (XGetWindowProperty (dpy, win, prop, ct.nitems / 4, (bytes_after + 3) / 4, delete_prop, AnyPropertyType, &ct2.encoding, &ct2.format, @@ -2715,11 +2736,11 @@ { // INCR selection, start handshake if (!delete_prop) - XDeleteProperty (xdisp, win, prop); + XDeleteProperty (dpy, win, prop); selection_wait = Sel_incr; incr_buf_fill = 0; - incr_ev.start (NOW + 10); + incr_ev.start (10); goto bailout; } @@ -2738,7 +2759,7 @@ incr_buf_size = 0; incr_ev.stop (); } - else + else { if (selection_wait == Sel_normal && (win != display->root || prop != XA_CUT_BUFFER0)) // avoid recursion @@ -2755,7 +2776,7 @@ } else if (selection_wait == Sel_incr) { - incr_ev.start (NOW + 10); + incr_ev.start (10); while (incr_buf_fill + ct.nitems > incr_buf_size) { @@ -2772,7 +2793,7 @@ char **cl; int cr; -#if ENABLE_FRILLS +#if !ENABLE_MINIMAL // xlib is horribly broken with respect to UTF8_STRING, and nobody cares to fix it // so recode it manually if (ct.encoding == xa[XA_UTF8_STRING]) @@ -2786,7 +2807,7 @@ } else #endif - if (XmbTextPropertyToTextList (xdisp, &ct, &cl, &cr) >= 0 + if (XmbTextPropertyToTextList (dpy, &ct, &cl, &cr) >= 0 && cl) { for (int i = 0; i < cr; i++) @@ -2805,7 +2826,7 @@ } void -rxvt_term::incr_cb (time_watcher &w) NOTHROW +rxvt_term::incr_cb (ev::timer &w, int revents) NOTHROW { selection_wait = Sel_none; @@ -2826,7 +2847,7 @@ /* ------------------------------------------------------------------------- */ /* - * Request the current selection: + * Request the current selection: * Order: > internal selection if available * > PRIMARY, SECONDARY, CLIPBOARD if ownership is claimed (+) * > CUT_BUFFER0 @@ -2838,7 +2859,8 @@ rxvt_term::selection_request (Time tm, int selnum) NOTHROW { if (selection.text && selnum == Sel_Primary) - { /* internal selection */ + { + /* internal selection */ char *str = rxvt_wcstombs (selection.text, selection.len); paste (str, strlen (str)); free (str); @@ -2878,9 +2900,9 @@ else sel = xa[XA_CLIPBOARD]; - if (XGetSelectionOwner (xdisp, sel) != None) + if (XGetSelectionOwner (dpy, sel) != None) { - XConvertSelection (xdisp, sel, target, xa[XA_VT_SELECTION], + XConvertSelection (dpy, sel, target, xa[XA_VT_SELECTION], vt, selection_request_time); return 1; } @@ -2953,7 +2975,7 @@ for (; row <= selection.end.row; row++, col = 0) { -#if ENABLE_FRILLS +#if !ENABLE_MINIMAL if (selection.rect) { col = selection.beg.col; @@ -2966,7 +2988,7 @@ col = max (col, 0); if (row == selection.end.row -#if ENABLE_FRILLS +#if !ENABLE_MINIMAL || selection.rect #endif ) @@ -2999,7 +3021,7 @@ new_selection_text[ofs++] = *t++; } -#if ENABLE_FRILLS +#if !ENABLE_MINIMAL if (selection.rect) { while (ofs @@ -3043,8 +3065,8 @@ { selection_time = tm; - XSetSelectionOwner (xdisp, XA_PRIMARY, vt, tm); - if (XGetSelectionOwner (xdisp, XA_PRIMARY) == vt) + XSetSelectionOwner (dpy, XA_PRIMARY, vt, tm); + if (XGetSelectionOwner (dpy, XA_PRIMARY) == vt) { display->set_selection_owner (this); return true; @@ -3058,7 +3080,7 @@ #if 0 XTextProperty ct; - if (XwcTextListToTextProperty (xdisp, &selection.text, 1, XStringStyle, &ct) >= 0) + if (XwcTextListToTextProperty (dpy, &selection.text, 1, XStringStyle, &ct) >= 0) { set_string_property (XA_CUT_BUFFER0, ct.value, ct.nitems); XFree (ct.value); @@ -3114,9 +3136,10 @@ while (selection.mark.col > 0 && ROW(selection.mark.row).t[selection.mark.col] == NOCHAR) --selection.mark.col; - + if (selection.op) - { /* clear the old selection */ + { + /* clear the old selection */ selection.beg.row = selection.end.row = selection.mark.row; selection.beg.col = selection.end.col = selection.mark.col; } @@ -3315,7 +3338,8 @@ * time of the most recent button3 press */ if (button3 && buttonpress) - { /* button3 press */ + { + /* button3 press */ /* * first determine which edge of the selection we are closest to */ @@ -3343,7 +3367,8 @@ } } else - { /* button1 drag or button3 drag */ + { + /* button1 drag or button3 drag */ if (ROWCOL_IS_AFTER (selection.mark, pos)) { if (selection.mark.row == selection.end.row @@ -3370,7 +3395,7 @@ { if (selection.beg.col > ROW(selection.beg.row).l //TODO//FIXME//LEN && !ROW(selection.beg.row).is_longer () -#if ENABLE_FRILLS +#if !ENABLE_MINIMAL && !selection.rect #endif ) @@ -3379,7 +3404,7 @@ if ( selection.end.col > ROW(selection.end.row).l //TODO//FIXME//LEN && !ROW(selection.end.row).is_longer () -#if ENABLE_FRILLS +#if !ENABLE_MINIMAL && !selection.rect #endif ) @@ -3396,7 +3421,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); @@ -3406,7 +3431,9 @@ { selection.end.row = end_row; selection.end.col = ROW(end_row).l; +# if !ENABLE_MINIMAL selection_remove_trailing_spaces (); +# endif break; } } @@ -3432,7 +3459,8 @@ } if (button3 && buttonpress) - { /* mark may need to be changed */ + { + /* mark may need to be changed */ if (closeto == LEFT) { selection.mark.row = selection.end.row; @@ -3445,13 +3473,13 @@ } } -#if ENABLE_FRILLS +#if !ENABLE_MINIMAL if (selection.rect && selection.beg.col > selection.end.col) ::swap (selection.beg.col, selection.end.col); #endif } -#if ENABLE_FRILLS +#if !ENABLE_MINIMAL void rxvt_term::selection_remove_trailing_spaces () NOTHROW { @@ -3539,7 +3567,7 @@ *target++ = xa[XA_UTF8_STRING]; #endif - XChangeProperty (xdisp, rq.requestor, rq.property, XA_ATOM, + XChangeProperty (dpy, rq.requestor, rq.property, XA_ATOM, 32, PropModeReplace, (unsigned char *)target_list, target - target_list); ev.property = rq.property; @@ -3552,7 +3580,7 @@ #endif else if (rq.target == xa[XA_TIMESTAMP] && selection.text) { - XChangeProperty (xdisp, rq.requestor, rq.property, rq.target, + XChangeProperty (dpy, rq.requestor, rq.property, rq.target, 32, PropModeReplace, (unsigned char *)&selection_time, 1); ev.property = rq.property; } @@ -3586,7 +3614,7 @@ style = enc_text; else if (target == xa[XA_COMPOUND_TEXT]) style = enc_compound_text; -#if ENABLE_FRILLS +#if !ENABLE_MINIMAL else if (target == xa[XA_UTF8_STRING]) style = enc_utf8; #endif @@ -3607,7 +3635,7 @@ selectlen = 0; } -#if ENABLE_FRILLS +#if !ENABLE_MINIMAL // xlib is horribly broken with respect to UTF8_STRING, and nobody cares to fix it // so recode it manually if (style == enc_utf8) @@ -3620,7 +3648,7 @@ } else #endif - if (XwcTextListToTextProperty (xdisp, &cl, 1, (XICCEncodingStyle) style, &ct) >= 0) + if (XwcTextListToTextProperty (dpy, &cl, 1, (XICCEncodingStyle) style, &ct) >= 0) freect = 1; else { @@ -3630,7 +3658,7 @@ ct.encoding = target; } - XChangeProperty (xdisp, rq.requestor, rq.property, + XChangeProperty (dpy, rq.requestor, rq.property, ct.encoding, 8, PropModeReplace, ct.value, (int)ct.nitems); ev.property = rq.property; @@ -3639,23 +3667,7 @@ XFree (ct.value); } - XSendEvent (xdisp, rq.requestor, False, 0L, (XEvent *)&ev); -} - -/* ------------------------------------------------------------------------- * - * MOUSE ROUTINES * - * ------------------------------------------------------------------------- */ - -/* - * return col/row values corresponding to x/y pixel values - */ -void -rxvt_term::pixel_position (int *x, int *y) NOTHROW -{ - *x = Pixel2Col (*x); - /* max_it (*x, 0); min_it (*x, (int)ncol - 1); */ - *y = Pixel2Row (*y); - /* max_it (*y, 0); min_it (*y, (int)nrow - 1); */ + XSendEvent (dpy, rq.requestor, False, 0L, (XEvent *)&ev); } /* ------------------------------------------------------------------------- */ @@ -3665,7 +3677,7 @@ { XWindowAttributes xwa; - XGetWindowAttributes (xdisp, vt, &xwa); + XGetWindowAttributes (dpy, vt, &xwa); pos.x = xwa.x + Col2Pixel (screen.cur.col); pos.y = xwa.y + Height2Pixel (screen.cur.row) + fbase;