HRESULT CRetroArchVideoOptions::OnInit(XUIMessageInit * pInitData, BOOL& bHandled) { GetChildById(L"XuiMenuList", &m_menulist); GetChildById(L"XuiBackButton", &m_back); GetChildById(L"XuiTxtTitle", &m_menutitle); XuiListDeleteItems(m_menulist, 0, XuiListGetItemCount(m_menulist)); XuiTextElementSetText(m_menutitle, L"Video Options"); XuiListInsertItems(m_menulist, MENU_XUI_ITEM_HW_TEXTURE_FILTER, 1); XuiListSetText(m_menulist, MENU_XUI_ITEM_HW_TEXTURE_FILTER, g_settings.video.smooth ? L"Default Filter: Linear" : L"Default Filter: Nearest"); XuiListInsertItems(m_menulist, MENU_XUI_ITEM_GAMMA_CORRECTION_ENABLED, 1); XuiListSetText(m_menulist, MENU_XUI_ITEM_GAMMA_CORRECTION_ENABLED, g_extern.console.screen.gamma_correction ? L"Gamma Correction: ON" : L"Gamma correction: OFF"); if (driver.video_poke->set_aspect_ratio) driver.video_poke->set_aspect_ratio(driver.video_data, g_settings.video.aspect_ratio_idx); menu_settings_create_menu_item_label_w(strw_buffer, S_LBL_ASPECT_RATIO, sizeof(strw_buffer)); XuiListInsertItems(m_menulist, MENU_XUI_ITEM_ASPECT_RATIO, 1); XuiListSetText(m_menulist, MENU_XUI_ITEM_ASPECT_RATIO, strw_buffer); XuiListInsertItems(m_menulist, MENU_XUI_ITEM_RESIZE_MODE, 1); XuiListSetText(m_menulist, MENU_XUI_ITEM_RESIZE_MODE, L"Custom Ratio ..."); driver.video->set_rotation(driver.video_data, g_settings.video.rotation); menu_settings_create_menu_item_label_w(strw_buffer, S_LBL_ROTATION, sizeof(strw_buffer)); XuiListInsertItems(m_menulist, MENU_XUI_ITEM_ORIENTATION, 1); XuiListSetText(m_menulist, MENU_XUI_ITEM_ORIENTATION, strw_buffer); return 0; }
HRESULT CRetroArchVideoOptions::OnControlNavigate(XUIMessageControlNavigate *pControlNavigateData, BOOL& bHandled) { bool aspectratio_changed = false; int current_index; current_index = XuiListGetCurSel(m_menulist, NULL); unsigned input = pControlNavigateData->nControlNavigate; unsigned action = xui_input_to_rgui_action(input); switch (current_index) { case MENU_XUI_ITEM_HW_TEXTURE_FILTER: menu_set_settings(RGUI_SETTINGS_VIDEO_FILTER, action); XuiListSetText(m_menulist, MENU_XUI_ITEM_HW_TEXTURE_FILTER, g_settings.video.smooth ? L"Default Filter: Linear" : L"Default Filter: Nearest"); break; case MENU_XUI_ITEM_GAMMA_CORRECTION_ENABLED: if (action == RGUI_ACTION_LEFT || action == RGUI_ACTION_RIGHT || action == RGUI_ACTION_OK) { g_extern.console.screen.gamma_correction = g_extern.console.screen.gamma_correction ? 0 : 1; XuiListSetText(m_menulist, MENU_XUI_ITEM_GAMMA_CORRECTION_ENABLED, g_extern.console.screen.gamma_correction ? L"Gamma correction: ON" : L"Gamma correction: OFF"); msg_queue_push(g_extern.msg_queue, "You need to restart for this change to take effect.\n", 1, 90); } break; case MENU_XUI_ITEM_ASPECT_RATIO: menu_set_settings(RGUI_SETTINGS_VIDEO_ASPECT_RATIO, action); menu_settings_create_menu_item_label_w(strw_buffer, S_LBL_ASPECT_RATIO, sizeof(strw_buffer)); XuiListSetText(m_menulist, MENU_XUI_ITEM_ASPECT_RATIO, strw_buffer); break; case MENU_XUI_ITEM_ORIENTATION: menu_set_settings(RGUI_SETTINGS_VIDEO_ROTATION, action); menu_settings_create_menu_item_label_w(strw_buffer, S_LBL_ROTATION, sizeof(strw_buffer)); XuiListSetText(m_menulist, MENU_XUI_ITEM_ORIENTATION, strw_buffer); driver.video->set_rotation(driver.video_data, g_settings.video.rotation); break; } bHandled = TRUE; switch(action) { case RGUI_ACTION_LEFT: case RGUI_ACTION_RIGHT: case RGUI_ACTION_UP: case RGUI_ACTION_DOWN: pControlNavigateData->hObjDest = pControlNavigateData->hObjSource; break; default: break; } return 0; }
HRESULT CRetroArchAudioOptions::OnControlNavigate(XUIMessageControlNavigate *pControlNavigateData, BOOL& bHandled) { int current_index = XuiListGetCurSel(m_menulist, NULL); unsigned input = pControlNavigateData->nControlNavigate; unsigned action = xui_input_to_rgui_action(input); switch (current_index) { case MENU_XUI_ITEM_AUDIO_MUTE_AUDIO: menu_set_settings(RGUI_SETTINGS_AUDIO_MUTE, action); XuiListSetText(m_menulist, MENU_XUI_ITEM_AUDIO_MUTE_AUDIO, g_extern.audio_data.mute ? L"Mute Audio : ON" : L"Mute Audio : OFF"); break; } bHandled = TRUE; switch(action) { case RGUI_ACTION_LEFT: case RGUI_ACTION_RIGHT: case RGUI_ACTION_UP: case RGUI_ACTION_DOWN: pControlNavigateData->hObjDest = pControlNavigateData->hObjSource; break; default: break; } return 0; }
HRESULT CRetroArchControls::OnControlNavigate( XUIMessageControlNavigate *pControlNavigateData, BOOL& bHandled) { char button[128]; char buttons[RARCH_FIRST_META_KEY][128]; int i, current_index; for(i = 0; i < RARCH_FIRST_META_KEY; i++) { struct platform_bind key_label; strlcpy(key_label.desc, "Unknown", sizeof(key_label.desc)); key_label.joykey = g_settings.input.binds[rgui->current_pad][i].joykey; if (driver.input->set_keybinds) driver.input->set_keybinds(&key_label, 0, 0, 0, (1ULL << KEYBINDS_ACTION_GET_BIND_LABEL)); snprintf(buttons[i], sizeof(buttons[i]), "%s #%d: %s", g_settings.input.binds[rgui->current_pad][i].desc, rgui->current_pad, key_label.desc); mbstowcs(strw_buffer, buttons[i], sizeof(strw_buffer) / sizeof(wchar_t)); XuiListSetText(m_menulist, i, strw_buffer); } current_index = XuiListGetCurSel(m_menulist, NULL); unsigned input = pControlNavigateData->nControlNavigate; unsigned action = xui_input_to_rgui_action(input); switch(current_index) { case SETTING_CONTROLS_DPAD_EMULATION: break; case SETTING_CONTROLS_DEFAULT_ALL: break; default: break; } //set_dpad_emulation_label(rgui->current_pad, button, sizeof(button)); //mbstowcs(strw_buffer, button, sizeof(strw_buffer) / sizeof(wchar_t)); //XuiListSetText(m_menulist, SETTING_CONTROLS_DPAD_EMULATION, strw_buffer); XuiListSetText(m_menulist, SETTING_CONTROLS_DPAD_EMULATION, L"Stub"); XuiListSetText(m_menulist, SETTING_CONTROLS_DEFAULT_ALL, L"Reset all buttons to default"); return 0; }
HRESULT CRetroArchSettings::OnControlNavigate(XUIMessageControlNavigate *pControlNavigateData, BOOL& bHandled) { int current_index; xdk_d3d_video_t *device_ptr = (xdk_d3d_video_t*)driver.video_data; current_index = XuiListGetCurSel(m_menulist, NULL); unsigned input = pControlNavigateData->nControlNavigate; unsigned action = xui_input_to_rgui_action(input); switch(current_index) { case INGAME_MENU_REWIND_ENABLED: menu_set_settings(RGUI_SETTINGS_REWIND_ENABLE, action); XuiListSetText(m_menulist, INGAME_MENU_REWIND_ENABLED, g_settings.rewind_enable ? L"Rewind: ON" : L"Rewind: OFF"); break; case INGAME_MENU_REWIND_GRANULARITY: menu_set_settings(RGUI_SETTINGS_REWIND_GRANULARITY, action); menu_settings_create_menu_item_label_w(strw_buffer, S_LBL_REWIND_GRANULARITY, sizeof(strw_buffer)); XuiListSetText(m_menulist, INGAME_MENU_REWIND_GRANULARITY, strw_buffer); break; case SETTING_EMU_SHOW_DEBUG_INFO_MSG: menu_set_settings(RGUI_SETTINGS_DEBUG_TEXT, action); XuiListSetText(m_menulist, SETTING_EMU_SHOW_DEBUG_INFO_MSG, g_settings.fps_show ? L"Show Framerate: ON" : L"Show Framerate: OFF"); break; default: break; } bHandled = TRUE; switch(action) { case RGUI_ACTION_LEFT: case RGUI_ACTION_RIGHT: case RGUI_ACTION_UP: case RGUI_ACTION_DOWN: pControlNavigateData->hObjDest = pControlNavigateData->hObjSource; break; default: break; } return 0; }
static void rmenu_xui_list_insert(void *data, const char *path, size_t list_size) { (void)data; wchar_t buf[PATH_MAX]; XuiListInsertItems(m_menulist, list_size, 1); mbstowcs(buf, path, sizeof(buf) / sizeof(wchar_t)); XuiListSetText(m_menulist, list_size, buf); }
static void rmenu_xui_list_insert(file_list_t *list, const char *path, const char *, size_t list_size) { wchar_t buf[PATH_MAX_LENGTH] = {0}; XuiListInsertItems(m_menulist, list_size, 1); mbstowcs(buf, path, sizeof(buf) / sizeof(wchar_t)); XuiListSetText(m_menulist, list_size, buf); }
HRESULT CRetroArchCoreOptions::OnControlNavigate(XUIMessageControlNavigate *pControlNavigateData, BOOL& bHandled) { unsigned current_index = XuiListGetCurSel(m_menulist, NULL); unsigned input = pControlNavigateData->nControlNavigate; unsigned action = xui_input_to_rgui_action(input); if (g_extern.system.core_options) { bool update_item = false; switch (action) { case RGUI_ACTION_LEFT: core_option_prev(g_extern.system.core_options, current_index); update_item = true; break; case RGUI_ACTION_RIGHT: core_option_next(g_extern.system.core_options, current_index); update_item = true; break; } if (update_item) { char label[256]; strlcpy(label, core_option_get_desc(g_extern.system.core_options, current_index), sizeof(label)); snprintf(label, sizeof(label), "%s : %s", label, core_option_get_val(g_extern.system.core_options, current_index)); mbstowcs(strw_buffer, label, sizeof(strw_buffer) / sizeof(wchar_t)); XuiListSetText(m_menulist, current_index, strw_buffer); } } bHandled = TRUE; switch(action) { case RGUI_ACTION_LEFT: case RGUI_ACTION_RIGHT: case RGUI_ACTION_UP: case RGUI_ACTION_DOWN: pControlNavigateData->hObjDest = pControlNavigateData->hObjSource; break; default: break; } return 0; }
static void xui_list_insert(void *data, file_list_t *list, const char *path, const char *fullpath, const char *unused, size_t list_size, unsigned entry_type) { wchar_t buf[PATH_MAX_LENGTH] = {0}; XuiListInsertItems(m_menulist, list_size, 1); mbstowcs(buf, path, sizeof(buf) / sizeof(wchar_t)); XuiListSetText(m_menulist, list_size, buf); }
HRESULT CRetroArchAudioOptions::OnInit(XUIMessageInit * pInitData, BOOL& bHandled) { GetChildById(L"XuiMenuList", &m_menulist); GetChildById(L"XuiBackButton", &m_back); GetChildById(L"XuiTxtTitle", &m_menutitle); XuiListDeleteItems(m_menulist, 0, XuiListGetItemCount(m_menulist)); XuiTextElementSetText(m_menutitle, L"Audio Options"); XuiListInsertItems(m_menulist, MENU_XUI_ITEM_AUDIO_MUTE_AUDIO, 1); XuiListSetText(m_menulist, MENU_XUI_ITEM_AUDIO_MUTE_AUDIO, g_extern.audio_data.mute ? L"Mute Audio : ON" : L"Mute Audio : OFF"); return 0; }
void filebrowser_fetch_directory_entries(uint64_t action) { filebrowser_iterate(rgui->browser, action); mbstowcs(strw_buffer, rgui->browser->current_dir.directory_path, sizeof(strw_buffer) / sizeof(wchar_t)); XuiTextElementSetText(m_menutitle, strw_buffer); XuiListDeleteItems(m_menulist, 0, XuiListGetItemCount(m_menulist)); XuiListInsertItems(m_menulist, 0, rgui->browser->list->size); for(unsigned i = 0; i < rgui->browser->list->size; i++) { char fname_tmp[256]; fill_pathname_base(fname_tmp, rgui->browser->list->elems[i].data, sizeof(fname_tmp)); mbstowcs(strw_buffer, fname_tmp, sizeof(strw_buffer) / sizeof(wchar_t)); XuiListSetText(m_menulist, i, strw_buffer); } }
static void rmenu_xui_render(void) { size_t begin, end; char title[256]; const char *dir = NULL; unsigned menu_type = 0; unsigned menu_type_is = 0; if (!driver.menu || driver.menu->need_refresh && (g_extern.lifecycle_state & (1ULL << MODE_MENU)) && !driver.menu->msg_force) return; begin = driver.menu->selection_ptr; end = file_list_get_size(driver.menu->selection_buf); rmenu_xui_render_background(); file_list_get_last(driver.menu->menu_stack, &dir, &menu_type); if (driver.menu_ctx && driver.menu_ctx->backend && driver.menu_ctx->backend->type_is) menu_type_is = driver.menu_ctx->backend->type_is(menu_type); if (menu_type == MENU_SETTINGS_CORE) snprintf(title, sizeof(title), "CORE SELECTION %s", dir); else if (menu_type == MENU_SETTINGS_DEFERRED_CORE) snprintf(title, sizeof(title), "DETECTED CORES %s", dir); else if (menu_type == MENU_SETTINGS_CONFIG) snprintf(title, sizeof(title), "CONFIG %s", dir); else if (menu_type == MENU_SETTINGS_DISK_APPEND) snprintf(title, sizeof(title), "DISK APPEND %s", dir); else if (menu_type == MENU_SETTINGS_VIDEO_OPTIONS) strlcpy(title, "VIDEO OPTIONS", sizeof(title)); else if (menu_type == MENU_SETTINGS_INPUT_OPTIONS) strlcpy(title, "INPUT OPTIONS", sizeof(title)); else if (menu_type == MENU_SETTINGS_OVERLAY_OPTIONS) strlcpy(title, "OVERLAY OPTIONS", sizeof(title)); else if (menu_type == MENU_SETTINGS_NETPLAY_OPTIONS) strlcpy(title, "NETPLAY OPTIONS", sizeof(title)); else if (menu_type == MENU_SETTINGS_PATH_OPTIONS) strlcpy(title, "PATH OPTIONS", sizeof(title)); else if (menu_type == MENU_SETTINGS_OPTIONS) strlcpy(title, "SETTINGS", sizeof(title)); else if (menu_type == MENU_SETTINGS_DRIVERS) strlcpy(title, "DRIVER OPTIONS", sizeof(title)); else if (menu_type == MENU_SETTINGS_PERFORMANCE_COUNTERS) strlcpy(title, "PERFORMANCE COUNTERS", sizeof(title)); else if (menu_type == MENU_SETTINGS_PERFORMANCE_COUNTERS_LIBRETRO) strlcpy(title, "CORE PERFORMANCE COUNTERS", sizeof(title)); else if (menu_type == MENU_SETTINGS_PERFORMANCE_COUNTERS_FRONTEND) strlcpy(title, "FRONTEND PERFORMANCE COUNTERS", sizeof(title)); #ifdef HAVE_SHADER_MANAGER else if (menu_type == MENU_SETTINGS_SHADER_OPTIONS) strlcpy(title, "SHADER OPTIONS", sizeof(title)); #endif else if (menu_type == MENU_SETTINGS_FONT_OPTIONS) strlcpy(title, "FONT OPTIONS", sizeof(title)); else if (menu_type == MENU_SETTINGS_GENERAL_OPTIONS) strlcpy(title, "GENERAL OPTIONS", sizeof(title)); else if (menu_type == MENU_SETTINGS_AUDIO_OPTIONS) strlcpy(title, "AUDIO OPTIONS", sizeof(title)); else if (menu_type == MENU_SETTINGS_DISK_OPTIONS) strlcpy(title, "DISK OPTIONS", sizeof(title)); else if (menu_type == MENU_SETTINGS_CORE_OPTIONS) strlcpy(title, "CORE OPTIONS", sizeof(title)); else if (menu_type == MENU_SETTINGS_CORE_INFO) strlcpy(title, "CORE INFO", sizeof(title)); else if (menu_type == MENU_SETTINGS_PRIVACY_OPTIONS) strlcpy(title, "PRIVACY OPTIONS", sizeof(title)); #ifdef HAVE_SHADER_MANAGER else if (menu_type_is == MENU_SETTINGS_SHADER_OPTIONS) snprintf(title, sizeof(title), "SHADER %s", dir); #endif else if ((menu_type == MENU_SETTINGS_INPUT_OPTIONS) || (menu_type == MENU_SETTINGS_PATH_OPTIONS) || (menu_type == MENU_SETTINGS_OPTIONS) || (menu_type == MENU_SETTINGS_CUSTOM_VIEWPORT || menu_type == MENU_SETTINGS_CUSTOM_VIEWPORT_2) || menu_type == MENU_SETTINGS_CUSTOM_BIND || menu_type == MENU_START_SCREEN || menu_type == MENU_SETTINGS) snprintf(title, sizeof(title), "MENU %s", dir); else if (menu_type == MENU_SETTINGS_OPEN_HISTORY) strlcpy(title, "LOAD HISTORY", sizeof(title)); else if (menu_type == MENU_INFO_SCREEN) strlcpy(title, "INFO", sizeof(title)); #ifdef HAVE_OVERLAY else if (menu_type == MENU_SETTINGS_OVERLAY_PRESET) snprintf(title, sizeof(title), "OVERLAY %s", dir); #endif else if (menu_type == MENU_SETTINGS_VIDEO_SOFTFILTER) snprintf(title, sizeof(title), "FILTER %s", dir); else if (menu_type == MENU_SETTINGS_AUDIO_DSP_FILTER) snprintf(title, sizeof(title), "DSP FILTER %s", dir); else if (menu_type == MENU_BROWSER_DIR_PATH) snprintf(title, sizeof(title), "BROWSER DIR %s", dir); else if (menu_type == MENU_CONTENT_DIR_PATH) snprintf(title, sizeof(title), "CONTENT DIR %s", dir); else if (menu_type == MENU_SCREENSHOT_DIR_PATH) snprintf(title, sizeof(title), "SCREENSHOT DIR %s", dir); else if (menu_type == MENU_AUTOCONFIG_DIR_PATH) snprintf(title, sizeof(title), "AUTOCONFIG DIR %s", dir); else if (menu_type == MENU_SHADER_DIR_PATH) snprintf(title, sizeof(title), "SHADER DIR %s", dir); else if (menu_type == MENU_FILTER_DIR_PATH) snprintf(title, sizeof(title), "FILTER DIR %s", dir); else if (menu_type == MENU_DSP_FILTER_DIR_PATH) snprintf(title, sizeof(title), "DSP_FILTER DIR %s", dir); else if (menu_type == MENU_SAVESTATE_DIR_PATH) snprintf(title, sizeof(title), "SAVESTATE DIR %s", dir); #ifdef HAVE_DYNAMIC else if (menu_type == MENU_LIBRETRO_DIR_PATH) snprintf(title, sizeof(title), "LIBRETRO DIR %s", dir); #endif else if (menu_type == MENU_CONFIG_DIR_PATH) snprintf(title, sizeof(title), "CONFIG DIR %s", dir); else if (menu_type == MENU_SAVEFILE_DIR_PATH) snprintf(title, sizeof(title), "SAVEFILE DIR %s", dir); #ifdef HAVE_OVERLAY else if (menu_type == MENU_OVERLAY_DIR_PATH) snprintf(title, sizeof(title), "OVERLAY DIR %s", dir); #endif else if (menu_type == MENU_SYSTEM_DIR_PATH) snprintf(title, sizeof(title), "SYSTEM DIR %s", dir); else if (menu_type == MENU_ASSETS_DIR_PATH) snprintf(title, sizeof(title), "ASSETS DIR %s", dir); else { if (driver.menu->defer_core) snprintf(title, sizeof(title), "CONTENT %s", dir); else { const char *core_name = driver.menu->info.library_name; if (!core_name) core_name = g_extern.system.info.library_name; if (!core_name) core_name = "No Core"; snprintf(title, sizeof(title), "CONTENT (%s) %s", core_name, dir); } } mbstowcs(strw_buffer, title, sizeof(strw_buffer) / sizeof(wchar_t)); XuiTextElementSetText(m_menutitle, strw_buffer); char title_buf[256]; menu_ticker_line(title_buf, RXUI_TERM_WIDTH - 3, g_extern.frame_count / 15, title, true); blit_line(RXUI_TERM_START_X + 15, 15, title_buf, true); char title_msg[64]; const char *core_name = driver.menu->info.library_name; if (!core_name) core_name = g_extern.system.info.library_name; if (!core_name) core_name = "No Core"; const char *core_version = driver.menu->info.library_version; if (!core_version) core_version = g_extern.system.info.library_version; if (!core_version) core_version = ""; snprintf(title_msg, sizeof(title_msg), "%s - %s %s", PACKAGE_VERSION, core_name, core_version); blit_line(RXUI_TERM_START_X + 15, (RXUI_TERM_HEIGHT * FONT_HEIGHT_STRIDE) + RXUI_TERM_START_Y + 2, title_msg, true); unsigned x, y; size_t i; x = RXUI_TERM_START_X; y = RXUI_TERM_START_Y; for (i = begin; i < end; i++/*, y += FONT_HEIGHT_STRIDE */) { const char *path = 0; unsigned type = 0; file_list_get_at_offset(driver.menu->selection_buf, i, &path, &type); char message[256]; char type_str[256]; unsigned w = 19; if (menu_type == MENU_SETTINGS_INPUT_OPTIONS || menu_type == MENU_SETTINGS_CUSTOM_BIND) w = 21; else if (menu_type == MENU_SETTINGS_PATH_OPTIONS) w = 24; if (type >= MENU_SETTINGS_SHADER_FILTER && type <= MENU_SETTINGS_SHADER_LAST) { // HACK. Work around that we're using the menu_type as dir type to propagate state correctly. if ((menu_type_is == MENU_SETTINGS_SHADER_OPTIONS) && (menu_type_is == MENU_SETTINGS_SHADER_OPTIONS)) { type = MENU_FILE_DIRECTORY; strlcpy(type_str, "(DIR)", sizeof(type_str)); w = 5; } else if (type == MENU_SETTINGS_SHADER_OPTIONS || type == MENU_SETTINGS_SHADER_PRESET) strlcpy(type_str, "...", sizeof(type_str)); else if (type == MENU_SETTINGS_SHADER_FILTER) snprintf(type_str, sizeof(type_str), "%s", g_settings.video.smooth ? "Linear" : "Nearest"); else if (driver.menu_ctx && driver.menu_ctx->backend && driver.menu_ctx->backend->shader_manager_get_str) driver.menu_ctx->backend->shader_manager_get_str(driver.menu->shader, type_str, sizeof(type_str), type); } else // Pretty-print libretro cores from menu. if (menu_type == MENU_SETTINGS_CORE || menu_type == MENU_SETTINGS_DEFERRED_CORE) { if (type == MENU_FILE_PLAIN) { strlcpy(type_str, "(CORE)", sizeof(type_str)); file_list_get_alt_at_offset(driver.menu->selection_buf, i, &path); w = 6; } else { strlcpy(type_str, "(DIR)", sizeof(type_str)); type = MENU_FILE_DIRECTORY; w = 5; } } else if (menu_type == MENU_SETTINGS_CONFIG || #ifdef HAVE_OVERLAY menu_type == MENU_SETTINGS_OVERLAY_PRESET || #endif menu_type == MENU_SETTINGS_VIDEO_SOFTFILTER || menu_type == MENU_SETTINGS_AUDIO_DSP_FILTER || menu_type == MENU_SETTINGS_DISK_APPEND || menu_type_is == MENU_FILE_DIRECTORY) { if (type == MENU_FILE_PLAIN) { strlcpy(type_str, "(FILE)", sizeof(type_str)); w = 6; } else if (type == MENU_FILE_USE_DIRECTORY) { *type_str = '\0'; w = 0; } else { strlcpy(type_str, "(DIR)", sizeof(type_str)); type = MENU_FILE_DIRECTORY; w = 5; } } else if (menu_type == MENU_SETTINGS_OPEN_HISTORY) { *type_str = '\0'; w = 0; } else if (type >= MENU_SETTINGS_CORE_OPTION_START) strlcpy(type_str, core_option_get_val(g_extern.system.core_options, type - MENU_SETTINGS_CORE_OPTION_START), sizeof(type_str)); else if (driver.menu_ctx && driver.menu_ctx->backend && driver.menu_ctx->backend->setting_set_label) driver.menu_ctx->backend->setting_set_label(type_str, sizeof(type_str), &w, type); char entry_title_buf[256]; char type_str_buf[64]; bool selected = i == driver.menu->selection_ptr; strlcpy(entry_title_buf, path, sizeof(entry_title_buf)); strlcpy(type_str_buf, type_str, sizeof(type_str_buf)); #if 0 if ((type == MENU_FILE_PLAIN || type == MENU_FILE_DIRECTORY)) menu_ticker_line(entry_title_buf, RXUI_TERM_WIDTH - (w + 1 + 2), g_extern.frame_count / 15, path, selected); else menu_ticker_line(type_str_buf, w, g_extern.frame_count / 15, type_str, selected); #endif snprintf(message, sizeof(message), "%s : %s", entry_title_buf, type_str_buf); wchar_t msg_w[256]; mbstowcs(msg_w, message, sizeof(msg_w) / sizeof(wchar_t)); XuiListSetText(m_menulist, i, msg_w); blit_line(x, y, message, i); } if (driver.menu->keyboard.display) { char msg[1024]; const char *str = *driver.menu->keyboard.buffer; if (!str) str = ""; snprintf(msg, sizeof(msg), "%s\n%s", driver.menu->keyboard.label, str); rmenu_xui_render_messagebox(msg); } }
static void rmenu_xui_render(void) { size_t begin, end; char title[256]; const char *dir = NULL; const char *label = NULL; unsigned menu_type = 0; if (!driver.menu || driver.menu->need_refresh && g_extern.is_menu && !driver.menu->msg_force) return; begin = driver.menu->selection_ptr; end = menu_list_get_size(driver.menu->menu_list); rmenu_xui_render_background(); menu_list_get_last_stack(driver.menu->menu_list, &dir, &label, &menu_type); get_title(label, dir, menu_type, title, sizeof(title)); mbstowcs(strw_buffer, title, sizeof(strw_buffer) / sizeof(wchar_t)); XuiTextElementSetText(m_menutitle, strw_buffer); char title_buf[256]; menu_ticker_line(title_buf, RXUI_TERM_WIDTH - 3, g_extern.frame_count / 15, title, true); blit_line(RXUI_TERM_START_X + 15, 15, title_buf, true); char title_msg[64]; const char *core_name = g_extern.menu.info.library_name; if (!core_name) core_name = g_extern.system.info.library_name; if (!core_name) core_name = "No Core"; const char *core_version = g_extern.menu.info.library_version; if (!core_version) core_version = g_extern.system.info.library_version; if (!core_version) core_version = ""; snprintf(title_msg, sizeof(title_msg), "%s - %s %s", PACKAGE_VERSION, core_name, core_version); blit_line(RXUI_TERM_START_X + 15, (RXUI_TERM_HEIGHT * FONT_HEIGHT_STRIDE) + RXUI_TERM_START_Y + 2, title_msg, true); unsigned x, y; size_t i; x = RXUI_TERM_START_X; y = RXUI_TERM_START_Y; for (i = begin; i < end; i++/*, y += FONT_HEIGHT_STRIDE */) { char message[PATH_MAX], type_str[PATH_MAX], entry_title_buf[PATH_MAX], type_str_buf[PATH_MAX], path_buf[PATH_MAX]; const char *path = NULL, *entry_label = NULL; unsigned type = 0, w = 0; bool selected = false; menu_list_get_at_offset(driver.menu->menu_list->selection_buf, i, &path, &entry_label, &type); disp_set_label(driver.menu->menu_list->selection_buf, &w, type, i, label, type_str, sizeof(type_str), entry_label, path, path_buf, sizeof(path_buf)); selected = (i == driver.menu->selection_ptr); #if 0 if ((type == MENU_FILE_PLAIN || type == MENU_FILE_DIRECTORY)) menu_ticker_line(entry_title_buf, RXUI_TERM_WIDTH - (w + 1 + 2), g_extern.frame_count / 15, path, selected); else menu_ticker_line(type_str_buf, w, g_extern.frame_count / 15, type_str, selected); #endif snprintf(message, sizeof(message), "%s : %s", entry_title_buf, type_str_buf); wchar_t msg_w[256]; mbstowcs(msg_w, message, sizeof(msg_w) / sizeof(wchar_t)); XuiListSetText(m_menulist, i, msg_w); blit_line(x, y, message, i); } if (driver.menu->keyboard.display) { char msg[1024]; const char *str = *driver.menu->keyboard.buffer; if (!str) str = ""; snprintf(msg, sizeof(msg), "%s\n%s", driver.menu->keyboard.label, str); rmenu_xui_render_messagebox(msg); } }
static void init_menulist(unsigned menu_id) { XuiListDeleteItems(m_menulist, 0, XuiListGetItemCount(m_menulist)); switch (menu_id) { case INGAME_MENU_CORE_OPTIONS_MODE: if (g_extern.system.core_options) { size_t opts = core_option_size(g_extern.system.core_options); for (size_t i = 0; i < opts; i++) { char label[256]; strlcpy(label, core_option_get_desc(g_extern.system.core_options, i), sizeof(label)); snprintf(label, sizeof(label), "%s : %s", label, core_option_get_val(g_extern.system.core_options, i)); mbstowcs(strw_buffer, label, sizeof(strw_buffer) / sizeof(wchar_t)); XuiListInsertItems(m_menulist, i, 1); XuiListSetText(m_menulist, i, strw_buffer); } } else { XuiListInsertItems(m_menulist, 0, 1); XuiListSetText(m_menulist, 0, L"No options available."); } break; case INGAME_MENU_LOAD_GAME_HISTORY_MODE: { size_t history_size = rom_history_size(rgui->history); if (history_size) { size_t opts = history_size; for (size_t i = 0; i < opts; i++) { const char *path = NULL; const char *core_path = NULL; const char *core_name = NULL; rom_history_get_index(rgui->history, i, &path, &core_path, &core_name); char path_short[PATH_MAX]; fill_pathname(path_short, path_basename(path), "", sizeof(path_short)); char fill_buf[PATH_MAX]; snprintf(fill_buf, sizeof(fill_buf), "%s (%s)", path_short, core_name); mbstowcs(strw_buffer, fill_buf, sizeof(strw_buffer) / sizeof(wchar_t)); XuiListInsertItems(m_menulist, i, 1); XuiListSetText(m_menulist, i, strw_buffer); } } else { XuiListInsertItems(m_menulist, 0, 1); XuiListSetText(m_menulist, 0, L"No history available."); } } break; case INGAME_MENU_INPUT_OPTIONS_MODE: { unsigned i; char buttons[RARCH_FIRST_META_KEY][128]; unsigned keybind_end = RETRO_DEVICE_ID_JOYPAD_R3 + 1; for(i = 0; i < keybind_end; i++) { struct platform_bind key_label; strlcpy(key_label.desc, "Unknown", sizeof(key_label.desc)); key_label.joykey = g_settings.input.binds[rgui->current_pad][i].joykey; if (driver.input->set_keybinds) driver.input->set_keybinds(&key_label, 0, 0, 0, (1ULL << KEYBINDS_ACTION_GET_BIND_LABEL)); snprintf(buttons[i], sizeof(buttons[i]), "%s #%d: %s", g_settings.input.binds[rgui->current_pad][i].desc, rgui->current_pad, key_label.desc); mbstowcs(strw_buffer, buttons[i], sizeof(strw_buffer) / sizeof(wchar_t)); XuiListInsertItems(m_menulist, i, 1); XuiListSetText(m_menulist, i, strw_buffer); } //set_dpad_emulation_label(rgui->current_pad, buttons[0], sizeof(buttons[0])); //mbstowcs(strw_buffer, buttons[0], sizeof(strw_buffer) / sizeof(wchar_t)); XuiListInsertItems(m_menulist, keybind_end, 1); //XuiListSetText(m_menulist, SETTING_CONTROLS_DPAD_EMULATION, strw_buffer); XuiListSetText(m_menulist, SETTING_CONTROLS_DPAD_EMULATION, L"Stub"); XuiListInsertItems(m_menulist, keybind_end + 1, 1); XuiListSetText(m_menulist, SETTING_CONTROLS_DEFAULT_ALL, L"Reset all buttons to default"); } break; case INGAME_MENU_SETTINGS_MODE: XuiListInsertItems(m_menulist, INGAME_MENU_REWIND_ENABLED, 1); XuiListSetText(m_menulist, INGAME_MENU_REWIND_ENABLED, g_settings.rewind_enable ? L"Rewind: ON" : L"Rewind: OFF"); menu_settings_create_menu_item_label_w(strw_buffer, S_LBL_REWIND_GRANULARITY, sizeof(strw_buffer)); XuiListInsertItems(m_menulist, INGAME_MENU_REWIND_GRANULARITY, 1); XuiListSetText(m_menulist, INGAME_MENU_REWIND_GRANULARITY, strw_buffer); XuiListInsertItems(m_menulist, SETTING_EMU_SHOW_DEBUG_INFO_MSG, 1); XuiListSetText(m_menulist, SETTING_EMU_SHOW_DEBUG_INFO_MSG, (g_settings.fps_show) ? L"Show Framerate: ON" : L"Show Framerate: OFF"); break; case INGAME_MENU_MAIN_MODE: XuiListInsertItems(m_menulist, INGAME_MENU_CHANGE_LIBRETRO_CORE, 1); XuiListSetText(m_menulist, INGAME_MENU_CHANGE_LIBRETRO_CORE, L"Core ..."); XuiListInsertItems(m_menulist, INGAME_MENU_LOAD_GAME_HISTORY_MODE, 1); XuiListSetText(m_menulist, INGAME_MENU_LOAD_GAME_HISTORY_MODE, L"Load Game (History) ..."); XuiListInsertItems(m_menulist, INGAME_MENU_CHANGE_GAME, 1); XuiListSetText(m_menulist, INGAME_MENU_CHANGE_GAME, L"Load Game ..."); XuiListInsertItems(m_menulist, INGAME_MENU_CORE_OPTIONS_MODE, 1); XuiListSetText(m_menulist, INGAME_MENU_CORE_OPTIONS_MODE, L"Core Options ..."); XuiListInsertItems(m_menulist, INGAME_MENU_VIDEO_OPTIONS_MODE, 1); XuiListSetText(m_menulist, INGAME_MENU_VIDEO_OPTIONS_MODE, L"Video Options ..."); XuiListInsertItems(m_menulist, INGAME_MENU_AUDIO_OPTIONS_MODE, 1); XuiListSetText(m_menulist, INGAME_MENU_AUDIO_OPTIONS_MODE, L"Audio Options ..."); XuiListInsertItems(m_menulist, INGAME_MENU_INPUT_OPTIONS_MODE, 1); XuiListSetText(m_menulist, INGAME_MENU_INPUT_OPTIONS_MODE, L"Input Options ..."); XuiListInsertItems(m_menulist, INGAME_MENU_PATH_OPTIONS_MODE, 1); XuiListSetText(m_menulist, INGAME_MENU_PATH_OPTIONS_MODE, L"Path Options ..."); XuiListInsertItems(m_menulist, INGAME_MENU_SETTINGS_MODE, 1); XuiListSetText(m_menulist, INGAME_MENU_SETTINGS_MODE, L"Settings ..."); menu_settings_create_menu_item_label_w(strw_buffer, S_LBL_LOAD_STATE_SLOT, sizeof(strw_buffer)); XuiListInsertItems(m_menulist, INGAME_MENU_LOAD_STATE, 1); XuiListSetText(m_menulist, INGAME_MENU_LOAD_STATE, strw_buffer); menu_settings_create_menu_item_label_w(strw_buffer, S_LBL_SAVE_STATE_SLOT, sizeof(strw_buffer)); XuiListInsertItems(m_menulist, INGAME_MENU_SAVE_STATE, 1); XuiListSetText(m_menulist, INGAME_MENU_SAVE_STATE, strw_buffer); XuiListInsertItems(m_menulist, INGAME_MENU_SCREENSHOT_MODE, 1); XuiListSetText(m_menulist, INGAME_MENU_SCREENSHOT_MODE, L"Take Screenshot"); XuiListInsertItems(m_menulist, INGAME_MENU_RETURN_TO_GAME, 1); XuiListSetText(m_menulist, INGAME_MENU_RETURN_TO_GAME, L"Resume Game"); XuiListInsertItems(m_menulist, INGAME_MENU_RESET, 1); XuiListSetText(m_menulist, INGAME_MENU_RESET, L"Restart Game"); XuiListInsertItems(m_menulist, INGAME_MENU_QUIT_RETROARCH, 1); XuiListSetText(m_menulist, INGAME_MENU_QUIT_RETROARCH, L"Quit RetroArch"); break; } }
HRESULT CRetroArchMain::OnControlNavigate(XUIMessageControlNavigate *pControlNavigateData, BOOL& bHandled) { xdk_d3d_video_t *vid = (xdk_d3d_video_t*)driver.video_data; HRESULT hr; int current_index; bool hdmenus_allowed = (g_extern.lifecycle_mode_state & (1ULL << MODE_MENU_HD)); current_index= XuiListGetCurSel(m_menulist, NULL); unsigned input = pControlNavigateData->nControlNavigate; unsigned action = xui_input_to_rgui_action(input); HXUIOBJ current_obj = current_menu; switch (current_index) { case INGAME_MENU_CHANGE_LIBRETRO_CORE: if (action == RGUI_ACTION_OK) { hr = XuiSceneCreate(hdmenus_allowed ? L"file://game:/media/hd/" : L"file://game:/media/sd/", L"rarch_libretrocore_browser.xur", NULL, ¤t_menu); if (hr < 0) RARCH_ERR("Failed to load scene.\n"); XuiSceneNavigateForward(current_obj, false, current_menu, XUSER_INDEX_FOCUS); } break; case INGAME_MENU_LOAD_GAME_HISTORY_MODE: if (action == RGUI_ACTION_OK) { hr = XuiSceneCreate(hdmenus_allowed ? L"file://game:/media/hd/" : L"file://game:/media/sd/", L"rarch_load_game_history.xur", NULL, ¤t_menu); if (hr < 0) RARCH_ERR("Failed to load scene.\n"); XuiSceneNavigateForward(current_obj, false, current_menu, XUSER_INDEX_FOCUS); } break; case INGAME_MENU_CHANGE_GAME: if (action == RGUI_ACTION_OK) { hr = XuiSceneCreate(hdmenus_allowed ? L"file://game:/media/hd/" : L"file://game:/media/sd/", L"rarch_filebrowser.xur", NULL, ¤t_menu); if (hr < 0) RARCH_ERR("Failed to load scene.\n"); XuiSceneNavigateForward(current_obj, false, current_menu, XUSER_INDEX_FOCUS); } break; case INGAME_MENU_CORE_OPTIONS_MODE: if (action == RGUI_ACTION_OK) { hr = XuiSceneCreate(hdmenus_allowed ? L"file://game:/media/hd/" : L"file://game:/media/sd/", L"rarch_core_options.xur", NULL, ¤t_menu); if (hr < 0) RARCH_ERR("Failed to load scene.\n"); XuiSceneNavigateForward(current_obj, false, current_menu, XUSER_INDEX_FOCUS); } break; case INGAME_MENU_VIDEO_OPTIONS_MODE: if (action == RGUI_ACTION_OK) { hr = XuiSceneCreate(hdmenus_allowed ? L"file://game:/media/hd/" : L"file://game:/media/sd/", L"rarch_video_options.xur", NULL, ¤t_menu); if (hr < 0) RARCH_ERR("Failed to load scene.\n"); XuiSceneNavigateForward(current_obj, false, current_menu, XUSER_INDEX_FOCUS); } break; case INGAME_MENU_AUDIO_OPTIONS_MODE: if (action == RGUI_ACTION_OK) { hr = XuiSceneCreate(hdmenus_allowed ? L"file://game:/media/hd/" : L"file://game:/media/sd/", L"rarch_audio_options.xur", NULL, ¤t_menu); if (hr < 0) RARCH_ERR("Failed to load scene.\n"); XuiSceneNavigateForward(current_obj, false, current_menu, XUSER_INDEX_FOCUS); } break; case INGAME_MENU_INPUT_OPTIONS_MODE: if (action == RGUI_ACTION_OK) { hr = XuiSceneCreate(hdmenus_allowed ? L"file://game:/media/hd/" : L"file://game:/media/sd/", L"rarch_controls.xur", NULL, ¤t_menu); if (hr < 0) RARCH_ERR("Failed to load scene.\n"); XuiSceneNavigateForward(current_obj, false, current_menu, XUSER_INDEX_FOCUS); } break; case INGAME_MENU_PATH_OPTIONS_MODE: break; case INGAME_MENU_SETTINGS_MODE: if (action == RGUI_ACTION_OK) { hr = XuiSceneCreate(hdmenus_allowed ? L"file://game:/media/hd/" : L"file://game:/media/sd/", L"rarch_settings.xur", NULL, ¤t_menu); if (hr < 0) RARCH_ERR("Failed to load scene.\n"); XuiSceneNavigateForward(current_obj, false, current_menu, XUSER_INDEX_FOCUS); } break; case INGAME_MENU_LOAD_STATE: process_input_ret = menu_set_settings(RGUI_SETTINGS_SAVESTATE_LOAD, action); menu_settings_create_menu_item_label_w(strw_buffer, S_LBL_LOAD_STATE_SLOT, sizeof(strw_buffer)); XuiListSetText(m_menulist, INGAME_MENU_LOAD_STATE, strw_buffer); menu_settings_create_menu_item_label_w(strw_buffer, S_LBL_SAVE_STATE_SLOT, sizeof(strw_buffer)); XuiListSetText(m_menulist, INGAME_MENU_SAVE_STATE, strw_buffer); break; case INGAME_MENU_SAVE_STATE: process_input_ret = menu_set_settings(RGUI_SETTINGS_SAVESTATE_SAVE, action); menu_settings_create_menu_item_label_w(strw_buffer, S_LBL_LOAD_STATE_SLOT, sizeof(strw_buffer)); XuiListSetText(m_menulist, INGAME_MENU_LOAD_STATE, strw_buffer); menu_settings_create_menu_item_label_w(strw_buffer, S_LBL_SAVE_STATE_SLOT, sizeof(strw_buffer)); XuiListSetText(m_menulist, INGAME_MENU_SAVE_STATE, strw_buffer); break; case INGAME_MENU_SCREENSHOT_MODE: break; case INGAME_MENU_RETURN_TO_GAME: process_input_ret = menu_set_settings(RGUI_SETTINGS_RESUME_GAME, action); break; case INGAME_MENU_RESET: process_input_ret = menu_set_settings(RGUI_SETTINGS_RESTART_GAME, action); break; case INGAME_MENU_QUIT_RETROARCH: process_input_ret = menu_set_settings(RGUI_SETTINGS_QUIT_RARCH, action); break; } bHandled = TRUE; switch(action) { case RGUI_ACTION_LEFT: case RGUI_ACTION_RIGHT: case RGUI_ACTION_UP: case RGUI_ACTION_DOWN: pControlNavigateData->hObjDest = pControlNavigateData->hObjSource; break; default: break; } return 0; }