diff --git a/menu/cbs/menu_cbs_select.c b/menu/cbs/menu_cbs_select.c index 38974ab908..c465c8c5b9 100644 --- a/menu/cbs/menu_cbs_select.c +++ b/menu/cbs/menu_cbs_select.c @@ -46,6 +46,12 @@ static int action_select_default(const char *path, const char *label, unsigned t file_list_t *selection_buf = menu_entries_get_selection_buf_ptr(0); menu_entry_init(&entry); + /* Note: If menu_entry_action() is modified, + * will have to verify that these parameters + * remain unused... */ + entry.rich_label_enabled = false; + entry.value_enabled = false; + entry.sublabel_enabled = false; menu_entry_get(&entry, 0, idx, NULL, false); if (selection_buf) @@ -53,10 +59,7 @@ static int action_select_default(const char *path, const char *label, unsigned t file_list_get_actiondata_at_offset(selection_buf, idx); if (!cbs) - { - menu_entry_free(&entry); return -1; - } if (cbs->setting) { @@ -102,8 +105,6 @@ static int action_select_default(const char *path, const char *label, unsigned t if (action != MENU_ACTION_NOOP) ret = menu_entry_action(&entry, (unsigned)idx, action); - menu_entry_free(&entry); - task_queue_check(); return ret; diff --git a/menu/drivers/materialui.c b/menu/drivers/materialui.c index 46c9586b87..1260027051 100644 --- a/menu/drivers/materialui.c +++ b/menu/drivers/materialui.c @@ -606,33 +606,35 @@ static void materialui_compute_entries_box(materialui_handle_t* mui, int width) for (i = 0; i < entries_end; i++) { menu_entry_t entry; - char *sublabel_str = NULL; + char wrapped_sublabel_str[512]; + const char *sublabel_str = NULL; unsigned lines = 0; - materialui_node_t *node = (materialui_node_t*) + materialui_node_t *node = (materialui_node_t*) file_list_get_userdata_at_offset(list, i); + wrapped_sublabel_str[0] = '\0'; + menu_entry_init(&entry); + entry.path_enabled = false; + entry.label_enabled = false; + entry.rich_label_enabled = false; + entry.value_enabled = false; menu_entry_get(&entry, 0, i, NULL, true); - sublabel_str = menu_entry_get_sublabel(&entry); - menu_entry_free(&entry); + menu_entry_get_sublabel(&entry, &sublabel_str); - if (sublabel_str) + if (!string_is_empty(sublabel_str)) { - if (!string_is_empty(sublabel_str)) - { - int icon_margin = 0; + int icon_margin = 0; - if (node->texture_switch2_set) - if (mui->textures.list[node->texture_switch2_index]) - icon_margin = mui->icon_size; + if (node->texture_switch2_set) + if (mui->textures.list[node->texture_switch2_index]) + icon_margin = mui->icon_size; - word_wrap(sublabel_str, sublabel_str, - (int)((usable_width - icon_margin) / mui->glyph_width2), - false, 0); - lines = materialui_count_lines(sublabel_str); - } - free(sublabel_str); + word_wrap(wrapped_sublabel_str, sublabel_str, + (int)((usable_width - icon_margin) / mui->glyph_width2), + false, 0); + lines = materialui_count_lines(wrapped_sublabel_str); } node->line_height = (scale_factor / 3) + (lines * mui->font->size); @@ -743,8 +745,9 @@ static void materialui_render_label_value( menu_animation_ctx_ticker_t ticker; char label_str[255]; char value_str[255]; + char wrapped_sublabel_str[512]; unsigned entry_type = 0; - char *sublabel_str = NULL; + const char *sublabel_str = NULL; bool switch_is_on = true; int value_len = (int)utf8len(value); int ticker_limit = 0; @@ -761,9 +764,13 @@ static void materialui_render_label_value( ticker.type_enum = (enum menu_animation_ticker_type)settings->uints.menu_ticker_type; ticker.spacer = NULL; - label_str[0] = value_str[0] = '\0'; + label_str[0] = value_str[0] = wrapped_sublabel_str[0] = '\0'; menu_entry_init(&entry); + entry.path_enabled = false; + entry.label_enabled = false; + entry.rich_label_enabled = false; + entry.value_enabled = false; menu_entry_get(&entry, 0, i, NULL, true); entry_type = menu_entry_get_type_new(&entry); @@ -861,27 +868,23 @@ static void materialui_render_label_value( } } - sublabel_str = menu_entry_get_sublabel(&entry); + menu_entry_get_sublabel(&entry, &sublabel_str); if (texture_switch2) icon_margin = mui->icon_size; /* Sublabel */ - if (sublabel_str) + if (!string_is_empty(sublabel_str) && mui->font) { - if (!string_is_empty(sublabel_str) && mui->font) - { - word_wrap(sublabel_str, sublabel_str, - (int)((usable_width - icon_margin) / mui->glyph_width2), - false, 0); + word_wrap(wrapped_sublabel_str, sublabel_str, + (int)((usable_width - icon_margin) / mui->glyph_width2), + false, 0); - menu_display_draw_text(mui->font2, sublabel_str, - mui->margin + icon_margin, - y + (scale_factor / 4) + mui->font->size, - width, height, sublabel_color, TEXT_ALIGN_LEFT, - 1.0f, false, 0, false); - } - free(sublabel_str); + menu_display_draw_text(mui->font2, wrapped_sublabel_str, + mui->margin + icon_margin, + y + (scale_factor / 4) + mui->font->size, + width, height, sublabel_color, TEXT_ALIGN_LEFT, + 1.0f, false, 0, false); } menu_display_draw_text(mui->font, label_str, @@ -931,8 +934,6 @@ static void materialui_render_label_value( switch_is_on ? &label_color[0] : &pure_white[0] ); } - - menu_entry_free(&entry); } static void materialui_render_menu_list( @@ -964,16 +965,14 @@ static void materialui_render_menu_list( for (i = 0; i < entries_end; i++) { menu_entry_t entry; - char entry_value[255]; - char *rich_label = NULL; + const char *entry_value = NULL; + const char *rich_label = NULL; bool entry_selected = false; materialui_node_t *node = (materialui_node_t*) file_list_get_userdata_at_offset(list, i); size_t selection = menu_navigation_get_selection(); int y = header_height - mui->scroll_y + sum; - entry_value[0] = '\0'; - sum += node->line_height; if (y + (int)node->line_height < 0) @@ -983,9 +982,12 @@ static void materialui_render_menu_list( break; menu_entry_init(&entry); + entry.path_enabled = false; + entry.label_enabled = false; + entry.sublabel_enabled = false; menu_entry_get(&entry, 0, (unsigned)i, NULL, true); - menu_entry_get_value(&entry, entry_value, sizeof(entry_value)); - rich_label = menu_entry_get_rich_label(&entry); + menu_entry_get_value(&entry, &entry_value); + menu_entry_get_rich_label(&entry, &rich_label); entry_selected = selection == i; /* Render label, value, and associated icons */ @@ -1006,9 +1008,6 @@ static void materialui_render_menu_list( menu_list_color, sublabel_color ); - - menu_entry_free(&entry); - free(rich_label); } } diff --git a/menu/drivers/menu_generic.c b/menu/drivers/menu_generic.c index 2e2f0080dd..195e8668b9 100644 --- a/menu/drivers/menu_generic.c +++ b/menu/drivers/menu_generic.c @@ -233,10 +233,15 @@ int generic_menu_iterate(menu_handle_t *menu, void *userdata, enum menu_action a selection = MAX(MIN(selection, (menu_entries_get_size() - 1)), 0); menu_entry_init(&entry); + /* Note: If menu_entry_action() is modified, + * will have to verify that these parameters + * remain unused... */ + entry.rich_label_enabled = false; + entry.value_enabled = false; + entry.sublabel_enabled = false; menu_entry_get(&entry, 0, selection, NULL, false); ret = menu_entry_action(&entry, (unsigned)selection, (enum menu_action)action); - menu_entry_free(&entry); if (ret) goto end; diff --git a/menu/drivers/ozone/ozone.c b/menu/drivers/ozone/ozone.c index 43ab389fe4..da1f5399e3 100644 --- a/menu/drivers/ozone/ozone.c +++ b/menu/drivers/ozone/ozone.c @@ -1285,12 +1285,14 @@ static void ozone_set_thumbnail_content(void *data, const char *s) menu_entry_t entry; menu_entry_init(&entry); + entry.label_enabled = false; + entry.rich_label_enabled = false; + entry.value_enabled = false; + entry.sublabel_enabled = false; menu_entry_get(&entry, 0, selection, NULL, true); if (!string_is_empty(entry.path)) menu_thumbnail_set_content(ozone->thumbnail_path_data, entry.path); - - menu_entry_free(&entry); } } else if (string_is_equal(s, "imageviewer")) @@ -1301,13 +1303,15 @@ static void ozone_set_thumbnail_content(void *data, const char *s) ozone_node_t *node = (ozone_node_t*)file_list_get_userdata_at_offset(selection_buf, selection); menu_entry_init(&entry); + entry.label_enabled = false; + entry.rich_label_enabled = false; + entry.value_enabled = false; + entry.sublabel_enabled = false; menu_entry_get(&entry, 0, selection, NULL, true); if (node) if (!string_is_empty(entry.path) && !string_is_empty(node->fullpath)) menu_thumbnail_set_content_image(ozone->thumbnail_path_data, node->fullpath, entry.path); - - menu_entry_free(&entry); } else if (!string_is_empty(s)) { @@ -1366,11 +1370,15 @@ static void ozone_selection_changed(ozone_handle_t *ozone, bool allow_animation) size_t new_selection = menu_navigation_get_selection(); ozone_node_t *node = (ozone_node_t*) file_list_get_userdata_at_offset(selection_buf, new_selection); - menu_entry_init(&entry); - if (!node) return; + menu_entry_init(&entry); + entry.path_enabled = false; + entry.label_enabled = false; + entry.rich_label_enabled = false; + entry.value_enabled = false; + entry.sublabel_enabled = false; menu_entry_get(&entry, 0, selection, NULL, true); if (ozone->selection != new_selection) @@ -1424,8 +1432,6 @@ static void ozone_selection_changed(ozone_handle_t *ozone, bool allow_animation) /* TODO: update savestate thumbnail and path */ } - - menu_entry_free(&entry); } static void ozone_navigation_clear(void *data, bool pending_push) diff --git a/menu/drivers/ozone/ozone_entries.c b/menu/drivers/ozone/ozone_entries.c index cea4c84dcc..80e35e0821 100644 --- a/menu/drivers/ozone/ozone_entries.c +++ b/menu/drivers/ozone/ozone_entries.c @@ -213,9 +213,14 @@ void ozone_compute_entries_position(ozone_handle_t *ozone) { /* Entry */ menu_entry_t entry; - ozone_node_t *node = NULL; + ozone_node_t *node = NULL; + const char *sublabel_str = NULL; menu_entry_init(&entry); + entry.path_enabled = false; + entry.label_enabled = false; + entry.rich_label_enabled = false; + entry.value_enabled = false; menu_entry_get(&entry, 0, (unsigned)i, NULL, true); /* Empty playlist detection: @@ -237,14 +242,20 @@ void ozone_compute_entries_position(ozone_handle_t *ozone) if (!node) continue; - node->height = ozone->dimensions.entry_height + (entry.sublabel ? ozone->dimensions.entry_spacing + 40 : 0); + node->height = ozone->dimensions.entry_height; node->wrap = false; - if (entry.sublabel) - { - char *sublabel_str = menu_entry_get_sublabel(&entry); + menu_entry_get_sublabel(&entry, &sublabel_str); - int sublabel_max_width = video_info_width - + if (!string_is_empty(sublabel_str)) + { + int sublabel_max_width; + char wrapped_sublabel_str[512]; + wrapped_sublabel_str[0] = '\0'; + + node->height += ozone->dimensions.entry_spacing + 40; + + sublabel_max_width = video_info_width - entry_padding * 2 - ozone->dimensions.entry_icon_padding * 2; if (ozone->depth == 1) @@ -253,24 +264,20 @@ void ozone_compute_entries_position(ozone_handle_t *ozone) if (ozone->show_thumbnail_bar) sublabel_max_width -= ozone->dimensions.thumbnail_bar_width; - word_wrap(sublabel_str, sublabel_str, sublabel_max_width / ozone->sublabel_font_glyph_width, false, 0); + word_wrap(wrapped_sublabel_str, sublabel_str, sublabel_max_width / ozone->sublabel_font_glyph_width, false, 0); - lines = ozone_count_lines(sublabel_str); + lines = ozone_count_lines(wrapped_sublabel_str); if (lines > 1) { node->height += lines * 15; node->wrap = true; } - - free(sublabel_str); } node->position_y = ozone->entries_height; ozone->entries_height += node->height; - - menu_entry_free(&entry); } /* Update scrolling */ @@ -467,27 +474,29 @@ border_iterate: menu_entry_t entry; menu_animation_ctx_ticker_t ticker; static const char* const ticker_spacer = OZONE_TICKER_SPACER; - char entry_value[255]; char rich_label[255]; char entry_value_ticker[255]; - char *sublabel_str; - ozone_node_t *node = NULL; - char *entry_rich_label = NULL; - bool entry_selected = false; - int text_offset = -ozone->dimensions.entry_icon_padding - ozone->dimensions.entry_icon_size; - float *icon_color = NULL; + char wrapped_sublabel_str[512]; + const char *sublabel_str = NULL; + ozone_node_t *node = NULL; + const char *entry_rich_label = NULL; + const char *entry_value = NULL; + bool entry_selected = false; + int text_offset = -ozone->dimensions.entry_icon_padding - ozone->dimensions.entry_icon_size; + float *icon_color = NULL; /* Initial ticker configuration */ ticker.type_enum = (enum menu_animation_ticker_type)settings->uints.menu_ticker_type; ticker.spacer = ticker_spacer; - entry_value[0] = '\0'; entry_selected = selection == i; node = (ozone_node_t*) file_list_get_userdata_at_offset(selection_buf, i); menu_entry_init(&entry); + entry.path_enabled = false; + entry.label_enabled = false; menu_entry_get(&entry, 0, (unsigned)i, selection_buf, true); - menu_entry_get_value(&entry, entry_value, sizeof(entry_value)); + menu_entry_get_value(&entry, &entry_value); if (!node) continue; @@ -498,7 +507,7 @@ border_iterate: goto icons_iterate; /* Prepare text */ - entry_rich_label = menu_entry_get_rich_label(&entry); + menu_entry_get_rich_label(&entry, &entry_rich_label); ticker.idx = menu_animation_get_ticker_idx(); ticker.s = rich_label; @@ -515,20 +524,22 @@ border_iterate: y = video_info_height / 2 - 60; } - sublabel_str = menu_entry_get_sublabel(&entry); + menu_entry_get_sublabel(&entry, &sublabel_str); - if (node->wrap && sublabel_str) + if (node->wrap && !string_is_empty(sublabel_str)) { - int sublabel_max_width = video_info_width - - entry_padding * 2 - ozone->dimensions.entry_icon_padding * 2; + int sublabel_max_width = video_info_width - + entry_padding * 2 - ozone->dimensions.entry_icon_padding * 2; - if (ozone->show_thumbnail_bar) - sublabel_max_width -= ozone->dimensions.thumbnail_bar_width; + if (ozone->show_thumbnail_bar) + sublabel_max_width -= ozone->dimensions.thumbnail_bar_width; - if (ozone->depth == 1) - sublabel_max_width -= (unsigned) ozone->dimensions.sidebar_width; + if (ozone->depth == 1) + sublabel_max_width -= (unsigned) ozone->dimensions.sidebar_width; - word_wrap(sublabel_str, sublabel_str, sublabel_max_width / ozone->sublabel_font_glyph_width, false, 0); + wrapped_sublabel_str[0] = '\0'; + word_wrap(wrapped_sublabel_str, sublabel_str, sublabel_max_width / ozone->sublabel_font_glyph_width, false, 0); + sublabel_str = wrapped_sublabel_str; } /* Icon */ @@ -578,7 +589,7 @@ border_iterate: /* Draw text */ ozone_draw_text(video_info, ozone, rich_label, text_offset + (unsigned) ozone->dimensions.sidebar_width + x_offset + entry_padding + ozone->dimensions.entry_icon_size + ozone->dimensions.entry_icon_padding * 2, y + ozone->dimensions.entry_height / 2 + FONT_SIZE_ENTRIES_LABEL * 3/8 + scroll_y, TEXT_ALIGN_LEFT, video_info->width, video_info->height, ozone->fonts.entries_label, COLOR_TEXT_ALPHA(ozone->theme->text_rgba, alpha_uint32), false); - if (sublabel_str) + if (!string_is_empty(sublabel_str)) ozone_draw_text(video_info, ozone, sublabel_str, (unsigned) ozone->dimensions.sidebar_width + x_offset + entry_padding + ozone->dimensions.entry_icon_padding, y + ozone->dimensions.entry_height + 1 + 5 + FONT_SIZE_ENTRIES_SUBLABEL + scroll_y, TEXT_ALIGN_LEFT, video_info->width, video_info->height, ozone->fonts.entries_sublabel, COLOR_TEXT_ALPHA(ozone->theme->text_sublabel_rgba, alpha_uint32), false); @@ -595,14 +606,8 @@ border_iterate: ozone_draw_entry_value(ozone, video_info, entry_value_ticker, (unsigned) ozone->dimensions.sidebar_width + entry_padding + x_offset + entry_width - ozone->dimensions.entry_icon_padding, y + ozone->dimensions.entry_height / 2 + FONT_SIZE_ENTRIES_LABEL * 3/8 + scroll_y, alpha_uint32, &entry); - free(entry_rich_label); - - if (sublabel_str) - free(sublabel_str); - icons_iterate: y += node->height; - menu_entry_free(&entry); } /* Text layer */ diff --git a/menu/drivers/rgui.c b/menu/drivers/rgui.c index bbd51ed6c7..2117ae173d 100644 --- a/menu/drivers/rgui.c +++ b/menu/drivers/rgui.c @@ -3389,10 +3389,11 @@ static void rgui_render(void *data, bool is_idle) for (i = new_start; i < end; i++, y += FONT_HEIGHT_STRIDE) { - char entry_value[255]; char entry_title_buf[255]; char type_str_buf[255]; menu_entry_t entry; + const char *entry_label = NULL; + const char *entry_value = NULL; size_t entry_title_max_len = 0; unsigned entry_value_len = 0; bool entry_selected = (i == selection); @@ -3402,19 +3403,19 @@ static void rgui_render(void *data, bool is_idle) if (i > (selection + 100)) continue; - entry_value[0] = '\0'; entry_title_buf[0] = '\0'; type_str_buf[0] = '\0'; /* Get current entry */ menu_entry_init(&entry); + entry.path_enabled = false; + entry.label_enabled = false; + entry.sublabel_enabled = false; menu_entry_get(&entry, 0, (unsigned)i, NULL, true); - /* Read entry parameters - * Note: can use entry.path/entry.rich_label directly, - * but have to use menu_entry_get_value() for the value - * since this function handles password entries... */ - menu_entry_get_value(&entry, entry_value, sizeof(entry_value)); + /* Read entry parameters */ + menu_entry_get_rich_label(&entry, &entry_label); + menu_entry_get_value(&entry, &entry_value); /* Get base length of entry title field */ entry_title_max_len = RGUI_TERM_WIDTH(fb_width) - (1 + 2); @@ -3478,7 +3479,7 @@ static void rgui_render(void *data, bool is_idle) /* Format entry title string */ ticker.s = entry_title_buf; ticker.len = entry_title_max_len; - ticker.str = string_is_empty(entry.rich_label) ? entry.path : entry.rich_label; + ticker.str = entry_label; ticker.selected = entry_selected; menu_animation_ticker(&ticker); @@ -3508,8 +3509,6 @@ static void rgui_render(void *data, bool is_idle) if (entry_selected) blit_line(fb_width, x, y, ">", entry_color, rgui->colors.shadow_color); - - menu_entry_free(&entry); } /* Draw mini thumbnails, if required */ @@ -4351,10 +4350,18 @@ static void rgui_update_menu_sublabel(rgui_t *rgui) if (settings->bools.menu_show_sublabels && selection < menu_entries_get_size()) { menu_entry_t entry; + const char *sublabel = NULL; + menu_entry_init(&entry); + entry.path_enabled = false; + entry.label_enabled = false; + entry.rich_label_enabled = false; + entry.value_enabled = false; menu_entry_get(&entry, 0, (unsigned)selection, NULL, true); - if (!string_is_empty(entry.sublabel)) + menu_entry_get_sublabel(&entry, &sublabel); + + if (!string_is_empty(sublabel)) { static const char* const sublabel_spacer = RGUI_TICKER_SPACER; struct string_list *list = NULL; @@ -4364,7 +4371,7 @@ static void rgui_update_menu_sublabel(rgui_t *rgui) /* Sanitise sublabel * > Replace newline characters with standard delimiter * > Remove whitespace surrounding each sublabel line */ - list = string_split(entry.sublabel, "\n"); + list = string_split(sublabel, "\n"); if (list) { for (line_index = 0; line_index < list->size; line_index++) @@ -4382,8 +4389,6 @@ static void rgui_update_menu_sublabel(rgui_t *rgui) string_list_free(list); } } - - menu_entry_free(&entry); } } diff --git a/menu/drivers/stripes.c b/menu/drivers/stripes.c index 0960b5e7bf..af26de9df7 100644 --- a/menu/drivers/stripes.c +++ b/menu/drivers/stripes.c @@ -863,11 +863,10 @@ static void stripes_update_thumbnail_path(void *data, unsigned i, char pos) playlist_t *playlist = NULL; const char *dir_thumbnails = settings->paths.directory_thumbnails; - menu_entry_init(&entry); - if (!stripes || string_is_empty(dir_thumbnails)) goto end; + menu_entry_init(&entry); menu_entry_get(&entry, 0, i, NULL, true); entry_type = menu_entry_get_type_new(&entry); @@ -996,8 +995,6 @@ end: if (pos == 'L') stripes->left_thumbnail_file_path = strdup(new_path); } - - menu_entry_free(&entry); } static void stripes_update_savestate_thumbnail_path(void *data, unsigned i) @@ -1055,8 +1052,6 @@ static void stripes_update_savestate_thumbnail_path(void *data, unsigned i) free(path); } } - - menu_entry_free(&entry); } static void stripes_update_thumbnail_image(void *data) @@ -1180,7 +1175,7 @@ static void stripes_selection_pointer_changed( menu_entry_init(&entry); if (!stripes) - goto end; + return; menu_entry_get(&entry, 0, selection, NULL, true); @@ -1244,9 +1239,6 @@ static void stripes_selection_pointer_changed( menu_animation_push(&anim_entry); } } - -end: - menu_entry_free(&entry); } static void stripes_list_open_old(stripes_handle_t *stripes, @@ -1749,8 +1741,6 @@ static void stripes_list_switch(stripes_handle_t *stripes) if (!string_is_empty(entry.path)) stripes_set_thumbnail_content(stripes, entry.path, 0 /* will be ignored */); - menu_entry_free(&entry); - stripes_update_thumbnail_path(stripes, 0, 'R'); stripes_update_thumbnail_image(stripes); } @@ -1765,8 +1755,6 @@ static void stripes_list_switch(stripes_handle_t *stripes) if (!string_is_empty(entry.path)) stripes_set_thumbnail_content(stripes, entry.path, 0 /* will be ignored */); - menu_entry_free(&entry); - stripes_update_thumbnail_path(stripes, 0, 'L'); stripes_update_thumbnail_image(stripes); } @@ -2350,7 +2338,7 @@ static int stripes_draw_item( float icon_x, icon_y, label_offset; menu_animation_ctx_ticker_t ticker; char tmp[255]; - char *ticker_str = NULL; + const char *ticker_str = NULL; unsigned entry_type = 0; const float half_size = stripes->icon_size / 2.0f; uintptr_t texture_switch = 0; @@ -2467,7 +2455,7 @@ static int stripes_draw_item( } if (!string_is_empty(entry->path)) - ticker_str = menu_entry_get_rich_label(entry); + menu_entry_get_rich_label(entry, &ticker_str); ticker.s = tmp; ticker.len = ticker_limit; @@ -2585,13 +2573,9 @@ static int stripes_draw_item( stripes->shadow_offset); iterate: - if (!string_is_empty(ticker_str)) - free(ticker_str); return 0; end: - if (!string_is_empty(ticker_str)) - free(ticker_str); return -1; } @@ -2662,7 +2646,6 @@ static void stripes_draw_items( list, color, thumb_ident, left_thumb_ident, i, current, width, height); - menu_entry_free(&entry); if (ret == -1) break; } diff --git a/menu/drivers/xmb.c b/menu/drivers/xmb.c index 2d5803641e..37d91ae54d 100644 --- a/menu/drivers/xmb.c +++ b/menu/drivers/xmb.c @@ -955,6 +955,10 @@ static void xmb_update_savestate_thumbnail_path(void *data, unsigned i) return; menu_entry_init(&entry); + entry.path_enabled = false; + entry.rich_label_enabled = false; + entry.value_enabled = false; + entry.sublabel_enabled = false; menu_entry_get(&entry, 0, i, NULL, true); if (!string_is_empty(xmb->savestate_thumbnail_file_path)) @@ -1000,8 +1004,6 @@ static void xmb_update_savestate_thumbnail_path(void *data, unsigned i) free(path); } } - - menu_entry_free(&entry); } static void xmb_update_thumbnail_image(void *data) @@ -1184,12 +1186,14 @@ static void xmb_set_thumbnail_content(void *data, const char *s) menu_entry_t entry; menu_entry_init(&entry); + entry.label_enabled = false; + entry.rich_label_enabled = false; + entry.value_enabled = false; + entry.sublabel_enabled = false; menu_entry_get(&entry, 0, selection, NULL, true); if (!string_is_empty(entry.path)) menu_thumbnail_set_content(xmb->thumbnail_path_data, entry.path); - - menu_entry_free(&entry); } } else if (string_is_equal(s, "imageviewer")) @@ -1200,13 +1204,15 @@ static void xmb_set_thumbnail_content(void *data, const char *s) xmb_node_t *node = (xmb_node_t*)file_list_get_userdata_at_offset(selection_buf, selection); menu_entry_init(&entry); + entry.label_enabled = false; + entry.rich_label_enabled = false; + entry.value_enabled = false; + entry.sublabel_enabled = false; menu_entry_get(&entry, 0, selection, NULL, true); if (node) if (!string_is_empty(entry.path) && !string_is_empty(node->fullpath)) menu_thumbnail_set_content_image(xmb->thumbnail_path_data, node->fullpath, entry.path); - - menu_entry_free(&entry); } else if (!string_is_empty(s)) { @@ -1246,12 +1252,17 @@ static void xmb_selection_pointer_changed( file_list_t *selection_buf = menu_entries_get_selection_buf_ptr(0); size_t selection = menu_navigation_get_selection(); - menu_entries_ctl(MENU_ENTRIES_CTL_LIST_GET, &menu_list); - menu_entry_init(&entry); - if (!xmb) - goto end; + return; + menu_entries_ctl(MENU_ENTRIES_CTL_LIST_GET, &menu_list); + + menu_entry_init(&entry); + entry.path_enabled = false; + entry.label_enabled = false; + entry.rich_label_enabled = false; + entry.value_enabled = false; + entry.sublabel_enabled = false; menu_entry_get(&entry, 0, selection, NULL, true); end = (unsigned)menu_entries_get_size(); @@ -1377,9 +1388,6 @@ static void xmb_selection_pointer_changed( menu_animation_push(&anim_entry); } } - -end: - menu_entry_free(&entry); } static void xmb_list_open_old(xmb_handle_t *xmb, @@ -2832,7 +2840,7 @@ static int xmb_draw_item( float icon_x, icon_y, label_offset; menu_animation_ctx_ticker_t ticker; char tmp[255]; - char *ticker_str = NULL; + const char *ticker_str = NULL; unsigned entry_type = 0; const float half_size = xmb->icon_size / 2.0f; uintptr_t texture_switch = 0; @@ -2876,11 +2884,7 @@ static int xmb_draw_item( sizeof(entry_path)); if (!string_is_empty(entry_path)) - { - if (!string_is_empty(entry->path)) - free(entry->path); - entry->path = strdup(entry_path); - } + strlcpy(entry->path, entry_path, sizeof(entry->path)); } if (string_is_equal(entry->value, @@ -2948,7 +2952,7 @@ static int xmb_draw_item( } if (!string_is_empty(entry->path)) - ticker_str = menu_entry_get_rich_label(entry); + menu_entry_get_rich_label(entry, &ticker_str); ticker.s = tmp; ticker.len = ticker_limit; @@ -2997,8 +3001,8 @@ static int xmb_draw_item( if (!string_is_empty(entry->value)) { - char entry_value[255]; - menu_entry_get_value(entry, entry_value, sizeof(entry_value)); + const char *entry_value = NULL; + menu_entry_get_value(entry, &entry_value); ticker.str = entry_value; menu_animation_ticker(&ticker); @@ -3079,8 +3083,6 @@ static int xmb_draw_item( &color[0], xmb->shadow_offset); - if (!string_is_empty(ticker_str)) - free(ticker_str); return 0; } @@ -3141,6 +3143,9 @@ static void xmb_draw_items( int ret; menu_entry_t entry; menu_entry_init(&entry); + entry.label_enabled = false; + entry.rich_label_enabled = false; + entry.sublabel_enabled = (i == current); menu_entry_get(&entry, 0, i, list, true); ret = xmb_draw_item(video_info, &entry, @@ -3149,7 +3154,6 @@ static void xmb_draw_items( list, color, i, current, width, height); - menu_entry_free(&entry); if (ret == -1) break; } diff --git a/menu/drivers/xui.cpp b/menu/drivers/xui.cpp index 7de4a69a5b..af5f5d5b09 100644 --- a/menu/drivers/xui.cpp +++ b/menu/drivers/xui.cpp @@ -584,24 +584,20 @@ static void xui_render(void *data, bool is_idle) for (i = 0; i < end; i++) { menu_entry_t entry; - char *entry_path = NULL; - char entry_value[PATH_MAX_LENGTH] = {0}; + const char *entry_path = NULL; + const char *entry_value = NULL; wchar_t msg_right[PATH_MAX_LENGTH] = {0}; wchar_t msg_left[PATH_MAX_LENGTH] = {0}; menu_entry_init(&entry); menu_entry_get(&entry, 0, i, NULL, true); - menu_entry_get_value(&entry, entry_value, sizeof(entry_value)); - entry_path = menu_entry_get_path(&entry); + menu_entry_get_value(&entry, &entry_value); + menu_entry_get_path(&entry, &entry_path); mbstowcs(msg_left, entry_path, sizeof(msg_left) / sizeof(wchar_t)); mbstowcs(msg_right, entry_value, sizeof(msg_right) / sizeof(wchar_t)); xui_set_list_text(i, msg_left, msg_right); - - menu_entry_free(&entry); - if (!string_is_empty(entry_path)) - free(entry_path); } selection = menu_navigation_get_selection(); diff --git a/menu/menu_entries.c b/menu/menu_entries.c index b7ae4ad1a1..eef2f1642b 100644 --- a/menu/menu_entries.c +++ b/menu/menu_entries.c @@ -109,84 +109,59 @@ enum menu_entry_type menu_entry_get_type(uint32_t i) return MENU_ENTRY_ACTION; } -void menu_entry_free(menu_entry_t *entry) -{ - if (!entry) - return; - if (!string_is_empty(entry->label)) - free(entry->label); - if (!string_is_empty(entry->rich_label)) - free(entry->rich_label); - if (!string_is_empty(entry->sublabel)) - free(entry->sublabel); - if (!string_is_empty(entry->path)) - free(entry->path); - if (!string_is_empty(entry->value)) - free(entry->value); - entry->path = NULL; - entry->label = NULL; - entry->value = NULL; - entry->sublabel = NULL; - entry->rich_label = NULL; -} - void menu_entry_init(menu_entry_t *entry) { - entry->path = NULL; - entry->label = NULL; - entry->value = NULL; - entry->sublabel = NULL; - entry->rich_label = NULL; - entry->enum_idx = MSG_UNKNOWN; - entry->entry_idx = 0; - entry->idx = 0; - entry->type = 0; - entry->spacing = 0; + entry->path[0] = '\0'; + entry->label[0] = '\0'; + entry->sublabel[0] = '\0'; + entry->rich_label[0] = '\0'; + entry->value[0] = '\0'; + entry->password_value[0] = '\0'; + entry->enum_idx = MSG_UNKNOWN; + entry->entry_idx = 0; + entry->idx = 0; + entry->type = 0; + entry->spacing = 0; + entry->path_enabled = true; + entry->label_enabled = true; + entry->rich_label_enabled = true; + entry->value_enabled = true; + entry->sublabel_enabled = true; } -char *menu_entry_get_path(menu_entry_t *entry) +void menu_entry_get_path(menu_entry_t *entry, const char **path) { - if (!entry || string_is_empty(entry->path)) - return NULL; - return strdup(entry->path); + if (!entry || !path) + return; + + *path = entry->path; } -/* - * Return Value - * - * The function returns a heap-allocated string if - * successful. It's the callee's responsibility to - * free this. - */ -char *menu_entry_get_rich_label(menu_entry_t *entry) +void menu_entry_get_rich_label(menu_entry_t *entry, const char **rich_label) { - if (!entry) - return NULL; + if (!entry || !rich_label) + return; + if (!string_is_empty(entry->rich_label)) - return strdup(entry->rich_label); - if (!string_is_empty(entry->path)) - return strdup(entry->path); - return NULL; + *rich_label = entry->rich_label; + else + *rich_label = entry->path; } -/* - * Return Value - * - * The function returns a heap-allocated string if - * successful. It's the callee's responsibility to - * free this. - */ -char *menu_entry_get_sublabel(menu_entry_t *entry) +void menu_entry_get_sublabel(menu_entry_t *entry, const char **sublabel) { - if (!entry || string_is_empty(entry->sublabel)) - return NULL; - return strdup(entry->sublabel); + if (!entry || !sublabel) + return; + + *sublabel = entry->sublabel; } -void menu_entry_get_label(menu_entry_t *entry, char *s, size_t len) +void menu_entry_get_label(menu_entry_t *entry, const char **label) { - if (entry && !string_is_empty(entry->label)) - strlcpy(s, entry->label, len); + if (!entry || !label) + return; + + *label = entry->label; } unsigned menu_entry_get_spacing(menu_entry_t *entry) @@ -339,20 +314,15 @@ void menu_entry_reset(uint32_t i) menu_entry_action(&entry, i, MENU_ACTION_START); } -void menu_entry_get_value(menu_entry_t *entry, char *s, size_t len) +void menu_entry_get_value(menu_entry_t *entry, const char **value) { - size_t size, i; - - if (!entry || string_is_empty(entry->value)) + if (!entry || !value) return; - size = strlcpy(s, entry->value, len); - if (menu_entry_is_password(entry)) - { - for (i = 0; i < size; i++) - s[i] = '*'; - } + *value = entry->password_value; + else + *value = entry->value; } void menu_entry_set_value(uint32_t i, const char *s) @@ -409,6 +379,7 @@ void menu_entry_get(menu_entry_t *entry, size_t stack_idx, menu_file_list_cbs_t *cbs = NULL; file_list_t *selection_buf = menu_entries_get_selection_buf_ptr(stack_idx); file_list_t *list = (userdata) ? (file_list_t*)userdata : selection_buf; + bool path_enabled = entry->path_enabled; newpath[0] = '\0'; @@ -421,8 +392,8 @@ void menu_entry_get(menu_entry_t *entry, size_t stack_idx, cbs = (menu_file_list_cbs_t*)list->list[i].actiondata; entry->idx = (unsigned)i; - if (!string_is_empty(entry_label)) - entry->label = strdup(entry_label); + if (entry->label_enabled && !string_is_empty(entry_label)) + strlcpy(entry->label, entry_label, sizeof(entry->label)); if (cbs) { @@ -433,79 +404,85 @@ void menu_entry_get(menu_entry_t *entry, size_t stack_idx, menu_entries_get_last_stack(NULL, &label, NULL, NULL, NULL); - if (cbs->action_get_value && use_representation) + if (entry->rich_label_enabled && cbs->action_label) { - char tmp[255]; - tmp[0] = '\0'; - - cbs->action_get_value(list, - &entry->spacing, entry->type, - (unsigned)i, label, - tmp, - sizeof(tmp), - path, - newpath, - sizeof(newpath) - ); - - if (!string_is_empty(tmp)) - entry->value = strdup(tmp); - } - - if (cbs->action_label) - { - char tmp[255]; - tmp[0] = '\0'; - cbs->action_label(list, entry->type, (unsigned)i, label, path, - tmp, - sizeof(tmp)); + entry->rich_label, + sizeof(entry->rich_label)); - if (!string_is_empty(tmp)) - entry->rich_label = strdup(tmp); + if (string_is_empty(entry->rich_label)) + path_enabled = true; } - if (cbs->action_sublabel) + if ((path_enabled || entry->value_enabled) && + cbs->action_get_value && + use_representation) { - char tmp[512]; - tmp[0] = '\0'; + cbs->action_get_value(list, + &entry->spacing, entry->type, + (unsigned)i, label, + entry->value, + entry->value_enabled ? sizeof(entry->value) : 0, + path, + newpath, + path_enabled ? sizeof(newpath) : 0); - if (!string_is_empty(cbs->action_sublabel_cache)) - entry->sublabel = strdup(cbs->action_sublabel_cache); - else + if (!string_is_empty(entry->value)) { + if (menu_entry_is_password(entry)) + { + size_t size, i; + size = strlcpy(entry->password_value, entry->value, + sizeof(entry->password_value)); + for (i = 0; i < size; i++) + entry->password_value[i] = '*'; + } + } + } + + if (entry->sublabel_enabled) + { + if (!string_is_empty(cbs->action_sublabel_cache)) + strlcpy(entry->sublabel, + cbs->action_sublabel_cache, sizeof(entry->sublabel)); + else if (cbs->action_sublabel) + { + char tmp[512]; + tmp[0] = '\0'; + if (cbs->action_sublabel(list, entry->type, (unsigned)i, label, path, tmp, - sizeof(tmp))) + sizeof(tmp)) > 0) { - /* if this function callback returns true, + /* If this function callback returns true, * we know that the value won't change - so we * can cache it instead. */ strlcpy(cbs->action_sublabel_cache, tmp, sizeof(cbs->action_sublabel_cache)); } - if (!string_is_empty(tmp)) - entry->sublabel = strdup(tmp); + strlcpy(entry->sublabel, tmp, sizeof(entry->sublabel)); } } } - if (!string_is_empty(path) && !use_representation) - strlcpy(newpath, path, sizeof(newpath)); - else if (cbs && cbs->setting && cbs->setting->enum_value_idx != MSG_UNKNOWN - && !cbs->setting->dont_use_enum_idx_representation) - strlcpy(newpath, - msg_hash_to_str(cbs->setting->enum_value_idx), - sizeof(newpath)); - - if (!string_is_empty(newpath)) - entry->path = strdup(newpath); + if (path_enabled) + { + if (!string_is_empty(path) && !use_representation) + strlcpy(newpath, path, sizeof(newpath)); + else if (cbs && cbs->setting && cbs->setting->enum_value_idx != MSG_UNKNOWN + && !cbs->setting->dont_use_enum_idx_representation) + strlcpy(newpath, + msg_hash_to_str(cbs->setting->enum_value_idx), + sizeof(newpath)); + if (!string_is_empty(newpath)) + strlcpy(entry->path, newpath, sizeof(entry->path)); + } } bool menu_entry_is_currently_selected(unsigned id) diff --git a/menu/menu_entries.h b/menu/menu_entries.h index d30d0bb85f..ed48b7faa5 100644 --- a/menu/menu_entries.h +++ b/menu/menu_entries.h @@ -208,19 +208,25 @@ typedef struct menu_entry unsigned type; unsigned spacing; size_t entry_idx; - char *path; - char *label; - char *sublabel; - char *rich_label; - char *value; + char path[255]; + char label[255]; + char sublabel[512]; + char rich_label[255]; + char value[255]; + char password_value[255]; bool checked; + bool path_enabled; + bool label_enabled; + bool rich_label_enabled; + bool value_enabled; + bool sublabel_enabled; } menu_entry_t; enum menu_entry_type menu_entry_get_type(uint32_t i); -char *menu_entry_get_path(menu_entry_t *entry); +void menu_entry_get_path(menu_entry_t *entry, const char **path); -void menu_entry_get_label(menu_entry_t *entry, char *s, size_t len); +void menu_entry_get_label(menu_entry_t *entry, const char **label); unsigned menu_entry_get_spacing(menu_entry_t *entry); @@ -250,11 +256,11 @@ void menu_entry_pathdir_extensions(uint32_t i, char *s, size_t len); void menu_entry_reset(uint32_t i); -char *menu_entry_get_rich_label(menu_entry_t *entry); +void menu_entry_get_rich_label(menu_entry_t *entry, const char **rich_label); -char *menu_entry_get_sublabel(menu_entry_t *entry); +void menu_entry_get_sublabel(menu_entry_t *entry, const char **sublabel); -void menu_entry_get_value(menu_entry_t *entry, char *s, size_t len); +void menu_entry_get_value(menu_entry_t *entry, const char **value); void menu_entry_set_value(uint32_t i, const char *s); @@ -276,8 +282,6 @@ int menu_entry_select(uint32_t i); int menu_entry_action(menu_entry_t *entry, unsigned i, enum menu_action action); -void menu_entry_free(menu_entry_t *entry); - void menu_entry_init(menu_entry_t *entry); RETRO_END_DECLS diff --git a/menu/menu_input.c b/menu/menu_input.c index 97066d6e6f..3cfb3f2195 100644 --- a/menu/menu_input.c +++ b/menu/menu_input.c @@ -882,12 +882,17 @@ void menu_input_post_iterate(int *ret, unsigned action) : NULL; menu_entry_init(&entry); + /* Note: If menu_input_mouse_frame() or + * menu_input_pointer_post_iterate() are + * modified, will have to verify that these + * parameters remain unused... */ + entry.rich_label_enabled = false; + entry.value_enabled = false; + entry.sublabel_enabled = false; menu_entry_get(&entry, 0, selection, NULL, false); *ret = menu_input_mouse_frame(cbs, &entry, action); if (settings->bools.menu_pointer_enable) *ret |= menu_input_pointer_post_iterate(cbs, &entry, action); - - menu_entry_free(&entry); } diff --git a/menu/menu_thumbnail_path.c b/menu/menu_thumbnail_path.c index 6022622025..d611b2879a 100644 --- a/menu/menu_thumbnail_path.c +++ b/menu/menu_thumbnail_path.c @@ -258,6 +258,10 @@ bool menu_thumbnail_set_content(menu_thumbnail_path_data_t *path_data, const cha /* Determine content image name */ fill_content_img(path_data); + /* Have to set content path to *something*... + * Just use label value (it doesn't matter) */ + strlcpy(path_data->content_path, label, sizeof(path_data->content_path)); + /* Redundant error check... */ if (string_is_empty(path_data->content_img)) return false; diff --git a/ui/drivers/cocoa/cocoatouch_menu.m b/ui/drivers/cocoa/cocoatouch_menu.m index d474bb1ab6..86768f4c35 100644 --- a/ui/drivers/cocoa/cocoatouch_menu.m +++ b/ui/drivers/cocoa/cocoatouch_menu.m @@ -113,7 +113,7 @@ static void RunActionSheet(const char* title, const struct string_list* items, { menu_entry_t entry; char buffer[PATH_MAX_LENGTH]; - char *label = NULL; + const char *label = NULL; static NSString* const cell_id = @"text"; self.parentTable = tableView; @@ -125,7 +125,7 @@ static void RunActionSheet(const char* title, const struct string_list* items, menu_entry_init(&entry); menu_entry_get(&entry, 0, (unsigned)self.i, NULL, true); - label = menu_entry_get_path(&entry); + menu_entry_get_path(&entry, &label); menu_entry_get_value(&entry, buffer, sizeof(buffer)); if (string_is_empty(label)) @@ -137,10 +137,6 @@ static void RunActionSheet(const char* title, const struct string_list* items, result.textLabel.text = BOXSTRING(label); result.detailTextLabel.text = BOXSTRING(buffer); - menu_entry_free(&entry); - if (!string_is_empty(label)) - free(label); - return result; } @@ -158,7 +154,7 @@ static void RunActionSheet(const char* title, const struct string_list* items, - (UITableViewCell*)cellForTableView:(UITableView*)tableView { menu_entry_t entry; - char *label = NULL; + const char *label = NULL; static NSString* const cell_id = @"boolean_setting"; UITableViewCell* result = @@ -175,7 +171,7 @@ static void RunActionSheet(const char* title, const struct string_list* items, menu_entry_init(&entry); menu_entry_get(&entry, 0, (unsigned)self.i, NULL, true); - label = menu_entry_get_path(&entry); + menu_entry_get_path(&entry, &label); if (!string_is_empty(label)) result.textLabel.text = BOXSTRING(label); @@ -187,9 +183,6 @@ static void RunActionSheet(const char* title, const struct string_list* items, action:@selector(handleBooleanSwitch:) forControlEvents:UIControlEventValueChanged]; [(id)result.accessoryView setOn:(menu_entry_get_bool_value(self.i))]; - menu_entry_free(&entry); - if (!string_is_empty(label)) - free(label); return result; } @@ -226,12 +219,12 @@ static void RunActionSheet(const char* title, const struct string_list* items, { menu_entry_t entry; struct string_list* items = NULL; - char *label = NULL; + const char *label = NULL; RAMenuItemEnum __weak* weakSelf = self; menu_entry_init(&entry); menu_entry_get(&entry, 0, (unsigned)self.i, NULL, true); - label = menu_entry_get_path(&entry); + menu_entry_get_path(&entry, &label); items = menu_entry_enum_values(self.i); if (!string_is_empty(label)) @@ -248,9 +241,6 @@ static void RunActionSheet(const char* title, const struct string_list* items, }); } string_list_free(items); - menu_entry_free(&entry); - if (!string_is_empty(label)) - free(label); } @end @@ -265,11 +255,11 @@ static void RunActionSheet(const char* title, const struct string_list* items, ofController:(UIViewController *)controller { menu_entry_t entry; - char *label = NULL; + const char *label = NULL; menu_entry_init(&entry); menu_entry_get(&entry, 0, (unsigned)self.i, NULL, true); - label = menu_entry_get_path(&entry); + menu_entry_get_path(&entry, &label); self.alert = [[UIAlertView alloc] @@ -290,9 +280,6 @@ static void RunActionSheet(const char* title, const struct string_list* items, selector:@selector(checkBind:) userInfo:nil repeats:YES]; - menu_entry_free(&entry); - if (!string_is_empty(label)) - free(label); } - (void)finishWithClickedButton:(bool)clicked @@ -444,14 +431,14 @@ replacementString:(NSString *)string { menu_entry_t entry; char buffer[PATH_MAX_LENGTH]; - char *label = NULL; + const char *label = NULL; UIAlertView *alertView = NULL; UITextField *field = NULL; NSString *desc = NULL; menu_entry_init(&entry); menu_entry_get(&entry, 0, (unsigned)self.i, NULL, true); - label = menu_entry_get_path(&entry); + menu_entry_get_path(&entry, &label); desc = BOXSTRING(label); @@ -474,11 +461,6 @@ replacementString:(NSString *)string field.placeholder = BOXSTRING(buffer); - menu_entry_free(&entry); - - if (!string_is_empty(label)) - free(label); - [alertView show]; }