Daniel Stenberg | 1c0c861 | 2002-05-17 12:22:24 +0000 | [diff] [blame] | 1 | /*************************************************************************** |
| 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 Stenberg | 91f743f | 2002-06-14 10:39:11 +0000 | [diff] [blame] | 23 | #include <stdbool.h> |
Jonathan Gordon | 5599d68 | 2007-02-14 06:58:30 +0000 | [diff] [blame^] | 24 | #include "icon.h" |
| 25 | #include "icons.h" |
| 26 | |
Daniel Stenberg | 91f743f | 2002-06-14 10:39:11 +0000 | [diff] [blame] | 27 | |
Linus Nielsen Feltzing | 77936e6 | 2004-03-16 13:44:56 +0000 | [diff] [blame] | 28 | struct menu_item { |
Jörg Hohensohn | b1403ee | 2004-07-23 23:01:20 +0000 | [diff] [blame] | 29 | unsigned char *desc; /* string or ID */ |
Björn Stenberg | b1b8bd4 | 2002-09-24 17:22:12 +0000 | [diff] [blame] | 30 | bool (*function) (void); /* return true if USB was connected */ |
Daniel Stenberg | 1c0c861 | 2002-05-17 12:22:24 +0000 | [diff] [blame] | 31 | }; |
| 32 | |
Jonathan Gordon | 4718a1e | 2007-02-08 04:33:41 +0000 | [diff] [blame] | 33 | int 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 Stenberg | 2ac0572 | 2002-05-26 17:03:17 +0000 | [diff] [blame] | 36 | void menu_exit(int menu); |
Daniel Stenberg | 1c0c861 | 2002-05-17 12:22:24 +0000 | [diff] [blame] | 37 | |
Daniel Stenberg | 91f743f | 2002-06-14 10:39:11 +0000 | [diff] [blame] | 38 | void put_cursorxy(int x, int y, bool on); |
| 39 | |
Kjell Ericson | 5cd393c | 2003-01-29 08:26:11 +0000 | [diff] [blame] | 40 | /* Returns below define, or number of selected menu item*/ |
| 41 | int menu_show(int m); |
| 42 | #define MENU_ATTACHED_USB -1 |
| 43 | #define MENU_SELECTED_EXIT -2 |
Jonathan Gordon | 4718a1e | 2007-02-08 04:33:41 +0000 | [diff] [blame] | 44 | #define MENU_EXIT_ALL -3 |
| 45 | #define MENU_RETURN_TO_WPS -4 |
Kjell Ericson | 5cd393c | 2003-01-29 08:26:11 +0000 | [diff] [blame] | 46 | |
Björn Stenberg | b1b8bd4 | 2002-09-24 17:22:12 +0000 | [diff] [blame] | 47 | bool menu_run(int menu); |
Linus Nielsen Feltzing | 10b92c4 | 2004-03-12 10:20:33 +0000 | [diff] [blame] | 48 | int menu_cursor(int menu); |
| 49 | char* menu_description(int menu, int position); |
| 50 | void menu_delete(int menu, int position); |
| 51 | int menu_count(int menu); |
| 52 | bool menu_moveup(int menu); |
| 53 | bool menu_movedown(int menu); |
| 54 | void menu_draw(int menu); |
Jörg Hohensohn | b1403ee | 2004-07-23 23:01:20 +0000 | [diff] [blame] | 55 | void menu_insert(int menu, int position, char *desc, bool (*function) (void)); |
Jens Arnold | cef15c6 | 2005-04-10 17:36:55 +0000 | [diff] [blame] | 56 | void menu_set_cursor(int menu, int position); |
Kevin Ferrare | c43822d | 2005-11-03 11:56:21 +0000 | [diff] [blame] | 57 | void menu_talk_selected(int m); |
Daniel Stenberg | b285076 | 2002-08-23 12:32:52 +0000 | [diff] [blame] | 58 | |
Jonathan Gordon | 4718a1e | 2007-02-08 04:33:41 +0000 | [diff] [blame] | 59 | |
| 60 | enum menu_item_type { |
| 61 | MT_MENU = 0, |
| 62 | MT_SETTING, |
| 63 | MT_FUNCTION_CALL, /* used when the standard code wont work */ |
| 64 | MT_FUNCTION_WITH_PARAM, |
| 65 | MT_RETURN_ID, /* returns the position of the selected item (starting at 0)*/ |
| 66 | }; |
| 67 | |
| 68 | typedef int (*menu_function)(void); |
| 69 | struct menu_func_with_param { |
| 70 | int (*function)(void* param); |
| 71 | void *param; |
| 72 | }; |
| 73 | |
| 74 | #define MENU_TYPE_MASK 0xF /* MT_* type */ |
| 75 | #define MENU_HAS_DESC 0x10 |
| 76 | #define MENU_COUNT_MASK (~(MENU_TYPE_MASK|MENU_HAS_DESC)) /* unless we need more flags*/ |
| 77 | #define MENU_COUNT_SHIFT 5 |
| 78 | |
| 79 | struct menu_item_ex { |
| 80 | int flags; /* above defines */ |
| 81 | union { |
| 82 | const struct menu_item_ex **submenus; /* used with MT_MENU */ |
| 83 | void *variable; /* used with MT_SETTING, |
| 84 | must be in the settings_list.c list */ |
| 85 | int (*function)(void); /* used with MT_FUNCTION_CALL */ |
| 86 | const struct menu_func_with_param |
| 87 | *func_with_param; /* MT_FUNCTION_WITH_PARAM */ |
| 88 | const char **strings; /* used with MT_RETURN_ID */ |
| 89 | }; |
| 90 | union { |
| 91 | int (*menu_callback)(int action, const struct menu_item_ex *this_item); |
| 92 | const struct menu_callback_with_desc { |
| 93 | int (*menu_callback)(int action, |
| 94 | const struct menu_item_ex *this_item); |
| 95 | unsigned char *desc; /* string or ID */ |
Jonathan Gordon | 5599d68 | 2007-02-14 06:58:30 +0000 | [diff] [blame^] | 96 | #ifdef HAVE_LCD_BITMAP |
| 97 | ICON icon; /* Icon to display */ |
| 98 | #endif |
Jonathan Gordon | 4718a1e | 2007-02-08 04:33:41 +0000 | [diff] [blame] | 99 | } *callback_and_desc; |
| 100 | }; |
| 101 | }; |
| 102 | |
| 103 | typedef int (*menu_callback_type)(int action, |
| 104 | const struct menu_item_ex *this_item); |
| 105 | int do_menu(const struct menu_item_ex *menu); |
| 106 | |
| 107 | #define MENU_ITEM_COUNT(c) (c<<MENU_COUNT_SHIFT) |
Jonathan Gordon | 37d246a | 2007-02-11 10:31:50 +0000 | [diff] [blame] | 108 | /* In all the following macros the argument names are as follows: |
| 109 | - name: The name for the variable (so it can be used in a MAKE_MENU() |
| 110 | - str: the string to display for this menu item. use ID2P() for LANG_* id's |
| 111 | - callback: The callback function to call for this menu item. |
| 112 | */ |
Jonathan Gordon | 4718a1e | 2007-02-08 04:33:41 +0000 | [diff] [blame] | 113 | |
Jonathan Gordon | 37d246a | 2007-02-11 10:31:50 +0000 | [diff] [blame] | 114 | /* Use this to put a setting into a menu. |
| 115 | The setting must appear in settings_list.c. |
| 116 | If the setting is not configured properly, the menu will display "Not Done yet!" |
| 117 | When the user selects this item the setting select screen will load, |
| 118 | when that screen exits the user wll be back in the menu */ |
Jonathan Gordon | 4718a1e | 2007-02-08 04:33:41 +0000 | [diff] [blame] | 119 | #define MENUITEM_SETTING(name,var,callback) \ |
| 120 | static const struct menu_item_ex name = \ |
| 121 | {MT_SETTING, {.variable = (void*)var},{callback}}; |
| 122 | |
Jonathan Gordon | 37d246a | 2007-02-11 10:31:50 +0000 | [diff] [blame] | 123 | /* Use this To create a list of NON-XLATABLE (for the time being) Strings |
| 124 | When the user enters this list and selects one, the menu will exits |
| 125 | and its return value will be the index of the chosen item */ |
| 126 | #define MENUITEM_STRINGLIST(name, str, callback, ... ) \ |
Jonathan Gordon | 4718a1e | 2007-02-08 04:33:41 +0000 | [diff] [blame] | 127 | static const char *name##_[] = {__VA_ARGS__}; \ |
Jonathan Gordon | 5599d68 | 2007-02-14 06:58:30 +0000 | [diff] [blame^] | 128 | static const struct menu_callback_with_desc name##__ = {callback,str, NOICON};\ |
Jonathan Gordon | 4718a1e | 2007-02-08 04:33:41 +0000 | [diff] [blame] | 129 | static const struct menu_item_ex name = \ |
| 130 | {MT_RETURN_ID|MENU_HAS_DESC| \ |
| 131 | MENU_ITEM_COUNT(sizeof( name##_)/sizeof(*name##_)), \ |
| 132 | { .submenus = name##_},{.callback_and_desc = & name##__}}; |
Jonathan Gordon | 5599d68 | 2007-02-14 06:58:30 +0000 | [diff] [blame^] | 133 | |
| 134 | #ifdef HAVE_LCD_BITMAP /* Kill the player port already.... PLEASE!! */ |
Jonathan Gordon | 37d246a | 2007-02-11 10:31:50 +0000 | [diff] [blame] | 135 | |
Jonathan Gordon | 4718a1e | 2007-02-08 04:33:41 +0000 | [diff] [blame] | 136 | /* This one should be static'ed also, |
Jonathan Gordon | 37d246a | 2007-02-11 10:31:50 +0000 | [diff] [blame] | 137 | but cannot be done untill settings menu is done */ |
| 138 | /* Use this to put a function call into the menu. |
| 139 | When the user selects this item the function will be run, |
| 140 | when it exits the user will be back in the menu. return value is ignored */ |
Jonathan Gordon | 5599d68 | 2007-02-14 06:58:30 +0000 | [diff] [blame^] | 141 | #define MENUITEM_FUNCTION(name, str, func, callback, icon) \ |
| 142 | static const struct menu_callback_with_desc name##_ = {callback,str,icon}; \ |
Jonathan Gordon | 4718a1e | 2007-02-08 04:33:41 +0000 | [diff] [blame] | 143 | const struct menu_item_ex name = \ |
| 144 | { MT_FUNCTION_CALL|MENU_HAS_DESC, { .function = func}, \ |
| 145 | {.callback_and_desc = & name##_}}; |
| 146 | |
Jonathan Gordon | 37d246a | 2007-02-11 10:31:50 +0000 | [diff] [blame] | 147 | /* Same as above, except the function will be called with a (void*)param. */ |
Jonathan Gordon | 5599d68 | 2007-02-14 06:58:30 +0000 | [diff] [blame^] | 148 | #define MENUITEM_FUNCTION_WPARAM(name, str, func, param, callback, icon) \ |
| 149 | static const struct menu_callback_with_desc name##_ = {callback,str,icon}; \ |
Jonathan Gordon | 4718a1e | 2007-02-08 04:33:41 +0000 | [diff] [blame] | 150 | static const struct menu_func_with_param name##__ = {func, param}; \ |
| 151 | static const struct menu_item_ex name = \ |
| 152 | { MT_FUNCTION_WITH_PARAM|MENU_HAS_DESC, \ |
| 153 | { .func_with_param = &name##__}, \ |
| 154 | {.callback_and_desc = & name##_}}; |
| 155 | |
Jonathan Gordon | 37d246a | 2007-02-11 10:31:50 +0000 | [diff] [blame] | 156 | /* Use this to actually create a menu. the ... argument is a list of pointers |
| 157 | to any of the above macro'd variables. (It can also have other menus in the list. */ |
Jonathan Gordon | 5599d68 | 2007-02-14 06:58:30 +0000 | [diff] [blame^] | 158 | #define MAKE_MENU( name, str, callback, icon, ... ) \ |
Jonathan Gordon | 37d246a | 2007-02-11 10:31:50 +0000 | [diff] [blame] | 159 | static const struct menu_item_ex *name##_[] = {__VA_ARGS__}; \ |
Jonathan Gordon | 5599d68 | 2007-02-14 06:58:30 +0000 | [diff] [blame^] | 160 | static const struct menu_callback_with_desc name##__ = {callback,str,icon};\ |
Jonathan Gordon | 37d246a | 2007-02-11 10:31:50 +0000 | [diff] [blame] | 161 | const struct menu_item_ex name = \ |
| 162 | {MT_MENU|MENU_HAS_DESC| \ |
| 163 | MENU_ITEM_COUNT(sizeof( name##_)/sizeof(*name##_)), \ |
| 164 | { (void*)name##_},{.callback_and_desc = & name##__}}; |
Jonathan Gordon | 5599d68 | 2007-02-14 06:58:30 +0000 | [diff] [blame^] | 165 | |
| 166 | #else /* HAVE_LCD_BITMAP */ |
| 167 | #define MENUITEM_FUNCTION(name, str, func, callback, icon) \ |
| 168 | static const struct menu_callback_with_desc name##_ = {callback,str}; \ |
| 169 | const struct menu_item_ex name = \ |
| 170 | { MT_FUNCTION_CALL|MENU_HAS_DESC, { .function = func}, \ |
| 171 | {.callback_and_desc = & name##_}}; |
| 172 | #define MENUITEM_FUNCTION_WPARAM(name, str, func, param, callback, icon) \ |
| 173 | static const struct menu_callback_with_desc name##_ = {callback,str}; \ |
| 174 | static const struct menu_func_with_param name##__ = {func, param}; \ |
| 175 | static const struct menu_item_ex name = \ |
| 176 | { MT_FUNCTION_WITH_PARAM|MENU_HAS_DESC, \ |
| 177 | { .func_with_param = &name##__}, \ |
| 178 | {.callback_and_desc = & name##_}}; |
| 179 | #define MAKE_MENU( name, str, callback, icon, ... ) \ |
| 180 | static const struct menu_item_ex *name##_[] = {__VA_ARGS__}; \ |
| 181 | static const struct menu_callback_with_desc name##__ = {callback,str};\ |
| 182 | const struct menu_item_ex name = \ |
| 183 | {MT_MENU|MENU_HAS_DESC| \ |
| 184 | MENU_ITEM_COUNT(sizeof( name##_)/sizeof(*name##_)), \ |
| 185 | { (void*)name##_},{.callback_and_desc = & name##__}}; |
| 186 | |
| 187 | #endif /* HAVE_LCD_BITMAP */ |
| 188 | |
Daniel Stenberg | 1c0c861 | 2002-05-17 12:22:24 +0000 | [diff] [blame] | 189 | #endif /* End __MENU_H__ */ |