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;
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) {
} 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;
+ }
}
}
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 */
tab = true;
/* fall through */
case KEY_UP:
- case KEY_LEFT:
req = REQ_SPREV_FIELD;
break;
case '\t':
tab = true;
/* fall through */
case KEY_DOWN:
- case KEY_RIGHT:
req = REQ_SNEXT_FIELD;
break;
case KEY_PPAGE:
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);
return true;
}
- if (!widget->process_key)
- return false;
-
- return widget->process_key(widget, set->form, key);
+ return false;
}
static int widgetset_destructor(void *ptr)