]> git.ozlabs.org Git - petitboot/blobdiff - ui/ncurses/nc-widgets.c
ui/ncurses/widgets: Add widget focus offset query
[petitboot] / ui / ncurses / nc-widgets.c
index d17034dd685e14e42fb42294fa734aa4eb250ad6..583e5ed82d9169c6762ff986cd2b599e928d103e 100644 (file)
 
 #define _GNU_SOURCE
 
+#include "config.h"
+
+#include <linux/input.h> /* This must be included before ncurses.h */
+#if defined HAVE_NCURSESW_CURSES_H
+#  include <ncursesw/curses.h>
+#elif defined HAVE_NCURSESW_H
+#  include <ncursesw.h>
+#elif defined HAVE_NCURSES_CURSES_H
+#  include <ncurses/curses.h>
+#elif defined HAVE_NCURSES_H
+#  include <ncurses.h>
+#elif defined HAVE_CURSES_H
+#  include <curses.h>
+#else
+#  error "Curses header file not found."
+#endif
+
+#if defined HAVE_NCURSESW_FORM_H
+#  include <ncursesw/form.h>
+#elif defined HAVE_NCURSES_FORM_H
+#  include <ncurses/form.h>
+#elif defined HAVE_FORM_H
+#  include <form.h>
+#else
+#  error "Curses form.h not found."
+#endif
+
 #include <string.h>
 #include <ctype.h>
 
@@ -58,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;
 };
@@ -387,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;
@@ -411,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;
@@ -466,6 +509,8 @@ void widget_select_add_option(struct nc_widget_select *select, int value,
 
 int widget_select_get_value(struct nc_widget_select *select)
 {
+       if (!select->n_options)
+               return -1;
        return select->options[select->selected_option].val;
 }
 
@@ -593,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;
@@ -726,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;
+}
+