From a84facf636b23762919c617d0c344a0d85d14a75 Mon Sep 17 00:00:00 2001 From: alfrix Date: Sun, 25 Mar 2018 12:27:17 -0300 Subject: [PATCH] Add Left Thumbnails Fix behaviour when right thumb is off and use as fallback in filebrowser Remove update_left_thumbnail_path Fix dual image in imageviewer Remove xmb_left_thumbnails_ident Requested Changes Fix last warning and button not switching thumb Better scaling Limit vertical size without changing position Change thumb cycling behaviour Remove update_left_thumbnail_image it was causing problems --- CHANGES.md | 1 + config.def.h | 2 + configuration.c | 22 ++-- configuration.h | 1 + intl/msg_hash_lbl.h | 2 + intl/msg_hash_us.h | 6 + menu/cbs/menu_cbs_get_value.c | 45 +++++++ menu/cbs/menu_cbs_scan.c | 24 ++-- menu/cbs/menu_cbs_sublabel.c | 8 +- menu/drivers/materialui.c | 5 +- menu/drivers/xmb.c | 231 ++++++++++++++++++++++++++++------ menu/menu_displaylist.c | 23 ++-- menu/menu_driver.c | 27 +++- menu/menu_driver.h | 6 +- menu/menu_setting.c | 29 +++-- msg_hash.h | 4 +- retroarch.cfg | 1 + 17 files changed, 352 insertions(+), 85 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 4fd33cccb3..fbc6cd11a9 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -9,6 +9,7 @@ - LOCALIZATION: Update Italian translation. - LOCALIZATION: Update Polish translation. - MENU: Disable XMB shadow icons by default for PowerPC and ARM for performance reasons. +- MENU/XMB: Add Left Thumbnails (additional to the right). - MENU/XMB: Fixed left/right tab regression. - MENU/XMB: Fix scaling of tall images that were cut on bottom previously. - MENU/XMB: Menu scale factor setting now changes texts length, image scaling and margins. diff --git a/config.def.h b/config.def.h index 98430898f1..6223deddcf 100644 --- a/config.def.h +++ b/config.def.h @@ -652,6 +652,8 @@ static const unsigned input_bind_timeout = 5; static const unsigned menu_thumbnails_default = 3; +static const unsigned menu_left_thumbnails_default = 0; + #ifdef IOS static const bool ui_companion_start_on_boot = false; #else diff --git a/configuration.c b/configuration.c index 2e259ebb12..78fcea8d6c 100644 --- a/configuration.c +++ b/configuration.c @@ -4,6 +4,7 @@ * Copyright (C) 2014-2017 - Jean-André Santoni * Copyright (C) 2015-2017 - Andrés Suárez * Copyright (C) 2016-2017 - Brad Parker + * Copyright (C) 2018 - Alfredo Monclús * * RetroArch 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 Found- @@ -1474,6 +1475,7 @@ static struct config_uint_setting *populate_settings_uint(settings_t *settings, SETTING_UINT("dpi_override_value", &settings->uints.menu_dpi_override_value, true, menu_dpi_override_value, false); SETTING_UINT("menu_thumbnails", &settings->uints.menu_thumbnails, true, menu_thumbnails_default, false); #ifdef HAVE_XMB + SETTING_UINT("menu_left_thumbnails", &settings->uints.menu_left_thumbnails, true, menu_left_thumbnails_default, false); SETTING_UINT("xmb_alpha_factor", &settings->uints.menu_xmb_alpha_factor, true, xmb_alpha_factor, false); SETTING_UINT("xmb_scale_factor", &settings->uints.menu_xmb_scale_factor, true, xmb_scale_factor, false); SETTING_UINT("xmb_theme", &settings->uints.menu_xmb_theme, true, xmb_icon_theme, false); @@ -2930,7 +2932,7 @@ bool config_load_override(void) config_file_t *new_conf = NULL; bool should_append = false; rarch_system_info_t *system = runloop_get_system_info(); - const char *core_name = system ? + const char *core_name = system ? system->info.library_name : NULL; const char *game_name = path_basename(path_get(RARCH_PATH_BASENAME)); @@ -3018,7 +3020,7 @@ bool config_load_override(void) if (!should_append) goto error; - /* Re-load the configuration with any overrides + /* Re-load the configuration with any overrides * that might have been found */ buf[0] = '\0'; @@ -3103,7 +3105,7 @@ bool config_unload_override(void) bool config_load_remap(void) { size_t path_size = PATH_MAX_LENGTH * sizeof(char); - char *remap_directory = NULL; + char *remap_directory = NULL; char *core_path = NULL; char *game_path = NULL; config_file_t *new_conf = NULL; @@ -3123,12 +3125,12 @@ bool config_load_remap(void) /* path to the directory containing retroarch.cfg (prefix) */ remap_directory = (char*) malloc(PATH_MAX_LENGTH * sizeof(char)); - /* final path for core-specific configuration (prefix+suffix) */ + /* final path for core-specific configuration (prefix+suffix) */ core_path = (char*) malloc(PATH_MAX_LENGTH * sizeof(char)); /* final path for game-specific configuration (prefix+suffix) */ game_path = (char*) - malloc(PATH_MAX_LENGTH * sizeof(char)); + malloc(PATH_MAX_LENGTH * sizeof(char)); remap_directory[0] = core_path[0] = game_path[0] = '\0'; strlcpy(remap_directory, @@ -3230,7 +3232,7 @@ bool config_load_shader_preset(void) char *parent_path = NULL; settings_t *settings = config_get_ptr(); rarch_system_info_t *system = runloop_get_system_info(); - const char *core_name = system + const char *core_name = system ? system->info.library_name : NULL; const char *game_name = path_basename(path_get(RARCH_PATH_BASENAME)); @@ -4181,28 +4183,28 @@ bool config_save_overrides(int override_type) char cfg[64]; cfg[0] = '\0'; - if (settings->uints.input_device[i] + if (settings->uints.input_device[i] != overrides->uints.input_device[i]) { snprintf(cfg, sizeof(cfg), "input_device_p%u", i + 1); config_set_int(conf, cfg, overrides->uints.input_device[i]); } - if (settings->uints.input_joypad_map[i] + if (settings->uints.input_joypad_map[i] != overrides->uints.input_joypad_map[i]) { snprintf(cfg, sizeof(cfg), "input_player%u_joypad_index", i + 1); config_set_int(conf, cfg, overrides->uints.input_joypad_map[i]); } - if (settings->uints.input_libretro_device[i] + if (settings->uints.input_libretro_device[i] != overrides->uints.input_libretro_device[i]) { snprintf(cfg, sizeof(cfg), "input_libretro_device_p%u", i + 1); config_set_int(conf, cfg, overrides->uints.input_libretro_device[i]); } - if (settings->uints.input_analog_dpad_mode[i] + if (settings->uints.input_analog_dpad_mode[i] != overrides->uints.input_analog_dpad_mode[i]) { snprintf(cfg, sizeof(cfg), "input_player%u_analog_dpad_mode", i + 1); diff --git a/configuration.h b/configuration.h index 02b646cb0a..61909d8a95 100644 --- a/configuration.h +++ b/configuration.h @@ -350,6 +350,7 @@ typedef struct settings unsigned video_msg_bgcolor_blue; unsigned menu_thumbnails; + unsigned menu_left_thumbnails; unsigned menu_dpi_override_value; unsigned menu_entry_normal_color; unsigned menu_entry_hover_color; diff --git a/intl/msg_hash_lbl.h b/intl/msg_hash_lbl.h index 4152488f14..88ce40ea04 100644 --- a/intl/msg_hash_lbl.h +++ b/intl/msg_hash_lbl.h @@ -1035,6 +1035,8 @@ MSG_HASH(MENU_ENUM_LABEL_THREADED_DATA_RUNLOOP_ENABLE, "threaded_data_runloop_enable") MSG_HASH(MENU_ENUM_LABEL_THUMBNAILS, "thumbnails") +MSG_HASH(MENU_ENUM_LABEL_LEFT_THUMBNAILS, + "left thumbnails") MSG_HASH(MENU_ENUM_LABEL_THUMBNAILS_DIRECTORY, "thumbnails_directory") MSG_HASH(MENU_ENUM_LABEL_THUMBNAILS_UPDATER_LIST, diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index 97584df271..9ac3a8728a 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -1631,6 +1631,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_THREADED_DATA_RUNLOOP_ENABLE, "Threaded tasks") MSG_HASH(MENU_ENUM_LABEL_VALUE_THUMBNAILS, "Thumbnails") +MSG_HASH(MENU_ENUM_LABEL_VALUE_LEFT_THUMBNAILS, + "Left Thumbnails") MSG_HASH(MENU_ENUM_LABEL_VALUE_THUMBNAILS_DIRECTORY, "Thumbnails") MSG_HASH(MENU_ENUM_LABEL_VALUE_THUMBNAILS_UPDATER_LIST, @@ -2926,6 +2928,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_THUMBNAILS, "Type of thumbnail to display." ) +MSG_HASH( + MENU_ENUM_SUBLABEL_LEFT_THUMBNAILS, + "Type of thumbnail to display at the left." + ) MSG_HASH( MENU_ENUM_SUBLABEL_TIMEDATE_ENABLE, "Shows current date and/or time inside the menu." diff --git a/menu/cbs/menu_cbs_get_value.c b/menu/cbs/menu_cbs_get_value.c index ec8c1b4005..a3679e66c0 100644 --- a/menu/cbs/menu_cbs_get_value.c +++ b/menu/cbs/menu_cbs_get_value.c @@ -1134,6 +1134,47 @@ static void menu_action_setting_disp_set_label_thumbnails( } } +static void menu_action_setting_disp_set_label_left_thumbnails( + file_list_t* list, + unsigned *w, unsigned type, unsigned i, + const char *label, + char *s, size_t len, + const char *entry_label, + const char *path, + char *s2, size_t len2) +{ + settings_t *settings = config_get_ptr(); + + if (!settings) + return; + + strlcpy(s2, path, len2); + *w = 19; + + switch (settings->uints.menu_left_thumbnails) + { + case 0: + strlcpy(s, msg_hash_to_str( + MENU_ENUM_LABEL_VALUE_OFF), len); + break; + case 1: + strlcpy(s, + msg_hash_to_str( + MENU_ENUM_LABEL_VALUE_THUMBNAIL_MODE_SCREENSHOTS), len); + break; + case 2: + strlcpy(s, + msg_hash_to_str( + MENU_ENUM_LABEL_VALUE_THUMBNAIL_MODE_TITLE_SCREENS), len); + break; + case 3: + strlcpy(s, + msg_hash_to_str( + MENU_ENUM_LABEL_VALUE_THUMBNAIL_MODE_BOXARTS), len); + break; + } +} + static void menu_action_setting_disp_set_label_menu_toggle_gamepad_combo( file_list_t* list, unsigned *w, unsigned type, unsigned i, @@ -1912,6 +1953,10 @@ static int menu_cbs_init_bind_get_string_representation_compare_label( BIND_ACTION_GET_VALUE(cbs, menu_action_setting_disp_set_label_thumbnails); break; + case MENU_ENUM_LABEL_LEFT_THUMBNAILS: + BIND_ACTION_GET_VALUE(cbs, + menu_action_setting_disp_set_label_left_thumbnails); + break; case MENU_ENUM_LABEL_INPUT_MENU_ENUM_TOGGLE_GAMEPAD_COMBO: BIND_ACTION_GET_VALUE(cbs, menu_action_setting_disp_set_label_menu_toggle_gamepad_combo); diff --git a/menu/cbs/menu_cbs_scan.c b/menu/cbs/menu_cbs_scan.c index ed7fc081c1..c878491f29 100644 --- a/menu/cbs/menu_cbs_scan.c +++ b/menu/cbs/menu_cbs_scan.c @@ -104,14 +104,22 @@ int action_switch_thumbnail(const char *path, if (!settings) return -1; - settings->uints.menu_thumbnails++; - - if (settings->uints.menu_thumbnails > 3) - settings->uints.menu_thumbnails = 0; - - menu_driver_ctl(RARCH_MENU_CTL_UPDATE_THUMBNAIL_PATH, NULL); - menu_driver_ctl(RARCH_MENU_CTL_UPDATE_THUMBNAIL_IMAGE, NULL); - + if (settings->uints.menu_thumbnails == 0) + { + settings->uints.menu_left_thumbnails++; + if (settings->uints.menu_left_thumbnails > 3) + settings->uints.menu_left_thumbnails = 1; + menu_driver_ctl(RARCH_MENU_CTL_UPDATE_THUMBNAIL_PATH, NULL); + menu_driver_ctl(RARCH_MENU_CTL_UPDATE_THUMBNAIL_IMAGE, NULL); + } + else + { + settings->uints.menu_thumbnails++; + if (settings->uints.menu_thumbnails > 3) + settings->uints.menu_thumbnails = 1; + menu_driver_ctl(RARCH_MENU_CTL_UPDATE_THUMBNAIL_PATH, NULL); + menu_driver_ctl(RARCH_MENU_CTL_UPDATE_THUMBNAIL_IMAGE, NULL); + } return 0; } diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c index 319ee1f875..9db59de319 100644 --- a/menu/cbs/menu_cbs_sublabel.c +++ b/menu/cbs/menu_cbs_sublabel.c @@ -225,6 +225,7 @@ default_sublabel_macro(action_bind_sublabel_stdin_cmd_enable, MENU_ default_sublabel_macro(action_bind_sublabel_mouse_enable, MENU_ENUM_SUBLABEL_MOUSE_ENABLE) default_sublabel_macro(action_bind_sublabel_pointer_enable, MENU_ENUM_SUBLABEL_POINTER_ENABLE) default_sublabel_macro(action_bind_sublabel_thumbnails, MENU_ENUM_SUBLABEL_THUMBNAILS) +default_sublabel_macro(action_bind_sublabel_left_thumbnails, MENU_ENUM_SUBLABEL_LEFT_THUMBNAILS) default_sublabel_macro(action_bind_sublabel_timedate_enable, MENU_ENUM_SUBLABEL_TIMEDATE_ENABLE) default_sublabel_macro(action_bind_sublabel_battery_level_enable, MENU_ENUM_SUBLABEL_BATTERY_LEVEL_ENABLE) default_sublabel_macro(action_bind_sublabel_navigation_wraparound, MENU_ENUM_SUBLABEL_NAVIGATION_WRAPAROUND) @@ -416,8 +417,8 @@ static int action_bind_sublabel_subsystem_add( if (subsystem && content_get_subsystem_rom_id() < subsystem->num_roms) snprintf(s, len, " Current Content: %s", - content_get_subsystem() == type - MENU_SETTINGS_SUBSYSTEM_ADD - ? subsystem->roms[content_get_subsystem_rom_id()].desc + content_get_subsystem() == type - MENU_SETTINGS_SUBSYSTEM_ADD + ? subsystem->roms[content_get_subsystem_rom_id()].desc : subsystem->roms[0].desc); return 0; @@ -962,6 +963,9 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_THUMBNAILS: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_thumbnails); break; + case MENU_ENUM_LABEL_LEFT_THUMBNAILS: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_left_thumbnails); + break; case MENU_ENUM_LABEL_MOUSE_ENABLE: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_mouse_enable); break; diff --git a/menu/drivers/materialui.c b/menu/drivers/materialui.c index c37f93ab55..a821ff8ff3 100644 --- a/menu/drivers/materialui.c +++ b/menu/drivers/materialui.c @@ -992,7 +992,7 @@ static void materialui_render_label_value( if (texture_switch) { - /* This will be used instead of label_color if + /* This will be used instead of label_color if * texture_switch is 'off' icon */ float pure_white[16]= { 1.00, 1.00, 1.00, 1.00, @@ -1568,7 +1568,7 @@ static void materialui_frame(void *data, video_frame_info_t *video_info) { materialui_draw_tab_begin(mui, video_info, - width, height, + width, height, footer_bg_color ? &footer_bg_color[0] : NULL, &grey_bg[0]); @@ -1860,6 +1860,7 @@ static bool materialui_load_image(void *userdata, void *data, enum menu_image_ty menu_display_allocate_white_texture(); break; case MENU_IMAGE_THUMBNAIL: + case MENU_IMAGE_LEFT_THUMBNAIL: case MENU_IMAGE_SAVESTATE_THUMBNAIL: break; } diff --git a/menu/drivers/xmb.c b/menu/drivers/xmb.c index 532cfac8bf..33027c3e77 100755 --- a/menu/drivers/xmb.c +++ b/menu/drivers/xmb.c @@ -2,6 +2,7 @@ * Copyright (C) 2011-2017 - Daniel De Matteis * Copyright (C) 2014-2017 - Jean-André Santoni * Copyright (C) 2016-2017 - Brad Parker + * Copyright (C) 2018 - Alfredo Monclús * * RetroArch 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 Found- @@ -196,12 +197,15 @@ typedef struct xmb_handle unsigned categories_active_idx; unsigned categories_active_idx_old; uintptr_t thumbnail; + uintptr_t left_thumbnail; uintptr_t savestate_thumbnail; float x; float alpha; float thumbnail_width; float thumbnail_height; + float left_thumbnail_width; + float left_thumbnail_height; float savestate_thumbnail_width; float savestate_thumbnail_height; float above_subitem_offset; @@ -243,6 +247,7 @@ typedef struct xmb_handle char *thumbnail_content; char *savestate_thumbnail_file_path; char *thumbnail_file_path; + char *left_thumbnail_file_path; char *bg_file_path; file_list_t *selection_buf_old; @@ -506,11 +511,17 @@ static xmb_node_t *xmb_copy_node(const xmb_node_t *old_node) return new_node; } -static const char *xmb_thumbnails_ident(void) +static const char *xmb_thumbnails_ident(char pos) { + char folder; settings_t *settings = config_get_ptr(); - switch (settings->uints.menu_thumbnails) + if (pos == 'R') + folder = settings->uints.menu_thumbnails; + if (pos == 'L') + folder = settings->uints.menu_left_thumbnails; + + switch (folder) { case 1: return "Named_Snaps"; @@ -981,7 +992,7 @@ end: string_list_free(list); } -static void xmb_update_thumbnail_path(void *data, unsigned i) +static void xmb_update_thumbnail_path(void *data, unsigned i, char pos) { menu_entry_t entry; unsigned entry_type = 0; @@ -1034,10 +1045,19 @@ static void xmb_update_thumbnail_path(void *data, unsigned i) if (string_is_equal(core_name, "imageviewer")) { - if (!string_is_empty(entry.label)) - strlcpy(new_path, entry.label, - sizeof(new_path)); - goto end; + if (pos == 'R' || (pos == 'L' && string_is_equal(xmb_thumbnails_ident('R'), + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF)))) + { + if (!string_is_empty(entry.label)) + strlcpy(new_path, entry.label, + sizeof(new_path)); + goto end; + } + else + { + xmb->left_thumbnail = 0; + goto end; + } } } @@ -1056,9 +1076,13 @@ static void xmb_update_thumbnail_path(void *data, unsigned i) tmp_new2[0] = '\0'; - /* Append Named_Snaps/Named_Boxart/Named_Titles */ - fill_pathname_join(tmp_new2, new_path, - xmb_thumbnails_ident(), PATH_MAX_LENGTH * sizeof(char)); + /* Append Named_Snaps/Named_Boxarts/Named_Titles */ + if (pos == 'R') + fill_pathname_join(tmp_new2, new_path, + xmb_thumbnails_ident('R'), PATH_MAX_LENGTH * sizeof(char)); + if (pos == 'L') + fill_pathname_join(tmp_new2, new_path, + xmb_thumbnails_ident('L'), PATH_MAX_LENGTH * sizeof(char)); strlcpy(new_path, tmp_new2, PATH_MAX_LENGTH * sizeof(char)); @@ -1104,7 +1128,13 @@ static void xmb_update_thumbnail_path(void *data, unsigned i) end: if (xmb && !string_is_empty(new_path)) - xmb->thumbnail_file_path = strdup(new_path); + { + if (pos == 'R') + xmb->thumbnail_file_path = strdup(new_path); + if (pos == 'L') + xmb->left_thumbnail_file_path = strdup(new_path); + } + menu_entry_free(&entry); } @@ -1170,17 +1200,32 @@ static void xmb_update_savestate_thumbnail_path(void *data, unsigned i) static void xmb_update_thumbnail_image(void *data) { xmb_handle_t *xmb = (xmb_handle_t*)data; - if (!xmb || string_is_empty(xmb->thumbnail_file_path)) + if (!xmb) return; - if (filestream_exists(xmb->thumbnail_file_path)) - task_push_image_load(xmb->thumbnail_file_path, - menu_display_handle_thumbnail_upload, NULL); - else - xmb->thumbnail = 0; + if (!(string_is_empty(xmb->thumbnail_file_path))) + { + if (filestream_exists(xmb->thumbnail_file_path)) + task_push_image_load(xmb->thumbnail_file_path, + menu_display_handle_thumbnail_upload, NULL); + else + xmb->thumbnail = 0; - free(xmb->thumbnail_file_path); - xmb->thumbnail_file_path = NULL; + free(xmb->thumbnail_file_path); + xmb->thumbnail_file_path = NULL; + } + + if (!(string_is_empty(xmb->left_thumbnail_file_path))) + { + if (filestream_exists(xmb->left_thumbnail_file_path)) + task_push_image_load(xmb->left_thumbnail_file_path, + menu_display_handle_left_thumbnail_upload, NULL); + else + xmb->left_thumbnail = 0; + + free(xmb->left_thumbnail_file_path); + xmb->left_thumbnail_file_path = NULL; + } } static void xmb_set_thumbnail_system(void *data, char*s, size_t len) @@ -1248,7 +1293,8 @@ static void xmb_selection_pointer_changed( menu_list_t *menu_list = NULL; file_list_t *selection_buf = menu_entries_get_selection_buf_ptr(0); size_t selection = menu_navigation_get_selection(); - const char *thumb_ident = xmb_thumbnails_ident(); + const char *thumb_ident = xmb_thumbnails_ident('R'); + const char *lft_thumb_ident= xmb_thumbnails_ident('L'); menu_entries_ctl(MENU_ENTRIES_CTL_LIST_GET, &menu_list); menu_entry_init(&entry); @@ -1290,8 +1336,8 @@ static void xmb_selection_pointer_changed( ia = xmb->items_active_alpha; iz = xmb->items_active_zoom; - if (!string_is_equal(thumb_ident, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF)) || !string_is_equal(lft_thumb_ident, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF))) { if ((xmb_system_tab > XMB_SYSTEM_TAB_SETTINGS && depth == 1) || @@ -1299,8 +1345,18 @@ static void xmb_selection_pointer_changed( { if (!string_is_empty(entry.path)) xmb_set_thumbnail_content(xmb, entry.path, 0 /* will be ignored */); - xmb_update_thumbnail_path(xmb, i); - xmb_update_thumbnail_image(xmb); + if (!string_is_equal(thumb_ident, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF))) + { + xmb_update_thumbnail_path(xmb, i, 'R'); + xmb_update_thumbnail_image(xmb); + } + if (!string_is_equal(lft_thumb_ident, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF))) + { + xmb_update_thumbnail_path(xmb, i, 'L'); + xmb_update_thumbnail_image(xmb); + } } else if (((entry_type == FILE_TYPE_IMAGE || entry_type == FILE_TYPE_IMAGEVIEWER || entry_type == FILE_TYPE_RDB || entry_type == FILE_TYPE_RDB_ENTRY) @@ -1308,14 +1364,34 @@ static void xmb_selection_pointer_changed( { if (!string_is_empty(entry.path)) xmb_set_thumbnail_content(xmb, entry.path, 0 /* will be ignored */); - xmb_update_thumbnail_path(xmb, i); - xmb_update_thumbnail_image(xmb); + if (!string_is_equal(thumb_ident, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF))) + { + xmb_update_thumbnail_path(xmb, i, 'R'); + xmb_update_thumbnail_image(xmb); + } + else if (!string_is_equal(lft_thumb_ident, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF))) + { + xmb_update_thumbnail_path(xmb, i, 'L'); + xmb_update_thumbnail_image(xmb); + } } else if (filebrowser_get_type() != FILEBROWSER_NONE) { xmb_reset_thumbnail_content(xmb); - xmb_update_thumbnail_path(xmb, i); - xmb_update_thumbnail_image(xmb); + if (!string_is_equal(thumb_ident, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF))) + { + xmb_update_thumbnail_path(xmb, i, 'R'); + xmb_update_thumbnail_image(xmb); + } + else if (!string_is_equal(lft_thumb_ident, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF))) + { + xmb_update_thumbnail_path(xmb, i, 'L'); + xmb_update_thumbnail_image(xmb); + } } } xmb_update_savestate_thumbnail_path(xmb, i); @@ -1501,7 +1577,9 @@ static void xmb_list_open_new(xmb_handle_t *xmb, { if (xmb->depth < 4) xmb_reset_thumbnail_content(xmb); - xmb_update_thumbnail_path(xmb, 0); + xmb_update_thumbnail_path(xmb, 0, 'R'); + xmb_update_thumbnail_image(xmb); + xmb_update_thumbnail_path(xmb, 0, 'L'); xmb_update_thumbnail_image(xmb); } } @@ -1811,7 +1889,7 @@ static void xmb_list_switch(xmb_handle_t *xmb) xmb_list_switch_new(xmb, selection_buf, dir, selection); xmb->categories_active_idx_old = (unsigned)xmb->categories_selection_ptr; - if (!string_is_equal(xmb_thumbnails_ident(), + if (!string_is_equal(xmb_thumbnails_ident('R'), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF))) { menu_entry_t entry; @@ -1824,7 +1902,23 @@ static void xmb_list_switch(xmb_handle_t *xmb) menu_entry_free(&entry); - xmb_update_thumbnail_path(xmb, 0); + xmb_update_thumbnail_path(xmb, 0, 'R'); + xmb_update_thumbnail_image(xmb); + } + if (!string_is_equal(xmb_thumbnails_ident('L'), + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF))) + { + menu_entry_t entry; + + menu_entry_init(&entry); + menu_entry_get(&entry, 0, selection, NULL, true); + + if (!string_is_empty(entry.path)) + xmb_set_thumbnail_content(xmb, entry.path, 0 /* will be ignored */); + + menu_entry_free(&entry); + + xmb_update_thumbnail_path(xmb, 0, 'L'); xmb_update_thumbnail_image(xmb); } } @@ -2159,10 +2253,13 @@ static void xmb_populate_entries(void *data, { xmb_selection_pointer_changed(xmb, false); menu_driver_ctl(RARCH_MENU_CTL_UNSET_PREVENT_POPULATE, NULL); - if (!string_is_equal(xmb_thumbnails_ident(), + if (!string_is_equal(xmb_thumbnails_ident('R'), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF))) xmb_update_thumbnail_image(xmb); xmb_update_savestate_thumbnail_image(xmb); + if (!string_is_equal(xmb_thumbnails_ident('L'), + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF))) + xmb_update_thumbnail_image(xmb); return; } @@ -2384,6 +2481,7 @@ static int xmb_draw_item( file_list_t *list, float *color, const char *thumb_ident, + const char *left_thumb_ident, uint64_t frame_count, size_t i, size_t current, @@ -2489,7 +2587,11 @@ static int xmb_draw_item( (!string_is_equal (thumb_ident, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF)) - && xmb->thumbnail) + && xmb->thumbnail) || + (!string_is_equal + (left_thumb_ident, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF)) + && xmb->left_thumbnail) ) ticker_limit = 40 * scale_mod[1]; else @@ -2640,7 +2742,8 @@ static void xmb_draw_items( xmb_node_t *core_node = NULL; size_t end = 0; uint64_t frame_count = xmb ? xmb->frame_count : 0; - const char *thumb_ident = xmb_thumbnails_ident(); + const char *thumb_ident = xmb_thumbnails_ident('R'); + const char *left_thumb_ident= xmb_thumbnails_ident('L'); if (!list || !list->size || !xmb) return; @@ -2690,7 +2793,7 @@ static void xmb_draw_items( &entry, &mymat, xmb, core_node, - list, color, thumb_ident, + list, color, thumb_ident, left_thumb_ident, frame_count, i, current, width, height); @@ -2927,7 +3030,7 @@ static void xmb_frame(void *data, video_frame_info_t *video_info) size_t percent_width = 0; math_matrix_4x4 mymat; unsigned i; - float thumb_width, thumb_height; + float thumb_width, thumb_height, left_thumb_width, left_thumb_height; menu_display_ctx_rotate_draw_t rotate_draw; char msg[1024]; char title_msg[255]; @@ -3019,7 +3122,7 @@ static void xmb_frame(void *data, video_frame_info_t *video_info) xmb->savestate_thumbnail_width, xmb->savestate_thumbnail_height, xmb->savestate_thumbnail); else if (xmb->thumbnail - && !string_is_equal(xmb_thumbnails_ident(), + && !string_is_equal(xmb_thumbnails_ident('R'), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF))) { #ifdef XMB_DEBUG @@ -3028,7 +3131,7 @@ static void xmb_frame(void *data, video_frame_info_t *video_info) #endif /* Limit thumbnail height to screen height + margin. */ - if( xmb->margins_screen_top + xmb->icon_size + xmb->thumbnail_height * scale_mod[4] >= + if( xmb->margins_screen_top + xmb->icon_size + xmb->thumbnail_height * scale_mod[4] >= (float)(height * 0.96) ) { thumb_width = xmb->thumbnail_width * @@ -3051,6 +3154,40 @@ static void xmb_frame(void *data, video_frame_info_t *video_info) xmb->margins_screen_top + xmb->icon_size + thumb_height * scale_mod[4], thumb_width, thumb_height, xmb->thumbnail); + + } + + /* Left Thumbnail */ + + if (xmb->left_thumbnail + && !string_is_equal(xmb_thumbnails_ident('L'), + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF))) + { + + /* Limit thumbnail height to screen height + margin. */ + + if( xmb->margins_screen_top + xmb->icon_size * 2.2 + xmb->left_thumbnail_height >= + (float)(height * 0.9) ) + { + left_thumb_width = (xmb->left_thumbnail_width / scale_mod[4]) * + (((float)(height * 0.9) - xmb->margins_screen_top - xmb->icon_size * 2.2) / + (xmb->left_thumbnail_height * scale_mod[4])); + left_thumb_height = (xmb->left_thumbnail_height / scale_mod[4]) * + (((float)(height * 0.9) - xmb->margins_screen_top - xmb->icon_size * 2.2) / + (xmb->left_thumbnail_height * scale_mod[4])); + } + else + { + left_thumb_width = xmb->left_thumbnail_width / scale_mod[4]; + left_thumb_height = xmb->left_thumbnail_height / scale_mod[4]; + } + + xmb_draw_thumbnail(video_info, + xmb, &coord_white[0], width, height, + xmb->margins_title_left - 10, + xmb->margins_screen_top + xmb->icon_size * 2.2 + left_thumb_height * scale_mod[4], + left_thumb_width, left_thumb_height, + xmb->left_thumbnail); } /* Clock image */ @@ -3334,6 +3471,7 @@ static void xmb_layout_ps3(xmb_handle_t *xmb, int width) xmb->thumbnail_width = 460.0 * scale_factor; + xmb->left_thumbnail_width = 430.0 * scale_factor; xmb->savestate_thumbnail_width= 460.0 * scale_factor; xmb->cursor_size = 64.0 * scale_factor; @@ -3409,6 +3547,7 @@ static void xmb_layout_psp(xmb_handle_t *xmb, int width) xmb->margins_screen_top = (256+32) * scale_factor; xmb->thumbnail_width = 460.0 * scale_factor; + xmb->left_thumbnail_width = 400.0 * scale_factor; xmb->savestate_thumbnail_width= 460.0 * scale_factor; xmb->cursor_size = 64.0; @@ -3710,6 +3849,8 @@ static void xmb_free(void *data) free(xmb->savestate_thumbnail_file_path); if (!string_is_empty(xmb->thumbnail_file_path)) free(xmb->thumbnail_file_path); + if (!string_is_empty(xmb->left_thumbnail_file_path)) + free(xmb->left_thumbnail_file_path); if (!string_is_empty(xmb->bg_file_path)) free(xmb->bg_file_path); } @@ -3754,6 +3895,16 @@ static bool xmb_load_image(void *userdata, void *data, enum menu_image_type type TEXTURE_FILTER_MIPMAP_LINEAR, &xmb->thumbnail); } break; + case MENU_IMAGE_LEFT_THUMBNAIL: + { + struct texture_image *img = (struct texture_image*)data; + xmb->left_thumbnail_height = xmb->left_thumbnail_width + * (float)img->height / (float)img->width; + video_driver_texture_unload(&xmb->left_thumbnail); + video_driver_texture_load(data, + TEXTURE_FILTER_MIPMAP_LINEAR, &xmb->left_thumbnail); + } + break; case MENU_IMAGE_SAVESTATE_THUMBNAIL: { struct texture_image *img = (struct texture_image*)data; @@ -4008,7 +4159,10 @@ static void xmb_context_reset(void *data, bool is_threaded) xmb_context_reset_background(iconpath); xmb_context_reset_horizontal_list(xmb); - if (!string_is_equal(xmb_thumbnails_ident(), + if (!string_is_equal(xmb_thumbnails_ident('R'), + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF))) + xmb_update_thumbnail_image(xmb); + if (!string_is_equal(xmb_thumbnails_ident('R'), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF))) xmb_update_thumbnail_image(xmb); xmb_update_savestate_thumbnail_image(xmb); @@ -4316,6 +4470,7 @@ static void xmb_context_destroy(void *data) video_driver_texture_unload(&xmb->textures.list[i]); video_driver_texture_unload(&xmb->thumbnail); + video_driver_texture_unload(&xmb->left_thumbnail); video_driver_texture_unload(&xmb->savestate_thumbnail); xmb_context_destroy_horizontal_list(xmb); diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index 4ff133aeaa..6141c00bc7 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -505,14 +505,14 @@ static int menu_displaylist_parse_system_info(menu_displaylist_info_t *info) MENU_SETTINGS_CORE_INFO_NONE, 0, 0); snprintf(tmp, sizeof(tmp), "Port #%d device display name: %s", controller, - input_config_get_device_display_name(controller) ? + input_config_get_device_display_name(controller) ? input_config_get_device_display_name(controller) : "N/A"); menu_entries_append_enum(info->list, tmp, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); snprintf(tmp, sizeof(tmp), "Port #%d device config name: %s", controller, - input_config_get_device_display_name(controller) ? + input_config_get_device_display_name(controller) ? input_config_get_device_config_name(controller) : "N/A"); menu_entries_append_enum(info->list, tmp, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, @@ -2596,7 +2596,7 @@ static int menu_displaylist_parse_load_content_settings( } - if (settings->bools.quick_menu_show_save_load_state + if (settings->bools.quick_menu_show_save_load_state #ifdef HAVE_CHEEVOS && !(settings->bools.cheevos_hardcore_mode_enable && cheevos_loaded) #endif @@ -5339,6 +5339,9 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, void *data) menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_THUMBNAILS, PARSE_ONLY_UINT, false); + menu_displaylist_parse_settings_enum(menu, info, + MENU_ENUM_LABEL_LEFT_THUMBNAILS, + PARSE_ONLY_UINT, false); info->need_refresh = true; info->need_push = true; @@ -6162,7 +6165,7 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, void *data) case DISPLAYLIST_LOAD_CONTENT_LIST: case DISPLAYLIST_LOAD_CONTENT_SPECIAL: menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); - + if (!string_is_empty(settings->paths.directory_menu_content)) menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_FAVORITES), @@ -6655,17 +6658,17 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, void *data) info->type_default = FILE_TYPE_SHADER_PRESET; if (video_shader_is_supported(RARCH_SHADER_CG) && - video_shader_get_type_from_ext("cgp", &is_preset) + video_shader_get_type_from_ext("cgp", &is_preset) != RARCH_SHADER_NONE) string_list_append(str_list, "cgp", attr); if (video_shader_is_supported(RARCH_SHADER_GLSL) && - video_shader_get_type_from_ext("glslp", &is_preset) + video_shader_get_type_from_ext("glslp", &is_preset) != RARCH_SHADER_NONE) string_list_append(str_list, "glslp", attr); if (video_shader_is_supported(RARCH_SHADER_SLANG) && - video_shader_get_type_from_ext("slangp", &is_preset) + video_shader_get_type_from_ext("slangp", &is_preset) != RARCH_SHADER_NONE) string_list_append(str_list, "slangp", attr); string_list_join_concat(new_exts, sizeof(new_exts), str_list, "|"); @@ -6694,17 +6697,17 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, void *data) if (video_shader_is_supported(RARCH_SHADER_CG) && - video_shader_get_type_from_ext("cg", &is_preset) + video_shader_get_type_from_ext("cg", &is_preset) != RARCH_SHADER_NONE) string_list_append(str_list, "cg", attr); if (video_shader_is_supported(RARCH_SHADER_GLSL) && - video_shader_get_type_from_ext("glsl", &is_preset) + video_shader_get_type_from_ext("glsl", &is_preset) != RARCH_SHADER_NONE) string_list_append(str_list, "glsl", attr); if (video_shader_is_supported(RARCH_SHADER_SLANG) && - video_shader_get_type_from_ext("slang", &is_preset) + video_shader_get_type_from_ext("slang", &is_preset) != RARCH_SHADER_NONE) string_list_append(str_list, "slang", attr); diff --git a/menu/menu_driver.c b/menu/menu_driver.c index c335abad97..128dd37bdc 100644 --- a/menu/menu_driver.c +++ b/menu/menu_driver.c @@ -629,7 +629,7 @@ void menu_display_draw_bg(menu_display_ctx_draw_t *draw, coords.vertex = new_vertex; coords.tex_coord = new_tex_coord; coords.lut_tex_coord = new_tex_coord; - coords.color = (const float*)draw->color; + coords.color = (const float*)draw->color; draw->coords = &coords; draw->scale_factor = 1.0f; @@ -1023,9 +1023,9 @@ void menu_display_rotate_z(menu_display_ctx_rotate_draw_t *draw, math_matrix_4x4 *b = NULL; if ( - !draw || - !menu_disp || - !menu_disp->get_default_mvp || + !draw || + !menu_disp || + !menu_disp->get_default_mvp || menu_disp->handles_transform ) return; @@ -1074,6 +1074,22 @@ void menu_display_handle_thumbnail_upload(void *task_data, free(user_data); } +void menu_display_handle_left_thumbnail_upload(void *task_data, + void *user_data, const char *err) +{ + menu_ctx_load_image_t load_image_info; + struct texture_image *img = (struct texture_image*)task_data; + + load_image_info.data = img; + load_image_info.type = MENU_IMAGE_LEFT_THUMBNAIL; + + menu_driver_load_image(&load_image_info); + + image_texture_free(img); + free(img); + free(user_data); +} + void menu_display_handle_savestate_thumbnail_upload(void *task_data, void *user_data, const char *err) { @@ -2183,7 +2199,8 @@ bool menu_driver_ctl(enum rarch_menu_ctl_state state, void *data) if (!menu_driver_ctx || !menu_driver_ctx->update_thumbnail_path) return false; - menu_driver_ctx->update_thumbnail_path(menu_userdata, (unsigned)selection); + menu_driver_ctx->update_thumbnail_path(menu_userdata, (unsigned)selection, 'L'); + menu_driver_ctx->update_thumbnail_path(menu_userdata, (unsigned)selection, 'R'); } break; case RARCH_MENU_CTL_UPDATE_THUMBNAIL_IMAGE: diff --git a/menu/menu_driver.h b/menu/menu_driver.h index ed2489c0b1..3d8a2a74b0 100644 --- a/menu/menu_driver.h +++ b/menu/menu_driver.h @@ -61,6 +61,7 @@ enum menu_image_type MENU_IMAGE_NONE = 0, MENU_IMAGE_WALLPAPER, MENU_IMAGE_THUMBNAIL, + MENU_IMAGE_LEFT_THUMBNAIL, MENU_IMAGE_SAVESTATE_THUMBNAIL }; @@ -491,7 +492,7 @@ typedef struct menu_ctx_driver int (*pointer_tap)(void *data, unsigned x, unsigned y, unsigned ptr, menu_file_list_cbs_t *cbs, menu_entry_t *entry, unsigned action); - void (*update_thumbnail_path)(void *data, unsigned i); + void (*update_thumbnail_path)(void *data, unsigned i, char pos); void (*update_thumbnail_image)(void *data); void (*set_thumbnail_system)(void *data, char* s, size_t len); void (*set_thumbnail_content)(void *data, char* s, size_t len); @@ -721,6 +722,9 @@ void menu_display_handle_wallpaper_upload(void *task_data, void menu_display_handle_thumbnail_upload(void *task_data, void *user_data, const char *err); +void menu_display_handle_left_thumbnail_upload(void *task_data, + void *user_data, const char *err); + void menu_display_handle_savestate_thumbnail_upload(void *task_data, void *user_data, const char *err); diff --git a/menu/menu_setting.c b/menu/menu_setting.c index 55cda7d72d..f076d5bd2e 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -1523,7 +1523,7 @@ static void get_string_representation_bind_device(void * data, char *s, if (map < max_devices) { - const char *device_name = input_config_get_device_display_name(map) ? + const char *device_name = input_config_get_device_display_name(map) ? input_config_get_device_display_name(map) : input_config_get_device_name(map); if (!string_is_empty(device_name)) @@ -5545,7 +5545,7 @@ static bool setting_append_list( if (string_is_equal(settings->arrays.menu_driver, "glui")) { - /* only GLUI uses these values, don't show + /* only GLUI uses these values, don't show * them on other drivers */ CONFIG_BOOL( list, list_info, @@ -5579,7 +5579,7 @@ static bool setting_append_list( #ifdef HAVE_XMB if (string_is_equal(settings->arrays.menu_driver, "xmb")) { - /* only XMB uses these values, don't show + /* only XMB uses these values, don't show * them on other drivers. */ CONFIG_UINT( list, list_info, @@ -5814,7 +5814,7 @@ static bool setting_append_list( general_write_handler, general_read_handler, SD_FLAG_NONE); - + #ifdef HAVE_LAKKA CONFIG_BOOL( list, list_info, @@ -5831,7 +5831,7 @@ static bool setting_append_list( general_read_handler, SD_FLAG_NONE); #endif - + #ifdef HAVE_XMB if (string_is_equal(settings->arrays.menu_driver, "xmb")) { @@ -5850,7 +5850,7 @@ static bool setting_append_list( general_read_handler, SD_FLAG_NONE); settings_data_list_current_add_flags(list, list_info, SD_FLAG_LAKKA_ADVANCED); - + CONFIG_STRING( list, list_info, settings->paths.menu_content_show_settings_password, @@ -5866,7 +5866,7 @@ static bool setting_append_list( settings_data_list_current_add_flags(list, list_info, SD_FLAG_ALLOW_INPUT | SD_FLAG_LAKKA_ADVANCED); } #endif - + CONFIG_BOOL( list, list_info, &settings->bools.menu_content_show_favorites, @@ -5984,7 +5984,7 @@ static bool setting_append_list( #ifdef HAVE_MATERIALUI if (string_is_equal(settings->arrays.menu_driver, "glui")) { - /* only MaterialUI uses these values, don't show + /* only MaterialUI uses these values, don't show * them on other drivers. */ CONFIG_BOOL( list, list_info, @@ -6073,6 +6073,19 @@ static bool setting_append_list( general_write_handler, general_read_handler); menu_settings_list_current_add_range(list, list_info, 0, 3, 1, true, true); + + CONFIG_UINT( + list, list_info, + &settings->uints.menu_left_thumbnails, + MENU_ENUM_LABEL_LEFT_THUMBNAILS, + MENU_ENUM_LABEL_VALUE_LEFT_THUMBNAILS, + menu_left_thumbnails_default, + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler); + menu_settings_list_current_add_range(list, list_info, 0, 3, 1, true, true); } CONFIG_BOOL( diff --git a/msg_hash.h b/msg_hash.h index 59c330a01a..781fb6d757 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -184,7 +184,7 @@ enum msg_hash_enums MSG_NETPLAY_CHANGED_NICK, MSG_ADDED_TO_FAVORITES, MSG_RESET_CORE_ASSOCIATION, - MSG_CORE_ASSOCIATION_RESET, + MSG_CORE_ASSOCIATION_RESET, MSG_AUTODETECT, MSG_AUDIO_VOLUME, MSG_AUDIO_MIXER_VOLUME, @@ -773,6 +773,7 @@ enum msg_hash_enums MENU_LABEL(CONTENT_SHOW_ADD), MENU_LABEL(XMB_RIBBON_ENABLE), MENU_LABEL(THUMBNAILS), + MENU_LABEL(LEFT_THUMBNAILS), MENU_LABEL(TIMEDATE_ENABLE), MENU_LABEL(BATTERY_LEVEL_ENABLE), MENU_LABEL(MATERIALUI_MENU_COLOR_THEME), @@ -1718,6 +1719,7 @@ enum msg_hash_enums MENU_ENUM_LABEL_CB_LAKKA_DOWNLOAD, MENU_ENUM_LABEL_CB_LAKKA_LIST, MENU_ENUM_LABEL_CB_MENU_THUMBNAIL, + MENU_ENUM_LABEL_CB_MENU_LEFT_THUMBNAIL, MENU_ENUM_LABEL_CB_MENU_SAVESTATE_THUMBNAIL, MENU_ENUM_LABEL_CB_MENU_WALLPAPER, MENU_ENUM_LABEL_CB_THUMBNAILS_UPDATER_DOWNLOAD, diff --git a/retroarch.cfg b/retroarch.cfg index f4639e8031..5517a67458 100644 --- a/retroarch.cfg +++ b/retroarch.cfg @@ -700,6 +700,7 @@ video_message_bgcolor_opacity = 1.0 # Type of thumbnail to display. 0 = none, 1 = snaps, 2 = titles, 3 = boxarts # menu_thumbnails = 0 +# menu_left_thumbnails = 0 # Wrap-around to beginning and/or end if boundary of list is reached horizontally or vertically. # menu_navigation_wraparound_enable = false