From 8fe04a0c99bddf76f05de5d6f5094f894badb4f2 Mon Sep 17 00:00:00 2001 From: adnano Date: Tue, 18 Nov 2025 20:03:22 -0500 Subject: [PATCH] Limit number of menu lines by item count Limit the number of menu lines visible in line mode if there are less items than lines. This brings wmenu's behavior in line with dmenu's. Closes https://codeberg.org/adnano/wmenu/issues/64 --- menu.c | 7 +++++++ menu.h | 1 + wmenu-run.c | 1 + wmenu.c | 1 + 4 files changed, 10 insertions(+) diff --git a/menu.c b/menu.c index 207d71c..360ee69 100644 --- a/menu.c +++ b/menu.c @@ -155,11 +155,17 @@ void menu_getopts(struct menu *menu, int argc, char *argv[]) { fprintf(stderr, "%s", usage); exit(EXIT_FAILURE); } +} +// Compute menu line height and padding. +void menu_calc_height(struct menu *menu) { int height = get_font_height(menu->font); menu->line_height = height + 2; menu->height = menu->line_height; if (menu->lines > 0) { + if (menu->item_count < (size_t)menu->lines) { + menu->lines = menu->item_count; + } menu->height += menu->height * menu->lines; } menu->padding = height / 2; @@ -189,6 +195,7 @@ static int compare_items(const void *a, const void *b) { return strcmp(item_a->text, item_b->text); } +// Sort and deduplicate menu items. void menu_sort_and_deduplicate(struct menu *menu) { size_t j = 1; size_t i; diff --git a/menu.h b/menu.h index fdd9ad2..491b014 100644 --- a/menu.h +++ b/menu.h @@ -86,6 +86,7 @@ void menu_destroy(struct menu *menu); void menu_getopts(struct menu *menu, int argc, char *argv[]); void menu_add_item(struct menu *menu, char *text); void menu_sort_and_deduplicate(struct menu *menu); +void menu_calc_height(struct menu *menu); void menu_invalidate(struct menu *menu); void menu_render_items(struct menu *menu); void menu_paste(struct menu *menu, const char *text, ssize_t len); diff --git a/wmenu-run.c b/wmenu-run.c index 1b7b8c1..59f6dc0 100644 --- a/wmenu-run.c +++ b/wmenu-run.c @@ -72,6 +72,7 @@ int main(int argc, char *argv[]) { struct menu *menu = menu_create(exec_item); menu_getopts(menu, argc, argv); read_items(menu); + menu_calc_height(menu); int status = menu_run(menu); menu_destroy(menu); return status; diff --git a/wmenu.c b/wmenu.c index 38e78b9..84007e5 100644 --- a/wmenu.c +++ b/wmenu.c @@ -29,6 +29,7 @@ int main(int argc, char *argv[]) { struct menu *menu = menu_create(print_item); menu_getopts(menu, argc, argv); read_items(menu); + menu_calc_height(menu); int status = menu_run(menu); menu_destroy(menu); return status;