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;