static void toggle_option(struct view *view) { const struct menu_item menu[] = { #define DEFINE_TOGGLE_MENU(key, help, name) { key, help, name } TOGGLE_MENU_INFO(DEFINE_TOGGLE_MENU) { 0 } }; const char *toggle_argv[] = { "toggle", NULL, NULL }; int i = 0; if (!prompt_menu("Toggle option", menu, &i)) return; toggle_argv[1] = menu[i].data; run_prompt_command(view, toggle_argv); }
static enum view_flag toggle_option(struct view *view, enum request request, char msg[SIZEOF_STR]) { const struct { enum request request; const struct enum_map *map; enum view_flag reload_flags; } data[] = { #define DEFINE_TOGGLE_DATA(id, key, help, value, map, vflags) { REQ_TOGGLE_ ## id, map, vflags } TOGGLE_MENU_INFO(DEFINE_TOGGLE_DATA) }; const struct menu_item menu[] = { #define DEFINE_TOGGLE_MENU(id, key, help, value, map, vflags) { key, help, value } TOGGLE_MENU_INFO(DEFINE_TOGGLE_MENU) { 0 } }; int i = 0; if (request == REQ_OPTIONS) { if (!prompt_menu("Toggle option", menu, &i)) return VIEW_NO_FLAGS; } else { while (i < ARRAY_SIZE(data) && data[i].request != request) i++; if (i >= ARRAY_SIZE(data)) die("Invalid request (%d)", request); } if (data[i].map != NULL) { unsigned int *opt = menu[i].data; *opt = (*opt + 1) % data[i].map->size; if (data[i].map == ignore_space_map) { string_format_size(msg, SIZEOF_STR, "Ignoring %s %s", enum_name(data[i].map->entries[*opt]), menu[i].text); } else if (data[i].map == commit_order_map) { string_format_size(msg, SIZEOF_STR, "Using %s %s", enum_name(data[i].map->entries[*opt]), menu[i].text); } else { string_format_size(msg, SIZEOF_STR, "Displaying %s %s", enum_name(data[i].map->entries[*opt]), menu[i].text); } } else if (menu[i].data == &opt_title_overflow) { int *option = menu[i].data; *option = *option ? -*option : 50; string_format_size(msg, SIZEOF_STR, "%sabling %s", *option > 0 ? "En" : "Dis", menu[i].text); } else { bool *option = menu[i].data; *option = !*option; string_format_size(msg, SIZEOF_STR, "%sabling %s", *option ? "En" : "Dis", menu[i].text); } return data[i].reload_flags; }