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)
 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 )
extern

Find dynamic user interface item by shortcut key.

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

Definition at line 212 of file dynui.c.

212 {
213 struct dynamic_item *item;
214
215 list_for_each_entry ( item, &dynui->items, list ) {
216 if ( key && ( key == item->shortcut ) )
217 return item;
218 }
219
220 return NULL;
221}
union @162305117151260234136356364136041353210355154177 key
Sense key.
Definition scsi.h:3

References dynamic_ui::items, key, dynamic_item::list, list_for_each_entry, NULL, and dynamic_item::shortcut.

Referenced by 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 252 of file menu_ui.c.

254 {
255 struct dynamic_item *item;
256 struct menu_ui ui;
257 char buf[ MENU_COLS + 1 /* NUL */ ];
258 int named_count = 0;
259 int rc;
260
261 /* Initialise UI */
262 memset ( &ui, 0, sizeof ( ui ) );
263 ui.dynui = dynui;
264 ui.scroll.rows = MENU_ROWS;
265 ui.timeout = timeout;
266 ui.retimeout = retimeout;
267
268 list_for_each_entry ( item, &dynui->items, list ) {
269 if ( item->name ) {
270 if ( ! named_count )
271 ui.scroll.current = ui.scroll.count;
272 named_count++;
273 if ( select ) {
274 if ( strcmp ( select, item->name ) == 0 )
275 ui.scroll.current = ui.scroll.count;
276 } else {
277 if ( item->flags & DYNUI_DEFAULT )
278 ui.scroll.current = ui.scroll.count;
279 }
280 }
281 ui.scroll.count++;
282 }
283 if ( ! named_count ) {
284 /* Menus with no named items cannot be selected from,
285 * and will seriously confuse the navigation logic.
286 * Refuse to display any such menus.
287 */
288 return -ENOENT;
289 }
290
291 /* Initialise screen */
292 initscr();
293 start_color();
295 curs_set ( 0 );
296 erase();
297
298 /* Draw initial content */
299 attron ( A_BOLD );
300 snprintf ( buf, sizeof ( buf ), "%s", ui.dynui->title );
301 mvprintw ( TITLE_ROW, ( ( COLS - strlen ( buf ) ) / 2 ), "%s", buf );
302 attroff ( A_BOLD );
303 jump_scroll ( &ui.scroll );
304 draw_menu_items ( &ui );
305 draw_menu_item ( &ui, ui.scroll.current );
306
307 /* Enter main loop */
308 rc = menu_loop ( &ui, selected );
309 assert ( *selected );
310
311 /* Clear screen */
312 endwin();
313
314 return rc;
315}
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 508 of file form_ui.c.

508 {
509 struct form *form;
510 int rc;
511
512 /* Allocate and initialise structure */
513 form = alloc_form ( dynui );
514 if ( ! form ) {
515 rc = -ENOMEM;
516 goto err_alloc;
517 }
518
519 /* Parse setting names and load current values */
520 if ( ( rc = parse_names ( form ) ) != 0 )
521 goto err_parse_names;
522 load_values ( form );
523
524 /* Lay out form on screen */
525 if ( ( rc = layout_form ( form ) ) != 0 )
526 goto err_layout;
527
528 /* Draw initial form */
529 initscr();
530 start_color();
531 draw_form ( form );
532
533 /* Run main loop */
534 if ( ( rc = form_loop ( form ) ) != 0 )
535 goto err_loop;
536
537 err_loop:
539 endwin();
540 err_layout:
541 err_parse_names:
542 free_form ( form );
543 err_alloc:
544 return rc;
545}
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().