iPXE
dynui.h File Reference

Dynamic user interfaces. More...

#include <ipxe/list.h>

Go to the source code of this file.

Data Structures

struct  dynamic_ui
 A dynamic user interface. More...
struct  dynamic_item
 A dynamic user interface item. More...

Macros

#define DYNUI_DEFAULT   0x0001
 Dynamic user interface item is default selection.
#define DYNUI_SECRET   0x0002
 Dynamic user interface item represents a secret.

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 FILE_SECBOOT (PERMITTED)
struct dynamic_uicreate_dynui (const char *name, const char *title)
 Create dynamic user interface.
struct dynamic_itemadd_dynui_item (struct dynamic_ui *dynui, const char *name, const char *text, unsigned int flags, int shortcut)
 Add dynamic user interface item.
void destroy_dynui (struct dynamic_ui *dynui)
 Destroy dynamic user interface.
struct dynamic_uifind_dynui (const char *name)
 Find dynamic user interface.
struct dynamic_itemdynui_item (struct dynamic_ui *dynui, unsigned int index)
 Find dynamic user interface item by index.
struct dynamic_itemdynui_shortcut (struct dynamic_ui *dynui, int key, unsigned int index)
 Find dynamic user interface item by shortcut key.
int show_menu (struct dynamic_ui *dynui, unsigned long timeout, unsigned long retimeout, const char *select, struct dynamic_item **selected)
 Show menu.
int show_form (struct dynamic_ui *dynui)
 Show form.

Detailed Description

Dynamic user interfaces.

Definition in file dynui.h.

Macro Definition Documentation

◆ DYNUI_DEFAULT

#define DYNUI_DEFAULT   0x0001

Dynamic user interface item is default selection.

Definition at line 46 of file dynui.h.

Referenced by item_exec(), layout_form(), and show_menu().

◆ DYNUI_SECRET

#define DYNUI_SECRET   0x0002

Dynamic user interface item represents a secret.

Definition at line 49 of file dynui.h.

Referenced by item_exec(), and layout_form().

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )

◆ FILE_SECBOOT()

FILE_SECBOOT ( PERMITTED )

◆ create_dynui()

struct dynamic_ui * create_dynui ( const char * name,
const char * title )
extern

Create dynamic user interface.

Parameters
nameUser interface name, or NULL
titleUser interface title, or NULL
Return values
dynuiDynamic user interface, or NULL on failure

Definition at line 49 of file dynui.c.

49 {
50 struct dynamic_ui *dynui;
51 size_t name_len;
52 size_t title_len;
53 size_t len;
54 char *name_copy;
55 char *title_copy;
56
57 /* Destroy any existing user interface of this name */
58 dynui = find_dynui ( name );
59 if ( dynui )
60 destroy_dynui ( dynui );
61
62 /* Use empty title if none given */
63 if ( ! title )
64 title = "";
65
66 /* Allocate user interface */
67 name_len = ( name ? ( strlen ( name ) + 1 /* NUL */ ) : 0 );
68 title_len = ( strlen ( title ) + 1 /* NUL */ );
69 len = ( sizeof ( *dynui ) + name_len + title_len );
70 dynui = zalloc ( len );
71 if ( ! dynui )
72 return NULL;
73 name_copy = ( ( void * ) ( dynui + 1 ) );
74 title_copy = ( name_copy + name_len );
75
76 /* Initialise user interface */
77 if ( name ) {
78 strcpy ( name_copy, name );
79 dynui->name = name_copy;
80 }
81 strcpy ( title_copy, title );
82 dynui->title = title_copy;
83 INIT_LIST_HEAD ( &dynui->items );
84
85 /* Add to list of user interfaces */
86 list_add_tail ( &dynui->list, &dynamic_uis );
87
88 DBGC ( dynui, "DYNUI %s created with title \"%s\"\n",
89 dynui->name, dynui->title );
90
91 return dynui;
92}
#define NULL
NULL pointer (VOID *)
Definition Base.h:322
const char * name
Definition ath9k_hw.c:1986
ring len
Length.
Definition dwmac.h:226
struct dynamic_ui * find_dynui(const char *name)
Find dynamic user interface.
Definition dynui.c:173
void destroy_dynui(struct dynamic_ui *dynui)
Destroy dynamic user interface.
Definition dynui.c:150
#define DBGC(...)
Definition compiler.h:505
#define list_add_tail(new, head)
Add a new entry to the tail of a list.
Definition list.h:94
#define INIT_LIST_HEAD(list)
Initialise a list head.
Definition list.h:46
void * zalloc(size_t size)
Allocate cleared memory.
Definition malloc.c:662
char * strcpy(char *dest, const char *src)
Copy string.
Definition string.c:347
size_t strlen(const char *src)
Get length of string.
Definition string.c:244
A dynamic user interface.
Definition dynui.h:16
const char * title
Title.
Definition dynui.h:22
struct list_head list
List of dynamic user interfaces.
Definition dynui.h:18
const char * name
Name.
Definition dynui.h:20
struct list_head items
Dynamic user interface items.
Definition dynui.h:24

