aboutsummaryrefslogtreecommitdiff
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
parent71dc6e04e8ca9ab85acbef90bbfd57463be0dc07 (diff)
downloadrtmux-ad566a86de2368aa4a42cd26dafecc066cff41eb.tar.gz
rtmux-ad566a86de2368aa4a42cd26dafecc066cff41eb.tar.bz2
rtmux-ad566a86de2368aa4a42cd26dafecc066cff41eb.zip
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.
-rw-r--r--grid-view.c21
-rw-r--r--grid.c70
-rw-r--r--tmux.h4
3 files changed, 75 insertions, 20 deletions
diff --git a/grid-view.c b/grid-view.c
index bf58c61f..f6bde853 100644
--- a/grid-view.c
+++ b/grid-view.c
@@ -92,15 +92,20 @@ grid_view_scroll_region_up(struct grid *gd, u_int rupper, u_int rlower)
{
GRID_DEBUG(gd, "rupper=%u, rlower=%u", rupper, rlower);
- if (gd->flags & GRID_HISTORY && rupper == 0 && rlower == gd->sy - 1) {
- grid_scroll_line(gd);
- return;
+ if (gd->flags & GRID_HISTORY) {
+ grid_collect_history(gd);
+ if (rupper == 0 && rlower == gd->sy - 1)
+ grid_scroll_history(gd);
+ else {
+ rupper = grid_view_y(gd, rupper);
+ rlower = grid_view_y(gd, rlower);
+ grid_scroll_history_region(gd, rupper, rlower);
+ }
+ } else {
+ rupper = grid_view_y(gd, rupper);
+ rlower = grid_view_y(gd, rlower);
+ grid_move_lines(gd, rupper, rupper + 1, rlower - rupper);
}
-
- rupper = grid_view_y(gd, rupper);
- rlower = grid_view_y(gd, rlower);
-
- grid_move_lines(gd, rupper, rupper + 1, rlower - rupper);
}
/* Scroll region down. */
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++;
}
diff --git a/tmux.h b/tmux.h
index 35a542fa..0dcf7c37 100644
--- a/tmux.h
+++ b/tmux.h
@@ -1592,9 +1592,11 @@ extern const struct grid_cell grid_default_cell;
struct grid *grid_create(u_int, u_int, u_int);
void grid_destroy(struct grid *);
int grid_compare(struct grid *, struct grid *);
+void grid_collect_history(struct grid *);
+void grid_scroll_history(struct grid *);
+void grid_scroll_history_region(struct grid *, u_int, u_int);
void grid_expand_line(struct grid *, u_int, u_int);
void grid_expand_line_utf8(struct grid *, u_int, u_int);
-void grid_scroll_line(struct grid *);
const struct grid_cell *grid_peek_cell(struct grid *, u_int, u_int);
struct grid_cell *grid_get_cell(struct grid *, u_int, u_int);
void grid_set_cell(struct grid *, u_int, u_int, const struct grid_cell *);