forked from RepoMirrors/bemenu
bemenu: Reuse code more
This commit is contained in:
parent
0ff5f20178
commit
8cfa530b89
@ -251,6 +251,13 @@ launch(const char *bin)
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
item_cb(struct bm_item *item, const char *text)
|
||||
{
|
||||
(void)item; // may be null
|
||||
launch(text);
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, char **argv)
|
||||
{
|
||||
@ -272,22 +279,7 @@ main(int argc, char **argv)
|
||||
return EXIT_FAILURE;
|
||||
|
||||
read_items_to_menu_from_path(menu);
|
||||
bm_menu_set_highlighted_index(menu, client.selected);
|
||||
|
||||
enum bm_run_result status = run_menu(menu);
|
||||
|
||||
if (status == BM_RUN_RESULT_SELECTED) {
|
||||
uint32_t i, count;
|
||||
struct bm_item **items = bm_menu_get_selected_items(menu, &count);
|
||||
for (i = 0; i < count; ++i) {
|
||||
const char *text = bm_item_get_text(items[i]);
|
||||
launch(text);
|
||||
}
|
||||
|
||||
if (!count && bm_menu_get_filter(menu))
|
||||
launch(bm_menu_get_filter(menu));
|
||||
}
|
||||
|
||||
const enum bm_run_result status = run_menu(&client, menu, item_cb);
|
||||
bm_menu_free(menu);
|
||||
return (status == BM_RUN_RESULT_SELECTED ? EXIT_SUCCESS : EXIT_FAILURE);
|
||||
}
|
||||
|
@ -57,6 +57,13 @@ read_items_to_menu_from_stdin(struct bm_menu *menu)
|
||||
free(buffer);
|
||||
}
|
||||
|
||||
static void
|
||||
item_cb(struct bm_item *item, const char *text)
|
||||
{
|
||||
(void)item; // may be null
|
||||
printf("%s\n", (text ? text : ""));
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, char **argv)
|
||||
{
|
||||
@ -70,22 +77,7 @@ main(int argc, char **argv)
|
||||
return EXIT_FAILURE;
|
||||
|
||||
read_items_to_menu_from_stdin(menu);
|
||||
bm_menu_set_highlighted_index(menu, client.selected);
|
||||
|
||||
enum bm_run_result status = run_menu(menu);
|
||||
|
||||
if (status == BM_RUN_RESULT_SELECTED) {
|
||||
uint32_t i, count;
|
||||
struct bm_item **items = bm_menu_get_selected_items(menu, &count);
|
||||
for (i = 0; i < count; ++i) {
|
||||
const char *text = bm_item_get_text(items[i]);
|
||||
printf("%s\n", (text ? text : ""));
|
||||
}
|
||||
|
||||
if (!count && bm_menu_get_filter(menu))
|
||||
printf("%s\n", bm_menu_get_filter(menu));
|
||||
}
|
||||
|
||||
const enum bm_run_result status = run_menu(&client, menu, item_cb);
|
||||
bm_menu_free(menu);
|
||||
return (status == BM_RUN_RESULT_SELECTED ? EXIT_SUCCESS : EXIT_FAILURE);
|
||||
}
|
||||
|
@ -275,8 +275,9 @@ menu_with_options(const struct client *client)
|
||||
}
|
||||
|
||||
enum bm_run_result
|
||||
run_menu(struct bm_menu *menu)
|
||||
run_menu(const struct client *client, struct bm_menu *menu, void (*item_cb)(struct bm_item *item, const char *text))
|
||||
{
|
||||
bm_menu_set_highlighted_index(menu, client->selected);
|
||||
bm_menu_grab_keyboard(menu, true);
|
||||
|
||||
uint32_t unicode;
|
||||
@ -286,6 +287,19 @@ run_menu(struct bm_menu *menu)
|
||||
bm_menu_render(menu);
|
||||
key = bm_menu_poll_key(menu, &unicode);
|
||||
} while ((status = bm_menu_run_with_key(menu, key, unicode)) == BM_RUN_RESULT_RUNNING);
|
||||
|
||||
if (status == BM_RUN_RESULT_SELECTED) {
|
||||
uint32_t i, count;
|
||||
struct bm_item **items = bm_menu_get_selected_items(menu, &count);
|
||||
for (i = 0; i < count; ++i) {
|
||||
const char *text = bm_item_get_text(items[i]);
|
||||
item_cb(items[i], text);
|
||||
}
|
||||
|
||||
if (!count && bm_menu_get_filter(menu))
|
||||
item_cb(NULL, bm_menu_get_filter(menu));
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
|
@ -20,7 +20,7 @@ struct client {
|
||||
|
||||
void parse_args(struct client *client, int *argc, char **argv[]);
|
||||
struct bm_menu* menu_with_options(const struct client *client);
|
||||
enum bm_run_result run_menu(struct bm_menu *menu);
|
||||
enum bm_run_result run_menu(const struct client *client, struct bm_menu *menu, void (*item_cb)(struct bm_item *item, const char *text));
|
||||
|
||||
#endif /* _BM_COMMON_H_ */
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user