Remove key and trim text if menu cannot fit in available space, based on

a change from Alexis Hildebrandt.
pull/2950/head
nicm 2021-10-22 17:12:50 +00:00
parent 289ac55ebd
commit 8235957eaa
1 changed files with 24 additions and 4 deletions

28
menu.c
View File

@ -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);