blob: b0a1b4cb7fcdd6137ecef0d414060cba2777d280 [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)
102
103#define MENUITEM_SETTING(name,var,callback) \
104 static const struct menu_item_ex name = \
105 {MT_SETTING, {.variable = (void*)var},{callback}};
106
107#define MAKE_MENU( name, str, cb, ... ) \
108 static const struct menu_item_ex *name##_[] = {__VA_ARGS__}; \
109 static const struct menu_callback_with_desc name##__ = {cb,str}; \
110 const struct menu_item_ex name = \
111 {MT_MENU|MENU_HAS_DESC| \
112 MENU_ITEM_COUNT(sizeof( name##_)/sizeof(*name##_)), \
113 { (void*)name##_},{.callback_and_desc = & name##__}};
114
115#define MENUITEM_STRINGLIST(name, str, callback, ... ) \
116 static const char *name##_[] = {__VA_ARGS__}; \
117 static const struct menu_callback_with_desc name##__ = {cb,str}; \
118 static const struct menu_item_ex name = \
119 {MT_RETURN_ID|MENU_HAS_DESC| \
120 MENU_ITEM_COUNT(sizeof( name##_)/sizeof(*name##_)), \
121 { .submenus = name##_},{.callback_and_desc = & name##__}};
122/* This one should be static'ed also,
123 but cannot be done untill sound and playlist menus are done */
124#define MENUITEM_FUNCTION(name, str, func, cb) \
125 static const struct menu_callback_with_desc name##_ = {cb,str}; \
126 const struct menu_item_ex name = \
127 { MT_FUNCTION_CALL|MENU_HAS_DESC, { .function = func}, \
128 {.callback_and_desc = & name##_}};
129
130#define MENUITEM_FUNCTION_WPARAM(name, str, func, param, callback) \
131 static const struct menu_callback_with_desc name##_ = {callback,str}; \
132 static const struct menu_func_with_param name##__ = {func, param}; \
133 static const struct menu_item_ex name = \
134 { MT_FUNCTION_WITH_PARAM|MENU_HAS_DESC, \
135 { .func_with_param = &name##__}, \
136 {.callback_and_desc = & name##_}};
137
138
Daniel Stenberg1c0c8612002-05-17 12:22:24 +0000139#endif /* End __MENU_H__ */