summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
authorWilliam Wilgus <me.theuser@yahoo.com>2019-09-20 03:07:29 -0500
committerWilliam Wilgus <me.theuser@yahoo.com>2019-09-20 03:07:29 -0500
commit10e5e56f3c62383afba30b553fac1ee624a8428d (patch)
tree4431aa03b77fb7724933c8ac21c53a26d545f869 /apps
parentd0883d747ab7eb7a26364f01d2ab2f5445fbc204 (diff)
downloadrockbox-10e5e56f3c62383afba30b553fac1ee624a8428d.tar.gz
rockbox-10e5e56f3c62383afba30b553fac1ee624a8428d.zip
Bug fix dynamic menus
Dynamic menus had a buffer_len variable in the parent function but it was discarded before passing to the callbacks Why!!?? No clue but everything that used it was assuming MAXPATH Wouldn't be surprised to see some bugs pop out from this one.. init_menu_lists() was assuming MENU_HAS_DESC and setting the menu title + icon based on such even though it could be invalid didn't see anywhere in the code that was currently using MENU_DYNAMIC_DESC in relation to a top level menu but considering it caused all kinds of corruption to the menu when I tried its probably been tried and abandoned before... Change-Id: I8d961d748918bfa8ea6adb5ad60491af4d739d6e
Diffstat (limited to 'apps')
-rw-r--r--apps/menu.c37
-rw-r--r--apps/menu.h3
-rw-r--r--apps/menus/audiohw_eq_menu.c5
-rw-r--r--apps/menus/radio_menu.c5
-rw-r--r--apps/menus/settings_menu.c7
-rw-r--r--apps/root_menu.c5
6 files changed, 43 insertions, 19 deletions
diff --git a/apps/menu.c b/apps/menu.c
index a205615802..48f6fa3d0b 100644
--- a/apps/menu.c
+++ b/apps/menu.c
@@ -104,13 +104,12 @@ static const char* get_menu_item_name(int selected_item,
104 int type = (menu->flags&MENU_TYPE_MASK); 104 int type = (menu->flags&MENU_TYPE_MASK);
105 selected_item = get_menu_selection(selected_item, menu); 105 selected_item = get_menu_selection(selected_item, menu);
106 106
107 (void)buffer_len;
108 /* only MT_MENU or MT_RETURN_ID is allowed in here */ 107 /* only MT_MENU or MT_RETURN_ID is allowed in here */
109 if (type == MT_RETURN_ID) 108 if (type == MT_RETURN_ID)
110 { 109 {
111 if (menu->flags&MENU_DYNAMIC_DESC) 110 if (menu->flags&MENU_DYNAMIC_DESC)
112 return menu->menu_get_name_and_icon->list_get_name(selected_item, 111 return menu->menu_get_name_and_icon->list_get_name(selected_item,
113 menu->menu_get_name_and_icon->list_get_name_data, buffer); 112 menu->menu_get_name_and_icon->list_get_name_data, buffer, buffer_len);
114 return menu->strings[selected_item]; 113 return menu->strings[selected_item];
115 } 114 }
116 115
@@ -118,7 +117,7 @@ static const char* get_menu_item_name(int selected_item,
118 117
119 if ((menu->flags&MENU_DYNAMIC_DESC) && (type != MT_SETTING_W_TEXT)) 118 if ((menu->flags&MENU_DYNAMIC_DESC) && (type != MT_SETTING_W_TEXT))
120 return menu->menu_get_name_and_icon->list_get_name(selected_item, 119 return menu->menu_get_name_and_icon->list_get_name(selected_item,
121 menu->menu_get_name_and_icon->list_get_name_data, buffer); 120 menu->menu_get_name_and_icon->list_get_name_data, buffer, buffer_len);
122 121
123 type = (menu->flags&MENU_TYPE_MASK); 122 type = (menu->flags&MENU_TYPE_MASK);
124 if ((type == MT_SETTING) || (type == MT_SETTING_W_TEXT)) 123 if ((type == MT_SETTING) || (type == MT_SETTING_W_TEXT))
@@ -177,6 +176,7 @@ static void init_menu_lists(const struct menu_item_ex *menu,
177 int type = (menu->flags&MENU_TYPE_MASK); 176 int type = (menu->flags&MENU_TYPE_MASK);
178 menu_callback_type menu_callback = NULL; 177 menu_callback_type menu_callback = NULL;
179 int icon; 178 int icon;
179 char * title;
180 current_subitems_count = 0; 180 current_subitems_count = 0;
181 181
182 if (type == MT_RETURN_ID) 182 if (type == MT_RETURN_ID)
@@ -206,14 +206,33 @@ static void init_menu_lists(const struct menu_item_ex *menu,
206 206
207 gui_synclist_init(lists,get_menu_item_name,(void*)menu,false,1, parent); 207 gui_synclist_init(lists,get_menu_item_name,(void*)menu,false,1, parent);
208#ifdef HAVE_LCD_BITMAP 208#ifdef HAVE_LCD_BITMAP
209 if (menu->callback_and_desc->icon_id == Icon_NOICON) 209
210 icon = Icon_Submenu_Entered; 210 if (menu->flags&MENU_HAS_DESC)
211 else 211 {
212 icon = menu->callback_and_desc->icon_id; 212 icon = menu->callback_and_desc->icon_id;
213 gui_synclist_set_title(lists, P2STR(menu->callback_and_desc->desc), icon); 213 title = P2STR(menu->callback_and_desc->desc);
214 }
215 else if (menu->flags&MENU_DYNAMIC_DESC)
216 {
217 char buffer[80];
218 icon = menu->menu_get_name_and_icon->icon_id;
219 title = menu->menu_get_name_and_icon->
220 list_get_name(-1, menu->menu_get_name_and_icon->
221 list_get_name_data, buffer, sizeof(buffer));
222 }
223 else
224 {
225 icon = Icon_NOICON;
226 title = "";
227 }
228
229 if (icon == Icon_NOICON)
230 icon = Icon_Submenu_Entered;
231 gui_synclist_set_title(lists, title, icon);
214 gui_synclist_set_icon_callback(lists, global_settings.show_icons?menu_get_icon:NULL); 232 gui_synclist_set_icon_callback(lists, global_settings.show_icons?menu_get_icon:NULL);
215#else 233#else
216 (void)icon; 234 (void)icon;
235 (void)title;
217 gui_synclist_set_icon_callback(lists, NULL); 236 gui_synclist_set_icon_callback(lists, NULL);
218#endif 237#endif
219 if(global_settings.talk_menu) 238 if(global_settings.talk_menu)
@@ -256,8 +275,8 @@ static int talk_menu_item(int selected_item, void *data)
256 char buffer[80]; 275 char buffer[80];
257 str = menu->submenus[sel]->menu_get_name_and_icon-> 276 str = menu->submenus[sel]->menu_get_name_and_icon->
258 list_get_name(sel, menu->submenus[sel]-> 277 list_get_name(sel, menu->submenus[sel]->
259 menu_get_name_and_icon-> 278 menu_get_name_and_icon->
260 list_get_name_data, buffer); 279 list_get_name_data, buffer, sizeof(buffer));
261 id = P2ID(str); 280 id = P2ID(str);
262 } 281 }
263 } 282 }
diff --git a/apps/menu.h b/apps/menu.h
index df5f7ced9f..7ace51329f 100644
--- a/apps/menu.h
+++ b/apps/menu.h
@@ -91,7 +91,8 @@ struct menu_item_ex {
91 const struct menu_get_name_and_icon { 91 const struct menu_get_name_and_icon {
92 int (*menu_callback)(int action, 92 int (*menu_callback)(int action,
93 const struct menu_item_ex *this_item); 93 const struct menu_item_ex *this_item);
94 char *(*list_get_name)(int selected_item, void * data, char *buffer); 94 char *(*list_get_name)(int selected_item, void * data,
95 char *buffer, size_t buffer_len);
95 int (*list_speak_item)(int selected_item, void * data); 96 int (*list_speak_item)(int selected_item, void * data);
96 void *list_get_name_data; 97 void *list_get_name_data;
97 int icon_id; 98 int icon_id;
diff --git a/apps/menus/audiohw_eq_menu.c b/apps/menus/audiohw_eq_menu.c
index 1027d6a0b8..8dfb6e8450 100644
--- a/apps/menus/audiohw_eq_menu.c
+++ b/apps/menus/audiohw_eq_menu.c
@@ -41,9 +41,10 @@ static unsigned short hw_eq_setting_lang_ids[AUDIOHW_EQ_SETTING_NUM] =
41#endif 41#endif
42}; 42};
43 43
44static char * hw_eq_get_name(int selected_item, void * data, char *buffer) 44static char * hw_eq_get_name(int selected_item, void * data,
45 char *buffer, size_t buffer_len)
45{ 46{
46 snprintf(buffer, MAX_PATH, 47 snprintf(buffer, buffer_len,
47 str(hw_eq_setting_lang_ids[HW_EQ_IDX_SETTING(data)]), 48 str(hw_eq_setting_lang_ids[HW_EQ_IDX_SETTING(data)]),
48 HW_EQ_IDX_BAND(data) + 1); 49 HW_EQ_IDX_BAND(data) + 1);
49 return buffer; 50 return buffer;
diff --git a/apps/menus/radio_menu.c b/apps/menus/radio_menu.c
index fb3d2b7fee..8871421c11 100644
--- a/apps/menus/radio_menu.c
+++ b/apps/menus/radio_menu.c
@@ -100,11 +100,12 @@ MENUITEM_SETTING(force_mono, &global_settings.fm_force_mono, NULL);
100 100
101#ifndef FM_MODE 101#ifndef FM_MODE
102extern int radio_mode; 102extern int radio_mode;
103static char* get_mode_text(int selected_item, void * data, char *buffer) 103static char* get_mode_text(int selected_item, void * data,
104 char *buffer, size_t buffer_len)
104{ 105{
105 (void)selected_item; 106 (void)selected_item;
106 (void)data; 107 (void)data;
107 snprintf(buffer, MAX_PATH, "%s %s", str(LANG_MODE), 108 snprintf(buffer, buffer_len, "%s %s", str(LANG_MODE),
108 radio_mode ? str(LANG_PRESET) : 109 radio_mode ? str(LANG_PRESET) :
109 str(LANG_RADIO_SCAN_MODE)); 110 str(LANG_RADIO_SCAN_MODE));
110 return buffer; 111 return buffer;
diff --git a/apps/menus/settings_menu.c b/apps/menus/settings_menu.c
index ca0ec91967..67595498ad 100644
--- a/apps/menus/settings_menu.c
+++ b/apps/menus/settings_menu.c
@@ -500,14 +500,15 @@ static int seconds_to_min(int secs)
500 500
501/* A string representation of either whether a sleep timer will be started or 501/* A string representation of either whether a sleep timer will be started or
502 canceled, and how long it will be or how long is remaining in brackets */ 502 canceled, and how long it will be or how long is remaining in brackets */
503static char* sleep_timer_getname(int selected_item, void * data, char *buffer) 503static char* sleep_timer_getname(int selected_item, void * data,
504 char *buffer, size_t buffer_len)
504{ 505{
505 (void)selected_item; 506 (void)selected_item;
506 (void)data; 507 (void)data;
507 int sec = get_sleep_timer(); 508 int sec = get_sleep_timer();
508 char timer_buf[10]; 509 char timer_buf[10];
509 /* we have no sprintf, so MAX_PATH is a guess */ 510
510 snprintf(buffer, MAX_PATH, "%s (%s)", 511 snprintf(buffer, buffer_len, "%s (%s)",
511 str(sec ? LANG_SLEEP_TIMER_CANCEL_CURRENT 512 str(sec ? LANG_SLEEP_TIMER_CANCEL_CURRENT
512 : LANG_SLEEP_TIMER_START_CURRENT), 513 : LANG_SLEEP_TIMER_START_CURRENT),
513 sleep_timer_formatter(timer_buf, sizeof(timer_buf), 514 sleep_timer_formatter(timer_buf, sizeof(timer_buf),
diff --git a/apps/root_menu.c b/apps/root_menu.c
index 6b3e213831..584328bd4b 100644
--- a/apps/root_menu.c
+++ b/apps/root_menu.c
@@ -454,9 +454,10 @@ MENUITEM_RETURNVALUE(rocks_browser, ID2P(LANG_PLUGINS), GO_TO_BROWSEPLUGINS,
454MENUITEM_RETURNVALUE(playlist_browser, ID2P(LANG_CATALOG), GO_TO_PLAYLIST_VIEWER, 454MENUITEM_RETURNVALUE(playlist_browser, ID2P(LANG_CATALOG), GO_TO_PLAYLIST_VIEWER,
455 NULL, Icon_Playlist); 455 NULL, Icon_Playlist);
456 456
457static char *get_wps_item_name(int selected_item, void * data, char *buffer) 457static char *get_wps_item_name(int selected_item, void * data,
458 char *buffer, size_t buffer_len)
458{ 459{
459 (void)selected_item; (void)data; (void)buffer; 460 (void)selected_item; (void)data; (void)buffer; (void)buffer_len;
460 if (audio_status()) 461 if (audio_status())
461 return ID2P(LANG_NOW_PLAYING); 462 return ID2P(LANG_NOW_PLAYING);
462 return ID2P(LANG_RESUME_PLAYBACK); 463 return ID2P(LANG_RESUME_PLAYBACK);