ui/ncurses: Call widget process_key handlers first
[petitboot] / ui / ncurses / nc-widgets.c
index c5c4cec6faad311473802b3700ef7207d2e7b58a..7dc2df3f1d1fc2138c001b7511bac6bfc0e8041a 100644 (file)
@@ -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 */
@@ -1147,7 +1150,6 @@ bool widgetset_process_key(struct nc_widgetset *set, int key)
                break;
        }
 
-       widget = field_userptr(field);
        if (req) {
                widget_focus_change(widget, field, false);
                form_driver(set->form, req);
@@ -1172,10 +1174,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)