summaryrefslogtreecommitdiffstats
path: root/screen-display.c
diff options
context:
space:
mode:
authorNicholas Marriott <nicholas.marriott@gmail.com>2007-11-21 13:11:41 +0000
committerNicholas Marriott <nicholas.marriott@gmail.com>2007-11-21 13:11:41 +0000
commit9a6e47cfa8b7ebac8bebc7c2027fd72bee9d38ab (patch)
tree31a82c492c937f7aae181b906a47d97378c3e813 /screen-display.c
parent9b9ceac657c76ed9fe76f76f3276c1d05593942c (diff)
Initial history support.
Diffstat (limited to 'screen-display.c')
-rw-r--r--screen-display.c46
1 files changed, 35 insertions, 11 deletions
diff --git a/screen-display.c b/screen-display.c
index 5f2790aa..e11c6aaa 100644
--- a/screen-display.c
+++ b/screen-display.c
@@ -1,4 +1,4 @@
-/* $Id: screen-display.c,v 1.1 2007-11-20 21:42:29 nicm Exp $ */
+/* $Id: screen-display.c,v 1.2 2007-11-21 13:11:41 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -168,6 +168,36 @@ screen_display_cursor_down(struct screen *s)
void
screen_display_scroll_region_up(struct screen *s)
{
+ u_int sy;
+
+ /*
+ * If the region is the entire screen, this is easy-peasy. Allocate
+ * a new line and adjust the history size.
+ * XXX1 should this be done somewhere else?
+ */
+ if (s->rupper == 0 && s->rlower == screen_last_y(s)) {
+ sy = screen_size_y(s) + s->hsize;
+
+ if (s->hsize == s->hlimit) {
+ /*
+ * If the limit is hit, shift the whole thing up.
+ * XXX this is inefficient, is there a better way?
+ */
+ screen_move_lines(s, 0, 1, sy - 1);
+ } else {
+ s->hsize++;
+
+ s->grid_data = xrealloc(
+ s->grid_data, sy + 1, sizeof *s->grid_data);
+ s->grid_attr = xrealloc(
+ s->grid_attr, sy + 1, sizeof *s->grid_attr);
+ s->grid_colr = xrealloc(
+ s->grid_colr, sy + 1, sizeof *s->grid_colr);
+ }
+ screen_display_make_lines(s, screen_last_y(s), 1);
+ return;
+ }
+
/*
* Scroll scrolling region up:
* - delete rupper
@@ -189,8 +219,6 @@ screen_display_scroll_region_up(struct screen *s)
}
screen_display_make_lines(s, s->rlower, 1);
- screen_display_fill_lines(
- s, s->rlower, 1, SCREEN_DEFDATA, SCREEN_DEFATTR, SCREEN_DEFCOLR);
}
/* Scroll region down. */
@@ -218,8 +246,6 @@ screen_display_scroll_region_down(struct screen *s)
}
screen_display_make_lines(s, s->rupper, 1);
- screen_display_fill_lines(
- s, s->rupper, 1, SCREEN_DEFDATA, SCREEN_DEFATTR, SCREEN_DEFCOLR);
}
/* Insert lines. */
@@ -368,15 +394,14 @@ screen_display_insert_characters(struct screen *s, u_int px, u_int py, u_int nx)
{
u_int mx;
- px = screen_x(s, px);
- py = screen_y(s, py);
-
if (!screen_in_x(s, px) || !screen_in_y(s, py))
fatalx("bad value");
if (px + nx > screen_last_x(s))
nx = screen_last_x(s) - px;
+ py = screen_y(s, py);
+
/*
* Inserting a range of nx at px.
*
@@ -401,15 +426,14 @@ screen_display_delete_characters(struct screen *s, u_int px, u_int py, u_int nx)
{
u_int mx;
- px = screen_x(s, px);
- py = screen_y(s, py);
-
if (!screen_in_x(s, px) || !screen_in_y(s, py))
fatalx("bad value");
if (px + nx > screen_last_x(s))
nx = screen_last_x(s) - px;
+ py = screen_y(s, py);
+
/*
* Deleting the range from px to px + nx.
*