From b8581ec80e5339be5e2c08cfec70a77f21ba06b2 Mon Sep 17 00:00:00 2001 From: nicm Date: Mon, 11 Oct 2021 13:27:50 +0000 Subject: Make positions hidden by overlays range-based rather than character-based, from Anindya Mukherjee. --- menu.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) (limited to 'menu.c') diff --git a/menu.c b/menu.c index 043dafdd..4c6403a0 100644 --- a/menu.c +++ b/menu.c @@ -140,17 +140,16 @@ menu_mode_cb(__unused struct client *c, void *data, __unused u_int *cx, return (&md->s); } -int -menu_check_cb(__unused struct client *c, void *data, u_int px, u_int py) +/* Return parts of the input range which are not obstructed by the menu. */ +void +menu_check_cb(__unused struct client *c, void *data, u_int px, u_int py, + u_int nx, struct overlay_ranges *r) { struct menu_data *md = data; struct menu *menu = md->menu; - if (px < md->px || px > md->px + menu->width + 3) - return (1); - if (py < md->py || py > md->py + menu->count + 1) - return (1); - return (0); + server_client_overlay_range(md->px, md->py, menu->width + 4, + menu->count + 2, px, py, nx, r); } void -- cgit From 51ff77d47be80d59b1e30e55bd75788fcc22e4bf Mon Sep 17 00:00:00 2001 From: nicm Date: Mon, 18 Oct 2021 09:48:35 +0000 Subject: Fix menu width containing disabled items, from Alexis Hildebrandt in GitHub issue 2935. --- menu.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'menu.c') diff --git a/menu.c b/menu.c index 4c6403a0..a1c81816 100644 --- a/menu.c +++ b/menu.c @@ -100,6 +100,8 @@ menu_add_item(struct menu *menu, const struct menu_item *item, new_item->key = item->key; width = format_width(new_item->name); + if (*new_item->name == '-') + width--; if (width > menu->width) menu->width = width; } -- cgit From 8235957eaae0aacb1ad0c9b145a1f9d3abc93dfd Mon Sep 17 00:00:00 2001 From: nicm Date: Fri, 22 Oct 2021 17:12:50 +0000 Subject: Remove key and trim text if menu cannot fit in available space, based on a change from Alexis Hildebrandt. --- menu.c | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) (limited to 'menu.c') diff --git a/menu.c b/menu.c index a1c81816..45645147 100644 --- a/menu.c +++ b/menu.c @@ -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); -- cgit From 630c592ef8740a935ba6c12c957a359c94414219 Mon Sep 17 00:00:00 2001 From: nicm Date: Thu, 11 Nov 2021 09:22:33 +0000 Subject: If trimming menu item text, show key if it would take up less than a quarter of the space; from Alexis Hildebrandt. Also new sentence, new line in tmux.1, from jmc. --- menu.c | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) (limited to 'menu.c') diff --git a/menu.c b/menu.c index 45645147..aaa1287e 100644 --- a/menu.c +++ b/menu.c @@ -89,22 +89,26 @@ menu_add_item(struct menu *menu, const struct menu_item *item, 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. + * Add the key if it is shorter than a quarter of the available + * space or there is space for the entire item text and the + * key. */ - if (keylen >= max_width || slen >= max_width - keylen) + if (keylen <= max_width / 4) + max_width -= keylen; + else if (keylen >= max_width || slen >= max_width - keylen) key = NULL; } + if (slen > max_width) { + max_width--; + suffix = ">"; + } if (key != NULL) - xasprintf(&name, "%s#[default] #[align=right](%s)", s, key); - else { - if (slen > max_width) { - max_width--; - suffix = ">"; - } + xasprintf(&name, "%.*s%s#[default] #[align=right](%s)", + (int)max_width, s, suffix, key); + else xasprintf(&name, "%.*s%s", (int)max_width, s, suffix); - } + new_item->name = name; free(s); -- cgit From 770d28b8c517fd87621ea3e8d6d7bdc4f35b3a94 Mon Sep 17 00:00:00 2001 From: nicm Date: Tue, 1 Feb 2022 11:52:08 +0000 Subject: Do not overflow width when not enough space. --- menu.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'menu.c') diff --git a/menu.c b/menu.c index aaa1287e..c770cd7d 100644 --- a/menu.c +++ b/menu.c @@ -81,6 +81,8 @@ menu_add_item(struct menu *menu, const struct menu_item *item, menu->count--; return; } + if (c->tty.sx <= 4) + return; max_width = c->tty.sx - 4; slen = strlen(s); -- cgit From 97900d0442252aa4b76f89745718038f39717ecd Mon Sep 17 00:00:00 2001 From: nicm Date: Tue, 1 Feb 2022 18:12:20 +0000 Subject: A menu must be shown on a client, so always give the client when adding the items. Also fix mode menus. --- menu.c | 2 -- 1 file changed, 2 deletions(-) (limited to 'menu.c') diff --git a/menu.c b/menu.c index c770cd7d..aaa1287e 100644 --- a/menu.c +++ b/menu.c @@ -81,8 +81,6 @@ menu_add_item(struct menu *menu, const struct menu_item *item, menu->count--; return; } - if (c->tty.sx <= 4) - return; max_width = c->tty.sx - 4; slen = strlen(s); -- cgit From 0027ee13a089efe7d1db1a4cfedb9b801635ded8 Mon Sep 17 00:00:00 2001 From: nicm Date: Wed, 16 Feb 2022 18:55:05 +0000 Subject: Support more mouse buttons when the terminal sends them, GitHub issue 3055. --- menu.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'menu.c') diff --git a/menu.c b/menu.c index aaa1287e..c17d10b1 100644 --- a/menu.c +++ b/menu.c @@ -235,7 +235,7 @@ menu_key_cb(struct client *c, void *data, struct key_event *event) if (KEYC_IS_MOUSE(event->key)) { if (md->flags & MENU_NOMOUSE) { - if (MOUSE_BUTTONS(m->b) != 0) + if (MOUSE_BUTTONS(m->b) != MOUSE_BUTTON_1) return (1); return (0); } @@ -248,7 +248,7 @@ menu_key_cb(struct client *c, void *data, struct key_event *event) return (1); } else { if (!MOUSE_RELEASE(m->b) && - MOUSE_WHEEL(m->b) == 0 && + !MOUSE_WHEEL(m->b) && !MOUSE_DRAG(m->b)) return (1); } @@ -262,7 +262,7 @@ menu_key_cb(struct client *c, void *data, struct key_event *event) if (MOUSE_RELEASE(m->b)) goto chosen; } else { - if (MOUSE_WHEEL(m->b) == 0 && !MOUSE_DRAG(m->b)) + if (!MOUSE_WHEEL(m->b) && !MOUSE_DRAG(m->b)) goto chosen; } md->choice = m->y - (md->py + 1); -- cgit From 86a184b288bca66ec62706f413b7c151cb0850a4 Mon Sep 17 00:00:00 2001 From: nicm Date: Tue, 31 May 2022 10:22:42 +0000 Subject: Trim menu item text correctly, GitHub issue 3197. --- menu.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) (limited to 'menu.c') diff --git a/menu.c b/menu.c index c17d10b1..16120bed 100644 --- a/menu.c +++ b/menu.c @@ -56,7 +56,7 @@ menu_add_item(struct menu *menu, const struct menu_item *item, { struct menu_item *new_item; const char *key = NULL, *cmd, *suffix = ""; - char *s, *name; + char *s, *trimmed, *name; u_int width, max_width; int line; size_t keylen, slen; @@ -103,11 +103,13 @@ menu_add_item(struct menu *menu, const struct menu_item *item, max_width--; suffix = ">"; } - if (key != NULL) - xasprintf(&name, "%.*s%s#[default] #[align=right](%s)", - (int)max_width, s, suffix, key); - else - xasprintf(&name, "%.*s%s", (int)max_width, s, suffix); + trimmed = format_trim_right(s, max_width); + if (key != NULL) { + xasprintf(&name, "%s%s#[default] #[align=right](%s)", + trimmed, suffix, key); + } else + xasprintf(&name, "%s%s", trimmed, suffix); + free(trimmed); new_item->name = name; free(s); -- cgit From 7cee982f909d29e7331d35bd9c21d337688b9ea1 Mon Sep 17 00:00:00 2001 From: nicm Date: Thu, 16 Jun 2022 13:27:39 +0000 Subject: Keep cursor on selected item on menu (useful for blind people), GitHub issue 3225. --- menu.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'menu.c') diff --git a/menu.c b/menu.c index 16120bed..dc3b289f 100644 --- a/menu.c +++ b/menu.c @@ -160,11 +160,16 @@ menu_free(struct menu *menu) } struct screen * -menu_mode_cb(__unused struct client *c, void *data, __unused u_int *cx, - __unused u_int *cy) +menu_mode_cb(__unused struct client *c, void *data, u_int *cx, u_int *cy) { struct menu_data *md = data; + *cx = md->px + 2; + if (md->choice == -1) + *cy = md->py; + else + *cy = md->py + 1 + md->choice; + return (&md->s); } -- cgit