From patchwork Sun May 27 16:38:48 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: 161556 X-Patchwork-Delegate: marek.vasut@gmail.com 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 9A668B6F9A for ; Mon, 28 May 2012 02:39:47 +1000 (EST) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 2FF5D281D5; Sun, 27 May 2012 18:39:42 +0200 (CEST) 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 GwLR5CLuQ1MC; Sun, 27 May 2012 18:39:41 +0200 (CEST) Received: from theia.denx.de (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 3947E281BA; Sun, 27 May 2012 18:39:34 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 368D1281C1 for ; Sun, 27 May 2012 18:39:31 +0200 (CEST) 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 a1UeyE8LbE7S for ; Sun, 27 May 2012 18:39:30 +0200 (CEST) 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-we0-f172.google.com (mail-we0-f172.google.com [74.125.82.172]) by theia.denx.de (Postfix) with ESMTPS id 4B80D281B9 for ; Sun, 27 May 2012 18:39:29 +0200 (CEST) Received: by werb13 with SMTP id b13so1600821wer.3 for ; Sun, 27 May 2012 09:39:29 -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=j+HXc70a3Dc92Jt4VyZYOWmG3XL/6PdA2jIgIZsEMzk=; b=rUJSZ4ePLVgQ8kS4Q90mPLdqrAMxoR4DcMlPZsUTCdTldSY7KJpSosZJLwkx02W0Ht yyBq28+LBiVEPksjNGagSmeT0MfISF3fb6YSxkegWsjzarkrGagKhklNZRfmWvxDzDBp /werlQEo+DszpqbjMWLbvvi+ZWoMMgtpfQeaG03dSweKNzrvK+6MEyIm9mw8pw6RBBwF ajqIMxxRObVbYO/wW5+T/v5hLLKy5YB83Bsyb/eGz/pgoV5xd4Qo+DwUpjL2Hwhp6nSj qNdwvFU9UwqDVQ7NZ9gryJEhnJLa2AOaKgEw91F/L6M0TQy0t+roqwpQs1ZjIX5dZxhu BfZw== Received: by 10.216.226.147 with SMTP id b19mr2915306weq.210.1338136768946; Sun, 27 May 2012 09:39:28 -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 m20sm5653806wie.6.2012.05.27.09.39.28 (version=TLSv1/SSLv3 cipher=OTHER); Sun, 27 May 2012 09:39:28 -0700 (PDT) From: =?UTF-8?q?Pali=20Roh=C3=A1r?= To: u-boot@lists.denx.de Date: Sun, 27 May 2012 18:38:48 +0200 Message-Id: <1338136729-3907-2-git-send-email-pali.rohar@gmail.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1338136729-3907-1-git-send-email-pali.rohar@gmail.com> References: <1338136729-3907-1-git-send-email-pali.rohar@gmail.com> MIME-Version: 1.0 Cc: =?UTF-8?q?Pali=20Roh=C3=A1r?= Subject: [U-Boot] [PATCH 1/2] 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 --- 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 b3c1f67..346e275 100644 --- a/common/cmd_pxe.c +++ b/common/cmd_pxe.c @@ -1198,7 +1198,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 aa16c9a..470eb9f 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); } @@ -230,20 +232,27 @@ static inline int menu_interactive_choice(struct menu *m, void **choice) menu_display(m); - readret = readline_into_buffer("Enter choice: ", cbuf, - m->timeout); - - if (readret >= 0) { - choice_item = menu_item_by_key(m, cbuf); - - if (!choice_item) { - printf("%s not found\n", cbuf); - m->timeout = 0; + if (!m->item_data_choice) { + readret = readline_into_buffer("Enter choice: ", cbuf, + m->timeout); + + if (readret >= 0) { + choice_item = menu_item_by_key(m, cbuf); + if (!choice_item) + printf("%s not found\n", cbuf); + } else { + puts("^C\n"); + return -EINTR; } } else { - puts("^C\n"); - return -EINTR; + char *key = m->item_data_choice(m->data); + if (!key) + return -EINTR; + choice_item = menu_item_by_key(m, key); } + + if (!choice_item) + m->timeout = 0; } *choice = choice_item->data; @@ -380,7 +389,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; @@ -393,6 +404,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);