diff options
author | Jeremy Kerr <jk@ozlabs.org> | 2013-11-19 14:18:28 +1100 |
---|---|---|
committer | Jeremy Kerr <jk@ozlabs.org> | 2013-11-22 10:45:54 +0800 |
commit | e921d7bc8ed3980494518d22b0e754a6b3a603b1 (patch) | |
tree | c5c35d0737b7be7b3c672c3a620793ae7e0567b5 | |
parent | 4a624766022c2f2dd833f74751aab4b502ef6e06 (diff) | |
download | petitboot-e921d7bc8ed3980494518d22b0e754a6b3a603b1.zip petitboot-e921d7bc8ed3980494518d22b0e754a6b3a603b1.tar.gz |
ui/ncurses/widgets: Add widget focus offset query
When we have widgets that are larger than the screen, we'd like to
scroll to the currently-focussed component of that widget.
This change introduces a widget_focus_y function, which returns the y
offset of the field's focus.
Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
-rw-r--r-- | ui/ncurses/nc-widgets.c | 23 | ||||
-rw-r--r-- | ui/ncurses/nc-widgets.h | 1 |
2 files changed, 24 insertions, 0 deletions
diff --git a/ui/ncurses/nc-widgets.c b/ui/ncurses/nc-widgets.c index d96480e..583e5ed 100644 --- a/ui/ncurses/nc-widgets.c +++ b/ui/ncurses/nc-widgets.c @@ -85,10 +85,12 @@ struct nc_widget { bool (*process_key)(struct nc_widget *, FORM *, int); void (*set_visible)(struct nc_widget *, bool); void (*move)(struct nc_widget *, int, int); + void (*field_focus)(struct nc_widget *, FIELD *); int focussed_attr; int unfocussed_attr; int height; int width; + int focus_y; int x; int y; }; @@ -414,6 +416,19 @@ static void select_move(struct nc_widget *widget, int y, int x) field_move(select->options[i].field, y + i, x); } +static void select_field_focus(struct nc_widget *widget, FIELD *field) +{ + struct nc_widget_select *select = to_select(widget); + int i; + + for (i = 0; i < select->n_options; i++) { + if (field != select->options[i].field) + continue; + widget->focus_y = i; + return; + } +} + static int select_destructor(void *ptr) { struct nc_widget_select *select = ptr; @@ -438,6 +453,7 @@ struct nc_widget_select *widget_new_select(struct nc_widgetset *set, select->widget.process_key = select_process_key; select->widget.set_visible = select_set_visible; select->widget.move = select_move; + select->widget.field_focus = select_field_focus; select->widget.focussed_attr = A_REVERSE; select->widget.unfocussed_attr = A_NORMAL; select->top = y; @@ -622,6 +638,8 @@ bool widgetset_process_key(struct nc_widgetset *set, int key) field = current_field(set->form); widget = field_userptr(field); widget_focus_change(widget, field, true); + if (widget->field_focus) + widget->field_focus(widget, field); if (set->widget_focus) set->widget_focus(widget, set->widget_focus_arg); return true; @@ -755,3 +773,8 @@ int widget_y(struct nc_widget *widget) return widget->y; } +int widget_focus_y(struct nc_widget *widget) +{ + return widget->focus_y; +} + diff --git a/ui/ncurses/nc-widgets.h b/ui/ncurses/nc-widgets.h index 53f1583..d598d5a 100644 --- a/ui/ncurses/nc-widgets.h +++ b/ui/ncurses/nc-widgets.h @@ -59,6 +59,7 @@ int widget_height(struct nc_widget *widget); int widget_width(struct nc_widget *widget); int widget_y(struct nc_widget *widget); int widget_x(struct nc_widget *widget); +int widget_focus_y(struct nc_widget *widget); /* widgetset API */ typedef void (*widget_focus_cb)(struct nc_widget *widget, void *arg); |