[PATCH] ui/ncurses: Call widget process_key handlers first
Samuel Mendoza-Jonas
sam at mendozajonas.com
Thu Jul 21 15:40:41 AEST 2016
Adding KEY_LEFT and KEY_RIGHT brought to light the problem that
widgetset_process_keys() may handle keystrokes that would have also been
handled by a widget's process_keys function. In particular the cursor
in a textbox widget could no longer be moved with the left/right keys.
This updates widgetset_process_keys() to call the focussed widget's
process_keys function before handling the key in any other way. All of
the widget process_keys functions correctly return false if the key is
not relevant to the widget except for textbox_process_key() which is
updated to ignore the main navigational keys.
Signed-off-by: Samuel Mendoza-Jonas <sam at mendozajonas.com>
---
ui/ncurses/nc-widgets.c | 20 +++++++++++++++-----
1 file changed, 15 insertions(+), 5 deletions(-)
diff --git a/ui/ncurses/nc-widgets.c b/ui/ncurses/nc-widgets.c
index 8f8816e..7dc2df3 100644
--- a/ui/ncurses/nc-widgets.c
+++ b/ui/ncurses/nc-widgets.c
@@ -337,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;
@@ -1110,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 */
@@ -1136,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);
@@ -1161,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)
--
2.9.0
More information about the Petitboot
mailing list