static void update_sbar(Terminal *);
static void deselect(Terminal *);
static void term_print_finish(Terminal *);
+#ifdef OPTIMISE_SCROLL
+static void scroll_display(Terminal *, int, int, int);
+#endif /* OPTIMISE_SCROLL */
/*
* Resize a line to make it `cols' columns wide.
term->repeat_off = FALSE;
term->termstate = TOPLEVEL;
term->selstate = NO_SELECTION;
+ term->curstype = 0;
term->screen = term->alt_screen = term->scrollback = NULL;
term->disptop = 0;
}
}
+#ifdef OPTIMISE_SCROLL
+/*
+ * Scroll the physical display, and our conception of it in disptext.
+ */
+static void scroll_display(Terminal *term, int topline, int botline, int lines)
+{
+ unsigned long *start, *end;
+ int distance, size, i;
+
+ start = term->disptext + topline * (term->cols + 1);
+ end = term->disptext + (botline + 1) * (term->cols + 1);
+ distance = (lines > 0 ? lines : -lines) * (term->cols + 1);
+ size = end - start - distance;
+ if (lines > 0) {
+ memmove(start, start + distance, size * TSIZE);
+ for (i = 0; i < distance; i++)
+ (start + size)[i] |= ATTR_INVALID;
+ } else {
+ memmove(start + distance, start, size * TSIZE);
+ for (i = 0; i < distance; i++)
+ start[i] |= ATTR_INVALID;
+ }
+ do_scroll(term->frontend, topline, botline, lines);
+}
+#endif /* OPTIMISE_SCROLL */
+
/*
* Move the cursor to a given position, clipping at boundaries. We
* may or may not want to clip at the scroll margin: marg_clip is 0
}
/* Are we in the nasty ACS mode? Note: no sco in utf mode. */
else if(term->sco_acs &&
- (c!='\033' && c!='\n' && c!='\r' && c!='\b'))
+ (c!='\033' && c!='\012' && c!='\015' && c!='\b'))
{
if (term->sco_acs == 2) c ^= 0x80;
c |= ATTR_SCOACS;
* Perform an actual beep if we're not overloaded.
*/
if (!cfg.bellovl || !term->beep_overloaded) {
+ beep(term->frontend, cfg.beep);
if (cfg.beep == BELL_VISUAL) {
term->in_vbell = TRUE;
term->vbell_startpoint = ticks;
term_update(term);
- } else
- beep(term->frontend, cfg.beep);
+ }
}
term->disptop = 0;
}
term->esc_query = FALSE;
}
break;
- case '\r':
+ case '\015':
term->curs.x = 0;
term->wrapnext = FALSE;
fix_cpos;
}
case '\013':
compatibility(VT100);
- case '\n':
+ case '\012':
if (term->curs.y == term->marg_b)
scroll(term, term->marg_t, term->marg_b, 1, TRUE);
else if (term->curs.y < term->rows - 1)
*
* -- RDB
*/
- if (c == '\n' || c == '\r') {
+ if (c == '\012' || c == '\015') {
term->termstate = TOPLEVEL;
} else if (c == 0234 || c == '\007') {
/*
*/
if ((tchar | tattr) != (term->disptext[idx]& ~ATTR_NARROW)) {
if ((tattr & ATTR_WIDE) == 0 &&
- CharWidth(ctx, (tchar | tattr) & 0xFFFF) == 2)
+ char_width(ctx, (tchar | tattr) & 0xFFFF) == 2)
tattr |= ATTR_NARROW;
} else if (term->disptext[idx]&ATTR_NARROW)
tattr |= ATTR_NARROW;
void term_scroll(Terminal *term, int rel, int where)
{
int sbtop = -count234(term->scrollback);
+#ifdef OPTIMISE_SCROLL
+ int olddisptop = term->disptop;
+ int shift;
+#endif /* OPTIMISE_SCROLL */
term->disptop = (rel < 0 ? 0 : rel > 0 ? sbtop : term->disptop) + where;
if (term->disptop < sbtop)
if (term->disptop > 0)
term->disptop = 0;
update_sbar(term);
+#ifdef OPTIMISE_SCROLL
+ shift = (term->disptop - olddisptop);
+ if (shift < term->rows && shift > -term->rows)
+ scroll_display(term, 0, term->rows - 1, shift);
+#endif /* OPTIMISE_SCROLL */
term_update(term);
}
if (DIRECT_FONT(uc)) {
if (c >= ' ' && c != 0x7F) {
- unsigned char buf[4];
+ char buf[4];
WCHAR wbuf[4];
int rv;
if (is_dbcs_leadbyte(font_codepage, (BYTE) c)) {
buf[0] = c;
- buf[1] = (unsigned char) ldata[top.x + 1];
+ buf[1] = ldata[top.x + 1];
rv = mb_to_wc(font_codepage, 0, buf, 2, wbuf, 4);
top.x++;
} else {
if (p <= data + len - sel_nl_sz &&
!memcmp(p, sel_nl, sizeof(sel_nl))) {
- term->paste_buffer[term->paste_len++] = '\r';
+ term->paste_buffer[term->paste_len++] = '\015';
p += sel_nl_sz;
}
q = p;
while (term->paste_pos < term->paste_len) {
int n = 0;
while (n + term->paste_pos < term->paste_len) {
- if (term->paste_buffer[term->paste_pos + n++] == '\r')
+ if (term->paste_buffer[term->paste_pos + n++] == '\015')
break;
}
if (term->ldisc)