width = ncol;
}
+ l.touch ();
+
efs &= ~RS_baseattrMask;
efs = SET_FONT (efs, FONTSET (efs)->find_font (' '));
#ifdef DEBUG_STRICT
assert (old_buf [MOD (p, prev_total_rows)].t);
#endif
-
int plines = 1;
int llen = old_buf [MOD (p, prev_total_rows)].l;
{
qline = row_buf + qrow;
lalloc (*qline);
- qline->set_is_longer ();
+ qline->l = ncol;
+ qline->is_longer (1);
int qcol = 0;
}
qline->l = llen ? MOD (llen - 1, ncol) + 1 : 0;
-#ifdef DEBUG_STRICT //TODO//FIXME//TEMPORARY
- if (qline->l < 0)
- {
- fprintf (stderr, "ERROR, PLEASE REPORT to rxvt-unicode@plan9.de: qline->l %d = llen %d < ncol %d ? %d : MOD %d\n", qline->l,llen,ncol,llen,MOD (llen - 1, ncol) + 1);//D
- qline->l = 0;
- }
-#endif
+ qline->is_longer (0);
scr_blank_line (*qline, qline->l, ncol - qline->l, DEFAULT_RSTYLE);
}
while (p != pend && q > 0);
// make sure all terminal lines exist
while (nsaved < 0)
scr_blank_screen_mem (ROW (-++nsaved), DEFAULT_RSTYLE);
-
}
else
{
unsigned char checksel;
unicode_t c;
- int last_col;
+ int ncol = this->ncol;
const unicode_t *strend = str + len;
want_refresh = 1;
ZERO_SCROLLBACK ();
- last_col = ncol;
if (nlines > 0)
{
if (nlines > 0
&& screen.tscroll == 0
- && screen.bscroll == (nrow - 1))
+ && screen.bscroll == nrow - 1)
{
/* _at least_ this many lines need to be scrolled */
scr_scroll_text (screen.tscroll, screen.bscroll, nlines);
}
#ifdef DEBUG_STRICT
- assert (screen.cur.col < last_col);
+ assert (screen.cur.col < ncol);
assert (screen.cur.row < nrow
&& screen.cur.row >= -nsaved);
#endif
if (c < 0x20)
if (c == C0_LF)
{
- if (!line->is_longer ()) /* XXX: think about this */
- max_it (line->l, screen.cur.col);
+ max_it (line->l, screen.cur.col);
screen.flags &= ~Screen_WrapNext;
}
else if (c == C0_CR)
{
- if (!line->is_longer ()) /* XXX: think about this */
- max_it (line->l, screen.cur.col);
+ max_it (line->l, screen.cur.col);
screen.flags &= ~Screen_WrapNext;
screen.cur.col = 0;
if (screen.flags & Screen_WrapNext)
{
- line->set_is_longer ();
+ max_it (line->l, ncol);
+ line->is_longer (1);
scr_do_wrap ();
// locale.
int width = c < 0x100 ? 1 : wcwidth (c);
- if (charsets[screen.charset] == '0') // DEC SPECIAL
+ if (charsets [screen.charset] == '0') // DEC SPECIAL
{
// vt100 special graphics and line drawing
// 5f-7e standard vt100
rend_t rend = SET_FONT (rstyle, FONTSET (rstyle)->find_font (c));
// if the character doesn't fit into the remaining columns...
- if (screen.cur.col > last_col - width && last_col >= width)
+ if (screen.cur.col > ncol - width && ncol >= width)
{
// ...output spaces
c = ' ';
--str;
}
+ line->touch ();
+
do
{
line->t[screen.cur.col] = c;
line->r[screen.cur.col] = rend;
- if (screen.cur.col < last_col - 1)
+ if (screen.cur.col < ncol - 1)
screen.cur.col++;
else
{
- line->l = last_col;
+ line->l = ncol;
if (screen.flags & Screen_Autowrap)
screen.flags |= Screen_WrapNext;
break;
// pad with spaces when overwriting wide character with smaller one
if (!width)
- for (int c = screen.cur.col; c < last_col && line->t[c] == NOCHAR; c++)
- {
- line->t[c] = ' ';
- line->r[c] = rend;
- }
+ {
+ line->touch ();
+
+ for (int c = screen.cur.col; c < ncol && line->t[c] == NOCHAR; c++)
+ {
+ line->t[c] = ' ';
+ line->r[c] = rend;
+ }
+ }
}
else // width == 0
{
// we just tag the accent on the previous on-screen character.
// this is arguably not correct, but also arguably not wrong.
// we don't handle double-width characters nicely yet.
+ line_t *linep;
text_t *tp;
rend_t *rp;
if (screen.cur.col > 0)
{
+ linep = line;
tp = line->t + screen.cur.col - 1;
rp = line->r + screen.cur.col - 1;
-
- while (*tp == NOCHAR && tp > line->t)
- tp--, rp--;
}
else if (screen.cur.row > 0
&& ROW(screen.cur.row - 1).is_longer ())
{
- line_t *line = &ROW(screen.cur.row - 1);
-
- tp = line->t + last_col - 1;
- rp = line->r + last_col - 1;
-
- while (*tp == NOCHAR && tp > line->t)
- tp--, rp--;
+ linep = &ROW(screen.cur.row - 1);
+ tp = line->t + ncol - 1;
+ rp = line->r + ncol - 1;
}
else
continue;
+ linep->touch ();
+
+ while (*tp == NOCHAR && tp > linep->t)
+ tp--, rp--;
+
// first try to find a precomposed character
unicode_t n = rxvt_compose (*tp, c);
if (n == NOCHAR)
}
}
- if (!line->is_longer ()) /* XXX: think about this */
- max_it (line->l, screen.cur.col);
+ max_it (line->l, screen.cur.col);
#ifdef DEBUG_STRICT
assert (screen.cur.row >= 0);
if (tabs[i])
{
x = i;
+
if (!--count)
break;
}
{
base_rend = SET_FONT (base_rend, 0);
- if (!l.is_longer ()) /* XXX: think about this */
- max_it (l.l, x);
+ l.touch (x);
i = screen.cur.col;
scr_gotorc (0, 1, R_RELATIVE | C_RELATIVE);
else
{
- if (ROW(screen.cur.row).is_longer ()) //TODO//FIXME//LEN
- ROW(screen.cur.row).l = ncol;
+ line_t &l = ROW(screen.cur.row);
+
+ l.touch ();
+ l.is_longer (0);
scr_gotorc (0, 0, R_RELATIVE);
scr_insdel_chars (1, DELETE);
line_t &line = ROW(screen.cur.row);
+ line.touch ();
+ line.is_longer (0);
+
switch (mode)
{
case 0: /* erase to end of line */
for (; num--; row++)
{
- ROW (row).l = 0;
- scr_blank_screen_mem (ROW (row), rstyle);
+ line_t &l = ROW(row);
+ l.l = 0;
+ l.is_longer (0);
+ scr_blank_screen_mem (l, rstyle);
scr_blank_line (drawn_buf [row], 0, ncol, ren);
}
}
for (int j = ncol; j--; )
*r1++ = fs;
- line.l = ncol; /* make the `E's selectable */
+ line.is_longer (0);
+ line.touch (ncol);
}
}
line_t *line = &ROW(row);
+ line->touch ();
+ line->is_longer (0);
+
switch (insdel)
{
case INSERT:
line->r[col] = line->r[col - count];
}
- if (!line->is_longer ())
- {
- line->l += count;
- min_it (line->l, ncol);
- }
+ line->l = min (line->l + count, ncol);
if (selection.op && current_screen == selection.screen
&& ROWCOL_IN_ROW_AT_OR_AFTER (selection.beg, screen.cur))
screen.cur.col += count; /* don't worry if > ncol */
selection_check (1);
screen.cur.col -= count;
+
+ line->l = max (line->l - count, 0);
scr_blank_line (*line, screen.cur.col, count, rstyle);
break;
line->r[col] = line->r[col + count];
}
- scr_blank_line (*line, ncol - count, count, tr);
-
- if (line->is_longer ()) /* break line continuation */
- line->l = ncol;
-
line->l = max (line->l - count, 0);
+ scr_blank_line (*line, ncol - count, count, tr);
if (selection.op && current_screen == selection.screen
&& ROWCOL_IN_ROW_AT_OR_AFTER (selection.beg, screen.cur))
if (mode < 0)
memset (tabs, 0, ncol * sizeof (char));
else if (screen.cur.col < ncol)
- tabs[screen.cur.col] = (mode ? 1 : 0);
+ tabs [screen.cur.col] = !!mode;
}
/* ------------------------------------------------------------------------- */
void
rxvt_term::set_font_style ()
{
- switch (charsets[screen.charset])
+#if 0
+ switch (charsets [screen.charset])
{
case '0': /* DEC Special Character & Line Drawing Set */
break;
case 'K': /* German character set */
break;
}
+#endif
}
/* ------------------------------------------------------------------------- */
int
rxvt_term::scr_changeview (unsigned int oldviewstart)
{
- PERL_INVOKE ((this, HOOK_VIEW_CHANGE, DT_INT, view_start, DT_END));
-
if (view_start != oldviewstart)
{
+ PERL_INVOKE ((this, HOOK_VIEW_CHANGE, DT_INT, view_start, DT_END));
+
want_refresh = 1;
num_scr -= (view_start - oldviewstart);
}
- return (int) (view_start - oldviewstart);
+ return (int)view_start - (int)oldviewstart;
}
/* ------------------------------------------------------------------------- */
}
void
-rxvt_term::scr_remap_chars (const line_t &l)
+rxvt_term::scr_remap_chars (line_t &l)
{
if (!l.t)
return;
+ l.touch (); // maybe a bit of an overkill, but its not performance-relevant
+
for (int i = ncol; i--; )
l.r[i] = SET_FONT (l.r[i], FONTSET (l.r[i])->find_font (l.t[i]));
}
}
else
#endif
- end_col = ROW(row).is_longer () ? ncol : ROW(row).l; //TODO//FIXME//LEN
+ end_col = ROW(row).l;
col = max (col, 0);
min_it (end_col, selection.end.col);
t = ROW(row).t + col;
+
for (; col < end_col; col++)
{
if (*t == NOCHAR)