Remove key and trim text if menu cannot fit in available space, based on
authornicm <nicm@openbsd.org>
Fri, 22 Oct 2021 17:12:50 +0000 (17:12 +0000)
committernicm <nicm@openbsd.org>
Fri, 22 Oct 2021 17:12:50 +0000 (17:12 +0000)
a change from Alexis Hildebrandt.

usr.bin/tmux/menu.c

index 345964e..2ed80a5 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: menu.c,v 1.39 2021/10/18 09:48:35 nicm Exp $ */
+/* $OpenBSD: menu.c,v 1.40 2021/10/22 17:12:50 nicm Exp $ */
 
 /*
  * Copyright (c) 2019 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -55,10 +55,11 @@ menu_add_item(struct menu *menu, const struct menu_item *item,
     struct cmdq_item *qitem, struct client *c, struct cmd_find_state *fs)
 {
        struct menu_item        *new_item;
-       const char              *key, *cmd;
+       const char              *key = NULL, *cmd, *suffix = "";
        char                    *s, *name;
-       u_int                    width;
+       u_int                    width, max_width;
        int                      line;
+       size_t                   keylen, slen;
 
        line = (item == NULL || item->name == NULL || *item->name == '\0');
        if (line && menu->count == 0)
@@ -80,11 +81,30 @@ menu_add_item(struct menu *menu, const struct menu_item *item,
                menu->count--;
                return;
        }
+       max_width = c->tty.sx - 4;
+
+       slen = strlen(s);
        if (*s != '-' && item->key != KEYC_UNKNOWN && item->key != KEYC_NONE) {
                key = key_string_lookup_key(item->key, 0);
+               keylen = strlen(key) + 3; /* 3 = space and two brackets */
+
+               /*
+                * Only add the key if there is space for the entire item text
+                * and the key.
+                */
+               if (keylen >= max_width || slen >= max_width - keylen)
+                       key = NULL;
+       }
+
+       if (key != NULL)
                xasprintf(&name, "%s#[default] #[align=right](%s)", s, key);
-       } else
-               xasprintf(&name, "%s", s);
+       else {
+               if (slen > max_width) {
+                       max_width--;
+                       suffix = ">";
+               }
+               xasprintf(&name, "%.*s%s", (int)max_width, s, suffix);
+       }
        new_item->name = name;
        free(s);