From 85531fd404ed68ffe7d724f58ef1f84c357f3cc8 Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Wed, 30 Jan 2013 17:00:17 +0000 Subject: [PATCH 1/3] Unused variable/type nit from Thomas Adam. --- cmd-select-layout.c | 2 -- server-client.c | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/cmd-select-layout.c b/cmd-select-layout.c index 3ca8766e..c5f64a07 100644 --- a/cmd-select-layout.c +++ b/cmd-select-layout.c @@ -87,13 +87,11 @@ cmd_select_layout_exec(struct cmd *self, struct cmd_ctx *ctx) { struct args *args = self->args; struct winlink *wl; - struct window *w; const char *layoutname; int next, previous, layout; if ((wl = cmd_find_window(ctx, args_get(args, 't'), NULL)) == NULL) return (CMD_RETURN_ERROR); - w = wl->window; next = self->entry == &cmd_next_layout_entry; if (args_has(self->args, 'n')) diff --git a/server-client.c b/server-client.c index b24b68e8..82189a5c 100644 --- a/server-client.c +++ b/server-client.c @@ -331,7 +331,7 @@ int server_client_assume_paste(struct session *s) { struct timeval tv; - u_int t; + int t; if ((t = options_get_number(&s->options, "assume-paste-time")) == 0) return (0); From a5521597b0e0771d5ad698bba92801ea88302c4f Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Tue, 5 Feb 2013 11:01:45 +0000 Subject: [PATCH 2/3] Don't set some string formats if the string is NULL. --- format.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/format.c b/format.c index 72c65c28..e950df53 100644 --- a/format.c +++ b/format.c @@ -365,6 +365,7 @@ format_window_pane(struct format_tree *ft, struct window_pane *wp) unsigned long long size; u_int i; u_int idx; + const char *cwd; size = 0; for (i = 0; i < gd->hsize; i++) { @@ -390,9 +391,11 @@ format_window_pane(struct format_tree *ft, struct window_pane *wp) format_add(ft, "pane_start_command", "%s", wp->cmd); if (wp->cwd != NULL) format_add(ft, "pane_start_path", "%s", wp->cwd); - format_add(ft, "pane_current_path", "%s", get_proc_cwd(wp->fd)); + if ((cwd = get_proc_cwd(wp->fd)) != NULL) + format_add(ft, "pane_current_path", "%s", cwd); format_add(ft, "pane_pid", "%ld", (long) wp->pid); - format_add(ft, "pane_tty", "%s", wp->tty); + if (wp->tty != NULL) + format_add(ft, "pane_tty", "%s", wp->tty); } void From 8903c1f167839569b7514508b38988aa6486575c Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Tue, 5 Feb 2013 11:08:59 +0000 Subject: [PATCH 3/3] Automatically reflow wrapped lines when a pane is resized, requested by many over the years and finally implemented by Richard Woodbury. --- grid.c | 41 +++++++++++++++++++++++++++++++++++++++++ screen.c | 20 +++++++++++++++++++- tmux.h | 4 +++- window-choose.c | 2 +- window-clock.c | 2 +- window-copy.c | 4 ++-- window.c | 8 ++++---- 7 files changed, 71 insertions(+), 10 deletions(-) diff --git a/grid.c b/grid.c index da769122..a8d6d930 100644 --- a/grid.c +++ b/grid.c @@ -460,3 +460,44 @@ grid_duplicate_lines( dy++; } } + +/* + * Reflow lines from src grid into dst grid based on width sx. Returns number + * of lines fewer in the visible area, or zero. + */ +u_int +grid_reflow(struct grid *dst, const struct grid *src, u_int sx) +{ + u_int px, py, line, cell; + int previous_wrapped; + struct grid_line *gl; + + px = py = 0; + previous_wrapped = 1; + for (line = 0; line < src->sy + src->hsize; line++) { + gl = src->linedata + line; + if (!previous_wrapped) { + px = 0; + py++; + if (py >= dst->hsize + dst->sy) + grid_scroll_history(dst); + } + for (cell = 0; cell < gl->cellsize; cell++) { + if (px == sx) { + dst->linedata[py].flags |= GRID_LINE_WRAPPED; + px = 0; + py++; + if (py >= dst->hsize + dst->sy) + grid_scroll_history(dst); + } + grid_set_cell(dst, px, py, gl->celldata + cell); + px++; + } + previous_wrapped = gl->flags & GRID_LINE_WRAPPED; + } + py++; /* account for final line, which never wraps */ + + if (py > src->sy) + return (0); + return (src->sy - py); +} diff --git a/screen.c b/screen.c index 7ffe2a24..1c0c0d36 100644 --- a/screen.c +++ b/screen.c @@ -120,7 +120,7 @@ screen_set_title(struct screen *s, const char *title) /* Resize screen. */ void -screen_resize(struct screen *s, u_int sx, u_int sy) +screen_resize(struct screen *s, u_int sx, u_int sy, int reflow) { if (sx < 1) sx = 1; @@ -140,6 +140,9 @@ screen_resize(struct screen *s, u_int sx, u_int sy) if (sy != screen_size_y(s)) screen_resize_y(s, sy); + + if (reflow) + screen_reflow(s, sx); } void @@ -356,3 +359,18 @@ screen_check_selection(struct screen *s, u_int px, u_int py) return (1); } + +/* Reflow wrapped lines. */ +void +screen_reflow(struct screen *s, u_int sx) +{ + struct grid *old, *new; + + old = s->grid; + new = grid_create(old->sx, old->sy, old->hlimit); + + s->cy -= grid_reflow(new, old, sx); + s->grid = new; + + grid_destroy(old); +} diff --git a/tmux.h b/tmux.h index 9149f6b5..f6382a70 100644 --- a/tmux.h +++ b/tmux.h @@ -1964,6 +1964,7 @@ void grid_move_cells(struct grid *, u_int, u_int, u_int, u_int); char *grid_string_cells(struct grid *, u_int, u_int, u_int); void grid_duplicate_lines( struct grid *, u_int, struct grid *, u_int, u_int); +u_int grid_reflow(struct grid *, const struct grid *, u_int); /* grid-cell.c */ u_int grid_cell_width(const struct grid_cell *); @@ -2057,11 +2058,12 @@ void screen_reset_tabs(struct screen *); void screen_set_cursor_style(struct screen *, u_int); void screen_set_cursor_colour(struct screen *, const char *); void screen_set_title(struct screen *, const char *); -void screen_resize(struct screen *, u_int, u_int); +void screen_resize(struct screen *, u_int, u_int, int); void screen_set_selection(struct screen *, u_int, u_int, u_int, u_int, u_int, struct grid_cell *); void screen_clear_selection(struct screen *); int screen_check_selection(struct screen *, u_int, u_int); +void screen_reflow(struct screen *, u_int); /* window.c */ extern struct windows windows; diff --git a/window-choose.c b/window-choose.c index 20482a66..dce026ec 100644 --- a/window-choose.c +++ b/window-choose.c @@ -203,7 +203,7 @@ window_choose_resize(struct window_pane *wp, u_int sx, u_int sy) if (data->selected > sy - 1) data->top = data->selected - (sy - 1); - screen_resize(s, sx, sy); + screen_resize(s, sx, sy, 0); window_choose_redraw_screen(wp); } diff --git a/window-clock.c b/window-clock.c index b6dc87e9..4cbe76a5 100644 --- a/window-clock.c +++ b/window-clock.c @@ -79,7 +79,7 @@ window_clock_resize(struct window_pane *wp, u_int sx, u_int sy) struct window_clock_mode_data *data = wp->modedata; struct screen *s = &data->screen; - screen_resize(s, sx, sy); + screen_resize(s, sx, sy, 0); window_clock_draw_screen(wp); } diff --git a/window-copy.c b/window-copy.c index 79d0c6ed..1d6b8f67 100644 --- a/window-copy.c +++ b/window-copy.c @@ -335,9 +335,9 @@ window_copy_resize(struct window_pane *wp, u_int sx, u_int sy) struct screen *s = &data->screen; struct screen_write_ctx ctx; - screen_resize(s, sx, sy); + screen_resize(s, sx, sy, 0); if (data->backing != &wp->base) - screen_resize(data->backing, sx, sy); + screen_resize(data->backing, sx, sy, 0); if (data->cy > sy - 1) data->cy = sy - 1; diff --git a/window.c b/window.c index 97168455..20cd9aa3 100644 --- a/window.c +++ b/window.c @@ -853,7 +853,7 @@ window_pane_resize(struct window_pane *wp, u_int sx, u_int sy) ws.ws_col = sx; ws.ws_row = sy; - screen_resize(&wp->base, sx, sy); + screen_resize(&wp->base, sx, sy, wp->saved_grid == NULL); if (wp->mode != NULL) wp->mode->resize(wp, sx, sy); @@ -914,7 +914,7 @@ window_pane_alternate_off(struct window_pane *wp, struct grid_cell *gc, * before copying back. */ if (sy > wp->saved_grid->sy) - screen_resize(s, sx, wp->saved_grid->sy); + screen_resize(s, sx, wp->saved_grid->sy, 1); /* Restore the grid, cursor position and cell. */ grid_duplicate_lines(s->grid, screen_hsize(s), wp->saved_grid, 0, sy); @@ -933,8 +933,8 @@ window_pane_alternate_off(struct window_pane *wp, struct grid_cell *gc, * the current size. */ wp->base.grid->flags |= GRID_HISTORY; - if (sy > wp->saved_grid->sy) - screen_resize(s, sx, sy); + if (sy > wp->saved_grid->sy || sx != wp->saved_grid->sx) + screen_resize(s, sx, sy, 1); grid_destroy(wp->saved_grid); wp->saved_grid = NULL;