summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornicm <nicm>2015-09-25 15:53:07 +0000
committernicm <nicm>2015-09-25 15:53:07 +0000
commit28f23f18e9d79405a60348c4f7aeded33da9135b (patch)
tree0fbd5c6742b4cb4f46bd434d3ce291e486078bc5
parent2a62917444783e62ea5b8c13069aecb77b47ff07 (diff)
Free the history when it is cleared, based on a diff from Carlo Cannas.
-rw-r--r--cmd-clear-history.c4
-rw-r--r--grid.c20
-rw-r--r--tmux.h1
3 files changed, 18 insertions, 7 deletions
diff --git a/cmd-clear-history.c b/cmd-clear-history.c
index 88dbbcf7..63e9d548 100644
--- a/cmd-clear-history.c
+++ b/cmd-clear-history.c
@@ -47,9 +47,7 @@ cmd_clear_history_exec(struct cmd *self, struct cmd_q *cmdq)
if (wp->mode == &window_copy_mode)
window_pane_reset_mode(wp);
-
- grid_move_lines(gd, 0, gd->hsize, gd->sy);
- gd->hsize = 0;
+ grid_clear_history(gd);
return (CMD_RETURN_NORMAL);
}
diff --git a/grid.c b/grid.c
index 93fed05e..99dafab2 100644
--- a/grid.c
+++ b/grid.c
@@ -170,6 +170,18 @@ grid_scroll_history(struct grid *gd)
gd->hsize++;
}
+/* Clear the history. */
+void
+grid_clear_history(struct grid *gd)
+{
+ grid_clear_lines(gd, 0, gd->hsize);
+ grid_move_lines(gd, 0, gd->hsize, gd->sy);
+
+ gd->hsize = 0;
+ gd->linedata = xreallocarray(gd->linedata, gd->sy,
+ sizeof *gd->linedata);
+}
+
/* 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)
@@ -344,8 +356,8 @@ grid_move_lines(struct grid *gd, u_int dy, u_int py, u_int ny)
grid_clear_lines(gd, yy, 1);
}
- memmove(
- &gd->linedata[dy], &gd->linedata[py], ny * (sizeof *gd->linedata));
+ memmove(&gd->linedata[dy], &gd->linedata[py],
+ ny * (sizeof *gd->linedata));
/* Wipe any lines that have been moved (without freeing them). */
for (yy = py; yy < py + ny; yy++) {
@@ -371,8 +383,8 @@ grid_move_cells(struct grid *gd, u_int dx, u_int px, u_int py, u_int nx)
grid_expand_line(gd, py, px + nx);
grid_expand_line(gd, py, dx + nx);
- memmove(
- &gl->celldata[dx], &gl->celldata[px], nx * sizeof *gl->celldata);
+ memmove(&gl->celldata[dx], &gl->celldata[px],
+ nx * sizeof *gl->celldata);
/* Wipe any cells that have been moved. */
for (xx = px; xx < px + nx; xx++) {
diff --git a/tmux.h b/tmux.h
index 3fd057e9..5bf9b39b 100644
--- a/tmux.h
+++ b/tmux.h
@@ -1842,6 +1842,7 @@ 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_clear_history(struct grid *);
void grid_expand_line(struct grid *, u_int, u_int);
const struct grid_cell *grid_peek_cell(struct grid *, u_int, u_int);
const struct grid_line *grid_peek_line(struct grid *, u_int);