References DBGC, destroy_dynui(), find_dynui(), INIT_LIST_HEAD, dynamic_ui::items, len, dynamic_ui::list, list_add_tail, dynamic_ui::name, name, NULL, strcpy(), strlen(), dynamic_ui::title, and zalloc().

Referenced by dynui_exec().

◆ add_dynui_item()

struct dynamic_item * add_dynui_item ( struct dynamic_ui * dynui,
const char * name,
const char * text,
unsigned int flags,
int shortcut )
extern

Add dynamic user interface item.

Parameters
dynuiDynamic user interface
nameName, or NULL
textText, or NULL
flagsFlags
shortcutShortcut key
Return values
itemUser interface item, or NULL on failure

Definition at line 104 of file dynui.c.

106 {
107 struct dynamic_item *item;
108 size_t name_len;
109 size_t text_len;
110 size_t len;
111 char *name_copy;
112 char *text_copy;
113
114 /* Use empty text if none given */
115 if ( ! text )
116 text = "";
117
118 /* Allocate item */
119 name_len = ( name ? ( strlen ( name ) + 1 /* NUL */ ) : 0 );
120 text_len = ( strlen ( text ) + 1 /* NUL */ );
121 len = ( sizeof ( *item ) + name_len + text_len );
122 item = zalloc ( len );
123 if ( ! item )
124 return NULL;
125 name_copy = ( ( void * ) ( item + 1 ) );
126 text_copy = ( name_copy + name_len );
127
128 /* Initialise item */
129 if ( name ) {
130 strcpy ( name_copy, name );
131 item->name = name_copy;
132 }
133 strcpy ( text_copy, text );
134 item->text = text_copy;
135 item->index = dynui->count++;
136 item->flags = flags;
137 item->shortcut = shortcut;
138
139 /* Add to list of items */
140 list_add_tail ( &item->list, &dynui->items );
141
142 return item;
143}
uint8_t flags
Flags.
Definition ena.h:7
A dynamic user interface item.
Definition dynui.h:30
struct list_head list
List of dynamic user interface items.
Definition dynui.h:32
int shortcut
Shortcut key.
Definition dynui.h:42
unsigned int index
Index.
Definition dynui.h:38
const char * text
Text.
Definition dynui.h:36
unsigned int flags
Flags.
Definition dynui.h:40
const char * name
Name.
Definition dynui.h:34
unsigned int count
Number of user interface items.
Definition dynui.h:26

References dynamic_ui::count, dynamic_item::flags, flags, dynamic_item::index, dynamic_ui::items, len, dynamic_item::list, list_add_tail, dynamic_item::name, name, NULL, dynamic_item::shortcut, strcpy(), strlen(), dynamic_item::text, and zalloc().

Referenced by item_exec().

◆ destroy_dynui()

void destroy_dynui ( struct dynamic_ui * dynui)
extern

Destroy dynamic user interface.

