--- rxvt-unicode/src/screen.C 2004/08/25 03:52:09 1.129 +++ rxvt-unicode/src/screen.C 2004/12/01 02:12:18 1.141 @@ -568,28 +568,32 @@ selection_check (2); /* check for boundary cross */ SWAP_IT (current_screen, scrn, int); + + SWAP_IT (screen.cur.row, swap.cur.row, int16_t); + SWAP_IT (screen.cur.col, swap.cur.col, int16_t); +# ifdef DEBUG_STRICT + assert (screen.cur.row >= 0 && screen.cur.row < prev_nrow); + assert (screen.cur.col >= 0 && screen.cur.col < prev_ncol); +# else /* drive with your eyes closed */ + MAX_IT (screen.cur.row, 0); + MIN_IT (screen.cur.row, (int32_t)prev_nrow - 1); + MAX_IT (screen.cur.col, 0); + MIN_IT (screen.cur.col, (int32_t)prev_ncol - 1); +# endif + #if NSCREENS if (options & Opt_secondaryScreen) { num_scr = 0; offset = TermWin.saveLines; + for (i = prev_nrow; i--;) { SWAP_IT (screen.text[i + offset], swap.text[i], text_t *); SWAP_IT (screen.tlen[i + offset], swap.tlen[i], int16_t); SWAP_IT (screen.rend[i + offset], swap.rend[i], rend_t *); } - SWAP_IT (screen.cur.row, swap.cur.row, int16_t); - SWAP_IT (screen.cur.col, swap.cur.col, int16_t); -# ifdef DEBUG_STRICT - assert ((screen.cur.row >= 0) && (screen.cur.row < prev_nrow)); - assert ((screen.cur.col >= 0) && (screen.cur.col < prev_ncol)); -# else /* drive with your eyes closed */ - MAX_IT (screen.cur.row, 0); - MIN_IT (screen.cur.row, (int32_t)prev_nrow - 1); - MAX_IT (screen.cur.col, 0); - MIN_IT (screen.cur.col, (int32_t)prev_ncol - 1); -# endif + SWAP_IT (screen.charset, swap.charset, int16_t); SWAP_IT (screen.flags, swap.flags, int); screen.flags |= Screen_VisibleCursor; @@ -599,7 +603,8 @@ #endif if (options & Opt_secondaryScroll) //if (current_screen == PRIMARY) - scr_scroll_text (0, (prev_nrow - 1), prev_nrow, 0); + scr_scroll_text (0, prev_nrow - 1, prev_nrow, 0); + return scrn; } @@ -880,14 +885,14 @@ srp = screen.rend[row]; /* _must_ refresh */ } - if (screen.flags & Screen_Insert) - scr_insdel_chars (1, INSERT); - // rely on wcwidth to tell us the character width, at least for non-latin1 // do wcwidth before further replacements, as wcwidth says that line-drawing // characters have width -1 (DOH!) on GNU/Linux sometimes. int width = c < 0x100 ? 1 : wcwidth (c); + if (screen.flags & Screen_Insert) + scr_insdel_chars (width, INSERT); + if (charsets[screen.charset] == '0') // DEC SPECIAL { // vt100 special graphics and line drawing @@ -991,25 +996,24 @@ { tp = stp + screen.cur.col - 1; rp = srp + screen.cur.col - 1; + + while (*tp == NOCHAR && tp > stp) + tp--, rp--; } else if (screen.cur.row > 0 && screen.tlen [screen.cur.row - 1 + TermWin.saveLines] == -1) { - tp = screen.text[screen.cur.row - 1 + TermWin.saveLines] + last_col - 1; - rp = screen.rend[screen.cur.row - 1 + TermWin.saveLines] + last_col - 1; + int line = screen.cur.row - 1 + TermWin.saveLines; + + tp = screen.text[line] + last_col - 1; + rp = screen.rend[line] + last_col - 1; + + while (*tp == NOCHAR && tp > screen.text[line]) + tp--, rp--; } else continue; - // handle double-width-chars by making them look extremely ugly - if (*tp == NOCHAR) - { - // hack //D //TODO //--tp, --rp; - *tp = ' '; - *rp &= ~RS_baseattrMask; - *rp = SET_FONT (*rp, FONTSET (*rp)->find_font (*tp)); - } - // first try to find a precomposed character unicode_t n = rxvt_compose (*tp, c); if (n == NOCHAR) @@ -1098,7 +1102,7 @@ // store horizontal tab commands as characters inside the text // buffer so they can be selected and pasted. - if (ht) + if (ht && options & Opt_pastableTabs) { base_rend = SET_FONT (base_rend, 0); @@ -1381,7 +1385,7 @@ } else { - ren = (rstyle & (RS_fgMask | RS_bgMask)); + ren = rstyle & (RS_fgMask | RS_bgMask); gcvalue.foreground = pix_colors[GET_BGCOLOR (rstyle)]; XChangeGC (display->display, TermWin.gc, GCForeground, &gcvalue); ERASE_ROWS (row, num); @@ -1391,11 +1395,9 @@ for (; num--; row++) { - scr_blank_screen_mem (screen.text, screen.rend, - (unsigned int) (row + row_offset), rstyle); + scr_blank_screen_mem (screen.text, screen.rend, (unsigned int) (row + row_offset), rstyle); screen.tlen[row + row_offset] = 0; - scr_blank_line (drawn_text[row], drawn_rend[row], - (unsigned int)TermWin.ncol, ren); + scr_blank_line (drawn_text[row], drawn_rend[row], (unsigned int)TermWin.ncol, ren); } } @@ -1489,8 +1491,7 @@ switch (insdel) { case INSERT: - for (col = TermWin.ncol - 1; (col - count) >= screen.cur.col; - col--) + for (col = TermWin.ncol - 1; (col - count) >= screen.cur.col; col--) { stp[col] = stp[col - count]; srp[col] = srp[col - count]; @@ -1510,13 +1511,13 @@ CLEAR_SELECTION (); else { /* shift selection */ - selection.beg.col += count; + selection.beg.col += count; selection.mark.col += count; /* XXX: yes? */ - selection.end.col += count; + selection.end.col += count; } } - scr_blank_line (& (stp[screen.cur.col]), & (srp[screen.cur.col]), + scr_blank_line (&stp[screen.cur.col], &srp[screen.cur.col], (unsigned int)count, rstyle); break; @@ -1524,7 +1525,7 @@ screen.cur.col += count; /* don't worry if > TermWin.ncol */ selection_check (1); screen.cur.col -= count; - scr_blank_line (& (stp[screen.cur.col]), & (srp[screen.cur.col]), + scr_blank_line (&stp[screen.cur.col], &srp[screen.cur.col], (unsigned int)count, rstyle); break; @@ -1537,8 +1538,7 @@ srp[col] = srp[col + count]; } - scr_blank_line (& (stp[TermWin.ncol - count]), - & (srp[TermWin.ncol - count]), + scr_blank_line (&stp[TermWin.ncol - count], &srp[TermWin.ncol - count], (unsigned int)count, tr); if (*slp == -1) /* break line continuation */ @@ -1557,9 +1557,9 @@ else { /* shift selection */ - selection.beg.col -= count; + selection.beg.col -= count; selection.mark.col -= count; /* XXX: yes? */ - selection.end.col -= count; + selection.end.col -= count; } } @@ -1753,10 +1753,10 @@ */ void rxvt_term::scr_charset_choose (int set) - { - screen.charset = set; - set_font_style (); - } +{ + screen.charset = set; + set_font_style (); +} /* ------------------------------------------------------------------------- */ /* @@ -1769,10 +1769,10 @@ */ void rxvt_term::scr_charset_set (int set, unsigned int ch) - { - charsets[set] = (unsigned char)ch; - set_font_style (); - } +{ + charsets[set] = (unsigned char)ch; + set_font_style (); +} /* ------------------------------------------------------------------------- * @@ -2038,6 +2038,8 @@ #endif rend_t *crp; // cursor rendition pointer + want_refresh = 0; /* screen is current */ + if (refresh_type == NO_REFRESH || !TermWin.mapped) return; @@ -2244,7 +2246,7 @@ // redraw one or more characters - // seek to the beginning if wide characters + // seek to the beginning of wide characters while (stp[col] == NOCHAR && col > 0) --col; @@ -2449,7 +2451,6 @@ num_scr = 0; num_scr_allow = 1; - want_refresh = 0; /* screen is current */ } void @@ -2546,22 +2547,36 @@ int col, row = selection.end.row + TermWin.saveLines; rend_t *srp; - if (i >= end_row) - col = selection.beg.col; - else +#if ENABLE_FRILLS + if (selection.rect) { - col = 0; - i = end_row; + end_row += TermWin.nrow; + + for (; i <= row && i <= end_row; i++) + for (srp = screen.rend[i], col = selection.beg.col; col < selection.end.col; col++) + srp[col] ^= RS_RVid; } + else +#endif + { + if (i >= end_row) + col = selection.beg.col; + else + { + col = 0; + i = end_row; + } + + end_row += TermWin.nrow; - end_row += TermWin.nrow; - for (; i < row && i < end_row; i++, col = 0) - for (srp = screen.rend[i]; col < TermWin.ncol; col++) - srp[col] ^= RS_RVid; - - if (i == row && i < end_row) - for (srp = screen.rend[i]; col < selection.end.col; col++) - srp[col] ^= RS_RVid; + for (; i < row && i < end_row; i++, col = 0) + for (srp = screen.rend[i]; col < TermWin.ncol; col++) + srp[col] ^= RS_RVid; + + if (i == row && i < end_row) + for (srp = screen.rend[i]; col < selection.end.col; col++) + srp[col] ^= RS_RVid; + } } } @@ -2921,7 +2936,6 @@ new_selection_text = (wchar_t *)rxvt_malloc ((i + 4) * sizeof (wchar_t)); col = selection.beg.col; - MAX_IT (col, 0); row = selection.beg.row + TermWin.saveLines; end_row = selection.end.row + TermWin.saveLines; int ofs = 0; @@ -2929,16 +2943,25 @@ for (; row <= end_row; row++, col = 0) { - t = &screen.text[row][col]; - end_col = screen.tlen[row]; +#if ENABLE_FRILLS + if (selection.rect) + { + col = selection.beg.col; + end_col = TermWin.ncol + 1; + } +#endif + + MAX_IT (col, 0); + if (end_col == -1) end_col = TermWin.ncol; - if (row == end_row) + if (row == end_row || selection.rect) MIN_IT (end_col, selection.end.col); + t = &screen.text[row][col]; for (; col < end_col; col++) { if (*t == NOCHAR) @@ -3208,6 +3231,7 @@ } closeto = RIGHT; want_refresh = 1; + switch (selection.op) { case SELECTION_INIT: @@ -3230,6 +3254,7 @@ default: return; } + if (selection.beg.col == selection.end.col && selection.beg.col != selection.mark.col && selection.beg.row == selection.end.row @@ -3289,9 +3314,10 @@ { /* button1 drag or button3 drag */ if (ROWCOL_IS_AFTER (selection.mark, pos)) { - if ((selection.mark.row == selection.end.row) - && (selection.mark.col == selection.end.col) - && clickchange && selection.clicks == 2) + if (selection.mark.row == selection.end.row + && selection.mark.col == selection.end.col + && clickchange + && selection.clicks == 2) selection.mark.col--; selection.beg.row = pos.row; @@ -3312,21 +3338,23 @@ { end_col = screen.tlen[selection.beg.row + TermWin.saveLines]; - if (end_col != -1 && selection.beg.col > end_col) - { -#if 1 - selection.beg.col = ncol; -#else - if (selection.beg.row != selection.end.row) - selection.beg.col = ncol; - else - selection.beg.col = selection.mark.col; + if (selection.beg.col > end_col + && end_col != -1 +#if ENABLE_FRILLS + && !selection.rect #endif - } + ) + selection.beg.col = ncol; end_col = screen.tlen[selection.end.row + TermWin.saveLines]; - if (end_col != -1 && selection.end.col > end_col) + if ( + selection.end.col > end_col + && end_col != -1 +#if ENABLE_FRILLS + && !selection.rect +#endif + ) selection.end.col = ncol; } else if (selection.clicks == 2) @@ -3334,8 +3362,8 @@ if (ROWCOL_IS_AFTER (selection.end, selection.beg)) selection.end.col--; - selection_delimit_word (UP, & (selection.beg), & (selection.beg)); - selection_delimit_word (DN, & (selection.end), & (selection.end)); + selection_delimit_word (UP, &selection.beg, &selection.beg); + selection_delimit_word (DN, &selection.end, &selection.end); } else if (selection.clicks == 3) { @@ -3344,7 +3372,7 @@ { int end_row; - selection_delimit_word (UP, & (selection.beg), & (selection.beg)); + selection_delimit_word (UP, &selection.beg, &selection.beg); end_row = screen.tlen[selection.mark.row + TermWin.saveLines]; for (end_row = selection.mark.row; end_row < TermWin.nrow; end_row++) @@ -3365,6 +3393,7 @@ { if (ROWCOL_IS_AFTER (selection.mark, selection.beg)) selection.mark.col++; + selection.beg.col = 0; selection.end.col = ncol; } @@ -3383,25 +3412,35 @@ selection.mark.col = selection.beg.col; } } + +#if ENABLE_FRILLS + if (selection.rect && selection.beg.col > selection.end.col) + SWAP_IT (selection.beg.col, selection.end.col, int); +#endif } #if ENABLE_FRILLS void rxvt_term::selection_remove_trailing_spaces () { - int32_t end_col, end_row; - text_t *stp; + int32_t end_col, end_row; + text_t *stp; end_col = selection.end.col; end_row = selection.end.row; + for ( ; end_row >= selection.beg.row; ) { stp = screen.text[end_row + TermWin.saveLines]; + while (--end_col >= 0) { - if (stp[end_col] != ' ' && stp[end_col] != '\t') + if (stp[end_col] != ' ' + && stp[end_col] != '\t' + && stp[end_col] != NOCHAR) break; } + if (end_col >= 0 || screen.tlen[end_row - 1 + TermWin.saveLines] != -1) { @@ -3409,9 +3448,11 @@ selection.end.row = end_row; break; } + end_row--; end_col = TermWin.ncol; } + if (selection.mark.row > selection.end.row) { selection.mark.row = selection.end.row; @@ -3437,14 +3478,6 @@ /* ------------------------------------------------------------------------- */ /* - * On some systems, the Atom typedef is 64 bits wide. We need to have a type - * that is exactly 32 bits wide, because a format of 64 is not allowed by - * the X11 protocol. - */ -typedef CARD32 Atom32; - -/* ------------------------------------------------------------------------- */ -/* * Respond to a request for our current selection * EXT: SelectionRequest */ @@ -3466,22 +3499,21 @@ if (rq.target == xa[XA_TARGETS]) { - Atom32 target_list[6]; - Atom32 *target = target_list; + Atom target_list[6]; + Atom *target = target_list; - *target++ = (Atom32) xa[XA_TARGETS]; - *target++ = (Atom32) xa[XA_TIMESTAMP]; - *target++ = (Atom32) XA_STRING; - *target++ = (Atom32) xa[XA_TEXT]; - *target++ = (Atom32) xa[XA_COMPOUND_TEXT]; + *target++ = xa[XA_TARGETS]; + *target++ = xa[XA_TIMESTAMP]; + *target++ = XA_STRING; + *target++ = xa[XA_TEXT]; + *target++ = xa[XA_COMPOUND_TEXT]; #if X_HAVE_UTF8_STRING - *target++ = (Atom32) xa[XA_UTF8_STRING]; + *target++ = xa[XA_UTF8_STRING]; #endif XChangeProperty (display->display, rq.requestor, rq.property, XA_ATOM, - (8 * sizeof (target_list[0])), PropModeReplace, - (unsigned char *)target_list, - target - target_list); + 32, PropModeReplace, + (unsigned char *)target_list, target - target_list); ev.property = rq.property; } #if TODO // TODO @@ -3492,9 +3524,8 @@ #endif else if (rq.target == xa[XA_TIMESTAMP] && selection.text) { - XChangeProperty (display->display, rq.requestor, rq.property, XA_INTEGER, - (8 * sizeof (Time)), PropModeReplace, - (unsigned char *)&selection_time, 1); + XChangeProperty (display->display, rq.requestor, rq.property, rq.target, + 32, PropModeReplace, (unsigned char *)&selection_time, 1); ev.property = rq.property; } else if (rq.target == XA_STRING