=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/status.c,v retrieving revision 1.234 retrieving revision 1.235 diff -c -r1.234 -r1.235 *** src/usr.bin/tmux/status.c 2022/05/30 13:07:46 1.234 --- src/usr.bin/tmux/status.c 2022/09/09 11:02:23 1.235 *************** *** 1,4 **** ! /* $OpenBSD: status.c,v 1.234 2022/05/30 13:07:46 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: status.c,v 1.235 2022/09/09 11:02:23 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott *************** *** 263,268 **** --- 263,279 ---- return (s->statuslines); } + /* Get the prompt line number for client's session. 1 means at the bottom. */ + static u_int + status_prompt_line_at(struct client *c) + { + struct session *s = c->session; + + if (c->flags & (CLIENT_STATUSOFF|CLIENT_CONTROL)) + return (1); + return (options_get_number(s->options, "status-prompt-line")); + } + /* Get window at window list position. */ struct style_range * status_get_range(struct client *c, u_int x, u_int y) *************** *** 533,539 **** struct session *s = c->session; struct screen old_screen; size_t len; ! u_int lines, offset; struct grid_cell gc; struct format_tree *ft; --- 544,550 ---- struct session *s = c->session; struct screen old_screen; size_t len; ! u_int lines, offset, messageline; struct grid_cell gc; struct format_tree *ft; *************** *** 546,551 **** --- 557,566 ---- lines = 1; screen_init(sl->active, c->tty.sx, lines, 0); + messageline = status_prompt_line_at(c); + if (messageline > lines - 1) + messageline = lines - 1; + len = screen_write_strlen("%s", c->message_string); if (len > c->tty.sx) len = c->tty.sx; *************** *** 555,565 **** format_free(ft); screen_write_start(&ctx, sl->active); ! screen_write_fast_copy(&ctx, &sl->screen, 0, 0, c->tty.sx, lines - 1); ! screen_write_cursormove(&ctx, 0, lines - 1, 0); for (offset = 0; offset < c->tty.sx; offset++) screen_write_putc(&ctx, &gc, ' '); ! screen_write_cursormove(&ctx, 0, lines - 1, 0); if (c->message_ignore_styles) screen_write_nputs(&ctx, len, &gc, "%s", c->message_string); else --- 570,580 ---- format_free(ft); screen_write_start(&ctx, sl->active); ! screen_write_fast_copy(&ctx, &sl->screen, 0, 0, c->tty.sx, lines); ! screen_write_cursormove(&ctx, 0, messageline, 0); for (offset = 0; offset < c->tty.sx; offset++) screen_write_putc(&ctx, &gc, ' '); ! screen_write_cursormove(&ctx, 0, messageline, 0); if (c->message_ignore_styles) screen_write_nputs(&ctx, len, &gc, "%s", c->message_string); else *************** *** 695,701 **** struct session *s = c->session; struct screen old_screen; u_int i, lines, offset, left, start, width; ! u_int pcursor, pwidth; struct grid_cell gc, cursorgc; struct format_tree *ft; --- 710,716 ---- struct session *s = c->session; struct screen old_screen; u_int i, lines, offset, left, start, width; ! u_int pcursor, pwidth, promptline; struct grid_cell gc, cursorgc; struct format_tree *ft; *************** *** 708,713 **** --- 723,732 ---- lines = 1; screen_init(sl->active, c->tty.sx, lines, 0); + promptline = status_prompt_line_at(c); + if (promptline > lines - 1) + promptline = lines - 1; + ft = format_create_defaults(NULL, c, NULL, NULL, NULL); if (c->prompt_mode == PROMPT_COMMAND) style_apply(&gc, s->options, "message-command-style", ft); *************** *** 723,735 **** start = c->tty.sx; screen_write_start(&ctx, sl->active); ! screen_write_fast_copy(&ctx, &sl->screen, 0, 0, c->tty.sx, lines - 1); ! screen_write_cursormove(&ctx, 0, lines - 1, 0); for (offset = 0; offset < c->tty.sx; offset++) screen_write_putc(&ctx, &gc, ' '); ! screen_write_cursormove(&ctx, 0, lines - 1, 0); format_draw(&ctx, &gc, start, c->prompt_string, NULL, 0); ! screen_write_cursormove(&ctx, start, lines - 1, 0); left = c->tty.sx - start; if (left == 0) --- 742,754 ---- start = c->tty.sx; screen_write_start(&ctx, sl->active); ! screen_write_fast_copy(&ctx, &sl->screen, 0, 0, c->tty.sx, lines); ! screen_write_cursormove(&ctx, 0, promptline, 0); for (offset = 0; offset < c->tty.sx; offset++) screen_write_putc(&ctx, &gc, ' '); ! screen_write_cursormove(&ctx, 0, promptline, 0); format_draw(&ctx, &gc, start, c->prompt_string, NULL, 0); ! screen_write_cursormove(&ctx, start, promptline, 0); left = c->tty.sx - start; if (left == 0)