Parameters
dynuiDynamic user interface

Definition at line 150 of file dynui.c.

150 {
151 struct dynamic_item *item;
152 struct dynamic_item *tmp;
153
154 /* Remove from list of user interfaces */
155 list_del ( &dynui->list );
156
157 /* Free items */
158 list_for_each_entry_safe ( item, tmp, &dynui->items, list ) {
159 list_del ( &item->list );
160 free ( item );
161 }
162
163 /* Free user interface */
164 free ( dynui );
165}
unsigned long tmp
Definition linux_pci.h:65
#define list_for_each_entry_safe(pos, tmp, head, member)
Iterate over entries in a list, safe against deletion of the current entry.
Definition list.h:459
#define list_del(list)
Delete an entry from a list.
Definition list.h:120
static void(* free)(struct refcnt *refcnt))
Definition refcnt.h:55

References free, dynamic_ui::items, dynamic_item::list, dynamic_ui::list, list_del, list_for_each_entry_safe, and tmp.

Referenced by choose_exec(), create_dynui(), dynui_exec(), and present_exec().

◆ find_dynui()

struct dynamic_ui * find_dynui ( const char * name)
extern

Find dynamic user interface.

Parameters
nameUser interface name, or NULL
Return values
dynuiDynamic user interface, or NULL if not found

Definition at line 173 of file dynui.c.

173 {
174 struct dynamic_ui *dynui;
175
176 list_for_each_entry ( dynui, &dynamic_uis, list ) {
177 if ( ( dynui->name == name ) ||
178 ( strcmp ( dynui->name, name ) == 0 ) ) {
179 return dynui;
180 }
181 }
182
183 return NULL;
184}
#define list_for_each_entry(pos, head, member)
Iterate over entries in a list.
Definition list.h:432
int strcmp(const char *first, const char *second)
Compare strings.
Definition string.c:174

References dynamic_ui::list, list_for_each_entry, dynamic_ui::name, name, NULL, and strcmp().

Referenced by create_dynui(), and parse_dynui().

◆ dynui_item()

struct dynamic_item * dynui_item ( struct dynamic_ui * dynui,
unsigned int index )
extern

Find dynamic user interface item by index.

Parameters
dynuiDynamic user interface
indexIndex
Return values
itemUser interface item, or NULL if not found

Definition at line 193 of file dynui.c.

194 {
195 struct dynamic_item *item;
196
197 list_for_each_entry ( item, &dynui->items, list ) {
198 if ( index-- == 0 )
199 return item;
200 }
201
202 return NULL;
203}
long index
Definition bigint.h:65

References index, dynamic_ui::items, dynamic_item::list, list_for_each_entry, and NULL.

Referenced by draw_menu_item(), and menu_loop().

◆ dynui_shortcut()

struct dynamic_item * dynui_shortcut ( struct dynamic_ui * dynui,
int key,
unsigned int index )
extern

Find dynamic user interface item by shortcut key.

Parameters
dynuiDynamic user interface
keyShortcut key
indexStarting index
Return values
itemUser interface item, or NULL if not found

Definition at line 213 of file dynui.c.

214 {
215 struct dynamic_item *item;
216
217 /* Do nothing unless shortcut key is set */
218 if ( ! key )
219 return NULL;
220
221 /* Search from current list index */
222 list_for_each_entry ( item, &dynui->items, list ) {
223 if ( ( key == item->shortcut ) && ( item->index >= index ) )
224 return item;
225 }
226
227 /* If not found, search again from start of list */
228 if ( index )
229 return dynui_shortcut ( dynui, key, 0 );
230
231 return NULL;
232}
union @162305117151260234136356364136041353210355154177 key
Sense key.
Definition scsi.h:3
struct dynamic_item * dynui_shortcut(struct dynamic_ui *dynui, int key, unsigned int index)
Find dynamic user interface item by shortcut key.
Definition dynui.c:213

References dynui_shortcut(), dynamic_item::index, index, dynamic_ui::items, key, dynamic_item::list, list_for_each_entry, NULL, and dynamic_item::shortcut.

