#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>
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;
};
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;
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;
int widget_select_get_value(struct nc_widget_select *select)
{
+ if (!select->n_options)
+ return -1;
return select->options[select->selected_option].val;
}
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;
return widget->y;
}
+int widget_focus_y(struct nc_widget *widget)
+{
+ return widget->focus_y;
+}
+