summaryrefslogtreecommitdiffstats
path: root/grid.c
diff options
context:
space:
mode:
authorNicholas Marriott <nicm@openbsd.org>2009-10-13 15:38:37 +0000
committerNicholas Marriott <nicm@openbsd.org>2009-10-13 15:38:37 +0000
commitad566a86de2368aa4a42cd26dafecc066cff41eb (patch)
tree98677a9cfc95b49a61cfee0d1da88ecd22cc00a0 /grid.c
parent71dc6e04e8ca9ab85acbef90bbfd57463be0dc07 (diff)
Move lines into the history when scrolling even if the scroll region is not
the entire screen. Allows ircII users to see history, prompted by naddy.
Diffstat (limited to 'grid.c')
-rw-r--r--grid.c70
1 files changed, 59 insertions, 11 deletions
diff --git a/grid.c b/grid.c
index 6e01aa7c..1041528d 100644
--- a/grid.c
+++ b/grid.c
@@ -161,29 +161,77 @@ grid_compare(struct grid *ga, struct grid *gb)
return (0);
}
-/* Scroll a line into the history. */
+/*
+ * Collect lines from the history if at the limit. Free the top (oldest) 10%
+ * and shift up.
+ */
void
-grid_scroll_line(struct grid *gd)
+grid_collect_history(struct grid *gd)
{
u_int yy;
GRID_DEBUG(gd, "");
- if (gd->hsize >= gd->hlimit) {
- /* If the limit is hit, free the bottom 10% and shift up. */
- yy = gd->hlimit / 10;
- if (yy < 1)
- yy = 1;
+ if (gd->hsize < gd->hlimit)
+ return;
- grid_move_lines(gd, 0, yy, gd->hsize + gd->sy - yy);
- gd->hsize -= yy;
- }
+ yy = gd->hlimit / 10;
+ if (yy < 1)
+ yy = 1;
- yy = gd->hsize + gd->sy;
+ grid_move_lines(gd, 0, yy, gd->hsize + gd->sy - yy);
+ gd->hsize -= yy;
+}
+/*
+ * Scroll the entire visible screen, moving one line into the history. Just
+ * allocate a new line at the bottom and move the history size indicator.
+ */
+void
+grid_scroll_history(struct grid *gd)
+{
+ u_int yy;
+
+ GRID_DEBUG(gd, "");
+
+ yy = gd->hsize + gd->sy;
gd->linedata = xrealloc(gd->linedata, yy + 1, sizeof *gd->linedata);
memset(&gd->linedata[yy], 0, sizeof gd->linedata[yy]);
+
+ gd->hsize++;
+}
+
+/* Scroll a region up, moving the top line into the history. */
+void
+grid_scroll_history_region(struct grid *gd, u_int upper, u_int lower)
+{
+ struct grid_line *gl_history, *gl_upper, *gl_lower;
+ u_int yy;
+
+ GRID_DEBUG(gd, "upper=%u, lower=%u", upper, lower);
+
+ /* Create a space for a new line. */
+ yy = gd->hsize + gd->sy;
+ gd->linedata = xrealloc(gd->linedata, yy + 1, sizeof *gd->linedata);
+
+ /* Move the entire screen down to free a space for this line. */
+ gl_history = &gd->linedata[gd->hsize];
+ memmove(gl_history + 1, gl_history, gd->sy * sizeof *gl_history);
+
+ /* Adjust the region and find its start and end. */
+ upper++;
+ gl_upper = &gd->linedata[upper];
+ lower++;
+ gl_lower = &gd->linedata[lower];
+
+ /* Move the line into the history. */
+ memcpy(gl_history, gl_upper, sizeof *gl_history);
+
+ /* Then move the region up and clear the bottom line. */
+ memmove(gl_upper, gl_upper + 1, (lower - upper) * sizeof *gl_upper);
+ memset(gl_lower, 0, sizeof *gl_lower);
+ /* Move the history offset down over the line. */
gd->hsize++;
}