Referenced by dynui_shortcut(), form_loop(), and menu_loop().

◆ show_menu()

int show_menu ( struct dynamic_ui * dynui,
unsigned long timeout,
unsigned long retimeout,
const char * select,
struct dynamic_item ** selected )
extern

Show menu.

Parameters
dynuiDynamic user interface
timeoutInitial timeout period, in ticks (0=indefinite)
retimeoutPost-activity timeout period, in ticks (0=indefinite)
Return values
selectedSelected item
rcReturn status code

Definition at line 253 of file menu_ui.c.

255 {
256 struct dynamic_item *item;
257 struct menu_ui ui;
258 char buf[ MENU_COLS + 1 /* NUL */ ];
259 int named_count = 0;
260 int rc;
261
262 /* Initialise UI */
263 memset ( &ui, 0, sizeof ( ui ) );
264 ui.dynui = dynui;
265 ui.scroll.rows = MENU_ROWS;
266 ui.timeout = timeout;
267 ui.retimeout = retimeout;
268
269 list_for_each_entry ( item, &dynui->items, list ) {
270 if ( item->name ) {
271 if ( ! named_count )
272 ui.scroll.current = ui.scroll.count;
273 named_count++;
274 if ( select ) {
275 if ( strcmp ( select, item->name ) == 0 )
276 ui.scroll.current = ui.scroll.count;
277 } else {
278 if ( item->flags & DYNUI_DEFAULT )
279 ui.scroll.current = ui.scroll.count;
280 }
281 }
282 ui.scroll.count++;
283 }
284 if ( ! named_count ) {
285 /* Menus with no named items cannot be selected from,
286 * and will seriously confuse the navigation logic.
287 * Refuse to display any such menus.
288 */
289 return -ENOENT;
290 }
291
292 /* Initialise screen */
293 initscr();
294 start_color();
296 curs_set ( 0 );
297 erase();
298
299 /* Draw initial content */
300 attron ( A_BOLD );
301 snprintf ( buf, sizeof ( buf ), "%s", ui.dynui->title );
302 mvprintw ( TITLE_ROW, ( ( COLS - strlen ( buf ) ) / 2 ), "%s", buf );
303 attroff ( A_BOLD );
304 jump_scroll ( &ui.scroll );
305 draw_menu_items ( &ui );
306 draw_menu_item ( &ui, ui.scroll.current );
307
308 /* Enter main loop */
309 rc = menu_loop ( &ui, selected );
310 assert ( *selected );
311
312 /* Clear screen */
313 endwin();
314
315 return rc;
316}
struct arbelprm_rc_send_wqe rc
Definition arbel.h:3
#define assert(condition)
Assert a condition at run-time.
Definition assert.h:50
int erase(void)
Completely clear the screen.
Definition clear.c:98
#define mvprintw(y, x, fmt,...)
Definition curses.h:649
void timeout(int)
#define start_color()
Definition curses.h:397
#define A_BOLD
Definition curses.h:139
#define color_set(cpno, opts)
Definition curses.h:241
static int attroff(int attrs)
Definition curses.h:509
static int attron(int attrs)
Definition curses.h:513
#define DYNUI_DEFAULT
Dynamic user interface item is default selection.
Definition dynui.h:46
#define TITLE_ROW
Form title row.
Definition form_ui.c:44
#define CPAIR_NORMAL
Normal text.
Definition ansicol.h:41
#define ENOENT
No such file or directory.
Definition errno.h:515
void * memset(void *dest, int character, size_t len) __nonnull
int jump_scroll(struct jump_scroller *scroll)
Jump scroll to new page (if applicable)
Definition jumpscroll.c:141
static void draw_menu_item(struct menu_ui *ui, unsigned int index)
Draw a numbered menu item.
Definition menu_ui.c:69
static int menu_loop(struct menu_ui *ui, struct dynamic_item **selected)
Menu main loop.
Definition menu_ui.c:159
#define MENU_COLS
Definition menu_ui.c:48
#define MENU_ROWS
Definition menu_ui.c:47
static void draw_menu_items(struct menu_ui *ui)
Draw the current block of menu items.
Definition menu_ui.c:136
int curs_set(int visibility)
Set cursor visibility.
Definition mucurses.c:154
int select(fd_set *readfds, int wait)
Check file descriptors for readiness.
Definition posix_io.c:229
A menu user interface.
Definition menu_ui.c:52
unsigned long retimeout
Post-activity timeout (0=indefinite)
Definition menu_ui.c:60
struct dynamic_ui * dynui
Dynamic user interface.
Definition menu_ui.c:54
#define COLS
Definition vga.h:27
int snprintf(char *buf, size_t size, const char *fmt,...)
Write a formatted string to a buffer.
Definition vsprintf.c:383
WINDOW * initscr(void)
Initialise console environment.
Definition wininit.c:18
int endwin(void)
Finalise console environment.
Definition wininit.c:32

