diff options
author | nicm <nicm> | 2014-11-14 02:19:47 +0000 |
---|---|---|
committer | nicm <nicm> | 2014-11-14 02:19:47 +0000 |
commit | e0929262db947f984964f979a23215c0de75ceb2 (patch) | |
tree | e09954e2ff09b3b9d309caf7b5c8d8630b6a0b3f /screen-redraw.c | |
parent | 7cc470664616e7acbaaec65da760fd905e8e652d (diff) | |
download | rtmux-e0929262db947f984964f979a23215c0de75ceb2.tar.gz rtmux-e0929262db947f984964f979a23215c0de75ceb2.tar.bz2 rtmux-e0929262db947f984964f979a23215c0de75ceb2.zip |
Label windows which are smaller than expected with a reason.
Diffstat (limited to 'screen-redraw.c')
-rw-r--r-- | screen-redraw.c | 43 |
1 files changed, 41 insertions, 2 deletions
diff --git a/screen-redraw.c b/screen-redraw.c index a7f713a5..ef9e539d 100644 --- a/screen-redraw.c +++ b/screen-redraw.c @@ -278,8 +278,37 @@ screen_redraw_draw_borders(struct client *c, int status, u_int top) 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; + 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"); @@ -290,6 +319,9 @@ screen_redraw_draw_borders(struct client *c, int status, u_int top) 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 @@ -298,6 +330,13 @@ screen_redraw_draw_borders(struct client *c, int status, u_int top) 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); + } } /* Draw the panes. */ |