blob: fa5d7e5b93fd957b219163e04f161211ea1dfbc6 [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>
Jonathan Gordon5599d682007-02-14 06:58:30 +000024#include "icon.h"
25#include "icons.h"
26
Daniel Stenberg91f743f2002-06-14 10:39:11 +000027
Linus Nielsen Feltzing77936e62004-03-16 13:44:56 +000028struct menu_item {
Jörg Hohensohnb1403ee2004-07-23 23:01:20 +000029 unsigned char *desc; /* string or ID */
Björn Stenbergb1b8bd42002-09-24 17:22:12 +000030 bool (*function) (void); /* return true if USB was connected */
Daniel Stenberg1c0c8612002-05-17 12:22:24 +000031};
32
Jonathan Gordon4718a1e2007-02-08 04:33:41 +000033int menu_init(const struct menu_item* mitems, int count,
34 int (*callback)(int, int),
35 const char *button1, const char *button2, const char *button3);
Björn Stenberg2ac05722002-05-26 17:03:17 +000036void menu_exit(int menu);
Daniel Stenberg1c0c8612002-05-17 12:22:24 +000037
Daniel Stenberg91f743f2002-06-14 10:39:11 +000038void put_cursorxy(int x, int y, bool on);
39
Kjell Ericson5cd393c2003-01-29 08:26:11 +000040 /* Returns below define, or number of selected menu item*/
41int menu_show(int m);
42#define MENU_ATTACHED_USB -1
43#define MENU_SELECTED_EXIT -2
Jonathan Gordon4718a1e2007-02-08 04:33:41 +000044#define MENU_EXIT_ALL -3
45#define MENU_RETURN_TO_WPS -4
Kjell Ericson5cd393c2003-01-29 08:26:11 +000046
Björn Stenbergb1b8bd42002-09-24 17:22:12 +000047bool menu_run(int menu);
Linus Nielsen Feltzing10b92c42004-03-12 10:20:33 +000048int menu_cursor(int menu);
49char* menu_description(int menu, int position);
50void menu_delete(int menu, int position);
51int menu_count(int menu);
52bool menu_moveup(int menu);
53bool menu_movedown(int menu);
54void menu_draw(int menu);
Jörg Hohensohnb1403ee2004-07-23 23:01:20 +000055void menu_insert(int menu, int position, char *desc, bool (*function) (void));
Jens Arnoldcef15c62005-04-10 17:36:55 +000056void menu_set_cursor(int menu, int position);
Kevin Ferrarec43822d2005-11-03 11:56:21 +000057void menu_talk_selected(int m);
Daniel Stenbergb2850762002-08-23 12:32:52 +000058
Jonathan Gordon4718a1e2007-02-08 04:33:41 +000059
60enum menu_item_type {
61 MT_MENU = 0,
62 MT_SETTING,
Jonathan Gordon97090862007-03-03 14:23:03 +000063 MT_SETTING_W_TEXT, /* same as setting, but uses different
64 text for the setting title,
65 ID2P() or "literal" for the str param */
Jonathan Gordon4718a1e2007-02-08 04:33:41 +000066 MT_FUNCTION_CALL, /* used when the standard code wont work */
67 MT_FUNCTION_WITH_PARAM,
68 MT_RETURN_ID, /* returns the position of the selected item (starting at 0)*/
Jonathan Gordon91cb68a2007-03-01 11:14:46 +000069 MT_RETURN_VALUE, /* returns a value associated with an item */
Jonathan Gordon4718a1e2007-02-08 04:33:41 +000070};
71
72typedef int (*menu_function)(void);
73struct menu_func_with_param {
74 int (*function)(void* param);
75 void *param;
76};
77
78#define MENU_TYPE_MASK 0xF /* MT_* type */
Jonathan Gordon2801a872007-02-19 02:14:51 +000079/* these next two are mutually exclusive */
Jonathan Gordon4718a1e2007-02-08 04:33:41 +000080#define MENU_HAS_DESC 0x10
Jonathan Gordon2801a872007-02-19 02:14:51 +000081#define MENU_DYNAMIC_DESC 0x20
82/* unless we need more flags*/
83#define MENU_COUNT_MASK (~(MENU_TYPE_MASK|MENU_HAS_DESC|MENU_DYNAMIC_DESC))
84#define MENU_COUNT_SHIFT 6
Jonathan Gordon4718a1e2007-02-08 04:33:41 +000085
86struct menu_item_ex {
87 int flags; /* above defines */
88 union {
89 const struct menu_item_ex **submenus; /* used with MT_MENU */
90 void *variable; /* used with MT_SETTING,
91 must be in the settings_list.c list */
92 int (*function)(void); /* used with MT_FUNCTION_CALL */
93 const struct menu_func_with_param
94 *func_with_param; /* MT_FUNCTION_WITH_PARAM */
95 const char **strings; /* used with MT_RETURN_ID */
Jonathan Gordon91cb68a2007-03-01 11:14:46 +000096 int value; /* MT_RETURN_VALUE */
Jonathan Gordon4718a1e2007-02-08 04:33:41 +000097 };
98 union {
Jonathan Gordon8ca99d32007-02-27 11:09:09 +000099 /* For settings */
Jonathan Gordon4718a1e2007-02-08 04:33:41 +0000100 int (*menu_callback)(int action, const struct menu_item_ex *this_item);
Jonathan Gordon8ca99d32007-02-27 11:09:09 +0000101 /* For everything else, except if the text is dynamic */
Jonathan Gordon4718a1e2007-02-08 04:33:41 +0000102 const struct menu_callback_with_desc {
103 int (*menu_callback)(int action,
104 const struct menu_item_ex *this_item);
105 unsigned char *desc; /* string or ID */
Jonathan Gordon02a87172007-03-03 13:52:14 +0000106 int icon_id; /* from icons_6x8 in icons.h */
Jonathan Gordon4718a1e2007-02-08 04:33:41 +0000107 } *callback_and_desc;
Jonathan Gordon8ca99d32007-02-27 11:09:09 +0000108 /* For when the item text is dynamic */
109 const struct menu_get_name_and_icon {
110 int (*menu_callback)(int action,
Jonathan Gordon2801a872007-02-19 02:14:51 +0000111 const struct menu_item_ex *this_item);
Jonathan Gordon8ca99d32007-02-27 11:09:09 +0000112 char *(*list_get_name)(int selected_item, void * data, char *buffer);
113 void *list_get_name_data;
Jonathan Gordon02a87172007-03-03 13:52:14 +0000114 int icon_id;
Jonathan Gordon8ca99d32007-02-27 11:09:09 +0000115 } *menu_get_name_and_icon;
Jonathan Gordon4718a1e2007-02-08 04:33:41 +0000116 };
117};
118
119typedef int (*menu_callback_type)(int action,
120 const struct menu_item_ex *this_item);
Jonathan Gordon91cb68a2007-03-01 11:14:46 +0000121int do_menu(const struct menu_item_ex *menu, int *start_selected);
Jonathan Gordon2801a872007-02-19 02:14:51 +0000122bool do_setting_from_menu(const struct menu_item_ex *temp);
Jonathan Gordon4718a1e2007-02-08 04:33:41 +0000123
124#define MENU_ITEM_COUNT(c) (c<<MENU_COUNT_SHIFT)
Jonathan Gordon37d246a2007-02-11 10:31:50 +0000125/* In all the following macros the argument names are as follows:
126 - name: The name for the variable (so it can be used in a MAKE_MENU()
127 - str: the string to display for this menu item. use ID2P() for LANG_* id's
128 - callback: The callback function to call for this menu item.
129*/
Jonathan Gordon4718a1e2007-02-08 04:33:41 +0000130
Jonathan Gordon37d246a2007-02-11 10:31:50 +0000131/* Use this to put a setting into a menu.
132 The setting must appear in settings_list.c.
133 If the setting is not configured properly, the menu will display "Not Done yet!"
134 When the user selects this item the setting select screen will load,
135 when that screen exits the user wll be back in the menu */
Jonathan Gordon4718a1e2007-02-08 04:33:41 +0000136#define MENUITEM_SETTING(name,var,callback) \
137 static const struct menu_item_ex name = \
138 {MT_SETTING, {.variable = (void*)var},{callback}};
139
Jonathan Gordon97090862007-03-03 14:23:03 +0000140/* Use this for settings which have a differnt title in their
141 setting screen than in the menu (e.g scroll options */
142#define MENUITEM_SETTING_W_TEXT(name, var, str, callback ) \
143 static const struct menu_callback_with_desc name##__ = {callback,str, Icon_NOICON};\
144 static const struct menu_item_ex name = \
145 {MT_SETTING_W_TEXT|MENU_HAS_DESC, {.variable = (void*)var }, \
146 {.callback_and_desc = & name##__}};
147
Jonathan Gordon37d246a2007-02-11 10:31:50 +0000148/* Use this To create a list of NON-XLATABLE (for the time being) Strings
149 When the user enters this list and selects one, the menu will exits
150 and its return value will be the index of the chosen item */
151#define MENUITEM_STRINGLIST(name, str, callback, ... ) \
Jonathan Gordon4718a1e2007-02-08 04:33:41 +0000152 static const char *name##_[] = {__VA_ARGS__}; \
Jonathan Gordon02a87172007-03-03 13:52:14 +0000153 static const struct menu_callback_with_desc name##__ = {callback,str, Icon_NOICON};\
Jonathan Gordon4718a1e2007-02-08 04:33:41 +0000154 static const struct menu_item_ex name = \
155 {MT_RETURN_ID|MENU_HAS_DESC| \
156 MENU_ITEM_COUNT(sizeof( name##_)/sizeof(*name##_)), \
157 { .submenus = name##_},{.callback_and_desc = & name##__}};
Jonathan Gordon5599d682007-02-14 06:58:30 +0000158
Jonathan Gordon37d246a2007-02-11 10:31:50 +0000159
Jonathan Gordon91cb68a2007-03-01 11:14:46 +0000160/* returns a value associated with the item */
161#define MENUITEM_RETURNVALUE(name, str, val, cb, icon) \
162 static const struct menu_callback_with_desc name##_ = {cb,str,icon}; \
163 static const struct menu_item_ex name = \
164 { MT_RETURN_VALUE|MENU_HAS_DESC, { .value = val}, \
165 {.callback_and_desc = & name##_}};
166
167/* same as above, except the item name is dynamic */
168#define MENUITEM_RETURNVALUE_DYNTEXT(name, val, cb, text_callback, text_cb_data, icon) \
169 static const struct menu_get_name_and_icon name##_ \
170 = {cb,text_callback,text_cb_data,icon}; \
171 static const struct menu_item_ex name = \
172 { MT_RETURN_VALUE|MENU_DYNAMIC_DESC, { .value = val}, \
173 {.menu_get_name_and_icon = & name##_}};
174
Jonathan Gordon37d246a2007-02-11 10:31:50 +0000175/* Use this to put a function call into the menu.
176 When the user selects this item the function will be run,
177 when it exits the user will be back in the menu. return value is ignored */
Jonathan Gordon5599d682007-02-14 06:58:30 +0000178#define MENUITEM_FUNCTION(name, str, func, callback, icon) \
179 static const struct menu_callback_with_desc name##_ = {callback,str,icon}; \
Jonathan Gordon91cb68a2007-03-01 11:14:46 +0000180 static const struct menu_item_ex name = \
Jonathan Gordon4718a1e2007-02-08 04:33:41 +0000181 { MT_FUNCTION_CALL|MENU_HAS_DESC, { .function = func}, \
182 {.callback_and_desc = & name##_}};
183
Jonathan Gordon91cb68a2007-03-01 11:14:46 +0000184/* This one should be static'ed also,
185 but cannot be done untill recording menu is done */
Jonathan Gordon37d246a2007-02-11 10:31:50 +0000186/* Same as above, except the function will be called with a (void*)param. */
Jonathan Gordon5599d682007-02-14 06:58:30 +0000187#define MENUITEM_FUNCTION_WPARAM(name, str, func, param, callback, icon) \
188 static const struct menu_callback_with_desc name##_ = {callback,str,icon}; \
Jonathan Gordon4718a1e2007-02-08 04:33:41 +0000189 static const struct menu_func_with_param name##__ = {func, param}; \
Jonathan Gordon91cb68a2007-03-01 11:14:46 +0000190 const struct menu_item_ex name = \
Jonathan Gordon4718a1e2007-02-08 04:33:41 +0000191 { MT_FUNCTION_WITH_PARAM|MENU_HAS_DESC, \
192 { .func_with_param = &name##__}, \
193 {.callback_and_desc = & name##_}};
Jonathan Gordon8ca99d32007-02-27 11:09:09 +0000194
Jonathan Gordon2801a872007-02-19 02:14:51 +0000195/* As above, except the text is dynamic */
196#define MENUITEM_FUNCTION_WPARAM_DYNTEXT(name, func, param, callback, \
Jonathan Gordon8ca99d32007-02-27 11:09:09 +0000197 text_callback, text_cb_data, icon) \
198 static const struct menu_get_name_and_icon name##_ \
199 = {callback,text_callback,text_cb_data,icon};\
Jonathan Gordon2801a872007-02-19 02:14:51 +0000200 static const struct menu_func_with_param name##__ = {func, param}; \
201 static const struct menu_item_ex name = \
202 { MT_FUNCTION_WITH_PARAM|MENU_DYNAMIC_DESC, \
203 { .func_with_param = &name##__}, \
204 {.menu_get_name_and_icon = & name##_}};
Jonathan Gordon4718a1e2007-02-08 04:33:41 +0000205
Jonathan Gordon37d246a2007-02-11 10:31:50 +0000206/* Use this to actually create a menu. the ... argument is a list of pointers
207 to any of the above macro'd variables. (It can also have other menus in the list. */
Jonathan Gordon5599d682007-02-14 06:58:30 +0000208#define MAKE_MENU( name, str, callback, icon, ... ) \
Jonathan Gordon37d246a2007-02-11 10:31:50 +0000209 static const struct menu_item_ex *name##_[] = {__VA_ARGS__}; \
Jonathan Gordon5599d682007-02-14 06:58:30 +0000210 static const struct menu_callback_with_desc name##__ = {callback,str,icon};\
Jonathan Gordon37d246a2007-02-11 10:31:50 +0000211 const struct menu_item_ex name = \
212 {MT_MENU|MENU_HAS_DESC| \
213 MENU_ITEM_COUNT(sizeof( name##_)/sizeof(*name##_)), \
214 { (void*)name##_},{.callback_and_desc = & name##__}};
Jonathan Gordon91cb68a2007-03-01 11:14:46 +0000215
Jonathan Gordon5599d682007-02-14 06:58:30 +0000216
Jonathan Gordon02a87172007-03-03 13:52:14 +0000217
Daniel Stenberg1c0c8612002-05-17 12:22:24 +0000218#endif /* End __MENU_H__ */