static int menu_info_screen_iterate(unsigned action) { char msg[PATH_MAX]; char needle[PATH_MAX]; unsigned info_type = 0; rarch_setting_t *current_setting = NULL; file_list_t *list = (file_list_t*)driver.menu->menu_list->selection_buf; if (!driver.menu) return 0; if (driver.video_data && driver.menu_ctx && driver.menu_ctx->render) driver.menu_ctx->render(); current_setting = (rarch_setting_t*)setting_data_find_setting( driver.menu->list_settings, list->list[driver.menu->selection_ptr].label); if (current_setting) strlcpy(needle, current_setting->name, sizeof(needle)); else if ((current_setting = (rarch_setting_t*)setting_data_find_setting( driver.menu->list_mainmenu, list->list[driver.menu->selection_ptr].label))) { if (current_setting) strlcpy(needle, current_setting->name, sizeof(needle)); } else { const char *label = NULL; menu_list_get_at_offset(driver.menu->menu_list->selection_buf, driver.menu->selection_ptr, NULL, &label, &info_type); if (label) strlcpy(needle, label, sizeof(needle)); } setting_data_get_description(needle, msg, sizeof(msg)); if (driver.video_data && driver.menu_ctx && driver.menu_ctx->render_messagebox) { if (*msg && msg[0] != '\0') driver.menu_ctx->render_messagebox(msg); } if (action == MENU_ACTION_OK) menu_list_pop_stack(driver.menu->menu_list); return 0; }
void menu_input_st_string_callback(void *userdata, const char *str) { menu_handle_t *menu = menu_driver_resolve(); if (!menu) return; if (str && *str) { rarch_setting_t *current_setting = NULL; if ((current_setting = (rarch_setting_t*) setting_data_find_setting( menu->list_settings, menu->keyboard.label_setting))) menu_action_setting_set_current_string(current_setting, str); else { if (!strcmp(menu->keyboard.label_setting, "video_shader_preset_save_as")) menu_shader_manager_save_preset(str, false); else if (!strcmp(menu->keyboard.label_setting, "remap_file_save_as")) input_remapping_save_file(str); else if (!strcmp(menu->keyboard.label_setting, "cheat_file_save_as")) cheat_manager_save(g_extern.cheat, str); } } menu_input_key_end_line(); }
void st_uint_callback(void *userdata, const char *str) { menu_handle_t *menu = (menu_handle_t*)userdata; rarch_setting_t *current_setting = NULL; rarch_setting_t *setting_data = (rarch_setting_t *)setting_data_get_list(); if (str && *str && setting_data) { if ((current_setting = (rarch_setting_t*) setting_data_find_setting( setting_data, menu->keyboard.label_setting))) *current_setting->value.unsigned_integer = strtoul(str, NULL, 0); } menu_key_end_line(menu); }
void st_string_callback(void *userdata, const char *str) { menu_handle_t *menu = (menu_handle_t*)userdata; rarch_setting_t *current_setting = NULL; rarch_setting_t *setting_data = (rarch_setting_t *)setting_data_get_list(); if (str && *str && setting_data) { if ((current_setting = (rarch_setting_t*) setting_data_find_setting( setting_data, menu->keyboard.label_setting))) menu_action_setting_set_current_string(current_setting, str); else menu_action_set_current_string_based_on_label( menu->keyboard.label_setting, str); } menu_key_end_line(menu); }
void menu_input_st_uint_callback(void *userdata, const char *str) { menu_handle_t *menu = menu_driver_resolve(); if (!menu) return; if (str && *str) { rarch_setting_t *current_setting = NULL; if ((current_setting = (rarch_setting_t*) setting_data_find_setting( menu->list_settings, menu->keyboard.label_setting))) *current_setting->value.unsigned_integer = strtoul(str, NULL, 0); } menu_input_key_end_line(); }
int menu_shader_manager_setting_toggle( unsigned id, const char *label, unsigned action) { if (!driver.menu) { RARCH_ERR("Cannot toggle shader setting, menu handle is not initialized.\n"); return 0; } #if 0 RARCH_LOG("shader label: %s\n", label); #endif rarch_setting_t *current_setting = NULL; rarch_setting_t *setting_data = (rarch_setting_t *)setting_data_get_list(); if (!strcmp(label, "video_shader_default_filter")) { if ((current_setting = setting_data_find_setting( setting_data, "video_smooth"))) menu_action_setting_boolean(current_setting, action); } else if (id >= MENU_SETTINGS_SHADER_PARAMETER_0 && id <= MENU_SETTINGS_SHADER_PARAMETER_LAST) { bool apply_changes = false; struct gfx_shader *shader = NULL; struct gfx_shader_parameter *param = NULL; if (!(shader = (struct gfx_shader*)driver.menu->parameter_shader)) return 0; if (!(param = &shader->parameters[id - MENU_SETTINGS_SHADER_PARAMETER_0])) return 0; switch (action) { case MENU_ACTION_START: param->current = param->initial; apply_changes = true; break; case MENU_ACTION_LEFT: param->current -= param->step; apply_changes = true; break; case MENU_ACTION_RIGHT: param->current += param->step; apply_changes = true; break; default: break; } param->current = min(max(param->minimum, param->current), param->maximum); if (apply_changes && !strcmp(label, "video_shader_parameters")) rarch_main_command(RARCH_CMD_SHADERS_APPLY_CHANGES); } else if ((!strcmp(label, "video_shader_parameters") || !strcmp(label, "video_shader_preset_parameters")) && action == MENU_ACTION_OK) menu_entries_push(driver.menu->menu_stack, "", "video_shader_parameters", MENU_FILE_SWITCH, driver.menu->selection_ptr); else if (!strcmp(label, "shader_apply_changes") || !strcmp(label, "video_shader_num_passes")) { if (!strcmp(label, "video_shader_num_passes")) return handle_shader_pass_setting(driver.menu->shader, action); menu_action_setting_set(id, label, action); } else if (!strcmp(label, "video_shader_preset")) { switch (action) { case MENU_ACTION_OK: menu_entries_push(driver.menu->menu_stack, g_settings.video.shader_dir, "video_shader_preset", id, driver.menu->selection_ptr); break; case MENU_ACTION_START: break; default: break; } } else if (!strcmp(label, "video_shader_pass")) { hack_shader_pass = id - MENU_SETTINGS_SHADER_PASS_0; struct gfx_shader *shader = (struct gfx_shader*)driver.menu->shader; struct gfx_shader_pass *shader_pass = NULL; if (shader) shader_pass = (struct gfx_shader_pass*)&shader->pass[hack_shader_pass]; switch (action) { case MENU_ACTION_OK: menu_entries_push(driver.menu->menu_stack, g_settings.video.shader_dir, "video_shader_pass", id, driver.menu->selection_ptr); break; case MENU_ACTION_START: if (shader_pass) *shader_pass->source.path = '\0'; break; default: break; } } else if (!strcmp(label, "video_shader_filter_pass")) { unsigned pass = id - MENU_SETTINGS_SHADER_PASS_FILTER_0; struct gfx_shader *shader = (struct gfx_shader*)driver.menu->shader; struct gfx_shader_pass *shader_pass = (struct gfx_shader_pass*) &shader->pass[pass]; switch (action) { case MENU_ACTION_START: if (shader) shader->pass[pass].filter = RARCH_FILTER_UNSPEC; break; case MENU_ACTION_LEFT: case MENU_ACTION_RIGHT: case MENU_ACTION_OK: { unsigned delta = (action == MENU_ACTION_LEFT) ? 2 : 1; if (shader_pass) shader_pass->filter = ((shader_pass->filter + delta) % 3); break; } default: break; } } else if (!strcmp(label, "video_shader_scale_pass")) { unsigned pass = id - MENU_SETTINGS_SHADER_PASS_SCALE_0; struct gfx_shader *shader = (struct gfx_shader*)driver.menu->shader; struct gfx_shader_pass *shader_pass = (struct gfx_shader_pass*) &shader->pass[pass]; switch (action) { case MENU_ACTION_START: if (shader) { shader_pass->fbo.scale_x = shader_pass->fbo.scale_y = 0; shader_pass->fbo.valid = false; } break; case MENU_ACTION_LEFT: case MENU_ACTION_RIGHT: case MENU_ACTION_OK: { unsigned current_scale = shader_pass->fbo.scale_x; unsigned delta = action == MENU_ACTION_LEFT ? 5 : 1; current_scale = (current_scale + delta) % 6; if (shader_pass) { shader_pass->fbo.valid = current_scale; shader_pass->fbo.scale_x = shader_pass->fbo.scale_y = current_scale; } break; } default: break; } } return 0; }
static int menu_action_ok(const char *menu_path, const char *menu_label, unsigned menu_type) { const char *label = NULL; const char *path = NULL; unsigned type = 0; rarch_setting_t *setting_data = (rarch_setting_t *)driver.menu->list_settings; rarch_setting_t *setting = (rarch_setting_t*) setting_data_find_setting(setting_data, menu_label); (void)hack_shader_pass; if (file_list_get_size(driver.menu->selection_buf) == 0) return 0; file_list_get_at_offset(driver.menu->selection_buf, driver.menu->selection_ptr, &path, &label, &type); #if 0 RARCH_LOG("menu label: %s\n", menu_label); RARCH_LOG("type : %d\n", type == MENU_FILE_USE_DIRECTORY); RARCH_LOG("type id : %d\n", type); #endif while (true) { switch (type) { case MENU_FILE_PLAYLIST_ENTRY: rarch_playlist_load_content(g_defaults.history, driver.menu->selection_ptr); menu_flush_stack_type(driver.menu->menu_stack, MENU_SETTINGS); return -1; #ifdef HAVE_COMPRESSION case MENU_FILE_IN_CARCHIVE: #endif case MENU_FILE_PLAIN: if (!strcmp(menu_label, "detect_core_list")) { int ret = rarch_defer_core(g_extern.core_info, menu_path, path, driver.menu->deferred_path, sizeof(driver.menu->deferred_path)); if (ret == -1) { rarch_main_command(RARCH_CMD_LOAD_CORE); menu_common_load_content(); return -1; } else if (ret == 0) menu_entries_push(driver.menu->menu_stack, g_settings.libretro_directory, "deferred_core_list", 0, driver.menu->selection_ptr); } else if ((setting && setting->type == ST_PATH)) { menu_action_setting_set_current_string_path(setting, menu_path, path); menu_entries_pop_stack(driver.menu->menu_stack, setting->name); } else if (!strcmp(menu_label, "disk_image_append")) { char image[PATH_MAX]; fill_pathname_join(image, menu_path, path, sizeof(image)); rarch_disk_control_append_image(image); rarch_main_command(RARCH_CMD_RESUME); menu_flush_stack_type(driver.menu->menu_stack,MENU_SETTINGS); return -1; } else { if (type == MENU_FILE_IN_CARCHIVE) { fill_pathname_join_delim(g_extern.fullpath, menu_path, path, '#',sizeof(g_extern.fullpath)); } else { fill_pathname_join(g_extern.fullpath, menu_path, path, sizeof(g_extern.fullpath)); } menu_common_load_content(); rarch_main_command(RARCH_CMD_LOAD_CONTENT_PERSIST); menu_flush_stack_type(driver.menu->menu_stack,MENU_SETTINGS); driver.menu->msg_force = true; return -1; } return 0; case MENU_FILE_CONFIG: { char config[PATH_MAX]; fill_pathname_join(config, menu_path, path, sizeof(config)); menu_flush_stack_type(driver.menu->menu_stack,MENU_SETTINGS); driver.menu->msg_force = true; if (rarch_replace_config(config)) { menu_clear_navigation(driver.menu); return -1; } } return 0; case MENU_FILE_FONT: case MENU_FILE_OVERLAY: case MENU_FILE_AUDIOFILTER: case MENU_FILE_VIDEOFILTER: menu_action_setting_set_current_string_path(setting, menu_path, path); menu_entries_pop_stack(driver.menu->menu_stack, setting->name); return 0; case MENU_FILE_SHADER_PRESET: #ifdef HAVE_SHADER_MANAGER { char shader_path[PATH_MAX]; fill_pathname_join(shader_path, menu_path, path, sizeof(shader_path)); menu_shader_manager_set_preset(driver.menu->shader, gfx_shader_parse_type(shader_path, RARCH_SHADER_NONE), shader_path); menu_flush_stack_label(driver.menu->menu_stack, "Shader Options"); } #endif return 0; case MENU_FILE_SHADER: #ifdef HAVE_SHADER_MANAGER fill_pathname_join(driver.menu->shader->pass[hack_shader_pass].source.path, menu_path, path, sizeof(driver.menu->shader->pass[hack_shader_pass].source.path)); /* This will reset any changed parameters. */ gfx_shader_resolve_parameters(NULL, driver.menu->shader); menu_flush_stack_label(driver.menu->menu_stack, "Shader Options"); #endif return 0; case MENU_FILE_CORE: if (!strcmp(menu_label, "deferred_core_list")) { strlcpy(g_settings.libretro, path, sizeof(g_settings.libretro)); strlcpy(g_extern.fullpath, driver.menu->deferred_path, sizeof(g_extern.fullpath)); menu_common_load_content(); return -1; } else if (!strcmp(menu_label, "core_list")) { fill_pathname_join(g_settings.libretro, menu_path, path, sizeof(g_settings.libretro)); rarch_main_command(RARCH_CMD_LOAD_CORE); menu_flush_stack_type(driver.menu->menu_stack,MENU_SETTINGS); #if defined(HAVE_DYNAMIC) /* No content needed for this core, load core immediately. */ if (driver.menu->load_no_content) { *g_extern.fullpath = '\0'; menu_common_load_content(); return -1; } /* Core selection on non-console just updates directory listing. * Will take effect on new content load. */ #elif defined(RARCH_CONSOLE) rarch_main_command(RARCH_CMD_RESTART_RETROARCH); return -1; #endif } return 0; case MENU_FILE_USE_DIRECTORY: if (setting && setting->type == ST_DIR) { menu_action_setting_set_current_string(setting, menu_path); menu_entries_pop_stack(driver.menu->menu_stack, setting->name); } return 0; case MENU_FILE_DIRECTORY: case MENU_FILE_CARCHIVE: { char cat_path[PATH_MAX]; if (type == MENU_FILE_CARCHIVE && !strcmp(menu_label, "detect_core_list")) { file_list_push(driver.menu->menu_stack, path, "load_open_zip", 0, driver.menu->selection_ptr); return 0; } fill_pathname_join(cat_path, menu_path, path, sizeof(cat_path)); menu_entries_push(driver.menu->menu_stack, cat_path, menu_label, type, driver.menu->selection_ptr); } return 0; } break; } if (menu_parse_check(label, type) == 0) { char cat_path[PATH_MAX]; fill_pathname_join(cat_path, menu_path, path, sizeof(cat_path)); menu_entries_push(driver.menu->menu_stack, cat_path, menu_label, type, driver.menu->selection_ptr); } return 0; }
static void glui_frame(void) { unsigned x, y; size_t i; char title[PATH_MAX], title_buf[PATH_MAX], title_msg[PATH_MAX]; const char *dir = NULL; const char *label = NULL; unsigned menu_type = 0; size_t end; gl_t *gl = (gl_t*)driver_video_resolve(NULL); glui_handle_t *glui = NULL; if (!driver.menu || !gl) return; glui = (glui_handle_t*)driver.menu->userdata; if (!glui) return; if (driver.menu->need_refresh && g_extern.is_menu && !driver.menu->msg_force) return; glui->line_height = g_settings.video.font_size * 4 / 3; glui->glyph_width = glui->line_height / 2; glui->margin = gl->win_width / 20 ; glui->term_width = (gl->win_width - glui->margin * 2) / glui->glyph_width; glui->term_height = (gl->win_height - glui->margin * 2) / glui->line_height - 2; driver.menu->mouse.ptr = (driver.menu->mouse.y - glui->margin) / glui->line_height - 2 + driver.menu->begin; glViewport(0, 0, gl->win_width, gl->win_height); if (driver.menu->mouse.wheeldown && driver.menu->begin < menu_list_get_size(driver.menu->menu_list) - glui->term_height) driver.menu->begin++; if (driver.menu->mouse.wheelup && driver.menu->begin > 0) driver.menu->begin--; /* Do not scroll if all items are visible. */ if (menu_list_get_size(driver.menu->menu_list) <= glui->term_height) driver.menu->begin = 0; end = (driver.menu->begin + glui->term_height <= menu_list_get_size(driver.menu->menu_list)) ? driver.menu->begin + glui->term_height : menu_list_get_size(driver.menu->menu_list); glui_render_background(false); menu_list_get_last_stack(driver.menu->menu_list, &dir, &label, &menu_type); get_title(label, dir, menu_type, title, sizeof(title)); menu_ticker_line(title_buf, glui->term_width - 3, g_extern.frame_count / glui->margin, title, true); glui_blit_line(glui->margin * 2, glui->margin + glui->line_height, title_buf, true); 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); glui_blit_line( glui->margin * 2, glui->margin + glui->term_height * glui->line_height + glui->line_height * 2, title_msg, true); x = glui->margin; y = glui->margin + glui->line_height * 2; for (i = driver.menu->begin; i < end; i++, y += glui->line_height) { 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); rarch_setting_t *setting = (rarch_setting_t*)setting_data_find_setting( driver.menu->list_settings, driver.menu->menu_list->selection_buf->list[i].label); (void)setting; 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); menu_ticker_line(entry_title_buf, glui->term_width - (w + 1 + 2), g_extern.frame_count / glui->margin, path_buf, selected); menu_ticker_line(type_str_buf, w, g_extern.frame_count / glui->margin, type_str, selected); strlcpy(message, entry_title_buf, sizeof(message)); glui_blit_line(x, y, message, selected); glui_blit_line(gl->win_width - glui->glyph_width * w - glui->margin , y, type_str_buf, selected); } #ifdef GEKKO const char *message_queue; if (driver.menu->msg_force) { message_queue = msg_queue_pull(g_extern.msg_queue); driver.menu->msg_force = false; } else message_queue = driver.current_msg; glui_render_messagebox(message_queue); #endif if (driver.menu->keyboard.display) { char msg[PATH_MAX]; const char *str = *driver.menu->keyboard.buffer; if (!str) str = ""; glui_render_background(true); snprintf(msg, sizeof(msg), "%s\n%s", driver.menu->keyboard.label, str); glui_render_messagebox(msg); } if (glui->box_message[0] != '\0') { glui_render_background(true); glui_render_messagebox(glui->box_message); glui->box_message[0] = '\0'; } if (driver.menu->mouse.enable) glui_draw_cursor(driver.menu->mouse.x, driver.menu->mouse.y); gl_set_viewport(gl, gl->win_width, gl->win_height, false, false); }