=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/screen-redraw.c,v retrieving revision 1.27 retrieving revision 1.28 diff -c -r1.27 -r1.28 *** src/usr.bin/tmux/screen-redraw.c 2014/03/31 21:34:08 1.27 --- src/usr.bin/tmux/screen-redraw.c 2014/11/14 02:19:47 1.28 *************** *** 1,4 **** ! /* $OpenBSD: screen-redraw.c,v 1.27 2014/03/31 21:34:08 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: screen-redraw.c,v 1.28 2014/11/14 02:19:47 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott *************** *** 278,286 **** struct options *oo = &c->session->options; struct tty *tty = &c->tty; struct window_pane *wp; ! struct grid_cell active_gc, other_gc; ! u_int i, j, type; style_apply(&other_gc, oo, "pane-border-style"); style_apply(&active_gc, oo, "pane-active-border-style"); active_gc.attr = other_gc.attr = GRID_ATTR_CHARSET; --- 278,315 ---- struct options *oo = &c->session->options; struct tty *tty = &c->tty; struct window_pane *wp; ! struct grid_cell active_gc, other_gc, msg_gc; ! u_int i, j, type, msgx = 0, msgy = 0; ! int small, flags; ! char msg[256]; ! const char *tmp; ! size_t msglen = 0; + small = (tty->sy - status + top > w->sy) || (tty->sx > w->sx); + if (small) { + flags = w->flags & (WINDOW_FORCEWIDTH|WINDOW_FORCEHEIGHT); + if (flags == (WINDOW_FORCEWIDTH|WINDOW_FORCEHEIGHT)) + tmp = "force-width, force-height"; + else if (flags == WINDOW_FORCEWIDTH) + tmp = "force-width"; + else if (flags == WINDOW_FORCEHEIGHT) + tmp = "force-height"; + else + tmp = "a smaller client"; + xsnprintf(msg, sizeof msg, "(size %ux%u from %s)", + w->sx, w->sy, tmp); + msglen = strlen(msg); + + if (tty->sy - 1 - status + top > w->sy && tty->sx >= msglen) { + msgx = tty->sx - msglen; + msgy = tty->sy - 1 - status + top; + } else if (tty->sx - w->sx > msglen) { + msgx = tty->sx - msglen; + msgy = tty->sy - 1 - status + top; + } else + small = 0; + } + style_apply(&other_gc, oo, "pane-border-style"); style_apply(&active_gc, oo, "pane-active-border-style"); active_gc.attr = other_gc.attr = GRID_ATTR_CHARSET; *************** *** 290,295 **** --- 319,327 ---- type = screen_redraw_check_cell(c, i, j, &wp); if (type == CELL_INSIDE) continue; + if (type == CELL_OUTSIDE && + small && i > msgx && j == msgy) + continue; if (screen_redraw_check_active(i, j, type, w, wp)) tty_attributes(tty, &active_gc); else *************** *** 297,302 **** --- 329,341 ---- tty_cursor(tty, i, top + j); tty_putc(tty, CELL_BORDERS[type]); } + } + + if (small) { + memcpy(&msg_gc, &grid_default_cell, sizeof msg_gc); + tty_attributes(tty, &msg_gc); + tty_cursor(tty, msgx, msgy); + tty_puts(tty, msg); } }