--- rxvt-unicode/src/screen.C 2010/08/28 11:03:04 1.347 +++ rxvt-unicode/src/screen.C 2011/01/04 18:22:11 1.358 @@ -146,6 +146,8 @@ rend_t rend = l.r[col] & ~RS_baseattrMask; rend = SET_FONT (rend, FONTSET (rend)->find_font (' ')); + l.touch (); + // found start, nuke do { l.t[col] = ' '; @@ -900,25 +902,29 @@ # endif #endif - // nuke the character at this position, if required - if (expect_false ( - line->t[screen.cur.col] == NOCHAR - || (screen.cur.col < ncol - 1 - && line->t[screen.cur.col + 1] == NOCHAR) - )) - scr_kill_char (*line, screen.cur.col); - rend_t rend = SET_FONT (rstyle, FONTSET (rstyle)->find_font (c)); // if the character doesn't fit into the remaining columns... if (expect_false (screen.cur.col > ncol - width && ncol >= width)) { - // ... artificially enlargen the previous one - c = NOCHAR; - // and try the same character next loop iteration - --str; + if (screen.flags & Screen_Autowrap) + { + // ... artificially enlargen the previous one + c = NOCHAR; + // and try the same character next loop iteration + --str; + } + else + screen.cur.col = ncol - width; } + // nuke the character at this position, if required + // due to wonderful coincidences everywhere else in this loop + // we never have to check for overwriting a wide char itself, + // only its tail. + if (expect_false (line->t[screen.cur.col] == NOCHAR)) + scr_kill_char (*line, screen.cur.col); + line->touch (); do @@ -933,7 +939,8 @@ line->l = ncol; if (screen.flags & Screen_Autowrap) screen.flags |= Screen_WrapNext; - break; + + goto end_of_line; } c = NOCHAR; @@ -941,16 +948,14 @@ while (expect_false (--width > 0)); // pad with spaces when overwriting wide character with smaller one - if (expect_false (!width)) + for (int c = screen.cur.col; expect_false (c < ncol && line->t[c] == NOCHAR); c++) { - line->touch (); - - for (int c = screen.cur.col; c < ncol && line->t[c] == NOCHAR; c++) - { - line->t[c] = ' '; - line->r[c] = rend; - } + line->t[c] = ' '; + line->r[c] = rend; } + +end_of_line: + ; } #if ENABLE_COMBINING else // width == 0 @@ -1023,6 +1028,8 @@ #endif } } + else if (screen.flags & Screen_WrapNext) + screen.flags &= ~Screen_WrapNext; else scr_gotorc (0, -1, RELATIVE); } @@ -2622,7 +2629,7 @@ { int row, wrote; unsigned int width, towrite; - char r1[] = "\n"; + const char r1[] = "\n"; for (row = saveLines + top_row; row < saveLines + nrow - 1; row++) @@ -2993,7 +3000,7 @@ void rxvt_term::selection_make (Time tm) { - int i; + int size; wchar_t *new_selection_text; text_t *t; @@ -3019,8 +3026,8 @@ if (HOOK_INVOKE ((this, HOOK_SEL_MAKE, DT_LONG, (long)tm, DT_END))) return; - i = (selection.end.row - selection.beg.row + 1) * (ncol + 1); - new_selection_text = (wchar_t *)rxvt_malloc ((i + 4) * sizeof (wchar_t)); + size = (selection.end.row - selection.beg.row + 1) * (ncol + 1); + new_selection_text = (wchar_t *)rxvt_malloc ((size + 4) * sizeof (wchar_t)); int ofs = 0; int extra = 0; @@ -3066,9 +3073,9 @@ if (extra < 0) { - extra += i; - i += i; - new_selection_text = (wchar_t *)rxvt_realloc (new_selection_text, (i + 4) * sizeof (wchar_t)); + extra += size; + size += size; + new_selection_text = (wchar_t *)rxvt_realloc (new_selection_text, (size + 4) * sizeof (wchar_t)); } ofs += rxvt_composite.expand (*t++, new_selection_text + ofs); @@ -3090,7 +3097,8 @@ } else #endif - if (!ROW(row).is_longer () && row != selection.end.row) + if (!ROW(row).is_longer () && row != selection.end.row + && (row != selection.beg.row || selection.beg.col < ncol)) new_selection_text[ofs++] = C0_LF; }