X-Git-Url: http://git.ozlabs.org/?p=petitboot;a=blobdiff_plain;f=ui%2Fncurses%2Fnc-widgets.c;h=15cec80f3594ae3600f2cecf891db28d4532901e;hp=98d30cc8686cf76e67694de24e83ebf889fd4267;hb=11c43508e4360456298a6dcb0563614e9a118b41;hpb=f5d24f2a0727a23a6a4a888651aea4232aa6e32f diff --git a/ui/ncurses/nc-widgets.c b/ui/ncurses/nc-widgets.c index 98d30cc..15cec80 100644 --- a/ui/ncurses/nc-widgets.c +++ b/ui/ncurses/nc-widgets.c @@ -162,21 +162,6 @@ static bool key_is_select(int key) return key == ' ' || key == '\r' || key == '\n' || key == KEY_ENTER; } -static bool key_is_minus(int key) -{ - return key == 055; -} - -static bool key_is_left(int key) -{ - return key == KEY_LEFT; -} - -static bool key_is_right(int key) -{ - return key == KEY_RIGHT; -} - static bool process_key_nop(struct nc_widget *widget __attribute__((unused)), FORM *form __attribute((unused)), int key __attribute__((unused))) @@ -352,6 +337,14 @@ static bool textbox_process_key( case KEY_DC: form_driver(form, REQ_DEL_CHAR); break; + case '\t': + case KEY_BTAB: + case KEY_UP: + case KEY_DOWN: + case KEY_PPAGE: + case KEY_NPAGE: + /* Don't catch navigational keys */ + return false; default: form_driver(form, key); break; @@ -481,6 +474,7 @@ static void subset_delete_active(struct nc_widget_subset *subset, int idx) struct nc_widget *widget; size_t rem; int i, val; + uint32_t opts; /* Shift field focus to nearest active option or next visible field */ if (subset->n_active > 1) { @@ -492,8 +486,11 @@ static void subset_delete_active(struct nc_widget_subset *subset, int idx) } else { for (i = 0; i < set->n_fields; i++) if (field_visible(set->fields[i])) { - set->cur_field = set->fields[i]; - break; + opts = field_opts(set->fields[i]); + if ((opts & O_ACTIVE) == O_ACTIVE) { + set->cur_field = set->fields[i]; + break; + } } } @@ -522,7 +519,7 @@ static bool subset_process_key(struct nc_widget *w, FORM *form, int key) int i, val, opt_idx = -1; FIELD *field; - if (!key_is_minus(key) && !key_is_left(key) && !key_is_right(key)) + if (key != '-' && key != '+' && key != KEY_DC && key != KEY_BACKSPACE) return false; field = current_field(form); @@ -538,10 +535,10 @@ static bool subset_process_key(struct nc_widget *w, FORM *form, int key) if (opt_idx < 0) return false; - if (key_is_minus(key)) + if (key == KEY_DC || key == KEY_BACKSPACE) subset_delete_active(subset, opt_idx); - if (key_is_left(key)){ + if (key == '-') { if (opt_idx == 0) return true; @@ -550,7 +547,7 @@ static bool subset_process_key(struct nc_widget *w, FORM *form, int key) subset->active[opt_idx - 1] = val; } - if (key_is_right(key)){ + if (key == '+') { if (opt_idx >= subset->n_active - 1) return true; @@ -1121,6 +1118,12 @@ bool widgetset_process_key(struct nc_widgetset *set, int key) field = current_field(set->form); assert(field); + widget = field_userptr(field); + + if (widget->process_key) + if (widget->process_key(widget, set->form, key)) + return true; + tab = false; /* handle field change events */ @@ -1143,9 +1146,14 @@ bool widgetset_process_key(struct nc_widgetset *set, int key) case KEY_NPAGE: req = REQ_SLAST_FIELD; break; + case KEY_LEFT: + req = REQ_LEFT_FIELD; + break; + case KEY_RIGHT: + req = REQ_RIGHT_FIELD; + break; } - widget = field_userptr(field); if (req) { widget_focus_change(widget, field, false); form_driver(set->form, req); @@ -1170,10 +1178,7 @@ bool widgetset_process_key(struct nc_widgetset *set, int key) return true; } - if (!widget->process_key) - return false; - - return widget->process_key(widget, set->form, key); + return false; } static int widgetset_destructor(void *ptr)