summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
a2d5a3e)
The main menu and plugin menu are separate screens but they share the
pmenu_process_key() handler. This means all the key shortcuts intended
for the main menu can also be used in the plugin menu, which is
particularly odd for "add new boot option" for example.
To work around this extend the 'hot_key' functionality in pmenu to allow
multiple handlers. This allows all pmenus to have the usual navigation
and action keys, and then add extra handlers as needed. For example,
ps3_mm_init() needs main menu shortcuts as well as some PS3-specific
shortcuts, whereas plugin_menu_init() only needs the generic key
handler.
This changes the functionality of pmenu_process_key() such that if a
hot_key_fn successfully handles a key, pmenu_process_key() returns
instead of continuing to process the key. This does not affect the
current usage.
Signed-off-by: Samuel Mendoza-Jonas <sam@mendozajonas.com>
+ m->n_hot_keys = 1;
+ m->hot_keys = talloc_array(m, hot_key_fn, m->n_hot_keys);
+ if (!m->hot_keys) {
+ pb_log("%s: failed to allocate hot_keys\n", __func__);
+ talloc_free(m);
+ return NULL;
+ }
+ m->hot_keys[0] = pmenu_main_hot_keys;
m->on_new = cui_item_new;
m->scr.frame.ltitle = talloc_asprintf(m,
m->on_new = cui_item_new;
m->scr.frame.ltitle = talloc_asprintf(m,
int result;
m = pmenu_init(cui, 2, cui_plugin_menu_exit);
int result;
m = pmenu_init(cui, 2, cui_plugin_menu_exit);
- m->on_new = cui_item_new;
m->scr.frame.ltitle = talloc_asprintf(m, _("Petitboot Plugins"));
m->scr.frame.rtitle = talloc_asprintf(m, NULL);
m->scr.frame.help = talloc_strdup(m,
m->scr.frame.ltitle = talloc_asprintf(m, _("Petitboot Plugins"));
m->scr.frame.rtitle = talloc_asprintf(m, NULL);
m->scr.frame.help = talloc_strdup(m,
wrefresh(menu->scr.main_ncw);
}
wrefresh(menu->scr.main_ncw);
}
+/**
+ * pmenu_main_hot_keys - Hot keys for the main boot menu
+ */
+int pmenu_main_hot_keys(struct pmenu *menu, struct pmenu_item *item, int c)
+{
+ struct nc_scr *scr = &menu->scr;
+ (void)item;
+
+ switch (c) {
+ case 'i':
+ cui_show_sysinfo(cui_from_arg(scr->ui_ctx));
+ break;
+ case 'c':
+ cui_show_config(cui_from_arg(scr->ui_ctx));
+ break;
+ case 'l':
+ cui_show_lang(cui_from_arg(scr->ui_ctx));
+ break;
+ case 'g':
+ cui_show_statuslog(cui_from_arg(scr->ui_ctx));
+ break;
+ default:
+ return 0;
+ }
+
+ return c;
+}
+
/**
* pmenu_process_key - Process a user keystroke.
*/
/**
* pmenu_process_key - Process a user keystroke.
*/
{
struct pmenu *menu = pmenu_from_scr(scr);
struct pmenu_item *item = pmenu_find_selected(menu);
{
struct pmenu *menu = pmenu_from_scr(scr);
struct pmenu_item *item = pmenu_find_selected(menu);
nc_scr_status_free(&menu->scr);
nc_scr_status_free(&menu->scr);
- if (menu->hot_key)
- key = menu->hot_key(menu, item, key);
+ if (menu->hot_keys)
+ for (i = 0; i < menu->n_hot_keys; i++) {
+ if (menu->hot_keys[i](menu, item, key))
+ return;
+ }
switch (key) {
case 27: /* ESC */
switch (key) {
case 27: /* ESC */
if (item->on_execute)
item->on_execute(item);
break;
if (item->on_execute)
item->on_execute(item);
break;
- case 'i':
- cui_show_sysinfo(cui_from_arg(scr->ui_ctx));
- break;
- case 'c':
- cui_show_config(cui_from_arg(scr->ui_ctx));
- break;
- case 'l':
- cui_show_lang(cui_from_arg(scr->ui_ctx));
- break;
- case 'g':
- cui_show_statuslog(cui_from_arg(scr->ui_ctx));
- break;
case KEY_F(1):
case 'h':
if (menu->help_text)
case KEY_F(1):
case 'h':
if (menu->help_text)
+typedef int (*hot_key_fn)(struct pmenu *menu, struct pmenu_item *item, int c);
+
+int pmenu_main_hot_keys(struct pmenu *menu, struct pmenu_item *item, int c);
+
/**
* struct pmenu - Data structure defining complete menu.
* @insert_pt: Index in nc item array.
/**
* struct pmenu - Data structure defining complete menu.
* @insert_pt: Index in nc item array.
unsigned int insert_pt;
const char *help_title;
const struct help_text *help_text;
unsigned int insert_pt;
const char *help_title;
const struct help_text *help_text;
- int (*hot_key)(struct pmenu *menu, struct pmenu_item *item, int c);
+ hot_key_fn *hot_keys;
+ unsigned int n_hot_keys;
void (*on_exit)(struct pmenu *menu);
void (*on_new)(struct pmenu *menu);
};
void (*on_exit)(struct pmenu *menu);
void (*on_new)(struct pmenu *menu);
};
- m->hot_key = ps3_hot_key;
+ m->n_hot_keys = 2;
+ m->hot_keys = talloc_array(m, hot_key_fn *, m->n_hot_keys);
+ if (!m->hot_keys) {
+ pb_log("%s: failed to allocate hot_keys\n", __func__);
+ talloc_free(m);
+ return NULL;
+ }
+ m->hot_keys[0] = ps3_hot_key;
+ m->hot_keys[1] = pmenu_main_hot_keys;
m->on_new = cui_item_new;
#if defined(DEBUG)
m->on_new = cui_item_new;
#if defined(DEBUG)