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
diff --git a/apps/menu.c b/apps/menu.c
index a205615..48f6fa3 100644
--- a/apps/menu.c
+++ b/apps/menu.c
@@ -104,13 +104,12 @@
int type = (menu->flags&MENU_TYPE_MASK);
selected_item = get_menu_selection(selected_item, menu);
- (void)buffer_len;
/* only MT_MENU or MT_RETURN_ID is allowed in here */
if (type == MT_RETURN_ID)
{
if (menu->flags&MENU_DYNAMIC_DESC)
return menu->menu_get_name_and_icon->list_get_name(selected_item,
- menu->menu_get_name_and_icon->list_get_name_data, buffer);
+ menu->menu_get_name_and_icon->list_get_name_data, buffer, buffer_len);
return menu->strings[selected_item];
}
@@ -118,7 +117,7 @@
if ((menu->flags&MENU_DYNAMIC_DESC) && (type != MT_SETTING_W_TEXT))
return menu->menu_get_name_and_icon->list_get_name(selected_item,
- menu->menu_get_name_and_icon->list_get_name_data, buffer);
+ menu->menu_get_name_and_icon->list_get_name_data, buffer, buffer_len);
type = (menu->flags&MENU_TYPE_MASK);
if ((type == MT_SETTING) || (type == MT_SETTING_W_TEXT))
@@ -177,6 +176,7 @@
int type = (menu->flags&MENU_TYPE_MASK);
menu_callback_type menu_callback = NULL;
int icon;
+ char * title;
current_subitems_count = 0;
if (type == MT_RETURN_ID)
@@ -206,14 +206,33 @@
gui_synclist_init(lists,get_menu_item_name,(void*)menu,false,1, parent);
#ifdef HAVE_LCD_BITMAP
- if (menu->callback_and_desc->icon_id == Icon_NOICON)
- icon = Icon_Submenu_Entered;
- else
+
+ if (menu->flags&MENU_HAS_DESC)
+ {
icon = menu->callback_and_desc->icon_id;
- gui_synclist_set_title(lists, P2STR(menu->callback_and_desc->desc), icon);
+ title = P2STR(menu->callback_and_desc->desc);
+ }
+ else if (menu->flags&MENU_DYNAMIC_DESC)
+ {
+ char buffer[80];
+ icon = menu->menu_get_name_and_icon->icon_id;
+ title = menu->menu_get_name_and_icon->
+ list_get_name(-1, menu->menu_get_name_and_icon->
+ list_get_name_data, buffer, sizeof(buffer));
+ }
+ else
+ {
+ icon = Icon_NOICON;
+ title = "";
+ }
+
+ if (icon == Icon_NOICON)
+ icon = Icon_Submenu_Entered;
+ gui_synclist_set_title(lists, title, icon);
gui_synclist_set_icon_callback(lists, global_settings.show_icons?menu_get_icon:NULL);
#else
(void)icon;
+ (void)title;
gui_synclist_set_icon_callback(lists, NULL);
#endif
if(global_settings.talk_menu)
@@ -256,8 +275,8 @@
char buffer[80];
str = menu->submenus[sel]->menu_get_name_and_icon->
list_get_name(sel, menu->submenus[sel]->
- menu_get_name_and_icon->
- list_get_name_data, buffer);
+ menu_get_name_and_icon->
+ list_get_name_data, buffer, sizeof(buffer));
id = P2ID(str);
}
}
diff --git a/apps/menu.h b/apps/menu.h
index df5f7ce..7ace513 100644
--- a/apps/menu.h
+++ b/apps/menu.h
@@ -91,7 +91,8 @@
const struct menu_get_name_and_icon {
int (*menu_callback)(int action,
const struct menu_item_ex *this_item);
- char *(*list_get_name)(int selected_item, void * data, char *buffer);
+ char *(*list_get_name)(int selected_item, void * data,
+ char *buffer, size_t buffer_len);
int (*list_speak_item)(int selected_item, void * data);
void *list_get_name_data;
int icon_id;
diff --git a/apps/menus/audiohw_eq_menu.c b/apps/menus/audiohw_eq_menu.c
index 1027d6a..8dfb6e8 100644
--- a/apps/menus/audiohw_eq_menu.c
+++ b/apps/menus/audiohw_eq_menu.c
@@ -41,9 +41,10 @@
#endif
};
-static char * hw_eq_get_name(int selected_item, void * data, char *buffer)
+static char * hw_eq_get_name(int selected_item, void * data,
+ char *buffer, size_t buffer_len)
{
- snprintf(buffer, MAX_PATH,
+ snprintf(buffer, buffer_len,
str(hw_eq_setting_lang_ids[HW_EQ_IDX_SETTING(data)]),
HW_EQ_IDX_BAND(data) + 1);
return buffer;
diff --git a/apps/menus/radio_menu.c b/apps/menus/radio_menu.c
index fb3d2b7..8871421 100644
--- a/apps/menus/radio_menu.c
+++ b/apps/menus/radio_menu.c
@@ -100,11 +100,12 @@
#ifndef FM_MODE
extern int radio_mode;
-static char* get_mode_text(int selected_item, void * data, char *buffer)
+static char* get_mode_text(int selected_item, void * data,
+ char *buffer, size_t buffer_len)
{
(void)selected_item;
(void)data;
- snprintf(buffer, MAX_PATH, "%s %s", str(LANG_MODE),
+ snprintf(buffer, buffer_len, "%s %s", str(LANG_MODE),
radio_mode ? str(LANG_PRESET) :
str(LANG_RADIO_SCAN_MODE));
return buffer;
diff --git a/apps/menus/settings_menu.c b/apps/menus/settings_menu.c
index ca0ec91..6759549 100644
--- a/apps/menus/settings_menu.c
+++ b/apps/menus/settings_menu.c
@@ -500,14 +500,15 @@
/* A string representation of either whether a sleep timer will be started or
canceled, and how long it will be or how long is remaining in brackets */
-static char* sleep_timer_getname(int selected_item, void * data, char *buffer)
+static char* sleep_timer_getname(int selected_item, void * data,
+ char *buffer, size_t buffer_len)
{
(void)selected_item;
(void)data;
int sec = get_sleep_timer();
char timer_buf[10];
- /* we have no sprintf, so MAX_PATH is a guess */
- snprintf(buffer, MAX_PATH, "%s (%s)",
+
+ snprintf(buffer, buffer_len, "%s (%s)",
str(sec ? LANG_SLEEP_TIMER_CANCEL_CURRENT
: LANG_SLEEP_TIMER_START_CURRENT),
sleep_timer_formatter(timer_buf, sizeof(timer_buf),
diff --git a/apps/root_menu.c b/apps/root_menu.c
index 6b3e213..584328b 100644
--- a/apps/root_menu.c
+++ b/apps/root_menu.c
@@ -454,9 +454,10 @@
MENUITEM_RETURNVALUE(playlist_browser, ID2P(LANG_CATALOG), GO_TO_PLAYLIST_VIEWER,
NULL, Icon_Playlist);
-static char *get_wps_item_name(int selected_item, void * data, char *buffer)
+static char *get_wps_item_name(int selected_item, void * data,
+ char *buffer, size_t buffer_len)
{
- (void)selected_item; (void)data; (void)buffer;
+ (void)selected_item; (void)data; (void)buffer; (void)buffer_len;
if (audio_status())
return ID2P(LANG_NOW_PLAYING);
return ID2P(LANG_RESUME_PLAYBACK);