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
This commit is contained in:
adnano 2025-11-18 20:03:22 -05:00
parent 0a38d45abb
commit 8fe04a0c99
4 changed files with 10 additions and 0 deletions

7
menu.c
View file

@ -155,11 +155,17 @@ void menu_getopts(struct menu *menu, int argc, char *argv[]) {
fprintf(stderr, "%s", usage); fprintf(stderr, "%s", usage);
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
}
// Compute menu line height and padding.
void menu_calc_height(struct menu *menu) {
int height = get_font_height(menu->font); int height = get_font_height(menu->font);
menu->line_height = height + 2; menu->line_height = height + 2;
menu->height = menu->line_height; menu->height = menu->line_height;
if (menu->lines > 0) { if (menu->lines > 0) {
if (menu->item_count < (size_t)menu->lines) {
menu->lines = menu->item_count;
}
menu->height += menu->height * menu->lines; menu->height += menu->height * menu->lines;
} }
menu->padding = height / 2; 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); return strcmp(item_a->text, item_b->text);
} }
// Sort and deduplicate menu items.
void menu_sort_and_deduplicate(struct menu *menu) { void menu_sort_and_deduplicate(struct menu *menu) {
size_t j = 1; size_t j = 1;
size_t i; size_t i;

1
menu.h
View file

@ -86,6 +86,7 @@ void menu_destroy(struct menu *menu);
void menu_getopts(struct menu *menu, int argc, char *argv[]); void menu_getopts(struct menu *menu, int argc, char *argv[]);
void menu_add_item(struct menu *menu, char *text); void menu_add_item(struct menu *menu, char *text);
void menu_sort_and_deduplicate(struct menu *menu); void menu_sort_and_deduplicate(struct menu *menu);
void menu_calc_height(struct menu *menu);
void menu_invalidate(struct menu *menu); void menu_invalidate(struct menu *menu);
void menu_render_items(struct menu *menu); void menu_render_items(struct menu *menu);
void menu_paste(struct menu *menu, const char *text, ssize_t len); void menu_paste(struct menu *menu, const char *text, ssize_t len);

View file

@ -72,6 +72,7 @@ int main(int argc, char *argv[]) {
struct menu *menu = menu_create(exec_item); struct menu *menu = menu_create(exec_item);
menu_getopts(menu, argc, argv); menu_getopts(menu, argc, argv);
read_items(menu); read_items(menu);
menu_calc_height(menu);
int status = menu_run(menu); int status = menu_run(menu);
menu_destroy(menu); menu_destroy(menu);
return status; return status;

View file

@ -29,6 +29,7 @@ int main(int argc, char *argv[]) {
struct menu *menu = menu_create(print_item); struct menu *menu = menu_create(print_item);
menu_getopts(menu, argc, argv); menu_getopts(menu, argc, argv);
read_items(menu); read_items(menu);
menu_calc_height(menu);
int status = menu_run(menu); int status = menu_run(menu);
menu_destroy(menu); menu_destroy(menu);
return status; return status;