blob: df5f7ced9fd0a6ce2d4a4a1da1540dd4d65dccb2 [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 *
Daniel Stenberg2acc0ac2008-06-28 18:10:04 +000012 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
Daniel Stenberg1c0c8612002-05-17 12:22:24 +000016 *
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
19 *
20 ****************************************************************************/
21
22#ifndef __MENU_H__
23#define __MENU_H__
24
Daniel Stenberg91f743f2002-06-14 10:39:11 +000025#include <stdbool.h>
Jonathan Gordon5599d682007-02-14 06:58:30 +000026#include "icon.h"
27#include "icons.h"
Jonathan Gordon91e726a2007-03-27 06:38:11 +000028#include "root_menu.h" /* needed for MENU_* return codes */
Jonathan Gordon101693f2011-11-15 13:22:02 +000029#include "settings_list.h"
Jonathan Gordon5599d682007-02-14 06:58:30 +000030
Daniel Stenberg91f743f2002-06-14 10:39:11 +000031
Jonathan Gordon4718a1e2007-02-08 04:33:41 +000032enum menu_item_type {
33 MT_MENU = 0,
34 MT_SETTING,
Jonathan Gordon97090862007-03-03 14:23:03 +000035 MT_SETTING_W_TEXT, /* same as setting, but uses different
36 text for the setting title,
37 ID2P() or "literal" for the str param */
Jonathan Gordondaf66942007-03-17 12:33:34 +000038 MT_FUNCTION_CALL, /* call a function from the menus */
Jonathan Gordon4718a1e2007-02-08 04:33:41 +000039 MT_RETURN_ID, /* returns the position of the selected item (starting at 0)*/
Jonathan Gordon91cb68a2007-03-01 11:14:46 +000040 MT_RETURN_VALUE, /* returns a value associated with an item */
Jonathan Gordon4718a1e2007-02-08 04:33:41 +000041};
Jonathan Gordon26ff6972007-05-01 11:01:53 +000042#define MENU_TYPE_MASK 0xF /* MT_* type */
Jonathan Gordon4718a1e2007-02-08 04:33:41 +000043
Jonathan Gordondaf66942007-03-17 12:33:34 +000044struct menu_func {
45 union {
46 int (*function_w_param)(void* param); /* intptr_t instead of void*
47 for 64bit systems */
48 int (*function)(void);
49 };
50 void *param; /* passed to function_w_param */
Jonathan Gordon4718a1e2007-02-08 04:33:41 +000051};
52
Jonathan Gordon2801a872007-02-19 02:14:51 +000053/* these next two are mutually exclusive */
Jonathan Gordon4718a1e2007-02-08 04:33:41 +000054#define MENU_HAS_DESC 0x10
Jonathan Gordon26ff6972007-05-01 11:01:53 +000055#define MENU_DYNAMIC_DESC 0x20 /* the name of this menu item is set by the \
56 list_get_name callback */
57
58#define MENU_EXITAFTERTHISMENU 0x40 /* do_menu() will exiting out of any \
59 menu item with this flag set */
Jonathan Gordondaf66942007-03-17 12:33:34 +000060
61/* Flags for MT_FUNCTION_CALL */
Jonathan Gordon3a7760c2007-04-30 13:41:33 +000062#define MENU_FUNC_USEPARAM 0x80
63#define MENU_FUNC_CHECK_RETVAL 0x100
Jonathan Gordondaf66942007-03-17 12:33:34 +000064
65#define MENU_COUNT_MASK 0xFFF
Jonathan Gordon3a7760c2007-04-30 13:41:33 +000066#define MENU_COUNT_SHIFT 12
Jonathan Gordondaf66942007-03-17 12:33:34 +000067#define MENU_ITEM_COUNT(c) ((c&MENU_COUNT_MASK)<<MENU_COUNT_SHIFT)
Jonathan Gordonb5e587c2007-03-18 06:31:33 +000068#define MENU_GET_COUNT(flags) ((flags>>MENU_COUNT_SHIFT)&MENU_COUNT_MASK)
Jonathan Gordon4718a1e2007-02-08 04:33:41 +000069
70struct menu_item_ex {
Jonathan Gordondaf66942007-03-17 12:33:34 +000071 unsigned int flags; /* above defines */
Jonathan Gordon4718a1e2007-02-08 04:33:41 +000072 union {
73 const struct menu_item_ex **submenus; /* used with MT_MENU */
74 void *variable; /* used with MT_SETTING,
75 must be in the settings_list.c list */
Jonathan Gordondaf66942007-03-17 12:33:34 +000076 const struct menu_func *function; /* MT_FUNCTION_* */
Jonathan Gordon4718a1e2007-02-08 04:33:41 +000077 const char **strings; /* used with MT_RETURN_ID */
Jonathan Gordon91cb68a2007-03-01 11:14:46 +000078 int value; /* MT_RETURN_VALUE */
Jonathan Gordon4718a1e2007-02-08 04:33:41 +000079 };
80 union {
Jonathan Gordon8ca99d32007-02-27 11:09:09 +000081 /* For settings */
Jonathan Gordon4718a1e2007-02-08 04:33:41 +000082 int (*menu_callback)(int action, const struct menu_item_ex *this_item);
Jonathan Gordon8ca99d32007-02-27 11:09:09 +000083 /* For everything else, except if the text is dynamic */
Jonathan Gordon4718a1e2007-02-08 04:33:41 +000084 const struct menu_callback_with_desc {
85 int (*menu_callback)(int action,
86 const struct menu_item_ex *this_item);
87 unsigned char *desc; /* string or ID */
Jonathan Gordon02a87172007-03-03 13:52:14 +000088 int icon_id; /* from icons_6x8 in icons.h */
Jonathan Gordon4718a1e2007-02-08 04:33:41 +000089 } *callback_and_desc;
Jonathan Gordon8ca99d32007-02-27 11:09:09 +000090 /* For when the item text is dynamic */
91 const struct menu_get_name_and_icon {
92 int (*menu_callback)(int action,
Jonathan Gordon2801a872007-02-19 02:14:51 +000093 const struct menu_item_ex *this_item);
Jonathan Gordon8ca99d32007-02-27 11:09:09 +000094 char *(*list_get_name)(int selected_item, void * data, char *buffer);
Stéphane Doyon5acf0912007-10-09 03:48:56 +000095 int (*list_speak_item)(int selected_item, void * data);
Jonathan Gordon8ca99d32007-02-27 11:09:09 +000096 void *list_get_name_data;
Jonathan Gordon02a87172007-03-03 13:52:14 +000097 int icon_id;
Jonathan Gordon8ca99d32007-02-27 11:09:09 +000098 } *menu_get_name_and_icon;
Jonathan Gordon4718a1e2007-02-08 04:33:41 +000099 };
100};
101
102typedef int (*menu_callback_type)(int action,
103 const struct menu_item_ex *this_item);
Steve Bavinf14999e2009-03-10 07:27:13 +0000104void do_setting_from_menu(const struct menu_item_ex *temp,
Jonathan Gordonfe9dca32008-04-23 11:07:40 +0000105 struct viewport parent[NB_SCREENS]);
Jonathan Gordon101693f2011-11-15 13:22:02 +0000106void do_setting_screen(const struct settings_list *setting, const char * title,
107 struct viewport parent[NB_SCREENS]);
Jonathan Gordon4718a1e2007-02-08 04:33:41 +0000108
Jonathan Gordonb85817a2007-05-20 08:26:27 +0000109/*
110 int do_menu(const struct menu_item_ex *menu, int *start_selected)
111
112 Return value - usually one of the GO_TO_* values from root_menu.h,
113 however, some of the following defines can cause this to
114 return a different value.
115
116 *menu - The menu to run, can be a pointer to a MAKE_MENU() variable,
117 MENUITEM_STRINGLIST() or MENUITEM_RETURNVALUE() variable.
118
119 *start_selected - the item to select when the menu is first run.
120 When do_menu() returns, this will be set to the
121 index of the selected item at the time of the exit.
122 This is always set, even if the menu was cancelled.
123 If NULL it is ignored and the firs item starts selected
124*/
Jonathan Gordon5ca15392008-03-26 03:35:24 +0000125int do_menu(const struct menu_item_ex *menu, int *start_selected,
Thomas Martitz5629d552010-01-26 20:14:42 +0000126 struct viewport parent[NB_SCREENS], bool hide_theme);
Jonathan Gordonb85817a2007-05-20 08:26:27 +0000127
Jonathan Gordon37d246a2007-02-11 10:31:50 +0000128/* In all the following macros the argument names are as follows:
129 - name: The name for the variable (so it can be used in a MAKE_MENU()
130 - str: the string to display for this menu item. use ID2P() for LANG_* id's
131 - callback: The callback function to call for this menu item.
132*/
Jonathan Gordon4718a1e2007-02-08 04:33:41 +0000133
Jonathan Gordon37d246a2007-02-11 10:31:50 +0000134/* Use this to put a setting into a menu.
135 The setting must appear in settings_list.c.
136 If the setting is not configured properly, the menu will display "Not Done yet!"
137 When the user selects this item the setting select screen will load,
138 when that screen exits the user wll be back in the menu */
Jonathan Gordon4718a1e2007-02-08 04:33:41 +0000139#define MENUITEM_SETTING(name,var,callback) \
140 static const struct menu_item_ex name = \
141 {MT_SETTING, {.variable = (void*)var},{callback}};
142
Jonathan Gordon97090862007-03-03 14:23:03 +0000143/* Use this for settings which have a differnt title in their
144 setting screen than in the menu (e.g scroll options */
145#define MENUITEM_SETTING_W_TEXT(name, var, str, callback ) \
Jonathan Gordon26ff6972007-05-01 11:01:53 +0000146 static const struct menu_callback_with_desc name##__ = \
147 {callback,str, Icon_NOICON}; \
Jonathan Gordon97090862007-03-03 14:23:03 +0000148 static const struct menu_item_ex name = \
Jonathan Gordon26ff6972007-05-01 11:01:53 +0000149 {MT_SETTING_W_TEXT|MENU_HAS_DESC, {.variable = (void*)var }, \
Jonathan Gordon97090862007-03-03 14:23:03 +0000150 {.callback_and_desc = & name##__}};
151
Jonathan Gordon26ff6972007-05-01 11:01:53 +0000152/* Use this To create a list of Strings (or ID2P()'s )
Jonathan Gordonb85817a2007-05-20 08:26:27 +0000153 When the user enters this list and selects one, the menu will exit
154 and do_menu() will return value the index of the chosen item.
155 if the user cancels, GO_TO_PREVIOUS will be returned */
Jonathan Gordon37d246a2007-02-11 10:31:50 +0000156#define MENUITEM_STRINGLIST(name, str, callback, ... ) \
Jonathan Gordon4718a1e2007-02-08 04:33:41 +0000157 static const char *name##_[] = {__VA_ARGS__}; \
Jonathan Gordon26ff6972007-05-01 11:01:53 +0000158 static const struct menu_callback_with_desc name##__ = \
159 {callback,str, Icon_NOICON}; \
Jonathan Gordon4718a1e2007-02-08 04:33:41 +0000160 static const struct menu_item_ex name = \
161 {MT_RETURN_ID|MENU_HAS_DESC| \
162 MENU_ITEM_COUNT(sizeof( name##_)/sizeof(*name##_)), \
Jonathan Gordon1f5ee2a2007-03-25 14:31:56 +0000163 { .strings = name##_},{.callback_and_desc = & name##__}};
Jonathan Gordon5599d682007-02-14 06:58:30 +0000164
Jonathan Gordon37d246a2007-02-11 10:31:50 +0000165
Jonathan Gordonb85817a2007-05-20 08:26:27 +0000166/* causes do_menu() to return a value associated with the item */
Jonathan Gordon91cb68a2007-03-01 11:14:46 +0000167#define MENUITEM_RETURNVALUE(name, str, val, cb, icon) \
Jonathan Gordon26ff6972007-05-01 11:01:53 +0000168 static const struct menu_callback_with_desc name##_ = {cb,str,icon}; \
169 static const struct menu_item_ex name = \
170 { MT_RETURN_VALUE|MENU_HAS_DESC, { .value = val}, \
Jonathan Gordon91cb68a2007-03-01 11:14:46 +0000171 {.callback_and_desc = & name##_}};
172
173/* same as above, except the item name is dynamic */
Jonathan Gordon26ff6972007-05-01 11:01:53 +0000174#define MENUITEM_RETURNVALUE_DYNTEXT(name, val, cb, text_callback, \
Stéphane Doyon5acf0912007-10-09 03:48:56 +0000175 voice_callback, text_cb_data, icon) \
Jonathan Gordon26ff6972007-05-01 11:01:53 +0000176 static const struct menu_get_name_and_icon name##_ \
Stéphane Doyon5acf0912007-10-09 03:48:56 +0000177 = {cb,text_callback,voice_callback,text_cb_data,icon}; \
Jonathan Gordon91cb68a2007-03-01 11:14:46 +0000178 static const struct menu_item_ex name = \
179 { MT_RETURN_VALUE|MENU_DYNAMIC_DESC, { .value = val}, \
180 {.menu_get_name_and_icon = & name##_}};
181
Jonathan Gordon37d246a2007-02-11 10:31:50 +0000182/* Use this to put a function call into the menu.
183 When the user selects this item the function will be run,
Jonathan Gordon26ff6972007-05-01 11:01:53 +0000184 if MENU_FUNC_CHECK_RETVAL is set, the return value
185 will be checked, returning 1 will exit do_menu();
186 if MENU_FUNC_USEPARAM is set, param will be passed to the function */
187#define MENUITEM_FUNCTION(name, flags, str, func, param, \
188 callback, icon) \
Jonathan Gordon5599d682007-02-14 06:58:30 +0000189 static const struct menu_callback_with_desc name##_ = {callback,str,icon}; \
Jonathan Gordon26ff6972007-05-01 11:01:53 +0000190 static const struct menu_func name##__ = {{(void*)func}, param}; \
191 /* should be const, but recording_settings wont let us do that */ \
192 const struct menu_item_ex name = \
Jonathan Gordondaf66942007-03-17 12:33:34 +0000193 { MT_FUNCTION_CALL|MENU_HAS_DESC|flags, \
194 { .function = & name##__}, {.callback_and_desc = & name##_}};
Jonathan Gordon8ca99d32007-02-27 11:09:09 +0000195
Jonathan Gordon2801a872007-02-19 02:14:51 +0000196/* As above, except the text is dynamic */
Stéphane Doyon5acf0912007-10-09 03:48:56 +0000197#define MENUITEM_FUNCTION_DYNTEXT(name, flags, func, param, \
198 text_callback, voice_callback, \
199 text_cb_data, callback, icon) \
200 static const struct menu_get_name_and_icon name##_ \
201 = {callback,text_callback,voice_callback,text_cb_data,icon}; \
Jonathan Gordon26ff6972007-05-01 11:01:53 +0000202 static const struct menu_func name##__ = {{(void*)func}, param}; \
Thomas Martitza453bee2011-10-17 18:57:44 +0000203 const struct menu_item_ex name = \
Jonathan Gordondaf66942007-03-17 12:33:34 +0000204 { MT_FUNCTION_CALL|MENU_DYNAMIC_DESC|flags, \
205 { .function = & name##__}, {.menu_get_name_and_icon = & name##_}};
Jonathan Gordon4718a1e2007-02-08 04:33:41 +0000206
Jonathan Gordon37d246a2007-02-11 10:31:50 +0000207/* Use this to actually create a menu. the ... argument is a list of pointers
Jonathan Gordon26ff6972007-05-01 11:01:53 +0000208 to any of the above macro'd variables.
209 (It can also have other menus in the list.) */
210#define MAKE_MENU( name, str, callback, icon, ... ) \
211 static const struct menu_item_ex *name##_[] = {__VA_ARGS__}; \
Jonathan Gordon5599d682007-02-14 06:58:30 +0000212 static const struct menu_callback_with_desc name##__ = {callback,str,icon};\
Jonathan Gordon26ff6972007-05-01 11:01:53 +0000213 const struct menu_item_ex name = \
214 {MT_MENU|MENU_HAS_DESC| \
215 MENU_ITEM_COUNT(sizeof( name##_)/sizeof(*name##_)), \
Jonathan Gordon37d246a2007-02-11 10:31:50 +0000216 { (void*)name##_},{.callback_and_desc = & name##__}};
Jonathan Gordon91cb68a2007-03-01 11:14:46 +0000217
Jonathan Gordon5599d682007-02-14 06:58:30 +0000218
Daniel Stenberg1c0c8612002-05-17 12:22:24 +0000219#endif /* End __MENU_H__ */