Since we may have a long list of devices on the configuration screen,
we'd like a way to jump between widgets. This change repeats the
PREV_FIELD/NEXT_FIELD driver request on these events.
Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
bool widgetset_process_key(struct nc_widgetset *set, int key)
{
struct nc_widget *widget;
bool widgetset_process_key(struct nc_widgetset *set, int key)
{
struct nc_widget *widget;
field = current_field(set->form);
assert(field);
field = current_field(set->form);
assert(field);
/* handle field change events */
switch (key) {
case KEY_BTAB:
/* handle field change events */
switch (key) {
case KEY_BTAB:
+ tab = true;
+ /* fall through */
case KEY_UP:
req = REQ_PREV_FIELD;
break;
case '\t':
case KEY_UP:
req = REQ_PREV_FIELD;
break;
case '\t':
+ tab = true;
+ /* fall through */
case KEY_DOWN:
req = REQ_NEXT_FIELD;
break;
case KEY_DOWN:
req = REQ_NEXT_FIELD;
break;
if (req) {
widget_focus_change(widget, field, false);
form_driver(set->form, req);
if (req) {
widget_focus_change(widget, field, false);
form_driver(set->form, req);
- form_driver(set->form, REQ_END_FIELD);
+
+ /* if we're doing a tabbed-field-change, skip until we
+ * see the next widget */
+ tmp = field;
field = current_field(set->form);
field = current_field(set->form);
+
+ for (; tab && tmp != field && field_userptr(field) == widget;) {
+ form_driver(set->form, req);
+ field = current_field(set->form);
+ }
+
+ form_driver(set->form, REQ_END_FIELD);
widget = field_userptr(field);
widget_focus_change(widget, field, true);
if (widget->field_focus)
widget = field_userptr(field);
widget_focus_change(widget, field, true);
if (widget->field_focus)