blob: a192df3073f51260dabbe9b6474925804fd2d043 [file] [log] [blame]
Daniel Stenberg1c0c8612002-05-17 12:22:24 +00001/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2002 Robert E. Hak
11 *
12 * All files in this archive are subject to the GNU General Public License.
13 * See the file COPYING in the source tree root for full license agreement.
14 *
15 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
16 * KIND, either express or implied.
17 *
18 ****************************************************************************/
19
20#ifndef __MENU_H__
21#define __MENU_H__
22
Daniel Stenberg91f743f2002-06-14 10:39:11 +000023#include <stdbool.h>
24
Linus Nielsen Feltzing77936e62004-03-16 13:44:56 +000025struct menu_item {
Jörg Hohensohnb1403ee2004-07-23 23:01:20 +000026 unsigned char *desc; /* string or ID */
Björn Stenbergb1b8bd42002-09-24 17:22:12 +000027 bool (*function) (void); /* return true if USB was connected */
Daniel Stenberg1c0c8612002-05-17 12:22:24 +000028};
29
Jonathan Gordon4718a1e2007-02-08 04:33:41 +000030int menu_init(const struct menu_item* mitems, int count,
31 int (*callback)(int, int),
32 const char *button1, const char *button2, const char *button3);
Björn Stenberg2ac05722002-05-26 17:03:17 +000033void menu_exit(int menu);
Daniel Stenberg1c0c8612002-05-17 12:22:24 +000034
Daniel Stenberg91f743f2002-06-14 10:39:11 +000035void put_cursorxy(int x, int y, bool on);
36
Kjell Ericson5cd393c2003-01-29 08:26:11 +000037 /* Returns below define, or number of selected menu item*/
38int menu_show(int m);
39#define MENU_ATTACHED_USB -1
40#define MENU_SELECTED_EXIT -2
Jonathan Gordon4718a1e2007-02-08 04:33:41 +000041#define MENU_EXIT_ALL -3
42#define MENU_RETURN_TO_WPS -4
Kjell Ericson5cd393c2003-01-29 08:26:11 +000043
Björn Stenbergb1b8bd42002-09-24 17:22:12 +000044bool menu_run(int menu);
Linus Nielsen Feltzing10b92c42004-03-12 10:20:33 +000045int menu_cursor(int menu);
46char* menu_description(int menu, int position);
47void menu_delete(int menu, int position);
48int menu_count(int menu);
49bool menu_moveup(int menu);
50bool menu_movedown(int menu);
51void menu_draw(int menu);
Jörg Hohensohnb1403ee2004-07-23 23:01:20 +000052void menu_insert(int menu, int position, char *desc, bool (*function) (void));
Jens Arnoldcef15c62005-04-10 17:36:55 +000053void menu_set_cursor(int menu, int position);
Kevin Ferrarec43822d2005-11-03 11:56:21 +000054void menu_talk_selected(int m);
Daniel Stenbergb2850762002-08-23 12:32:52 +000055
Jonathan Gordon4718a1e2007-02-08 04:33:41 +000056
57enum menu_item_type {
58 MT_MENU = 0,
59 MT_SETTING,
60 MT_FUNCTION_CALL, /* used when the standard code wont work */
61 MT_FUNCTION_WITH_PARAM,
62 MT_RETURN_ID, /* returns the position of the selected item (starting at 0)*/
63};
64
65typedef int (*menu_function)(void);
66struct menu_func_with_param {
67 int (*function)(void* param);
68 void *param;
69};
70
71#define MENU_TYPE_MASK 0xF /* MT_* type */
72#define MENU_HAS_DESC 0x10
73#define MENU_COUNT_MASK (~(MENU_TYPE_MASK|MENU_HAS_DESC)) /* unless we need more flags*/
74#define MENU_COUNT_SHIFT 5
75
76struct menu_item_ex {
77 int flags; /* above defines */
78 union {
79 const struct menu_item_ex **submenus; /* used with MT_MENU */
80 void *variable; /* used with MT_SETTING,
81 must be in the settings_list.c list */
82 int (*function)(void); /* used with MT_FUNCTION_CALL */
83 const struct menu_func_with_param
84 *func_with_param; /* MT_FUNCTION_WITH_PARAM */
85 const char **strings; /* used with MT_RETURN_ID */
86 };
87 union {
88 int (*menu_callback)(int action, const struct menu_item_ex *this_item);
89 const struct menu_callback_with_desc {
90 int (*menu_callback)(int action,
91 const struct menu_item_ex *this_item);
92 unsigned char *desc; /* string or ID */
93 } *callback_and_desc;
94 };
95};
96
97typedef int (*menu_callback_type)(int action,
98 const struct menu_item_ex *this_item);
99int do_menu(const struct menu_item_ex *menu);
100
101#define MENU_ITEM_COUNT(c) (c<<MENU_COUNT_SHIFT)
Jonathan Gordon37d246a2007-02-11 10:31:50 +0000102/* In all the following macros the argument names are as follows:
103 - name: The name for the variable (so it can be used in a MAKE_MENU()
104 - str: the string to display for this menu item. use ID2P() for LANG_* id's
105 - callback: The callback function to call for this menu item.
106*/
Jonathan Gordon4718a1e2007-02-08 04:33:41 +0000107
Jonathan Gordon37d246a2007-02-11 10:31:50 +0000108/* Use this to put a setting into a menu.
109 The setting must appear in settings_list.c.
110 If the setting is not configured properly, the menu will display "Not Done yet!"
111 When the user selects this item the setting select screen will load,
112 when that screen exits the user wll be back in the menu */
Jonathan Gordon4718a1e2007-02-08 04:33:41 +0000113#define MENUITEM_SETTING(name,var,callback) \
114 static const struct menu_item_ex name = \
115 {MT_SETTING, {.variable = (void*)var},{callback}};
116
Jonathan Gordon37d246a2007-02-11 10:31:50 +0000117/* Use this To create a list of NON-XLATABLE (for the time being) Strings
118 When the user enters this list and selects one, the menu will exits
119 and its return value will be the index of the chosen item */
120#define MENUITEM_STRINGLIST(name, str, callback, ... ) \
Jonathan Gordon4718a1e2007-02-08 04:33:41 +0000121 static const char *name##_[] = {__VA_ARGS__}; \
Jonathan Gordon37d246a2007-02-11 10:31:50 +0000122 static const struct menu_callback_with_desc name##__ = {callback,str}; \
Jonathan Gordon4718a1e2007-02-08 04:33:41 +0000123 static const struct menu_item_ex name = \
124 {MT_RETURN_ID|MENU_HAS_DESC| \
125 MENU_ITEM_COUNT(sizeof( name##_)/sizeof(*name##_)), \
126 { .submenus = name##_},{.callback_and_desc = & name##__}};
Jonathan Gordon37d246a2007-02-11 10:31:50 +0000127
Jonathan Gordon4718a1e2007-02-08 04:33:41 +0000128/* This one should be static'ed also,
Jonathan Gordon37d246a2007-02-11 10:31:50 +0000129 but cannot be done untill settings menu is done */
130/* Use this to put a function call into the menu.
131 When the user selects this item the function will be run,
132 when it exits the user will be back in the menu. return value is ignored */
133#define MENUITEM_FUNCTION(name, str, func, callback) \
134 static const struct menu_callback_with_desc name##_ = {callback,str}; \
Jonathan Gordon4718a1e2007-02-08 04:33:41 +0000135 const struct menu_item_ex name = \
136 { MT_FUNCTION_CALL|MENU_HAS_DESC, { .function = func}, \
137 {.callback_and_desc = & name##_}};
138
Jonathan Gordon37d246a2007-02-11 10:31:50 +0000139/* Same as above, except the function will be called with a (void*)param. */
Jonathan Gordon4718a1e2007-02-08 04:33:41 +0000140#define MENUITEM_FUNCTION_WPARAM(name, str, func, param, callback) \
141 static const struct menu_callback_with_desc name##_ = {callback,str}; \
142 static const struct menu_func_with_param name##__ = {func, param}; \
143 static const struct menu_item_ex name = \
144 { MT_FUNCTION_WITH_PARAM|MENU_HAS_DESC, \
145 { .func_with_param = &name##__}, \
146 {.callback_and_desc = & name##_}};
147
Jonathan Gordon37d246a2007-02-11 10:31:50 +0000148/* Use this to actually create a menu. the ... argument is a list of pointers
149 to any of the above macro'd variables. (It can also have other menus in the list. */
150#define MAKE_MENU( name, str, callback, ... ) \
151 static const struct menu_item_ex *name##_[] = {__VA_ARGS__}; \
152 static const struct menu_callback_with_desc name##__ = {callback,str}; \
153 const struct menu_item_ex name = \
154 {MT_MENU|MENU_HAS_DESC| \
155 MENU_ITEM_COUNT(sizeof( name##_)/sizeof(*name##_)), \
156 { (void*)name##_},{.callback_and_desc = & name##__}};
Daniel Stenberg1c0c8612002-05-17 12:22:24 +0000157#endif /* End __MENU_H__ */