2002-05-17 12:22:24 +00:00
|
|
|
/***************************************************************************
|
|
|
|
* __________ __ ___.
|
|
|
|
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
|
|
|
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
|
|
|
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
|
|
|
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
|
|
|
* \/ \/ \/ \/ \/
|
|
|
|
* $Id$
|
|
|
|
*
|
|
|
|
* Copyright (C) 2002 Robert E. Hak
|
|
|
|
*
|
2008-06-28 18:10:04 +00:00
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
|
|
|
* of the License, or (at your option) any later version.
|
2002-05-17 12:22:24 +00:00
|
|
|
*
|
|
|
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
|
|
|
* KIND, either express or implied.
|
|
|
|
*
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
#ifndef __MENU_H__
|
|
|
|
#define __MENU_H__
|
|
|
|
|
2002-06-14 10:39:11 +00:00
|
|
|
#include <stdbool.h>
|
2007-02-14 06:58:30 +00:00
|
|
|
#include "icon.h"
|
|
|
|
#include "icons.h"
|
2007-03-27 06:38:11 +00:00
|
|
|
#include "root_menu.h" /* needed for MENU_* return codes */
|
2011-11-15 13:22:02 +00:00
|
|
|
#include "settings_list.h"
|
2007-02-14 06:58:30 +00:00
|
|
|
|
2002-06-14 10:39:11 +00:00
|
|
|
|
2007-02-08 04:33:41 +00:00
|
|
|
enum menu_item_type {
|
|
|
|
MT_MENU = 0,
|
|
|
|
MT_SETTING,
|
2007-03-03 14:23:03 +00:00
|
|
|
MT_SETTING_W_TEXT, /* same as setting, but uses different
|
|
|
|
text for the setting title,
|
|
|
|
ID2P() or "literal" for the str param */
|
2007-03-17 12:33:34 +00:00
|
|
|
MT_FUNCTION_CALL, /* call a function from the menus */
|
2007-02-08 04:33:41 +00:00
|
|
|
MT_RETURN_ID, /* returns the position of the selected item (starting at 0)*/
|
2007-03-01 11:14:46 +00:00
|
|
|
MT_RETURN_VALUE, /* returns a value associated with an item */
|
2007-02-08 04:33:41 +00:00
|
|
|
};
|
2007-05-01 11:01:53 +00:00
|
|
|
#define MENU_TYPE_MASK 0xF /* MT_* type */
|
2007-02-08 04:33:41 +00:00
|
|
|
|
2007-03-17 12:33:34 +00:00
|
|
|
struct menu_func {
|
|
|
|
union {
|
|
|
|
int (*function_w_param)(void* param); /* intptr_t instead of void*
|
|
|
|
for 64bit systems */
|
|
|
|
int (*function)(void);
|
|
|
|
};
|
|
|
|
void *param; /* passed to function_w_param */
|
2007-02-08 04:33:41 +00:00
|
|
|
};
|
|
|
|
|
2007-02-19 02:14:51 +00:00
|
|
|
/* these next two are mutually exclusive */
|
2007-02-08 04:33:41 +00:00
|
|
|
#define MENU_HAS_DESC 0x10
|
2007-05-01 11:01:53 +00:00
|
|
|
#define MENU_DYNAMIC_DESC 0x20 /* the name of this menu item is set by the \
|
|
|
|
list_get_name callback */
|
|
|
|
|
|
|
|
#define MENU_EXITAFTERTHISMENU 0x40 /* do_menu() will exiting out of any \
|
|
|
|
menu item with this flag set */
|
2007-03-17 12:33:34 +00:00
|
|
|
|
|
|
|
/* Flags for MT_FUNCTION_CALL */
|
2007-04-30 13:41:33 +00:00
|
|
|
#define MENU_FUNC_USEPARAM 0x80
|
|
|
|
#define MENU_FUNC_CHECK_RETVAL 0x100
|
2007-03-17 12:33:34 +00:00
|
|
|
|
|
|
|
#define MENU_COUNT_MASK 0xFFF
|
2007-04-30 13:41:33 +00:00
|
|
|
#define MENU_COUNT_SHIFT 12
|
2007-03-17 12:33:34 +00:00
|
|
|
#define MENU_ITEM_COUNT(c) ((c&MENU_COUNT_MASK)<<MENU_COUNT_SHIFT)
|
2007-03-18 06:31:33 +00:00
|
|
|
#define MENU_GET_COUNT(flags) ((flags>>MENU_COUNT_SHIFT)&MENU_COUNT_MASK)
|
2007-02-08 04:33:41 +00:00
|
|
|
|
|
|
|
struct menu_item_ex {
|
2007-03-17 12:33:34 +00:00
|
|
|
unsigned int flags; /* above defines */
|
2007-02-08 04:33:41 +00:00
|
|
|
union {
|
|
|
|
const struct menu_item_ex **submenus; /* used with MT_MENU */
|
|
|
|
void *variable; /* used with MT_SETTING,
|
|
|
|
must be in the settings_list.c list */
|
2007-03-17 12:33:34 +00:00
|
|
|
const struct menu_func *function; /* MT_FUNCTION_* */
|
2007-02-08 04:33:41 +00:00
|
|
|
const char **strings; /* used with MT_RETURN_ID */
|
2007-03-01 11:14:46 +00:00
|
|
|
int value; /* MT_RETURN_VALUE */
|
2007-02-08 04:33:41 +00:00
|
|
|
};
|
|
|
|
union {
|
2007-02-27 11:09:09 +00:00
|
|
|
/* For settings */
|
2007-02-08 04:33:41 +00:00
|
|
|
int (*menu_callback)(int action, const struct menu_item_ex *this_item);
|
2007-02-27 11:09:09 +00:00
|
|
|
/* For everything else, except if the text is dynamic */
|
2007-02-08 04:33:41 +00:00
|
|
|
const struct menu_callback_with_desc {
|
|
|
|
int (*menu_callback)(int action,
|
|
|
|
const struct menu_item_ex *this_item);
|
|
|
|
unsigned char *desc; /* string or ID */
|
2007-03-03 13:52:14 +00:00
|
|
|
int icon_id; /* from icons_6x8 in icons.h */
|
2007-02-08 04:33:41 +00:00
|
|
|
} *callback_and_desc;
|
2007-02-27 11:09:09 +00:00
|
|
|
/* For when the item text is dynamic */
|
|
|
|
const struct menu_get_name_and_icon {
|
|
|
|
int (*menu_callback)(int action,
|
2007-02-19 02:14:51 +00:00
|
|
|
const struct menu_item_ex *this_item);
|
2007-02-27 11:09:09 +00:00
|
|
|
char *(*list_get_name)(int selected_item, void * data, char *buffer);
|
2007-10-09 03:48:56 +00:00
|
|
|
int (*list_speak_item)(int selected_item, void * data);
|
2007-02-27 11:09:09 +00:00
|
|
|
void *list_get_name_data;
|
2007-03-03 13:52:14 +00:00
|
|
|
int icon_id;
|
2007-02-27 11:09:09 +00:00
|
|
|
} *menu_get_name_and_icon;
|
2007-02-08 04:33:41 +00:00
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
typedef int (*menu_callback_type)(int action,
|
|
|
|
const struct menu_item_ex *this_item);
|
2009-03-10 07:27:13 +00:00
|
|
|
void do_setting_from_menu(const struct menu_item_ex *temp,
|
2008-04-23 11:07:40 +00:00
|
|
|
struct viewport parent[NB_SCREENS]);
|
2011-11-15 13:22:02 +00:00
|
|
|
void do_setting_screen(const struct settings_list *setting, const char * title,
|
|
|
|
struct viewport parent[NB_SCREENS]);
|
2007-02-08 04:33:41 +00:00
|
|
|
|
2007-05-20 08:26:27 +00:00
|
|
|
/*
|
|
|
|
int do_menu(const struct menu_item_ex *menu, int *start_selected)
|
|
|
|
|
|
|
|
Return value - usually one of the GO_TO_* values from root_menu.h,
|
|
|
|
however, some of the following defines can cause this to
|
|
|
|
return a different value.
|
|
|
|
|
|
|
|
*menu - The menu to run, can be a pointer to a MAKE_MENU() variable,
|
|
|
|
MENUITEM_STRINGLIST() or MENUITEM_RETURNVALUE() variable.
|
|
|
|
|
|
|
|
*start_selected - the item to select when the menu is first run.
|
|
|
|
When do_menu() returns, this will be set to the
|
|
|
|
index of the selected item at the time of the exit.
|
|
|
|
This is always set, even if the menu was cancelled.
|
|
|
|
If NULL it is ignored and the firs item starts selected
|
|
|
|
*/
|
2008-03-26 03:35:24 +00:00
|
|
|
int do_menu(const struct menu_item_ex *menu, int *start_selected,
|
2010-01-26 20:14:42 +00:00
|
|
|
struct viewport parent[NB_SCREENS], bool hide_theme);
|
2007-05-20 08:26:27 +00:00
|
|
|
|
2007-02-11 10:31:50 +00:00
|
|
|
/* In all the following macros the argument names are as follows:
|
|
|
|
- name: The name for the variable (so it can be used in a MAKE_MENU()
|
|
|
|
- str: the string to display for this menu item. use ID2P() for LANG_* id's
|
|
|
|
- callback: The callback function to call for this menu item.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* Use this to put a setting into a menu.
|
|
|
|
The setting must appear in settings_list.c.
|
|
|
|
If the setting is not configured properly, the menu will display "Not Done yet!"
|
|
|
|
When the user selects this item the setting select screen will load,
|
|
|
|
when that screen exits the user wll be back in the menu */
|
2007-02-08 04:33:41 +00:00
|
|
|
#define MENUITEM_SETTING(name,var,callback) \
|
|
|
|
static const struct menu_item_ex name = \
|
|
|
|
{MT_SETTING, {.variable = (void*)var},{callback}};
|
|
|
|
|
2007-03-03 14:23:03 +00:00
|
|
|
/* Use this for settings which have a differnt title in their
|
|
|
|
setting screen than in the menu (e.g scroll options */
|
|
|
|
#define MENUITEM_SETTING_W_TEXT(name, var, str, callback ) \
|
2007-05-01 11:01:53 +00:00
|
|
|
static const struct menu_callback_with_desc name##__ = \
|
|
|
|
{callback,str, Icon_NOICON}; \
|
2007-03-03 14:23:03 +00:00
|
|
|
static const struct menu_item_ex name = \
|
2007-05-01 11:01:53 +00:00
|
|
|
{MT_SETTING_W_TEXT|MENU_HAS_DESC, {.variable = (void*)var }, \
|
2007-03-03 14:23:03 +00:00
|
|
|
{.callback_and_desc = & name##__}};
|
|
|
|
|
2007-05-01 11:01:53 +00:00
|
|
|
/* Use this To create a list of Strings (or ID2P()'s )
|
2007-05-20 08:26:27 +00:00
|
|
|
When the user enters this list and selects one, the menu will exit
|
|
|
|
and do_menu() will return value the index of the chosen item.
|
|
|
|
if the user cancels, GO_TO_PREVIOUS will be returned */
|
2007-02-11 10:31:50 +00:00
|
|
|
#define MENUITEM_STRINGLIST(name, str, callback, ... ) \
|
2007-02-08 04:33:41 +00:00
|
|
|
static const char *name##_[] = {__VA_ARGS__}; \
|
2007-05-01 11:01:53 +00:00
|
|
|
static const struct menu_callback_with_desc name##__ = \
|
|
|
|
{callback,str, Icon_NOICON}; \
|
2007-02-08 04:33:41 +00:00
|
|
|
static const struct menu_item_ex name = \
|
|
|
|
{MT_RETURN_ID|MENU_HAS_DESC| \
|
|
|
|
MENU_ITEM_COUNT(sizeof( name##_)/sizeof(*name##_)), \
|
2007-03-25 14:31:56 +00:00
|
|
|
{ .strings = name##_},{.callback_and_desc = & name##__}};
|
2007-02-14 06:58:30 +00:00
|
|
|
|
2007-02-11 10:31:50 +00:00
|
|
|
|
2007-05-20 08:26:27 +00:00
|
|
|
/* causes do_menu() to return a value associated with the item */
|
2007-03-01 11:14:46 +00:00
|
|
|
#define MENUITEM_RETURNVALUE(name, str, val, cb, icon) \
|
2007-05-01 11:01:53 +00:00
|
|
|
static const struct menu_callback_with_desc name##_ = {cb,str,icon}; \
|
|
|
|
static const struct menu_item_ex name = \
|
|
|
|
{ MT_RETURN_VALUE|MENU_HAS_DESC, { .value = val}, \
|
2007-03-01 11:14:46 +00:00
|
|
|
{.callback_and_desc = & name##_}};
|
|
|
|
|
|
|
|
/* same as above, except the item name is dynamic */
|
2007-05-01 11:01:53 +00:00
|
|
|
#define MENUITEM_RETURNVALUE_DYNTEXT(name, val, cb, text_callback, \
|
2007-10-09 03:48:56 +00:00
|
|
|
voice_callback, text_cb_data, icon) \
|
2007-05-01 11:01:53 +00:00
|
|
|
static const struct menu_get_name_and_icon name##_ \
|
2007-10-09 03:48:56 +00:00
|
|
|
= {cb,text_callback,voice_callback,text_cb_data,icon}; \
|
2007-03-01 11:14:46 +00:00
|
|
|
static const struct menu_item_ex name = \
|
|
|
|
{ MT_RETURN_VALUE|MENU_DYNAMIC_DESC, { .value = val}, \
|
|
|
|
{.menu_get_name_and_icon = & name##_}};
|
|
|
|
|
2007-02-11 10:31:50 +00:00
|
|
|
/* Use this to put a function call into the menu.
|
|
|
|
When the user selects this item the function will be run,
|
2007-05-01 11:01:53 +00:00
|
|
|
if MENU_FUNC_CHECK_RETVAL is set, the return value
|
|
|
|
will be checked, returning 1 will exit do_menu();
|
|
|
|
if MENU_FUNC_USEPARAM is set, param will be passed to the function */
|
|
|
|
#define MENUITEM_FUNCTION(name, flags, str, func, param, \
|
|
|
|
callback, icon) \
|
2007-02-14 06:58:30 +00:00
|
|
|
static const struct menu_callback_with_desc name##_ = {callback,str,icon}; \
|
2007-05-01 11:01:53 +00:00
|
|
|
static const struct menu_func name##__ = {{(void*)func}, param}; \
|
|
|
|
/* should be const, but recording_settings wont let us do that */ \
|
|
|
|
const struct menu_item_ex name = \
|
2007-03-17 12:33:34 +00:00
|
|
|
{ MT_FUNCTION_CALL|MENU_HAS_DESC|flags, \
|
|
|
|
{ .function = & name##__}, {.callback_and_desc = & name##_}};
|
2007-02-27 11:09:09 +00:00
|
|
|
|
2007-02-19 02:14:51 +00:00
|
|
|
/* As above, except the text is dynamic */
|
2007-10-09 03:48:56 +00:00
|
|
|
#define MENUITEM_FUNCTION_DYNTEXT(name, flags, func, param, \
|
|
|
|
text_callback, voice_callback, \
|
|
|
|
text_cb_data, callback, icon) \
|
|
|
|
static const struct menu_get_name_and_icon name##_ \
|
|
|
|
= {callback,text_callback,voice_callback,text_cb_data,icon}; \
|
2007-05-01 11:01:53 +00:00
|
|
|
static const struct menu_func name##__ = {{(void*)func}, param}; \
|
2011-10-17 18:57:44 +00:00
|
|
|
const struct menu_item_ex name = \
|
2007-03-17 12:33:34 +00:00
|
|
|
{ MT_FUNCTION_CALL|MENU_DYNAMIC_DESC|flags, \
|
|
|
|
{ .function = & name##__}, {.menu_get_name_and_icon = & name##_}};
|
2007-02-08 04:33:41 +00:00
|
|
|
|
2007-02-11 10:31:50 +00:00
|
|
|
/* Use this to actually create a menu. the ... argument is a list of pointers
|
2007-05-01 11:01:53 +00:00
|
|
|
to any of the above macro'd variables.
|
|
|
|
(It can also have other menus in the list.) */
|
|
|
|
#define MAKE_MENU( name, str, callback, icon, ... ) \
|
|
|
|
static const struct menu_item_ex *name##_[] = {__VA_ARGS__}; \
|
2007-02-14 06:58:30 +00:00
|
|
|
static const struct menu_callback_with_desc name##__ = {callback,str,icon};\
|
2007-05-01 11:01:53 +00:00
|
|
|
const struct menu_item_ex name = \
|
|
|
|
{MT_MENU|MENU_HAS_DESC| \
|
|
|
|
MENU_ITEM_COUNT(sizeof( name##_)/sizeof(*name##_)), \
|
2007-02-14 06:58:30 +00:00
|
|
|
{ (void*)name##_},{.callback_and_desc = & name##__}};
|
2007-03-01 11:14:46 +00:00
|
|
|
|
2007-02-14 06:58:30 +00:00
|
|
|
|
2002-05-17 12:22:24 +00:00
|
|
|
#endif /* End __MENU_H__ */
|