=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/screen.c,v retrieving revision 1.61 retrieving revision 1.62 diff -c -r1.61 -r1.62 *** src/usr.bin/tmux/screen.c 2020/04/15 12:59:20 1.61 --- src/usr.bin/tmux/screen.c 2020/04/15 17:50:02 1.62 *************** *** 1,4 **** ! /* $OpenBSD: screen.c,v 1.61 2020/04/15 12:59:20 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: screen.c,v 1.62 2020/04/15 17:50:02 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott *************** *** 48,57 **** }; TAILQ_HEAD(screen_titles, screen_title_entry); ! static void screen_resize_y(struct screen *, u_int); - static void screen_reflow(struct screen *, u_int); - /* Free titles stack. */ static void screen_free_titles(struct screen *s) --- 48,56 ---- }; TAILQ_HEAD(screen_titles, screen_title_entry); ! static void screen_resize_y(struct screen *, u_int, int); ! static void screen_reflow(struct screen *, u_int, u_int *, u_int *); /* Free titles stack. */ static void screen_free_titles(struct screen *s) *************** *** 216,225 **** } } ! /* Resize screen. */ void ! screen_resize(struct screen *s, u_int sx, u_int sy, int reflow) { if (sx < 1) sx = 1; if (sy < 1) --- 215,237 ---- } } ! /* Resize screen and return cursor position. */ void ! screen_resize_cursor(struct screen *s, u_int sx, u_int sy, int reflow, ! int eat_empty, u_int *cx, u_int *cy) { + u_int tcx, tcy; + + if (cx == NULL) + cx = &tcx; + *cx = s->cx; + + if (cy == NULL) + cy = т + *cy = s->grid->hsize + s->cy; + + log_debug("%s: start %u,%u (%u,%u)", __func__, s->cx, s->cy, *cx, *cy); + if (sx < 1) sx = 1; if (sy < 1) *************** *** 232,245 **** reflow = 0; if (sy != screen_size_y(s)) ! screen_resize_y(s, sy); if (reflow) ! screen_reflow(s, sx); } static void ! screen_resize_y(struct screen *s, u_int sy) { struct grid *gd = s->grid; u_int needed, available, oldy, i; --- 244,273 ---- reflow = 0; if (sy != screen_size_y(s)) ! screen_resize_y(s, sy, eat_empty); if (reflow) ! screen_reflow(s, sx, cx, cy); ! ! if (*cy >= s->grid->hsize) { ! s->cx = *cx; ! s->cy = (*cy) - s->grid->hsize; ! } else { ! s->cx = 0; ! s->cy = 0; ! } ! log_debug("%s: finish %u,%u (%u,%u)", __func__, s->cx, s->cy, *cx, *cy); } + /* Resize screen. */ + void + screen_resize(struct screen *s, u_int sx, u_int sy, int reflow) + { + screen_resize_cursor(s, sx, sy, reflow, 1, NULL, NULL); + } + static void ! screen_resize_y(struct screen *s, u_int sy, int eat_empty) { struct grid *gd = s->grid; u_int needed, available, oldy, i; *************** *** 264,277 **** needed = oldy - sy; /* Delete as many lines as possible from the bottom. */ ! available = oldy - 1 - s->cy; ! if (available > 0) { ! if (available > needed) ! available = needed; ! grid_view_delete_lines(gd, oldy - available, available, ! 8); } - needed -= available; /* * Now just increase the history size, if possible, to take --- 292,307 ---- needed = oldy - sy; /* Delete as many lines as possible from the bottom. */ ! if (eat_empty) { ! available = oldy - 1 - s->cy; ! if (available > 0) { ! if (available > needed) ! available = needed; ! grid_view_delete_lines(gd, oldy - available, ! available, 8); ! } ! needed -= available; } /* * Now just increase the history size, if possible, to take *************** *** 287,293 **** available = needed; grid_view_delete_lines(gd, 0, available, 8); } - s->cy -= needed; } /* Resize line array. */ --- 317,322 ---- *************** *** 307,313 **** available = needed; gd->hscrolled -= available; gd->hsize -= available; - s->cy += available; } else available = 0; needed -= available; --- 336,341 ---- *************** *** 482,506 **** /* Reflow wrapped lines. */ static void ! screen_reflow(struct screen *s, u_int new_x) { ! u_int cx = s->cx, cy = s->grid->hsize + s->cy, wx, wy; ! grid_wrap_position(s->grid, cx, cy, &wx, &wy); ! log_debug("%s: cursor %u,%u is %u,%u", __func__, cx, cy, wx, wy); grid_reflow(s->grid, new_x); ! grid_unwrap_position(s->grid, &cx, &cy, wx, wy); ! log_debug("%s: new cursor is %u,%u", __func__, cx, cy); ! ! if (cy >= s->grid->hsize) { ! s->cx = cx; ! s->cy = cy - s->grid->hsize; ! } else { ! s->cx = 0; ! s->cy = 0; ! } } /* --- 510,526 ---- /* Reflow wrapped lines. */ static void ! screen_reflow(struct screen *s, u_int new_x, u_int *cx, u_int *cy) { ! u_int wx, wy; ! grid_wrap_position(s->grid, *cx, *cy, &wx, &wy); ! log_debug("%s: cursor %u,%u is %u,%u", __func__, *cx, *cy, wx, wy); grid_reflow(s->grid, new_x); ! grid_unwrap_position(s->grid, cx, cy, wx, wy); ! log_debug("%s: new cursor is %u,%u", __func__, *cx,* cy); } /*