From patchwork Thu Nov 1 11:39:10 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Pali_Roh=C3=A1r?= X-Patchwork-Id: 196169 X-Patchwork-Delegate: agust@denx.de Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from theia.denx.de (theia.denx.de [85.214.87.163]) by ozlabs.org (Postfix) with ESMTP id CF1772C0312 for ; Thu, 1 Nov 2012 22:39:54 +1100 (EST) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 0788D4A56A; Thu, 1 Nov 2012 12:39:46 +0100 (CET) X-Virus-Scanned: Debian amavisd-new at theia.denx.de Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id oo4Y5tvXfZeH; Thu, 1 Nov 2012 12:39:45 +0100 (CET) Received: from theia.denx.de (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 76DC44A56C; Thu, 1 Nov 2012 12:39:35 +0100 (CET) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id ED39E4A566 for ; Thu, 1 Nov 2012 12:39:32 +0100 (CET) X-Virus-Scanned: Debian amavisd-new at theia.denx.de Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id NzvDNNYmJ1J1 for ; Thu, 1 Nov 2012 12:39:31 +0100 (CET) X-policyd-weight: NOT_IN_SBL_XBL_SPAMHAUS=-1.5 NOT_IN_SPAMCOP=-1.5 NOT_IN_BL_NJABL=-1.5 (only DNSBL check requested) Received: from mail-ee0-f44.google.com (mail-ee0-f44.google.com [74.125.83.44]) by theia.denx.de (Postfix) with ESMTPS id 3CB194A562 for ; Thu, 1 Nov 2012 12:39:29 +0100 (CET) Received: by mail-ee0-f44.google.com with SMTP id d4so1397687eek.3 for ; Thu, 01 Nov 2012 04:39:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:x-mailer:in-reply-to:references :mime-version:content-type:content-transfer-encoding; bh=w4wMjy32A7lekw77PF5Fiy2gmV2SGlnFeiuuGWSCQnU=; b=eJ1bpE9Eszvm1vk4/mgKnJtchR+BRJwM3GVzYehdDnP3mKM7rtQbtA4GRvJprNDEqg 9vht1RcNxceFi/RD4OEck7mwTfetPk6kLcsoFOKo1bFsCJuL1jRBWOGa8+K0zFomO21f Bxpg40n7vo+jShJjzchyNfwMQ2ANMotabnEE4Pbx9Q6B+zbxNbW0mOriufA49IYh3e6A jFJKB1Xlt+N0euIk/ZN36hDqmeoqfpHWHHFUYFhFLKAnRxY6fuWynQcAj0Xjg7C3Dva6 7pcUctFhlx3w8qCG2qTP+mNIUSwfv/lXlX6hDdrU/bcZjcFHm2dff9fIj6tEFyZmFFRS x2jw== Received: by 10.14.223.4 with SMTP id u4mr95812028eep.19.1351769967664; Thu, 01 Nov 2012 04:39:27 -0700 (PDT) Received: from Pali-EliteBook.kolej.mff.cuni.cz (pali.kolej.mff.cuni.cz. [78.128.193.202]) by mx.google.com with ESMTPS id d44sm13984543eeo.10.2012.11.01.04.39.26 (version=TLSv1/SSLv3 cipher=OTHER); Thu, 01 Nov 2012 04:39:27 -0700 (PDT) From: =?UTF-8?q?Pali=20Roh=C3=A1r?= To: u-boot@lists.denx.de Date: Thu, 1 Nov 2012 12:39:10 +0100 Message-Id: <1351769953-13560-2-git-send-email-pali.rohar@gmail.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1351769953-13560-1-git-send-email-pali.rohar@gmail.com> References: <1338136729-3907-1-git-send-email-pali.rohar@gmail.com> <1351769953-13560-1-git-send-email-pali.rohar@gmail.com> MIME-Version: 1.0 Cc: =?UTF-8?q?Pali=20Roh=C3=A1r?= Subject: [U-Boot] [PATCH v2 1/4] menu: Added support to use user defined functions X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.11 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: u-boot-bounces@lists.denx.de Errors-To: u-boot-bounces@lists.denx.de * In menu_interactive_choice can be used user specified function item_data_choice (instead hardcoded function which read input from standard input) * Added option to specify user data for menu * menu_display_statusline will pass pointer to user data (instead pointer to menu) * This patch is needed for creating ANSI bootmenu Signed-off-by: Pali Rohár --- Changes in v2: - Rebased on next board/ait/cam_enc_4xx/cam_enc_4xx.c | 5 ++-- common/cmd_pxe.c | 3 ++- common/menu.c | 43 +++++++++++++++++++++++------------ include/menu.h | 6 +++-- 4 files changed, 37 insertions(+), 20 deletions(-) diff --git a/board/ait/cam_enc_4xx/cam_enc_4xx.c b/board/ait/cam_enc_4xx/cam_enc_4xx.c index 32b28f9..5078b01 100644 --- a/board/ait/cam_enc_4xx/cam_enc_4xx.c +++ b/board/ait/cam_enc_4xx/cam_enc_4xx.c @@ -561,7 +561,8 @@ static char *menu_handle(struct menu_display *display) char *s; char temp[6][200]; - m = menu_create(display->title, display->timeout, 1, ait_menu_print); + m = menu_create(display->title, display->timeout, 1, ait_menu_print, + NULL, NULL); for (i = 0; display->menulist[i]; i++) { sprintf(key, "%d", i + 1); @@ -1097,7 +1098,7 @@ int menu_show(int bootdelay) return MENU_EXIT; } -void menu_display_statusline(struct menu *m) +void menu_display_statusline(void *data) { char *s1, *s2; diff --git a/common/cmd_pxe.c b/common/cmd_pxe.c index ee75db9..2dbd49c 100644 --- a/common/cmd_pxe.c +++ b/common/cmd_pxe.c @@ -1280,7 +1280,8 @@ static struct menu *pxe_menu_to_menu(struct pxe_menu *cfg) /* * Create a menu and add items for all the labels. */ - m = menu_create(cfg->title, cfg->timeout, cfg->prompt, label_print); + m = menu_create(cfg->title, cfg->timeout, cfg->prompt, label_print, + NULL, NULL); if (!m) return NULL; diff --git a/common/menu.c b/common/menu.c index 6b2a2db..8b27c10 100644 --- a/common/menu.c +++ b/common/menu.c @@ -47,6 +47,8 @@ struct menu { char *title; int prompt; void (*item_data_print)(void *); + char *(*item_data_choice)(void *); + void *data; struct list_head items; }; @@ -113,11 +115,11 @@ static inline void *menu_item_destroy(struct menu *m, return NULL; } -void __menu_display_statusline(struct menu *m) +void __menu_display_statusline(void *menu_data) { return; } -void menu_display_statusline(struct menu *m) +void menu_display_statusline(void *menu_data) __attribute__ ((weak, alias("__menu_display_statusline"))); /* @@ -130,7 +132,7 @@ static inline void menu_display(struct menu *m) puts(m->title); putc('\n'); } - menu_display_statusline(m); + menu_display_statusline(m->data); menu_items_iter(m, menu_item_print, NULL); } @@ -204,18 +206,25 @@ 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 (readret >= 0) { - choice_item = menu_item_by_key(m, cbuf); + if (!m->item_data_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); + } else + return menu_default_choice(m, choice); + } else { + char *key = m->item_data_choice(m->data); + if (!key) + return menu_default_choice(m, choice); + choice_item = menu_item_by_key(m, key); + } - if (!choice_item) { - printf("%s not found\n", cbuf); - m->timeout = 0; - } - } else - return menu_default_choice(m, choice); + if (!choice_item) + m->timeout = 0; } *choice = choice_item->data; @@ -352,7 +361,9 @@ int menu_item_add(struct menu *m, char *item_key, void *item_data) * 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_data_choice)(void *), + void *menu_data) { struct menu *m; @@ -365,6 +376,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_data_choice = item_data_choice; + m->data = menu_data; if (title) { m->title = strdup(title); diff --git a/include/menu.h b/include/menu.h index 7af5fdb..00e8975 100644 --- a/include/menu.h +++ b/include/menu.h @@ -21,12 +21,14 @@ struct menu; struct menu *menu_create(char *title, int timeout, int prompt, - void (*item_data_print)(void *)); + void (*item_data_print)(void *), + char *(*item_data_choice)(void *), + void *menu_data); int menu_default_set(struct menu *m, char *item_key); int menu_get_choice(struct menu *m, void **choice); int menu_item_add(struct menu *m, char *item_key, void *item_data); int menu_destroy(struct menu *m); -void menu_display_statusline(struct menu *m); +void menu_display_statusline(void *menu_data); #if defined(CONFIG_MENU_SHOW) int menu_show(int bootdelay);