@ -47,6 +47,8 @@ struct menu {
char * title ;
int prompt ;
void ( * item_data_print ) ( void * ) ;
char * ( * item_choice ) ( void * ) ;
void * item_choice_data ;
struct list_head items ;
} ;
@ -204,18 +206,26 @@ static inline int menu_interactive_choice(struct menu *m, void **choice)
menu_display ( m ) ;
readret = readline_into_buffer ( " Enter choice: " , cbuf ,
m - > timeout / 10 ) ;
if ( ! m - > item_choice ) {
readret = readline_into_buffer ( " Enter choice: " , cbuf ,
m - > timeout / 10 ) ;
if ( readret > = 0 ) {
choice_item = menu_item_by_key ( m , cbuf ) ;
if ( ! choice_item ) {
printf ( " %s not found \n " , cbuf ) ;
m - > timeout = 0 ;
if ( readret > = 0 ) {
choice_item = menu_item_by_key ( m , cbuf ) ;
if ( ! choice_item )
printf ( " %s not found \n " , cbuf ) ;
} else {
return menu_default_choice ( m , choice ) ;
}
} else
return menu_default_choice ( m , choice ) ;
} else {
char * key = m - > item_choice ( m - > item_choice_data ) ;
if ( key )
choice_item = menu_item_by_key ( m , key ) ;
}
if ( ! choice_item )
m - > timeout = 0 ;
}
* choice = choice_item - > data ;
@ -348,11 +358,19 @@ int menu_item_add(struct menu *m, char *item_key, void *item_data)
* what must be entered to select an item , the item_data_print function should
* make it obvious what the key for each entry is .
*
* item_choice - If not NULL , will be called when asking the user to choose an
* item . Returns a key string corresponding to the choosen item or NULL if
* no item has been selected .
*
* item_choice_data - Will be passed as the argument to the item_choice function
*
* Returns a pointer to the menu if successful , or NULL if there is
* insufficient memory available to create the menu .
*/
struct menu * menu_create ( char * title , int timeout , int prompt ,
void ( * item_data_print ) ( void * ) )
void ( * item_data_print ) ( void * ) ,
char * ( * item_choice ) ( void * ) ,
void * item_choice_data )
{
struct menu * m ;
@ -365,6 +383,8 @@ struct menu *menu_create(char *title, int timeout, int prompt,
m - > prompt = prompt ;
m - > timeout = timeout ;
m - > item_data_print = item_data_print ;
m - > item_choice = item_choice ;
m - > item_choice_data = item_choice_data ;
if ( title ) {
m - > title = strdup ( title ) ;