blob: 6e61a8ca8e7d0a919648dff6bd8fbb376eadc8d9 [file]
#ifndef _IPXE_WIDGET_H
#define _IPXE_WIDGET_H
/** @file
*
* Text widgets
*
*/
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
FILE_SECBOOT ( PERMITTED );
#include <curses.h>
/** A text widget */
struct widget {
/** Widget operations */
struct widget_operations *op;
/** Row */
unsigned int row;
/** Starting column */
unsigned int col;
/** Width */
unsigned int width;
/** Flags */
unsigned int flags;
};
/** Text widget flags */
enum widget_flags {
/** Widget may have input focus */
WIDGET_EDITABLE = 0x0001,
/** Widget contains a secret */
WIDGET_SECRET = 0x0002,
};
/** Text widget operations */
struct widget_operations {
/**
* Draw widget
*
* @v widget Text widget
*/
void ( * draw ) ( struct widget *widget );
/**
* Edit widget
*
* @v widget Text widget
* @v key Key pressed by user
* @ret key Key returned to application, or zero
*
* This will not update the display: you must call the draw()
* method to ensure that any changes to an editable widget are
* displayed to the user.
*/
int ( * edit ) ( struct widget *widget, int key );
};
/**
* Initialise text widget
*
* @v widget Text widget
* @v op Text widget operations
* @v row Row
* @v col Starting column
* @v width Width
*/
static inline __attribute__ (( always_inline )) void
init_widget ( struct widget *widget, struct widget_operations *op,
unsigned int row, unsigned int col, unsigned int width,
unsigned int flags ) {
widget->op = op;
widget->row = row;
widget->col = col;
widget->width = width;
widget->flags = flags;
}
/**
* Draw text widget
*
* @v widget Text widget
*/
static inline __attribute__ (( always_inline )) void
draw_widget ( struct widget *widget ) {
widget->op->draw ( widget );
}
/**
* Edit text widget
*
* @v widget Text widget
* @v key Key pressed by user
* @ret key Key returned to application, or zero
*
* This will not update the display: you must call draw_widget() to
* ensure that any changes to an editable widget are displayed to the
* user.
*/
static inline __attribute__ (( always_inline )) int
edit_widget ( struct widget *widget, int key ) {
return widget->op->edit ( widget, key );
}
#endif /* _IPXE_WIDGET_H */