References A_BOLD, assert, attroff(), attron(), color_set, COLS, jump_scroller::count, CPAIR_NORMAL, jump_scroller::current, curs_set(), draw_menu_item(), draw_menu_items(), menu_ui::dynui, DYNUI_DEFAULT, endwin(), ENOENT, erase(), dynamic_item::flags, initscr(), dynamic_ui::items, jump_scroll(), list_for_each_entry, memset(), MENU_COLS, menu_loop(), MENU_ROWS, mvprintw, dynamic_item::name, NULL, rc, menu_ui::retimeout, jump_scroller::rows, menu_ui::scroll, select(), snprintf(), start_color, strcmp(), strlen(), menu_ui::timeout, timeout(), dynamic_ui::title, and TITLE_ROW.

Referenced by choose_exec().

◆ show_form()

int show_form ( struct dynamic_ui * dynui)
extern

Show form.

Parameters
dynuiDynamic user interface
Return values
rcReturn status code

Definition at line 509 of file form_ui.c.

509 {
510 struct form *form;
511 int rc;
512
513 /* Allocate and initialise structure */
514 form = alloc_form ( dynui );
515 if ( ! form ) {
516 rc = -ENOMEM;
517 goto err_alloc;
518 }
519
520 /* Parse setting names and load current values */
521 if ( ( rc = parse_names ( form ) ) != 0 )
522 goto err_parse_names;
523 load_values ( form );
524
525 /* Lay out form on screen */
526 if ( ( rc = layout_form ( form ) ) != 0 )
527 goto err_layout;
528
529 /* Draw initial form */
530 initscr();
531 start_color();
532 draw_form ( form );
533
534 /* Run main loop */
535 if ( ( rc = form_loop ( form ) ) != 0 )
536 goto err_loop;
537
538 err_loop:
540 endwin();
541 err_layout:
542 err_parse_names:
543 free_form ( form );
544 err_alloc:
545 return rc;
546}
static int form_loop(struct form *form)
Form main loop.
Definition form_ui.c:423
static int layout_form(struct form *form)
Assign form rows.
Definition form_ui.c:159
static void draw_form(struct form *form)
Draw form.
Definition form_ui.c:253
static struct form * alloc_form(struct dynamic_ui *dynui)
Allocate form.
Definition form_ui.c:100
static void free_form(struct form *form)
Free form.
Definition form_ui.c:142
static int parse_names(struct form *form)
Parse setting names.
Definition form_ui.c:321
static void load_values(struct form *form)
Load current input values.
Definition form_ui.c:358
#define ENOMEM
Not enough space.
Definition errno.h:535
A form.
Definition form_ui.c:65
struct dynamic_ui * dynui
Dynamic user interface.
Definition form_ui.c:67

References alloc_form(), color_set, CPAIR_NORMAL, draw_form(), form::dynui, endwin(), ENOMEM, form_loop(), free_form(), initscr(), layout_form(), load_values(), NULL, parse_names(), rc, and start_color.

Referenced by login_ui(), and present_exec().