pkg/android/phoenix/libs/googleplay/res/drawable-xhdpi/000775 001750 001750 00000000000 13044721241 024332 5ustar00sergiosergio000000 000000 gfx/drivers_shader/slang_reflection.cpp000664 001750 001750 00000052422 13044721241 021517 0ustar00sergiosergio000000 000000 /* RetroArch - A frontend for libretro. * Copyright (C) 2010-2017 - Hans-Kristian Arntzen * * 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- * ation, either version 3 of the License, or (at your option) any later version. * * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with RetroArch. * If not, see . */ #include "spirv_cross.hpp" #include "slang_reflection.hpp" #include #include #include "../../verbosity.h" using namespace std; using namespace spirv_cross; static bool slang_texture_semantic_is_array(slang_texture_semantic sem) { switch (sem) { case SLANG_TEXTURE_SEMANTIC_ORIGINAL_HISTORY: case SLANG_TEXTURE_SEMANTIC_PASS_OUTPUT: case SLANG_TEXTURE_SEMANTIC_PASS_FEEDBACK: case SLANG_TEXTURE_SEMANTIC_USER: return true; default: return false; } } slang_reflection::slang_reflection() { for (unsigned i = 0; i < SLANG_NUM_TEXTURE_SEMANTICS; i++) { semantic_textures[i].resize( slang_texture_semantic_is_array(static_cast(i)) ? 0 : 1); } } static const char *texture_semantic_names[] = { "Original", "Source", "OriginalHistory", "PassOutput", "PassFeedback", "User", nullptr }; static const char *texture_semantic_uniform_names[] = { "OriginalSize", "SourceSize", "OriginalHistorySize", "PassOutputSize", "PassFeedbackSize", "UserSize", nullptr }; static const char *semantic_uniform_names[] = { "MVP", "OutputSize", "FinalViewportSize", "FrameCount", }; static slang_texture_semantic slang_name_to_texture_semantic_array(const string &name, const char **names, unsigned *index) { unsigned i = 0; while (*names) { auto n = *names; auto semantic = static_cast(i); if (slang_texture_semantic_is_array(semantic)) { size_t baselen = strlen(n); int cmp = strncmp(n, name.c_str(), baselen); if (cmp == 0) { *index = strtoul(name.c_str() + baselen, nullptr, 0); return semantic; } } else if (name == n) { *index = 0; return semantic; } i++; names++; } return SLANG_INVALID_TEXTURE_SEMANTIC; } static slang_texture_semantic slang_name_to_texture_semantic( const unordered_map &semantic_map, const string &name, unsigned *index) { auto itr = semantic_map.find(name); if (itr != end(semantic_map)) { *index = itr->second.index; return itr->second.semantic; } return slang_name_to_texture_semantic_array(name, texture_semantic_names, index); } static slang_texture_semantic slang_uniform_name_to_texture_semantic( const unordered_map &semantic_map, const string &name, unsigned *index) { auto itr = semantic_map.find(name); if (itr != end(semantic_map)) { *index = itr->second.index; return itr->second.semantic; } return slang_name_to_texture_semantic_array(name, texture_semantic_uniform_names, index); } static slang_semantic slang_uniform_name_to_semantic( const unordered_map &semantic_map, const string &name, unsigned *index) { auto itr = semantic_map.find(name); if (itr != end(semantic_map)) { *index = itr->second.index; return itr->second.semantic; } // No builtin semantics are arrayed. *index = 0; unsigned i = 0; for (auto n : semantic_uniform_names) { if (name == n) return static_cast(i); i++; } return SLANG_INVALID_SEMANTIC; } template static void resize_minimum(T &vec, unsigned minimum) { if (vec.size() < minimum) vec.resize(minimum); } static bool set_ubo_texture_offset(slang_reflection *reflection, slang_texture_semantic semantic, unsigned index, size_t offset, bool push_constant) { resize_minimum(reflection->semantic_textures[semantic], index + 1); auto &sem = reflection->semantic_textures[semantic][index]; auto &active = push_constant ? sem.push_constant : sem.uniform; auto &active_offset = push_constant ? sem.push_constant_offset : sem.ubo_offset; if (active) { if (active_offset != offset) { RARCH_ERR("[slang]: Vertex and fragment have different offsets for same semantic %s #%u (%u vs. %u).\n", texture_semantic_uniform_names[semantic], index, unsigned(active_offset), unsigned(offset)); return false; } } active = true; active_offset = offset; return true; } static bool set_ubo_float_parameter_offset(slang_reflection *reflection, unsigned index, size_t offset, unsigned num_components, bool push_constant) { resize_minimum(reflection->semantic_float_parameters, index + 1); auto &sem = reflection->semantic_float_parameters[index]; auto &active = push_constant ? sem.push_constant : sem.uniform; auto &active_offset = push_constant ? sem.push_constant_offset : sem.ubo_offset; if (active) { if (active_offset != offset) { RARCH_ERR("[slang]: Vertex and fragment have different offsets for same parameter #%u (%u vs. %u).\n", index, unsigned(active_offset), unsigned(offset)); return false; } } if (sem.num_components != num_components && (sem.uniform || sem.push_constant)) { RARCH_ERR("[slang]: Vertex and fragment have different components for same parameter #%u (%u vs. %u).\n", index, unsigned(sem.num_components), unsigned(num_components)); return false; } active = true; active_offset = offset; sem.num_components = num_components; return true; } static bool set_ubo_offset(slang_reflection *reflection, slang_semantic semantic, size_t offset, unsigned num_components, bool push_constant) { auto &sem = reflection->semantics[semantic]; auto &active = push_constant ? sem.push_constant : sem.uniform; auto &active_offset = push_constant ? sem.push_constant_offset : sem.ubo_offset; if (active) { if (active_offset != offset) { RARCH_ERR("[slang]: Vertex and fragment have different offsets for same semantic %s (%u vs. %u).\n", semantic_uniform_names[semantic], unsigned(active_offset), unsigned(offset)); return false; } } if (sem.num_components != num_components && (sem.uniform || sem.push_constant)) { RARCH_ERR("[slang]: Vertex and fragment have different components for same semantic %s (%u vs. %u).\n", semantic_uniform_names[semantic], unsigned(sem.num_components), unsigned(num_components)); return false; } active = true; active_offset = offset; sem.num_components = num_components; return true; } static bool validate_type_for_semantic(const SPIRType &type, slang_semantic sem) { if (!type.array.empty()) return false; if (type.basetype != SPIRType::Float && type.basetype != SPIRType::Int && type.basetype != SPIRType::UInt) return false; switch (sem) { case SLANG_SEMANTIC_MVP: // mat4 return type.basetype == SPIRType::Float && type.vecsize == 4 && type.columns == 4; case SLANG_SEMANTIC_FRAME_COUNT: // uint return type.basetype == SPIRType::UInt && type.vecsize == 1 && type.columns == 1; case SLANG_SEMANTIC_FLOAT_PARAMETER: // float return type.basetype == SPIRType::Float && type.vecsize == 1 && type.columns == 1; default: // vec4 return type.basetype == SPIRType::Float && type.vecsize == 4 && type.columns == 1; } } static bool validate_type_for_texture_semantic(const SPIRType &type) { if (!type.array.empty()) return false; return type.basetype == SPIRType::Float && type.vecsize == 4 && type.columns == 1; } static bool add_active_buffer_ranges(const Compiler &compiler, const Resource &resource, slang_reflection *reflection, bool push_constant) { // Get which uniforms are actually in use by this shader. auto ranges = compiler.get_active_buffer_ranges(resource.id); for (auto &range : ranges) { auto &name = compiler.get_member_name(resource.base_type_id, range.index); auto &type = compiler.get_type(compiler.get_type(resource.base_type_id).member_types[range.index]); unsigned sem_index = 0; unsigned tex_sem_index = 0; auto sem = slang_uniform_name_to_semantic(*reflection->semantic_map, name, &sem_index); auto tex_sem = slang_uniform_name_to_texture_semantic(*reflection->texture_semantic_uniform_map, name, &tex_sem_index); if (tex_sem == SLANG_TEXTURE_SEMANTIC_PASS_OUTPUT && tex_sem_index >= reflection->pass_number) { RARCH_ERR("[slang]: Non causal filter chain detected. Shader is trying to use output from pass #%u, but this shader is pass #%u.\n", tex_sem_index, reflection->pass_number); return false; } if (sem != SLANG_INVALID_SEMANTIC) { if (!validate_type_for_semantic(type, sem)) { RARCH_ERR("[slang]: Underlying type of semantic is invalid.\n"); return false; } switch (sem) { case SLANG_SEMANTIC_FLOAT_PARAMETER: if (!set_ubo_float_parameter_offset(reflection, sem_index, range.offset, type.vecsize, push_constant)) return false; break; default: if (!set_ubo_offset(reflection, sem, range.offset, type.vecsize, push_constant)) return false; break; } } else if (tex_sem != SLANG_INVALID_TEXTURE_SEMANTIC) { if (!validate_type_for_texture_semantic(type)) { RARCH_ERR("[slang]: Underlying type of texture semantic is invalid.\n"); return false; } if (!set_ubo_texture_offset(reflection, tex_sem, tex_sem_index, range.offset, push_constant)) return false; } else { RARCH_ERR("[slang]: Unknown semantic found.\n"); return false; } } return true; } static bool slang_reflect(const Compiler &vertex_compiler, const Compiler &fragment_compiler, const ShaderResources &vertex, const ShaderResources &fragment, slang_reflection *reflection) { // Validate use of unexpected types. if ( !vertex.sampled_images.empty() || !vertex.storage_buffers.empty() || !vertex.subpass_inputs.empty() || !vertex.storage_images.empty() || !vertex.atomic_counters.empty() || !fragment.storage_buffers.empty() || !fragment.subpass_inputs.empty() || !fragment.storage_images.empty() || !fragment.atomic_counters.empty()) { RARCH_ERR("[slang]: Invalid resource type detected.\n"); return false; } // Validate vertex input. if (vertex.stage_inputs.size() != 2) { RARCH_ERR("[slang]: Vertex must have two attributes.\n"); return false; } if (fragment.stage_outputs.size() != 1) { RARCH_ERR("[slang]: Multiple render targets not supported.\n"); return false; } if (fragment_compiler.get_decoration(fragment.stage_outputs[0].id, spv::DecorationLocation) != 0) { RARCH_ERR("[slang]: Render target must use location = 0.\n"); return false; } uint32_t location_mask = 0; for (auto &input : vertex.stage_inputs) location_mask |= 1 << vertex_compiler.get_decoration(input.id, spv::DecorationLocation); if (location_mask != 0x3) { RARCH_ERR("[slang]: The two vertex attributes do not use location = 0 and location = 1.\n"); return false; } // Validate the single uniform buffer. if (vertex.uniform_buffers.size() > 1) { RARCH_ERR("[slang]: Vertex must use zero or one uniform buffer.\n"); return false; } if (fragment.uniform_buffers.size() > 1) { RARCH_ERR("[slang]: Fragment must use zero or one uniform buffer.\n"); return false; } // Validate the single push constant buffer. if (vertex.push_constant_buffers.size() > 1) { RARCH_ERR("[slang]: Vertex must use zero or one push constant buffers.\n"); return false; } if (fragment.push_constant_buffers.size() > 1) { RARCH_ERR("[slang]: Fragment must use zero or one push cosntant buffer.\n"); return false; } uint32_t vertex_ubo = vertex.uniform_buffers.empty() ? 0 : vertex.uniform_buffers[0].id; uint32_t fragment_ubo = fragment.uniform_buffers.empty() ? 0 : fragment.uniform_buffers[0].id; uint32_t vertex_push = vertex.push_constant_buffers.empty() ? 0 : vertex.push_constant_buffers[0].id; uint32_t fragment_push = fragment.push_constant_buffers.empty() ? 0 : fragment.push_constant_buffers[0].id; if (vertex_ubo && vertex_compiler.get_decoration(vertex_ubo, spv::DecorationDescriptorSet) != 0) { RARCH_ERR("[slang]: Resources must use descriptor set #0.\n"); return false; } if (fragment_ubo && fragment_compiler.get_decoration(fragment_ubo, spv::DecorationDescriptorSet) != 0) { RARCH_ERR("[slang]: Resources must use descriptor set #0.\n"); return false; } unsigned vertex_ubo_binding = vertex_ubo ? vertex_compiler.get_decoration(vertex_ubo, spv::DecorationBinding) : -1u; unsigned fragment_ubo_binding = fragment_ubo ? fragment_compiler.get_decoration(fragment_ubo, spv::DecorationBinding) : -1u; bool has_ubo = vertex_ubo || fragment_ubo; if (vertex_ubo_binding != -1u && fragment_ubo_binding != -1u && vertex_ubo_binding != fragment_ubo_binding) { RARCH_ERR("[slang]: Vertex and fragment uniform buffer must have same binding.\n"); return false; } unsigned ubo_binding = vertex_ubo_binding != -1u ? vertex_ubo_binding : fragment_ubo_binding; if (has_ubo && ubo_binding >= SLANG_NUM_BINDINGS) { RARCH_ERR("[slang]: Binding %u is out of range.\n", ubo_binding); return false; } reflection->ubo_binding = has_ubo ? ubo_binding : 0; reflection->ubo_stage_mask = 0; reflection->ubo_size = 0; reflection->push_constant_size = 0; reflection->push_constant_stage_mask = 0; if (vertex_ubo) { reflection->ubo_stage_mask |= SLANG_STAGE_VERTEX_MASK; reflection->ubo_size = max(reflection->ubo_size, vertex_compiler.get_declared_struct_size(vertex_compiler.get_type(vertex.uniform_buffers[0].base_type_id))); } if (fragment_ubo) { reflection->ubo_stage_mask |= SLANG_STAGE_FRAGMENT_MASK; reflection->ubo_size = max(reflection->ubo_size, fragment_compiler.get_declared_struct_size(fragment_compiler.get_type(fragment.uniform_buffers[0].base_type_id))); } if (vertex_push) { reflection->push_constant_stage_mask |= SLANG_STAGE_VERTEX_MASK; reflection->push_constant_size = max(reflection->push_constant_size, vertex_compiler.get_declared_struct_size(vertex_compiler.get_type(vertex.push_constant_buffers[0].base_type_id))); } if (fragment_push) { reflection->push_constant_stage_mask |= SLANG_STAGE_FRAGMENT_MASK; reflection->push_constant_size = max(reflection->push_constant_size, fragment_compiler.get_declared_struct_size(fragment_compiler.get_type(fragment.push_constant_buffers[0].base_type_id))); } // Validate push constant size against Vulkan's minimum spec to avoid cross-vendor issues. if (reflection->push_constant_size > 128) { RARCH_ERR("[slang]: Exceeded maximum size of 128 bytes for push constant buffer.\n"); return false; } // Find all relevant uniforms and push constants. if (vertex_ubo && !add_active_buffer_ranges(vertex_compiler, vertex.uniform_buffers[0], reflection, false)) return false; if (fragment_ubo && !add_active_buffer_ranges(fragment_compiler, fragment.uniform_buffers[0], reflection, false)) return false; if (vertex_push && !add_active_buffer_ranges(vertex_compiler, vertex.push_constant_buffers[0], reflection, true)) return false; if (fragment_push && !add_active_buffer_ranges(fragment_compiler, fragment.push_constant_buffers[0], reflection, true)) return false; uint32_t binding_mask = has_ubo ? (1 << ubo_binding) : 0; // On to textures. for (auto &texture : fragment.sampled_images) { unsigned set = fragment_compiler.get_decoration(texture.id, spv::DecorationDescriptorSet); unsigned binding = fragment_compiler.get_decoration(texture.id, spv::DecorationBinding); if (set != 0) { RARCH_ERR("[slang]: Resources must use descriptor set #0.\n"); return false; } if (binding >= SLANG_NUM_BINDINGS) { RARCH_ERR("[slang]: Binding %u is out of range.\n", ubo_binding); return false; } if (binding_mask & (1 << binding)) { RARCH_ERR("[slang]: Binding %u is already in use.\n", binding); return false; } binding_mask |= 1 << binding; unsigned array_index = 0; slang_texture_semantic index = slang_name_to_texture_semantic(*reflection->texture_semantic_map, texture.name, &array_index); if (index == SLANG_INVALID_TEXTURE_SEMANTIC) { RARCH_ERR("[slang]: Non-semantic textures not supported yet.\n"); return false; } resize_minimum(reflection->semantic_textures[index], array_index + 1); auto &semantic = reflection->semantic_textures[index][array_index]; semantic.binding = binding; semantic.stage_mask = SLANG_STAGE_FRAGMENT_MASK; semantic.texture = true; } RARCH_LOG("[slang]: Reflection\n"); RARCH_LOG("[slang]: Textures:\n"); for (unsigned i = 0; i < SLANG_NUM_TEXTURE_SEMANTICS; i++) { unsigned index = 0; for (auto &sem : reflection->semantic_textures[i]) { if (sem.texture) RARCH_LOG("[slang]: %s (#%u)\n", texture_semantic_names[i], index); index++; } } RARCH_LOG("[slang]:\n"); RARCH_LOG("[slang]: Uniforms (Vertex: %s, Fragment: %s):\n", reflection->ubo_stage_mask & SLANG_STAGE_VERTEX_MASK ? "yes": "no", reflection->ubo_stage_mask & SLANG_STAGE_FRAGMENT_MASK ? "yes": "no"); RARCH_LOG("[slang]: Push Constants (Vertex: %s, Fragment: %s):\n", reflection->push_constant_stage_mask & SLANG_STAGE_VERTEX_MASK ? "yes": "no", reflection->push_constant_stage_mask & SLANG_STAGE_FRAGMENT_MASK ? "yes": "no"); for (unsigned i = 0; i < SLANG_NUM_SEMANTICS; i++) { if (reflection->semantics[i].uniform) { RARCH_LOG("[slang]: %s (Offset: %u)\n", semantic_uniform_names[i], unsigned(reflection->semantics[i].ubo_offset)); } if (reflection->semantics[i].push_constant) { RARCH_LOG("[slang]: %s (PushOffset: %u)\n", semantic_uniform_names[i], unsigned(reflection->semantics[i].push_constant_offset)); } } for (unsigned i = 0; i < SLANG_NUM_TEXTURE_SEMANTICS; i++) { unsigned index = 0; for (auto &sem : reflection->semantic_textures[i]) { if (sem.uniform) { RARCH_LOG("[slang]: %s (#%u) (Offset: %u)\n", texture_semantic_uniform_names[i], index, unsigned(sem.ubo_offset)); } if (sem.push_constant) { RARCH_LOG("[slang]: %s (#%u) (PushOffset: %u)\n", texture_semantic_uniform_names[i], index, unsigned(sem.push_constant_offset)); } index++; } } RARCH_LOG("[slang]:\n"); RARCH_LOG("[slang]: Parameters:\n"); unsigned i = 0; for (auto ¶m : reflection->semantic_float_parameters) { if (param.uniform) RARCH_LOG("[slang]: #%u (Offset: %u)\n", i, param.ubo_offset); if (param.push_constant) RARCH_LOG("[slang]: #%u (PushOffset: %u)\n", i, param.push_constant_offset); i++; } return true; } bool slang_reflect_spirv(const std::vector &vertex, const std::vector &fragment, slang_reflection *reflection) { try { Compiler vertex_compiler(vertex); Compiler fragment_compiler(fragment); auto vertex_resources = vertex_compiler.get_shader_resources(); auto fragment_resources = fragment_compiler.get_shader_resources(); if (!slang_reflect(vertex_compiler, fragment_compiler, vertex_resources, fragment_resources, reflection)) { RARCH_ERR("[slang]: Failed to reflect SPIR-V. Resource usage is inconsistent with expectations.\n"); return false; } return true; } catch (const std::exception &e) { RARCH_ERR("[slang]: spir2cross threw exception: %s.\n", e.what()); return false; } } wiiu/include/wiiu/ios.h000664 001750 001750 00000000666 13044721241 016230 0ustar00sergiosergio000000 000000 #pragma once #include #ifdef __cplusplus extern "C" { #endif int IOS_Open(char *path, u32 mode); int IOS_Close(int fd); int IOS_Ioctl(int fd, u32 request, void *input_buffer, u32 input_buffer_len, void *output_buffer, u32 output_buffer_len); int IOS_IoctlAsync(int fd, u32 request, void *input_buffer, u32 input_buffer_len, void *output_buffer, u32 output_buffer_len, void *cb, void *cbarg); #ifdef __cplusplus } #endif libretro-common/formats/bmp/000775 001750 001750 00000000000 13044721241 017241 5ustar00sergiosergio000000 000000 wiiu/include/wiiu/sysapp.h000664 001750 001750 00000001073 13044721241 016746 0ustar00sergiosergio000000 000000 #pragma once #include #ifdef __cplusplus extern "C" { #endif typedef struct sysapp_input_struct sysapp_input_struct; void SYSSwitchToSyncControllerOnHBM(); void SYSSwitchToEManual(); void SYSSwitchToEShop(); void _SYSSwitchToMainApp(); void SYSSwitchToBrowserForViewer(sysapp_input_struct *); void SYSRelaunchTitle(uint32_t argc, char *pa_Argv[]); void SYSLaunchMenu(); void SYSLaunchTitle(uint64_t TitleId); void _SYSLaunchMiiStudio(); void _SYSLaunchSettings(); void _SYSLaunchParental(); void _SYSLaunchNotifications(); #ifdef __cplusplus } #endif gfx/drivers/vulkan_shaders/pipeline_snow_simple.frag000664 001750 001750 00000003513 13044721241 024242 0ustar00sergiosergio000000 000000 #version 310 es precision highp float; layout(std140, set = 0, binding = 0) uniform UBO { vec4 OutputSize; float time; } global; layout(location = 0) in vec2 vTexCoord; layout(location = 0) out vec4 FragColor; float baseScale = 1.25; // [1.0 .. 10.0] float density = 0.5; // [0.01 .. 1.0] float speed = 0.15; // [0.1 .. 1.0] float rand(vec2 co) { return fract(sin(dot(co.xy, vec2(12.9898, 78.233))) * 43758.5453); } float dist_func(vec2 distv) { float dist = sqrt((distv.x * distv.x) + (distv.y * distv.y)) * (40.0 / baseScale); dist = clamp(dist, 0.0, 1.0); return cos(dist * (3.14159265358 * 0.5)) * 0.5; } float random_dots(vec2 co) { float part = 1.0 / 20.0; vec2 cd = floor(co / vec2(part)); float p = rand(cd); if (p > 0.005 * (density * 40.0)) return 0.0; vec2 dpos = (vec2(fract(p * 2.0) , p) + vec2(2.0, 2.0)) * 0.25; vec2 cellpos = fract(co / part); vec2 distv = (cellpos - dpos); return dist_func(distv); } float snow(vec2 pos, float time, float scale) { // add wobble pos.x += cos(pos.y * 1.2 + time * 3.14159 * 2.0 + 1.0 / scale) / (8.0 / scale) * 4.0; // add gravity pos += time * scale * vec2(-0.5, 1.0) * 4.0; return random_dots(pos / vec2(scale)) * (scale * 0.5 + 0.5); } void main() { float tim = global.time * 0.4 * speed; vec2 pos = vTexCoord.xy / global.OutputSize.xx; float a = 0.0; // Each of these is a layer of snow // Remove some for better performance // Changing the scale (3rd value) will mess with the looping a += snow(pos, tim, 1.0); a += snow(pos, tim, 0.7); a += snow(pos, tim, 0.6); a += snow(pos, tim, 0.5); a += snow(pos, tim, 0.4); a += snow(pos, tim, 0.3); a += snow(pos, tim, 0.25); a += snow(pos, tim, 0.125); a = a * min(pos.y * 4.0, 1.0); FragColor = vec4(1.0, 1.0, 1.0, a); } memory/neon/000775 001750 001750 00000000000 13044721241 014147 5ustar00sergiosergio000000 000000 deps/7zip/7zAlloc.h000664 001750 001750 00000000623 13044721241 015211 0ustar00sergiosergio000000 000000 /* 7zAlloc.h -- Allocation functions 2010-10-29 : Igor Pavlov : Public domain */ #ifndef __7Z_ALLOC_H #define __7Z_ALLOC_H #include #ifdef __cplusplus extern "C" { #endif void *SzAlloc(void *p, size_t size); void SzFree(void *p, void *address); void *SzAllocTemp(void *p, size_t size); void SzFreeTemp(void *p, void *address); #ifdef __cplusplus } #endif #endif ctr/assets/mednafen_ngp_banner.png000664 001750 001750 00000066152 13044721241 020460 0ustar00sergiosergio000000 000000 PNG  IHDR䵷 sBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATxg6|I;V9g!! IHP" `GL `cdcd$BPHZisٙY=vIUCډ3csnd+/{\ck^^ל;VvXsy7a^{{ܨ9tӁ$'{w#9]M.N؉fO;we?ו /`ڏNL Neù $;}υ!ao?v:n_ȟy |;#J)o|cNv@^ӦX/'Ursap8v;͍B7}Q~Mop>r& Q6 {ݪ@7ye@g&Ơh?sU `gcHL(;Fr >zIkTmMB>WU$y1/ϕ}##ܧv- `$ ~/In%uUwRT ^@wɖ r\T8gnMݴz vp+[>vgJ^qw4ze%;JNe n:$;S^ |nnNuwRraN.lؙ=߮NM&yR{7 t []a)J4UL&%𝒲2S fBм%Vn2',pqAq[k#}n7wnrM.[k6EÇ?锓.*_re'5n=Ox9{4n\ּJ/YzL8䐞>OOy{iz6ƒr3Og#\?WI@l]1:}&0đ ckZE0yZa2Q@)5̓kY 48<8ԓ9rM;lꢳ8_^iSO^U\TTy ו+Wq?S9rƑe瞻+I2yӏ&F'O^y{3f̨[իo"|嗿r3p�S[6zJ$H܀NӦe􌽞y;OKuJG,PQ7E&O~i=ʿ?PeJJlRSѦ6mI*ez衕&O:ywo2{UC~態ljr6{YT| ܀ pbi% p;H7|e⿾B5e `DGaKK.(?2bH)u?MhA|5MBϟm/[n>-rgΜ5g֬Yйue몤\AX8]tɬ*@ω 0&|\acvqP`o s)?~ѣKʾgC,?r(?\?/!fvoJ&NmvUWMO7栃zQjRlinnnFۺRnevëzaM r8\-!l繂Kp^)N/;3+`o-p3B#G34?ҬT8^yz9rdw~tCԷo۷of뺮婔R|?pWhmhii`fQJ$ϖ/_sUWfԘ1%w|>~ؤ={.ٵkWIie˖|橧W曻"'-xaW3Ӛ.dSt}'VRn6{A%%%sS*:lY]6Bm V18꘣'zSgp:'7nUf4GSN&G $؟L$7#SF:{춀\/VRr2\~t6-A,P>KbdHbHȞ#{ [mݿ_*`0pVۻW^{{gwRn6M8qn;eik[.\vΝս{vtB~kWs|u|mƍc+=СCv/-vE:+0ܼHR y&+&\9INB듺iZQ+ JV޿TQ^^hm+[ҭ#G.Vv@Dn]va}6|@n2S iUVV^17 R[љ(G *f{dy=Q~'mwR'`N a W긫 7>%{R8cɔHwϓ'M<~KKK/xs׮]1H~)?W_~鑷||ymM ?o.ho"4qWxR;EHų-)'Nv9{Lz&:чW'4Pkis3 ubȉ>^D7<8#0+]T\A65 W;pkuz deSM&N(|补VtP9]Q PW_y;y{|SnǛo -YNϬlEk;@MM ***:\7MWr <#G)%sj |!'NTXm9n3fu{>HW;W4~>Ȕlu & P nhhRw2x]\)M~/o[ڮH lY-FK.?na{=,>zj3Ȧ/eJ-b/'K3tȑY9睗U(ˬfj.?)SyMY_/Ypa= p/[D v: Cf V 0M`w?9Io/Dnw@I@8p:μ4ۙ ]ȩd#p.H]$ eUC_+X㏯찿gu( ?$댹O9L>nW]s̬*BBKmuəvY|G~ݔOM2L' ׬- Њ haE>$t }ЭzN|O8%($eB $/0N) R2;bg ^*'|K/m:ᤓx=E~u \I>5׸NaF7nlFuUUUx;=c;`ou5LA:5Oy':3gU@Czx7|}17빷֛n@K"X8wc["R L 0'fDP T:^~ح}wEp8@^6/.% d. dt{85Mlur]r~D~$mݲ5R*/+ 9U49(L]T%e:9ՆU_ֻeVP-~Hѣ0c>wiޙ D90%s JD`0I4K/RT;2 ȟ"QN~-#'d& oW l^8Nn@zwd `=_p\8{C<;o٭SO<㓏:3g?aB=p677nmX9gKU(!O}1@}?r~~hc-)0gLS_fw; 8;咉epڜ/{:3dT+XUi3hwucƌqS\;5j{)Wz"ReUU(c10emhJjE10OPIǞ8lBBv/K.ZO>М݀---✫ wmNL -Zۉ`tJUP~ VS Z:14ݙI &4W;a(A?) l@FnzJ٘ҡ3}R.;m p5b͚3)SJ\[[pH$D:mm^' Җ ~  ~Qľ_?xVSwQGpȄbC'|2%oU^[W?ӹM>S$'e1szy 7͐A;~4z?'e&j81/A6I. СԵuN>㻧)|N{g3)o7tcNlk[o{$!ٷg=l߾=}^:TB &\j8CWV08˚W>|nG(뮹~i?:yD C>u6"L@y^~ل;*/{S)uo89g?g&1@P 8-`v}?#"~plve2)/$s3M")o5{VeIikE=>vI@) $";`UϞx'qm:i 9޻gCq zHT#쏆ðSĠy7?xvIq~4f\'Tڇ/6ha]i&ocZb=N#ZEɀ0N"i[' I`cNǮ\ 3 5'l^Y <y?sWdKIUȔIQr/sgtTW񮩩 -^y\Qf"R=yˌH2䝏pV~yQ>skÞғP|lȟƽOcш ڝ<2鲟^?T"㛱vSlΝoxE8FU䶔[Q/thDֻ @9^*5 MT #pzq/~@*%BCBC;9/@*miN>K@hQԵx*m60fO>UO]ѣGK~;ecvVUU wȽ $TQJ{ >Z$ )tH~͑ (G+_>պz=T%eumu,o,| 'W8mN-cg\GotCBF"ia'{1/U 거=E]m ,哥ޫ\Ӄ;@!&, 4y2~-H~ -dPlm <* e"40@ab&&5l?~CAǜWQѯ4-kOU}ҋ/…s6 }8¸8t٧ذ~ /ݦ_mZ A$H@B]%龗+s7M_υ185Szi[i;؟yXW|kbmsS"ޚ)>diw Yju$֋7߼u᮫9"{~_qI{іMO|z֠TD[gb@1hj&)&A}c1@9Y+*j ϩAm3ך]P3lΊ8=LЙlb+[=o1O̩>s 4ښ-5mhņ :>b%{t%%a{Qk1]ԼOZ V!`2S NFl(p0o/"@m/R1:8mǙfn^(/@HA"[<!"B@%eS" nI ;M HDBC ߶ߠA>;OEc4v>#фCro/fC)DJ6Q#^QDS5#aF`8L &0FrK؎- {g>536 L`Y2'do?co3s2qE'Yy IQ$ 'r|@hu!B7~?FmI@ ?FᩳAE-MԆ-.cP`ީ^>?X %#VZ_5H$jH00`( `BA2wbⶼ 83- x /#C6@WlNjC7"1Rl eZBPq@$5+? V: }aE!U~:%Pݠ^ bX+~e M ؽ\W >x p팂aVwZ[4,pu O`"Ӱ'2fM((b0[/祎{aՓBQWAsu}k IDAT~&y|'v`74P)RI-@ ZJ5ˬy+[@Y`%a!]B*HA@%h{ EK߂2 m֯ H9s+x+{Q@0OO!<{@ӧ!Ѩ*E10%( 2p8"4H@ R27!A@ᐐRZȵ!'}1e13q7:Я}~ 6{k|d t``Qؾ{G8T **LcKk[6AxKQ@ D&I JD[pޕ/? n`ɨ,$g I#  A 3~y2 !  \'>XQqt%zԊ!= 'vE5Cm # =Ѹ=;JPm_d ",n(HI:YBHk?1an\#y:;%*!X# I B|20⨎mNĠ-guŬsA8 lƆO q$K,7H1` fwfgLnLn֢T"7O|߯m0L &$Lo? @!X0!TRdh`аnņV beL D"ChyKO@E{EiBOLJh[ϐ Q} ߝ*0n'㑅 ]@͸6{%zPaۄD !ZoA!R':N_~>iP B HaZ5p!{5>^ۯ{J 6:t| $ e^ ј6O[{xJKb v?sUMwO6|$ş~GL\9e>I@/|` -!mR$@Ppj9Tƹ|:|۶qmK_%^EemUq#\pNwz&")fRA$"o('w@E/F1X>qp@Ixf#)N,pÅif#R',UȅLzjm:A2)X^µ}7P}Sr|6UeZhq{2cjk;^Z4 oFΉWkl\Qb_8k-MS5>]P" λYHF+K5r>aA>M׈è |ܶsnD€8GgOut(\X(HZMl&$q@P~($1vXرB0f+C 6FPq+>mgLl:$T[2,*@XjA ^s|EJz*`* { 5|抸)& o A 3[[++>Dq+{ii3#w\6 oIFLҒő]uf*b^@>/z%- ŒclR p_-=֚FKPB`µG*|9p&_J_ m}^ HDn$4o'0/Rxjq8t~1:HE77 a3ߦ0[\Ė=H Dҡ~/k?=OP- !0P|IRq=-  4vpQ͇}UmBDYbyWΙ:/|aR²!²+(((:{FgQyG|xD*⌑O{#B[~۲GI7mJ'IA]Op44;sczyD|yՏʟ;Լgɖr`ɚڮוM{U0k0 A$i}4('#"}zi8WEF iRtGb03Vm[;` RnJ#z "u.?}qW/ٰ6.t;@>d7/Xq{ M՟wP [6cXL! h !*3o+<1%ߛ$L|S; ; qux?\7Iɥĕept]띨i]2YrQyN:c;ZiPJ9)/3$$'qDσ|?xjw9 _4J&9JfB᳽'V,Kc{:տhTDP=T@^ywvw@Kd4",|ty՟_5mÎ<#gu{3͍{AZ,e;L>Q+Ř|HidI~N џ{hĔSL\ۊ~Bb:r</$4!H I*R%֏]cpx,Xe_U؋>3>P6eԀ}%ѢLӀ(/~0Vѐ!E ^E@^^( Oލf2 B/Ь HDMCK~$%p%t]CcM =F*4nm~_:Y?[+5sK'O3J{8u@~~;zUO)U3"nx6?5#hi6T0(La^fOk2sZ,AQ 0Rb`${LdKcmXhZyzUx@X)D ˟<6YT&:ا1W?m @=74q~CI[<ѓm ͠b' ׇX@;vC&APHDjԟkξ04f>Pj.A6t( R\qO!e岢_U,$;붘4y2$A0sqm5+6>6D=Muv9hdTy̳#{b1ۚF+-(_bf?(jM-%YFXqnّaaQ>D< pCd=skM}$'5)(hl.ټ8~P0xwыї~9XۨVXe߶*3Z7CMiQBZS D;UK T@8L=*$|_5Wwo0$`(DO4PߨҒ I?ePF5%5o [ l-5طu/vC#b?+  -MM isabmP)pW\C {lZ̩~uޟO(;wܧZz䗊4scQm\#BNQJT6(40 fH+.IF l()NVy⏣ioIBBHOy^aD݀j̫>-5&@%I ly)I:XXLR5b eġ6|$h+hA߾5D/ښ|W1BK`S>??$Ik5 M]'^4`jh5bk뾨I XȔSfT~^H(i @[@qhde?H\MŏBQX xcO^D~i()o5~DrB1#/ CH30p=j`S 0H z^_ЬwH {I6+,S3RVS\i IRXk`4Fsjea*,h++PZ5E$" eK[/lXrU pAAX\{E{?Y*_j0n>w 9j+8Ai-&L*Ќ Ҳ9'BE<` X(#  $d'h`}FcWK./ܞ@ܳTyU/yjGfِHKr ! yG?Gw}L/]a @MQԴD!> , q;فDS Fr&6U͕+q-B&fIw/w2=5h p1#bF߇z5!\27q%9}=}f3srU ܮ;Lj`OOlE{JYRͥvHr$H77l50Țc@_lݾ3Q\RHEE?zJWvٳ5^F^𳢺h\Dg9ӑNsH 2$@+ 9Ă!"QtX$eUrDP5+ iZiD& fծf|y_SQRO=k7£&7uܴGϮ]܁p? K;j g!` :@fGk@߾@X!VQEPu ^ҷa:4c{*0^ l_ _iV ٸK*.0@kNS/r/7 hJ!!]=ȭ{3\A/+d{.5swo6VI$3UӬwA ֥$9,UfC!BRr ^_p  (hQT$Hetc۪'z:LX{35XVؚ")i&6_;X {,C]bG{"ڪB0AkdKL"+ʟ]*`񘬠 `p ># &E GsII0+7xM$u &?XeXB} D?J}9"#P*N((RPѷ$IĚ-e&KW* 0 B weO AC&H(&*cKġU/Kl2k"_D@^@&C& Q.)פnry3Iǧ W^.-P-QjD>6l{nUx)Ƃ,&Js$h%Zv}EعT`;7uh5ff`M+aٌ$b;}ٌx h=a~q<氇US19hI@O~صgJdF"sv=MA"B{N!+%T;ya}?tV~yaFDVՏ8%8m3..Jmcf~?7rӎ֝漑BV{b&@(zw[4CgN>uRȵFԏO[;!1pԸ@w1f!=zhz - T J"IfjjvO=3(`CԱ/`KLqDUGN}|s4H ;bvUGr#7jԱfxjlW-}XSs,UWK#C~#ˆhOQe 鸉?^uwM]|zMC̳TU?FSJC[vNU[捄--/0^_ wRB}.GsqM0ZZZFLl"P p#k$G պ}fETm0d lq0 =?~mog#t'ÙcdݎF{E[q=+PZ eĘH0r_jZ IDAT>b3f]"}sXAa=@ Imر6ִ@-Em _ c6ZȇK>yxag`ԙYZ$Z1*p+T J` 8_YYTLCA, +c69ڦ^Yjl+C?`~X fHmb RP 2# !$VDq2:O_!–wڦ| |'c2 <ɳ_5n7ae" {Mݦ ͔oȄR&cR (Mj:ڌ:N@h0Vk(;)_MRoejޅ0JA d>fp"}!櫄qc;j(8X%{[6H"nEMh,H 0#8>kE`N@ 3p^Ҁ؎. ,+ۗ}U`$ IG/C%6@/O$,b(k0KR[0"vj3`BXQ7L \humBJa!&=jz &-t*PmJmٰ%K6 D"$ЪzW׭ɿ&3o۵1Q[_k M$s. 81̬m35mU h5ELUTV0XPh@Ioٯ@b&P0'15F>qHh=̢[Yg~V.J!Q,'U9Ni)F1H1[WǞٰ-7Azϼ2ILLqf̆2q*c40O:P(+*fv- 2QF-B ?$x2NIOiC -xJJI^ `6(f*n {$<,f&jEO"5|n Լ 4%`uHuH$0`0T 3*p7dUA6EEAA),nE\@D#ٳI&NMwstu]Sުˀi}KUu~ 3,D)aM}R ?9(ZO`Q$p" O V`!EN৒C$_yV%[/ P+}h ",8IHE g0c//` e$#%3( Ά afWN f1@B @2H>yQeaa#L0IX l?@Rp^@/ xVQjj ^䁗$@xh_-'q /p,8MբpGc6"ܒa":dY^ePh6[ oN0I $%>_ :If eЁ%)p=z5&0jOA? %+ۣX+(r-P6ģ>y'1Pdz`agLD[TSe$j$$FJ,J"0ѣhb)@T`FMjuK~ى~D^FFA>`Dh/%xdDAAўOQ_oT-KƷkU4' r222%~.")D>Rσ 7(y d<,xAO{xE%,omR>Ky_V6|f?|zHJH>@eᕓ mWd0d?p$B0J<3.*D^Q%x 7F^Z6`@>mrh(h$nKatґ +tljɇ>Ty _2򍄈HyLÛWO"߾"a" Pl^T@evg& XeJiƂA()@ٟRL"<H#-02C2R t@s "2}c4k`!q .*o@:] <80Oħ|DMH$v梨XY0˧'"4!(<,ޯ%-P(hbt72˯Z&71>QI͒²sIazPT\?vK¯B ܢZ @) vKloUPTMطlLNNvBO^_FxV#"a`bOP &6..i:z!ꤻ*0‚E2yݎY7b~6rVҥez栎6blfaiۮ\ic-$NP, //~ExQAB7=z[H@īD'. M#L njj[  H^7/{iEFSG-_z|U˰'V`2d+`X$' I2 / h/?g}OW JNIVVWS݈II#V&# e@{߿C|9G[-ZN|T@e]u4cG9N;Jϟ?NHL0 eZgdf:Ny8K $8_,Ąhn-(M6uםq_6+D3#LU=vLd202`fB0'yU6Q߈$VetVhQ{ShK #\Ff=}-yyӦ>RK|7omX ]w|{ҳt{z1c񑑑{>ثw( _l'N, 0 IOOHǹJ ]S(ltOh*Ь4) eT@mAL&fZnc|};VNVZEt5:999̻sNgyyyW{Ӷ]8t٪'y>x'g8[pJONNMf/^ld1~0hw H0_K3i<׫fёϘFI32ëD{i>;;y4O1a8lݦԫW+f3;֡m֬]+**J"j;c}6mXeN?2e?XvxAA ?i<{#,2 jg4Lo+>x(V5lҔ)F11f g~ԧzj%%%d#W}ڧp,\8; ]jៜ93g-?o٤_|чd~xۂŋy]!n|$yJ 3$i@׹@Wg?]t}#v; Wzcxxߨ:gEEOLL{F7֬Y3^ /m/x5̫RST*.*8\ӰKOOČȜ TRRRU__99R1= ^3222_Zd[m &N,p.Z1###/lWjԘ7.cY7nv8"|UUU.;u7ѮSݻGM2 //+6|QT¿۷lRU.RR >ܛet_}M4ײ @Fˀd<̯.F%۰nAtoۭO̜@_wĈiiZ|ݻk_YnӧofZZ9ztrvNJ/T{]_kfǦ3[oC;(_MMH-iDFFZxzr}o굮g<|yT}#GeuQ({iu}t|~tZ0Kh= `Xػ+ )S|xڝ_ѧo6(m׺ݿTA 71 L4ݸ jJzorgΘ҃0C o=߰o_Ϙ>}bN -;6u}>*=0GV{܍s z$HO>' \3?U`XV|cuuu|=wwF,˃ nSE4W>(Q2ヘvi'?L- ˲'NTU-gZ%mk476,Թܜ^Wۮ]N|~}n7{<4{ Lٿ(²Q#zqÏۈ%@ `F,\~fvCGK`uuuV>92I3 O؜cE&T{(mÇDn7iCko޸_~>P^^^xU#P`ůޥy;ٳ F"REqٻ\.͛68pPgΜ㏥"fp:+j~زxe zF@$hZ? A07|l6Y$6\ ŀqĉTq(.Cu@۷dQQQwΞ=cN)$|8iX4eYTSBB7̩S5e( 7׵kW[|BlZ7NYd1ϧ&{o1@(J/ҏuuuk.-P|>|/ѳ(M(M (̩j=xy}iO^Ӧڜ;h-G.}߉~:wJDi*++k @oSjJoӲĤ7kQ0 @@@hI,pdb(K4-Ztpûv;wٴaId1,.VչJ^'}Im<KDDj:PRR\,'A8b86P!6+ˊov۰kz葊}̌>uf$揂 nt:SRSZ7 ]xbт;7[W4b3/<ٹKkdp@mm-4555dޓYCk . ===jJ'dgUAXQn%ı>ǽJD~㓶7=Ph@4 GIG_SS#lذ~RS;Q8 YҒpZ-h]UNg-+'辀ʪʚfɉ)HPfw^Qto;t7ybccԵ3@v{p͚% iC`A3]Kj߁*N<":%ܢ++g^lZ.3n-/@pئ?xW_Ful6k޽rHNN6WVT俠pj4U@\ڼ@F7q'_X(vѫ vpS^Yt8NVD&{42fSҐTxVkd!C~{U8`}o;U` M~(qlOLD˟ =].- I7ˇT__ϋHl63w$%I\t<^2m/:YY p]t{}k~@(u(~W mvy =ß 1 *[F3?@cQ(w76EQ8s~?fg͛6==ZQE"yPff(X__WKKCҾUbypƒEZY¾lNgUy}qgW Vuf5/7Qc1թ:L3SREp.fHNN4OQ(6pܮ(GLt$S.1ݻuk37DA@ݷo q?5o(Q ѥ%%%z?$%U.eI ۡ%mZhq9⿞a4a@ﭫS\8aF@\]323L9|fʸA\ߩs# \\6(ͩ'S}|>Uڭ{1ƥiv `߾2ATp7egӯ_lVi^nnY|skΛp8T㯿>go,}'aWR\d˺.3""BfA]8wKJܲe0^yw3z1T6-@UUu崩S 7,I^;֕ے?4UZZZ}0;@dI_4^h25F9p0'&u J R̹no+[<~յ{w4pm۶ ⩧Fɇ;:gPܯ|SSdM(bЈHݦͿx=WYY޾m[0 Ϗ~W(+w}w~uϽ fFv{UkAtw8h@)O{{?5fL TٳgO|7uҔ)(_-L/(^ӏW3ҷwWG̲f~qqqv׎\߻8 lވ~pkkj^U˝(DATAe%)|etIAEhН5w IDATUNa!! OZi?H3F̟/naeɊaM&'曭eecl6n\- nf}dgO/*,*mۮmfrJJKT_QQ5_~yJ롒ܜ;u!'!1! f5zrEDDDX,HJVq?2iLظonݺ]QLÚ/>3kge5{v>'''>y>ӆpDK^r_w5jzԳO;SNi}۶*}vAyssw@m4,??4R|BB31c髵kO?5KqqFs{RfC4(EZ*vL D{bر-[laaa[\ Kڄ)cT0O䕜I]&3ǻi>{vEq6-z̧LNn JܱG+֮]/7#3m~}qg(?P]MMG>@1LfKc~y&䋷,9y}%%li>4qȨ(*=hٲߏ: gX^_YUU̙[LM/>|/$ ͛׷ oƗ.K퓳lƟYv{;&6FZp^X_P@ cEݦͪ"EƘqcE{w'1 e-=s7<^]0TՇv]{cԔt$QP+Q;ј_V@nx套֖tdR8S'MPPAР'N\8gy/XgW$SMMMӧcL͋-w P+/$I*ϙŋ27nX]w@Dxx4jQ_K//Ց~r,ITPcǰ⒓8=<ϳa¢EEElRp7z@<$hC$Iҳ7|ݔq+nۺܑ#G'%&aa㼗J/͝4q'3˽>d 65 \]]s{ٻs~pzZU?ٝP!I>w\|湹swIp /V^^G\| >6MWeeeu6&U^TXt̙36o S8?)tpWΝS'N^xLu[n=8"#8**,:]___;/@iOOJLJL&󼧲ya}Mr޽@0}/Ymֳ))Q(*sa?,e,i+ TK[p - {pO֭,ci! ѕ$R Ek#st17 0:hhMFȘ}GPЪ/!dĘLUMm&&lpMgVzH ,oR/L?!;)\4y0ɨ5,\k0Ahu=D$ij)7Eb~} x +^VY,V!BMƢQR̯IҀQ# V DW tF@^jPHS) V$.iC] D!8!;Ik6-$d~hU`R$8I AДx= &]x{4@;Ti4@'ŏ_A㞤JЕ9*72\Әc`b@2:`pv鶟@JMT=A bD@>Fot1~%fU+Ie@-)@K*`r?!T)ג@S@hl'R]ij(D@Dת,7X @ k#=^GSvOkGBwIv9@`DoOHv7H /J! ?MMUȫQ0թ2?yI ! |i! @F{#azNڸ#ڽ ?M녅(Dk2j@~#@ݓeˀz@0@NW~)#D!(\m1x6PSVšŒZZe=ԔuydkQku+e 1{Qi)`mSx IENDB`android/phoenix/libs/googleplay/res/drawable-xhdpi/common_signin_btn_icon_disabled_focus_light.9.png000664 001750 001750 00000004631 13044721241 036063 0ustar00sergiosergio000000 000000 pkgPNG  IHDRbbsBIT|d pHYs 7˭ ;IDATxr9WW?v$6 CҙZi_og-WS@$?{9CZ֮m-WWDd%]ҽ$TU@DX}_y?0tGM}*~(2q'""rd(&Y2yc̃&mwD|&m/V0D/"uֈȶbZU#Uo@}c̩"̵9Z 5Ghe_!:U#Dܯ?S(P f~y/Ъ:,Z$TvيUMӬ5zc'DI>/JQūsop8}ԭuYGъy޿s!l"M&C q${jݟDn.#̵ Qպެj]g,f/DpxGD>F= TumW抵EQ\a"CDZ{oI E3uk9Uݞ}G}kݳ7Mӯ$."+&P Dt.Yju= k9w$j "j}x2t&a6!S<f+5Xfȶsy\acTh`mBQ4+SUϜ5o a#Qkιz~csx)I,f1Xrs 3TśWU">.Z=,>sMwh'cۇ[kƘqlUEfNsݯ% G:TՁs.u΍)":"*jTՈȥMDM${]_#PDL&Uu B("WȱFBi>*D4뽿auG,!O|$IcrbMw/I)!fN@W$zV%TazgNM&i 9Gp иnzPVt~  h5ljGO;>?M2bIENDB`deps/7zip/7zAlloc.c000664 001750 001750 00000000776 13044721241 015215 0ustar00sergiosergio000000 000000 /* 7zAlloc.c -- Allocation functions 2010-10-29 : Igor Pavlov : Public domain */ #include "7zAlloc.h" void *SzAlloc(void *p, size_t size) { (void)p; if (size == 0) return 0; return malloc(size); } void SzFree(void *p, void *address) { (void)p; free(address); } void *SzAllocTemp(void *p, size_t size) { (void)p; if (size == 0) return 0; return malloc(size); } void SzFreeTemp(void *p, void *address) { (void)p; free(address); } gfx/drivers/gl_shaders/modern_opaque.glsl.vert.h000664 001750 001750 00000000725 13044721241 023207 0ustar00sergiosergio000000 000000 #include "shaders_common.h" /* Need to duplicate these to work around broken stuff on Android. * Must enforce alpha = 1.0 or 32-bit games can potentially go black. */ static const char *stock_vertex_modern = GLSL( attribute vec2 TexCoord; attribute vec2 VertexCoord; attribute vec4 Color; uniform mat4 MVPMatrix; varying vec2 tex_coord; void main() { gl_Position = MVPMatrix * vec4(VertexCoord, 0.0, 1.0); tex_coord = TexCoord; } ); ui/drivers/win32/ui_win32_msg_window.c000664 001750 001750 00000006265 13044721241 021006 0ustar00sergiosergio000000 000000 /* RetroArch - A frontend for libretro. * Copyright (C) 2011-2017 - Daniel De Matteis * * 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- * ation, either version 3 of the License, or (at your option) any later version. * * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with RetroArch. * If not, see . */ #include #include #include #include #include #include #include "../../ui_companion_driver.h" static enum ui_msg_window_response ui_msg_window_win32_response(ui_msg_window_state *state, UINT response) { switch (response) { case IDOK: return UI_MSG_RESPONSE_OK; case IDCANCEL: return UI_MSG_RESPONSE_CANCEL; case IDYES: return UI_MSG_RESPONSE_YES; case IDNO: return UI_MSG_RESPONSE_NO; default: break; } switch (state->buttons) { case UI_MSG_WINDOW_OK: return UI_MSG_RESPONSE_OK; case UI_MSG_WINDOW_OKCANCEL: return UI_MSG_RESPONSE_CANCEL; case UI_MSG_WINDOW_YESNO: return UI_MSG_RESPONSE_NO; case UI_MSG_WINDOW_YESNOCANCEL: return UI_MSG_RESPONSE_CANCEL; default: break; } return UI_MSG_RESPONSE_NA; } static UINT ui_msg_window_win32_buttons(ui_msg_window_state *state) { switch (state->buttons) { case UI_MSG_WINDOW_OK: return MB_OK; case UI_MSG_WINDOW_OKCANCEL: return MB_OKCANCEL; case UI_MSG_WINDOW_YESNO: return MB_YESNO; case UI_MSG_WINDOW_YESNOCANCEL: return MB_YESNOCANCEL; } return 0; } static enum ui_msg_window_response ui_msg_window_win32_error(ui_msg_window_state *state) { UINT flags = MB_ICONERROR | ui_msg_window_win32_buttons(state); return ui_msg_window_win32_response(state, MessageBoxA(NULL, (LPCSTR)state->text, (LPCSTR)state->title, flags)); } static enum ui_msg_window_response ui_msg_window_win32_information(ui_msg_window_state *state) { UINT flags = MB_ICONINFORMATION | ui_msg_window_win32_buttons(state); return ui_msg_window_win32_response(state, MessageBoxA(NULL, (LPCSTR)state->text, (LPCSTR)state->title, flags)); } static enum ui_msg_window_response ui_msg_window_win32_question(ui_msg_window_state *state) { UINT flags = MB_ICONQUESTION | ui_msg_window_win32_buttons(state); return ui_msg_window_win32_response(state, MessageBoxA(NULL, (LPCSTR)state->text, (LPCSTR)state->title, flags)); } static enum ui_msg_window_response ui_msg_window_win32_warning(ui_msg_window_state *state) { UINT flags = MB_ICONWARNING | ui_msg_window_win32_buttons(state); return ui_msg_window_win32_response(state, MessageBoxA(NULL, (LPCSTR)state->text, (LPCSTR)state->title, flags)); } const ui_msg_window_t ui_msg_window_win32 = { ui_msg_window_win32_error, ui_msg_window_win32_information, ui_msg_window_win32_question, ui_msg_window_win32_warning, "win32" }; libretro-common/streams/interface_stream.c000664 001750 001750 00000014006 13044721241 022146 0ustar00sergiosergio000000 000000 /* Copyright (C) 2010-2017 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (interface_stream.c). * --------------------------------------------------------------------------------------- * * Permission is hereby granted, free of charge, * to any person obtaining a copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation the rights to * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include #include #include #include struct intfstream_internal { enum intfstream_type type; struct { RFILE *fp; } file; struct { struct { uint8_t *data; unsigned size; } buf; memstream_t *fp; bool writable; } memory; }; bool intfstream_resize(intfstream_internal_t *intf, intfstream_info_t *info) { if (!intf || !info) return false; switch (intf->type) { case INTFSTREAM_FILE: break; case INTFSTREAM_MEMORY: intf->memory.buf.data = info->memory.buf.data; intf->memory.buf.size = info->memory.buf.size; memstream_set_buffer(intf->memory.buf.data, intf->memory.buf.size); break; } return true; } bool intfstream_open(intfstream_internal_t *intf, const char *path, unsigned mode, ssize_t len) { if (!intf) return false; switch (intf->type) { case INTFSTREAM_FILE: intf->file.fp = filestream_open(path, mode, len); if (!intf->file.fp) return false; break; case INTFSTREAM_MEMORY: intf->memory.fp = memstream_open(intf->memory.writable); if (!intf->memory.fp) return false; break; } return true; } int intfstream_close(intfstream_internal_t *intf) { if (!intf) return -1; switch (intf->type) { case INTFSTREAM_FILE: return filestream_close(intf->file.fp); case INTFSTREAM_MEMORY: memstream_close(intf->memory.fp); return 0; } return -1; } void *intfstream_init(intfstream_info_t *info) { intfstream_internal_t *intf = NULL; if (!info) goto error; intf = (intfstream_internal_t*)calloc(1, sizeof(*intf)); if (!intf) goto error; intf->type = info->type; switch (intf->type) { case INTFSTREAM_FILE: break; case INTFSTREAM_MEMORY: intf->memory.writable = info->memory.writable; if (!intfstream_resize(intf, info)) goto error; break; } return intf; error: if (intf) free(intf); return NULL; } int intfstream_seek(intfstream_internal_t *intf, int offset, int whence) { if (!intf) return -1; switch (intf->type) { case INTFSTREAM_FILE: return filestream_seek(intf->file.fp, offset, whence); case INTFSTREAM_MEMORY: return memstream_seek(intf->memory.fp, offset, whence); } return -1; } ssize_t intfstream_read(intfstream_internal_t *intf, void *s, size_t len) { if (!intf) return 0; switch (intf->type) { case INTFSTREAM_FILE: return filestream_read(intf->file.fp, s, len); case INTFSTREAM_MEMORY: return memstream_read(intf->memory.fp, s, len); } return 0; } ssize_t intfstream_write(intfstream_internal_t *intf, const void *s, size_t len) { if (!intf) return 0; switch (intf->type) { case INTFSTREAM_FILE: return filestream_write(intf->file.fp, s, len); case INTFSTREAM_MEMORY: return memstream_write(intf->memory.fp, s, len); } return 0; } char *intfstream_gets(intfstream_internal_t *intf, char *buffer, size_t len) { if (!intf) return NULL; switch (intf->type) { case INTFSTREAM_FILE: return filestream_gets(intf->file.fp, buffer, len); case INTFSTREAM_MEMORY: return memstream_gets(intf->memory.fp, buffer, len); } return NULL; } int intfstream_getc(intfstream_internal_t *intf) { if (!intf) return 0; switch (intf->type) { case INTFSTREAM_FILE: return filestream_getc(intf->file.fp); case INTFSTREAM_MEMORY: return memstream_getc(intf->memory.fp); } return 0; } int intfstream_tell(intfstream_internal_t *intf) { if (!intf) return -1; switch (intf->type) { case INTFSTREAM_FILE: return filestream_tell(intf->file.fp); case INTFSTREAM_MEMORY: return memstream_pos(intf->memory.fp); } return -1; } void intfstream_rewind(intfstream_internal_t *intf) { switch (intf->type) { case INTFSTREAM_FILE: filestream_rewind(intf->file.fp); break; case INTFSTREAM_MEMORY: memstream_rewind(intf->memory.fp); break; } } void intfstream_putc(intfstream_internal_t *intf, int c) { if (!intf) return; switch (intf->type) { case INTFSTREAM_FILE: filestream_putc(intf->file.fp, c); break; case INTFSTREAM_MEMORY: memstream_putc(intf->memory.fp, c); break; } } intl/msg_hash_lbl.h000664 001750 001750 00000132767 13044721241 015461 0ustar00sergiosergio000000 000000 MSG_HASH(MENU_ENUM_LABEL_ACCOUNTS_CHEEVOS_USERNAME, "accounts_cheevos_username") MSG_HASH(MENU_ENUM_LABEL_ACCOUNTS_LIST, "accounts_list") MSG_HASH(MENU_ENUM_LABEL_ACCOUNTS_RETRO_ACHIEVEMENTS, "retro_achievements") MSG_HASH(MENU_ENUM_LABEL_ACHIEVEMENT_LIST, "achievement_list") MSG_HASH(MENU_ENUM_LABEL_ACHIEVEMENT_LIST_HARDCORE, "achievement_list_hardcore") MSG_HASH(MENU_ENUM_LABEL_ADD_CONTENT_LIST, "add_content") MSG_HASH(MENU_ENUM_LABEL_CONFIGURATIONS_LIST, "configurations_list") MSG_HASH(MENU_ENUM_LABEL_ADD_TAB, "add_tab") MSG_HASH(MENU_ENUM_LABEL_NETPLAY_TAB, "netplay_tab") MSG_HASH(MENU_ENUM_LABEL_ARCHIVE_MODE, "archive_mode") MSG_HASH(MENU_ENUM_LABEL_ASSETS_DIRECTORY, "assets_directory") MSG_HASH(MENU_ENUM_LABEL_AUDIO_BLOCK_FRAMES, "audio_block_frames") MSG_HASH(MENU_ENUM_LABEL_AUDIO_DEVICE, "audio_device") MSG_HASH(MENU_ENUM_LABEL_AUDIO_DRIVER, "audio_driver") MSG_HASH(MENU_ENUM_LABEL_AUDIO_DSP_PLUGIN, "audio_dsp_plugin") MSG_HASH(MENU_ENUM_LABEL_AUDIO_ENABLE, "audio_enable") MSG_HASH(MENU_ENUM_LABEL_AUDIO_FILTER_DIR, "audio_filter_dir") MSG_HASH(MENU_ENUM_LABEL_TURBO_DEADZONE_LIST, "turbo_deadzone_list") MSG_HASH(MENU_ENUM_LABEL_AUDIO_LATENCY, "audio_latency") MSG_HASH(MENU_ENUM_LABEL_AUDIO_MAX_TIMING_SKEW, "audio_max_timing_skew") MSG_HASH(MENU_ENUM_LABEL_AUDIO_MUTE, "audio_mute_enable") MSG_HASH(MENU_ENUM_LABEL_AUDIO_OUTPUT_RATE, "audio_output_rate") MSG_HASH(MENU_ENUM_LABEL_AUDIO_RATE_CONTROL_DELTA, "audio_rate_control_delta") MSG_HASH(MENU_ENUM_LABEL_AUDIO_RESAMPLER_DRIVER, "audio_resampler_driver") MSG_HASH(MENU_ENUM_LABEL_AUDIO_SETTINGS, "audio_settings") MSG_HASH(MENU_ENUM_LABEL_AUDIO_SYNC, "audio_sync") MSG_HASH(MENU_ENUM_LABEL_AUDIO_VOLUME, "audio_volume") MSG_HASH(MENU_ENUM_LABEL_AUTOSAVE_INTERVAL, "autosave_interval") MSG_HASH(MENU_ENUM_LABEL_AUTO_OVERRIDES_ENABLE, "auto_overrides_enable") MSG_HASH(MENU_ENUM_LABEL_AUTO_REMAPS_ENABLE, "auto_remaps_enable") MSG_HASH(MENU_ENUM_LABEL_AUTO_SHADERS_ENABLE, "auto_shaders_enable") MSG_HASH(MENU_ENUM_LABEL_BLOCK_SRAM_OVERWRITE, "block_sram_overwrite") MSG_HASH(MENU_ENUM_LABEL_BLUETOOTH_ENABLE, "bluetooth_enable") MSG_HASH(MENU_ENUM_LABEL_BUILDBOT_ASSETS_URL, "buildbot_assets_url") MSG_HASH(MENU_ENUM_LABEL_CACHE_DIRECTORY, "cache_directory") MSG_HASH(MENU_ENUM_LABEL_CAMERA_ALLOW, "camera_allow") MSG_HASH(MENU_ENUM_LABEL_CAMERA_DRIVER, "camera_driver") MSG_HASH(MENU_ENUM_LABEL_CB_CORE_CONTENT_DIRS_LIST, "cb_core_content_dirs_list") MSG_HASH(MENU_ENUM_LABEL_CB_CORE_CONTENT_DOWNLOAD, "cb_core_content_download") MSG_HASH(MENU_ENUM_LABEL_CB_CORE_CONTENT_LIST, "cb_core_content_list") MSG_HASH(MENU_ENUM_LABEL_CB_CORE_THUMBNAILS_DOWNLOAD, "cb_core_thumbnails_download") MSG_HASH(MENU_ENUM_LABEL_CB_CORE_UPDATER_DOWNLOAD, "cb_core_updater_download") MSG_HASH(MENU_ENUM_LABEL_CB_CORE_UPDATER_LIST, "cb_core_updater_list") MSG_HASH(MENU_ENUM_LABEL_CB_DOWNLOAD_URL, "cb_download_url") MSG_HASH(MENU_ENUM_LABEL_CB_LAKKA_DOWNLOAD, "cb_lakka_download") MSG_HASH(MENU_ENUM_LABEL_CB_LAKKA_LIST, "cb_lakka_list") MSG_HASH(MENU_ENUM_LABEL_CB_MENU_THUMBNAIL, "cb_menu_thumbnail") MSG_HASH(MENU_ENUM_LABEL_CB_MENU_WALLPAPER, "cb_menu_wallpaper") MSG_HASH(MENU_ENUM_LABEL_CB_THUMBNAILS_UPDATER_DOWNLOAD, "cb_thumbnails_updater_download") MSG_HASH(MENU_ENUM_LABEL_CB_THUMBNAILS_UPDATER_LIST, "cb_thumbnails_updater_list") MSG_HASH(MENU_ENUM_LABEL_CB_UPDATE_ASSETS, "cb_update_assets") MSG_HASH(MENU_ENUM_LABEL_CB_UPDATE_AUTOCONFIG_PROFILES, "cb_update_autoconfig_profiles") MSG_HASH(MENU_ENUM_LABEL_CB_UPDATE_CHEATS, "cb_update_cheats") MSG_HASH(MENU_ENUM_LABEL_CB_UPDATE_CORE_INFO_FILES, "cb_update_core_info_files") MSG_HASH(MENU_ENUM_LABEL_CB_UPDATE_DATABASES, "cb_update_databases") MSG_HASH(MENU_ENUM_LABEL_CB_UPDATE_OVERLAYS, "cb_update_overlays") MSG_HASH(MENU_ENUM_LABEL_CB_UPDATE_SHADERS_CG, "cb_update_shaders_cg") MSG_HASH(MENU_ENUM_LABEL_CB_UPDATE_SHADERS_GLSL, "cb_update_shaders_glsl") MSG_HASH(MENU_ENUM_LABEL_CHEAT_APPLY_CHANGES, "cheat_apply_changes") MSG_HASH(MENU_ENUM_LABEL_CHEAT_DATABASE_PATH, "cheat_database_path") MSG_HASH(MENU_ENUM_LABEL_CHEAT_FILE_LOAD, "cheat_file_load") MSG_HASH(MENU_ENUM_LABEL_CHEAT_FILE_SAVE_AS, "cheat_file_save_as") MSG_HASH(MENU_ENUM_LABEL_CHEAT_NUM_PASSES, "cheat_num_passes") MSG_HASH(MENU_ENUM_LABEL_CHEEVOS_DESCRIPTION, "cheevos_description") MSG_HASH(MENU_ENUM_LABEL_CHEEVOS_ENABLE, "cheevos_enable") MSG_HASH(MENU_ENUM_LABEL_CHEEVOS_HARDCORE_MODE_ENABLE, "cheevos_hardcore_mode_enable") MSG_HASH(MENU_ENUM_LABEL_CHEEVOS_LOCKED_ACHIEVEMENTS, "cheevos_locked_achievements") MSG_HASH(MENU_ENUM_LABEL_CHEEVOS_LOCKED_ENTRY, "cheevos_locked_entry") MSG_HASH(MENU_ENUM_LABEL_CHEEVOS_PASSWORD, "cheevos_password") MSG_HASH(MENU_ENUM_LABEL_CHEEVOS_TEST_UNOFFICIAL, "cheevos_test_unofficial") MSG_HASH(MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ACHIEVEMENTS, "cheevos_unlocked_achievements") MSG_HASH(MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY, "cheevos_unlocked_entry") MSG_HASH(MENU_ENUM_LABEL_CHEEVOS_USERNAME, "cheevos_username") MSG_HASH(MENU_ENUM_LABEL_CLOSE_CONTENT, "unload_core") MSG_HASH(MENU_ENUM_LABEL_COLLECTION, "collection") MSG_HASH(MENU_ENUM_LABEL_CONFIGURATIONS, "configurations") MSG_HASH(MENU_ENUM_LABEL_CONFIGURATION_SETTINGS, "Determines how configuration files \n" "are loaded and prioritized.") MSG_HASH(MENU_ENUM_LABEL_CONFIG_SAVE_ON_EXIT, "config_save_on_exit") MSG_HASH(MENU_ENUM_LABEL_CONNECT_WIFI, "connect_wifi") MSG_HASH(MENU_ENUM_LABEL_CONNECT_NETPLAY_ROOM, "connect_room") MSG_HASH(MENU_ENUM_LABEL_CONTENT_ACTIONS, "content_actions") MSG_HASH(MENU_ENUM_LABEL_CONTENT_COLLECTION_LIST, "select_from_collection") MSG_HASH(MENU_ENUM_LABEL_BROWSE_URL_LIST, "browse_url_list") MSG_HASH(MENU_ENUM_LABEL_CONTENT_DATABASE_DIRECTORY, "content_database_path") MSG_HASH(MENU_ENUM_LABEL_CONTENT_HISTORY_SIZE, "content_history_size") MSG_HASH(MENU_ENUM_LABEL_PLAYLIST_ENTRY_REMOVE, "playlist_entry_remove") MSG_HASH(MENU_ENUM_LABEL_CONTENT_SETTINGS, "quick_menu") MSG_HASH(MENU_ENUM_LABEL_CORE_ASSETS_DIRECTORY, "core_assets_directory") MSG_HASH(MENU_ENUM_LABEL_CORE_CHEAT_OPTIONS, "core_cheat_options") MSG_HASH(MENU_ENUM_LABEL_CORE_COUNTERS, "core_counters") MSG_HASH(MENU_ENUM_LABEL_CORE_ENABLE, "menu_core_enable") MSG_HASH(MENU_ENUM_LABEL_CORE_INFORMATION, "core_information") MSG_HASH(MENU_ENUM_LABEL_CORE_INFO_ENTRY, "core_info_entry") MSG_HASH(MENU_ENUM_LABEL_CORE_INPUT_REMAPPING_OPTIONS, "core_input_remapping_options") MSG_HASH(MENU_ENUM_LABEL_CORE_LIST, "load_core") MSG_HASH(MENU_ENUM_LABEL_CORE_OPTIONS, "core_options") MSG_HASH(MENU_ENUM_LABEL_CORE_OPTION_ENTRY, "core_option_entry") MSG_HASH(MENU_ENUM_LABEL_CORE_SETTINGS, "core_settings") MSG_HASH(MENU_ENUM_LABEL_CORE_SET_SUPPORTS_NO_CONTENT_ENABLE, "core_set_supports_no_content_enable") MSG_HASH(MENU_ENUM_LABEL_CORE_UPDATER_AUTO_EXTRACT_ARCHIVE, "core_updater_auto_extract_archive") MSG_HASH(MENU_ENUM_LABEL_CORE_UPDATER_BUILDBOT_URL, "core_updater_buildbot_url") MSG_HASH(MENU_ENUM_LABEL_CORE_UPDATER_LIST, "core_updater_list") MSG_HASH(MENU_ENUM_LABEL_CPU_ARCHITECTURE, "system_information_cpu_architecture") MSG_HASH(MENU_ENUM_LABEL_CPU_CORES, "system_information_cpu_cores") MSG_HASH(MENU_ENUM_LABEL_CURSOR_DIRECTORY, "cursor_directory") MSG_HASH(MENU_ENUM_LABEL_CURSOR_MANAGER, "cursor_manager") MSG_HASH(MENU_ENUM_LABEL_CURSOR_MANAGER_LIST, "cursor_manager_list") MSG_HASH(MENU_ENUM_LABEL_CUSTOM_BIND, "custom_bind") MSG_HASH(MENU_ENUM_LABEL_CUSTOM_BIND_ALL, "custom_bind_all") MSG_HASH(MENU_ENUM_LABEL_CUSTOM_RATIO, "custom_ratio") MSG_HASH(MENU_ENUM_LABEL_DATABASE_MANAGER, "database_manager") MSG_HASH(MENU_ENUM_LABEL_DATABASE_MANAGER_LIST, "database_manager_list") MSG_HASH(MENU_ENUM_LABEL_DEFERRED_BROWSE_URL_START, "deferred_browse_url_start") MSG_HASH(MENU_ENUM_LABEL_DEFERRED_BROWSE_URL_LIST, "deferred_browse_url_list") MSG_HASH(MENU_ENUM_LABEL_DEFERRED_ACCOUNTS_CHEEVOS_LIST, "deferred_accounts_cheevos_list") MSG_HASH(MENU_ENUM_LABEL_DEFERRED_ACCOUNTS_LIST, "deferred_accounts_list") MSG_HASH(MENU_ENUM_LABEL_DEFERRED_ARCHIVE_ACTION, "deferred_archive_action") MSG_HASH(MENU_ENUM_LABEL_DEFERRED_ARCHIVE_ACTION_DETECT_CORE, "deferred_archive_action_detect_core") MSG_HASH(MENU_ENUM_LABEL_DEFERRED_ARCHIVE_OPEN, "deferred_archive_open") MSG_HASH(MENU_ENUM_LABEL_DEFERRED_ARCHIVE_OPEN_DETECT_CORE, "deferred_archive_open_detect_core") MSG_HASH(MENU_ENUM_LABEL_DEFERRED_AUDIO_SETTINGS_LIST, "deferred_audio_settings_list") MSG_HASH(MENU_ENUM_LABEL_DEFERRED_CONFIGURATION_SETTINGS_LIST, "deferred_configuration_settings_list") MSG_HASH(MENU_ENUM_LABEL_DEFERRED_CORE_CONTENT_DIRS_LIST, "deferred_core_content_dirs_list") MSG_HASH(MENU_ENUM_LABEL_DEFERRED_CORE_CONTENT_DIRS_SUBDIR_LIST, "deferred_core_content_dirs_subdir_list") MSG_HASH(MENU_ENUM_LABEL_DEFERRED_CORE_CONTENT_LIST, "deferred_core_content_list") MSG_HASH(MENU_ENUM_LABEL_DEFERRED_CORE_LIST, "deferred_core_list") MSG_HASH(MENU_ENUM_LABEL_DEFERRED_CORE_LIST_SET, "deferred_core_list_set") MSG_HASH(MENU_ENUM_LABEL_DEFERRED_CORE_SETTINGS_LIST, "deferred_core_settings_list") MSG_HASH(MENU_ENUM_LABEL_DEFERRED_CORE_UPDATER_LIST, "core_updater") MSG_HASH(MENU_ENUM_LABEL_DEFERRED_CURSOR_MANAGER_LIST, "deferred_cursor_manager_list") MSG_HASH(MENU_ENUM_LABEL_DEFERRED_DATABASE_MANAGER_LIST, "deferred_database_manager_list") MSG_HASH(MENU_ENUM_LABEL_DEFERRED_DIRECTORY_SETTINGS_LIST, "deferred_directory_settings_list") MSG_HASH(MENU_ENUM_LABEL_DEFERRED_DRIVER_SETTINGS_LIST, "deferred_driver_settings_list") MSG_HASH(MENU_ENUM_LABEL_DEFERRED_FRAME_THROTTLE_SETTINGS_LIST, "deferred_frame_throttle_settings_list") MSG_HASH(MENU_ENUM_LABEL_DEFERRED_INPUT_HOTKEY_BINDS_LIST, "deferred_input_hotkey_binds") MSG_HASH(MENU_ENUM_LABEL_DEFERRED_INPUT_SETTINGS_LIST, "deferred_input_settings_list") MSG_HASH(MENU_ENUM_LABEL_DEFERRED_LAKKA_LIST, "deferred_lakka_list") MSG_HASH(MENU_ENUM_LABEL_DEFERRED_LAKKA_SERVICES_LIST, "deferred_lakka_services_list") MSG_HASH(MENU_ENUM_LABEL_DEFERRED_LOGGING_SETTINGS_LIST, "deferred_logging_settings_list") MSG_HASH(MENU_ENUM_LABEL_DEFERRED_MENU_FILE_BROWSER_SETTINGS_LIST, "deferred_menu_file_browser_settings_list") MSG_HASH(MENU_ENUM_LABEL_DEFERRED_MENU_SETTINGS_LIST, "deferred_menu_settings_list") MSG_HASH(MENU_ENUM_LABEL_DEFERRED_NETWORK_SETTINGS_LIST, "deferred_network_settings_list") MSG_HASH(MENU_ENUM_LABEL_DEFERRED_ONSCREEN_DISPLAY_SETTINGS_LIST, "deferred_onscreen_display_settings_list") MSG_HASH(MENU_ENUM_LABEL_DEFERRED_ONSCREEN_OVERLAY_SETTINGS_LIST, "deferred_onscreen_overlay_settings_list") MSG_HASH(MENU_ENUM_LABEL_DEFERRED_ONSCREEN_NOTIFICATIONS_SETTINGS_LIST, "deferred_onscreen_notifications_settings_list") MSG_HASH(MENU_ENUM_LABEL_DEFERRED_PLAYLIST_SETTINGS_LIST, "deferred_playlist_settings") MSG_HASH(MENU_ENUM_LABEL_DEFERRED_PRIVACY_SETTINGS_LIST, "deferred_privacy_settings_list") MSG_HASH(MENU_ENUM_LABEL_DEFERRED_RDB_ENTRY_DETAIL, "deferred_rdb_entry_detail") MSG_HASH(MENU_ENUM_LABEL_DEFERRED_RECORDING_SETTINGS_LIST, "deferred_recording_settings") MSG_HASH(MENU_ENUM_LABEL_DEFERRED_RETRO_ACHIEVEMENTS_SETTINGS_LIST, "deferred_retro_achievements_settings_list") MSG_HASH(MENU_ENUM_LABEL_DEFERRED_REWIND_SETTINGS_LIST, "deferred_rewind_settings_list") MSG_HASH(MENU_ENUM_LABEL_DEFERRED_SAVING_SETTINGS_LIST, "deferred_saving_settings_list") MSG_HASH(MENU_ENUM_LABEL_DEFERRED_THUMBNAILS_UPDATER_LIST, "deferred_thumbnails_updater_list") MSG_HASH(MENU_ENUM_LABEL_DEFERRED_UPDATER_SETTINGS_LIST, "deferred_updater_settings_list") MSG_HASH(MENU_ENUM_LABEL_DEFERRED_USER_BINDS_LIST, "deferred_user_binds_list") MSG_HASH(MENU_ENUM_LABEL_DEFERRED_USER_INTERFACE_SETTINGS_LIST, "deferred_user_interface_settings_list") MSG_HASH(MENU_ENUM_LABEL_DEFERRED_USER_SETTINGS_LIST, "deferred_user_settings_list") MSG_HASH(MENU_ENUM_LABEL_DEFERRED_VIDEO_FILTER, "deferred_video_filter") MSG_HASH(MENU_ENUM_LABEL_DEFERRED_VIDEO_SETTINGS_LIST, "deferred_video_settings_list") MSG_HASH(MENU_ENUM_LABEL_DEFERRED_WIFI_SETTINGS_LIST, "deferred_wifi_settings_list") MSG_HASH(MENU_ENUM_LABEL_DELETE_ENTRY, "delete_entry") MSG_HASH(MENU_ENUM_LABEL_FAVORITES, "favorites") MSG_HASH(MENU_ENUM_LABEL_DIRECTORY_SETTINGS, "directory_settings") MSG_HASH(MENU_ENUM_LABEL_DISK_CYCLE_TRAY_STATUS, "disk_cycle_tray_status") MSG_HASH(MENU_ENUM_LABEL_DISK_IMAGE_APPEND, "disk_image_append") MSG_HASH(MENU_ENUM_LABEL_DISK_OPTIONS, "core_disk_options") MSG_HASH(MENU_ENUM_LABEL_DOWNLOADED_FILE_DETECT_CORE_LIST, "downloaded_file_detect_core_list") MSG_HASH(MENU_ENUM_LABEL_DOWNLOAD_CORE_CONTENT, "download_core_content") MSG_HASH(MENU_ENUM_LABEL_DOWNLOAD_CORE_CONTENT_DIRS, "download_core_content_dirs") MSG_HASH(MENU_ENUM_LABEL_CONTENT_DIR, "content_directory") MSG_HASH(MENU_ENUM_LABEL_DPI_OVERRIDE_ENABLE, "dpi_override_enable") MSG_HASH(MENU_ENUM_LABEL_DPI_OVERRIDE_VALUE, "dpi_override_value") MSG_HASH(MENU_ENUM_LABEL_DRIVER_SETTINGS, "driver_settings") MSG_HASH(MENU_ENUM_LABEL_CHECK_FOR_MISSING_FIRMWARE, "check_for_missing_firmware") MSG_HASH(MENU_ENUM_LABEL_DUMMY_ON_CORE_SHUTDOWN, "dummy_on_core_shutdown") MSG_HASH(MENU_ENUM_LABEL_DYNAMIC_WALLPAPER, "menu_dynamic_wallpaper_enable") MSG_HASH(MENU_ENUM_LABEL_DYNAMIC_WALLPAPERS_DIRECTORY, "dynamic_wallpapers_directory") MSG_HASH(MENU_ENUM_LABEL_ENTRY_HOVER_COLOR, "menu_entry_hover_color") MSG_HASH(MENU_ENUM_LABEL_ENTRY_NORMAL_COLOR, "menu_entry_normal_color") MSG_HASH(MENU_ENUM_LABEL_FASTFORWARD_RATIO, "fastforward_ratio") MSG_HASH(MENU_ENUM_LABEL_FILE_BROWSER_CORE, "file_browser_core") MSG_HASH(MENU_ENUM_LABEL_FILE_BROWSER_CORE_DETECTED, "file_browser_core_detected") MSG_HASH(MENU_ENUM_LABEL_FILE_BROWSER_CORE_SELECT_FROM_COLLECTION, "file_browser_core_select_from_collection") MSG_HASH(MENU_ENUM_LABEL_FILE_BROWSER_CORE_SELECT_FROM_COLLECTION_CURRENT_CORE, "file_browser_core_select_from_collection_current_core") MSG_HASH(MENU_ENUM_LABEL_FILE_BROWSER_DIRECTORY, "file_browser_directory") MSG_HASH(MENU_ENUM_LABEL_FILE_BROWSER_IMAGE, "file_browser_image") MSG_HASH(MENU_ENUM_LABEL_FILE_BROWSER_IMAGE_OPEN_WITH_VIEWER, "file_browser_image_open_with_viewer") MSG_HASH(MENU_ENUM_LABEL_FILE_BROWSER_MOVIE_OPEN, "file_browser_movie_open") MSG_HASH(MENU_ENUM_LABEL_FILE_BROWSER_MUSIC_OPEN, "file_browser_music_open") MSG_HASH(MENU_ENUM_LABEL_FILE_BROWSER_PLAIN_FILE, "file_browser_plain_file") MSG_HASH(MENU_ENUM_LABEL_FILE_BROWSER_REMAP, "file_browser_remap") MSG_HASH(MENU_ENUM_LABEL_FILE_BROWSER_SHADER, "file_browser_shader") MSG_HASH(MENU_ENUM_LABEL_FILE_BROWSER_SHADER_PRESET, "file_browser_shader_preset") MSG_HASH(MENU_ENUM_LABEL_FPS_SHOW, "fps_show") MSG_HASH(MENU_ENUM_LABEL_FRAME_THROTTLE_ENABLE, "fastforward_ratio_throttle_enable") MSG_HASH(MENU_ENUM_LABEL_FRAME_THROTTLE_SETTINGS, "frame_throttle_settings") MSG_HASH(MENU_ENUM_LABEL_FRONTEND_COUNTERS, "frontend_counters") MSG_HASH(MENU_ENUM_LABEL_GAME_SPECIFIC_OPTIONS, "game_specific_options") MSG_HASH(MENU_ENUM_LABEL_GAME_SPECIFIC_OPTIONS_CREATE, "game_specific_options_create") MSG_HASH(MENU_ENUM_LABEL_GAME_SPECIFIC_OPTIONS_IN_USE, "game_specific_options_in_use") MSG_HASH(MENU_ENUM_LABEL_HELP, "help") MSG_HASH(MENU_ENUM_LABEL_HELP_AUDIO_VIDEO_TROUBLESHOOTING, "help_audio_video_troubleshooting") MSG_HASH(MENU_ENUM_LABEL_HELP_CHANGE_VIRTUAL_GAMEPAD, "help_change_virtual_gamepad") MSG_HASH(MENU_ENUM_LABEL_HELP_CONTROLS, "help_controls") MSG_HASH(MENU_ENUM_LABEL_HELP_LIST, "help_list") MSG_HASH(MENU_ENUM_LABEL_HELP_LOADING_CONTENT, "help_loading_content") MSG_HASH(MENU_ENUM_LABEL_HELP_SCANNING_CONTENT, "help_scanning_content") MSG_HASH(MENU_ENUM_LABEL_HELP_WHAT_IS_A_CORE, "help_what_is_a_core") MSG_HASH(MENU_ENUM_LABEL_HISTORY_LIST_ENABLE, "history_list_enable") MSG_HASH(MENU_ENUM_LABEL_HISTORY_TAB, "history_tab") MSG_HASH(MENU_ENUM_LABEL_HORIZONTAL_MENU, "horizontal_menu") MSG_HASH(MENU_ENUM_LABEL_IMAGES_TAB, "images_tab") MSG_HASH(MENU_ENUM_LABEL_INFORMATION, "information") MSG_HASH(MENU_ENUM_LABEL_INFORMATION_LIST, "information_list") MSG_HASH(MENU_ENUM_LABEL_INFO_SCREEN, "info_screen") MSG_HASH(MENU_ENUM_LABEL_INPUT_ALL_USERS_CONTROL_MENU, "all_users_control_menu") MSG_HASH(MENU_ENUM_LABEL_MENU_INPUT_SWAP_OK_CANCEL, "menu_swap_ok_cancel") MSG_HASH(MENU_ENUM_LABEL_INPUT_AUTODETECT_ENABLE, "input_autodetect_enable") MSG_HASH(MENU_ENUM_LABEL_INPUT_AXIS_THRESHOLD, "input_axis_threshold") MSG_HASH(MENU_ENUM_LABEL_INPUT_BIND_MODE, "input_bind_mode") MSG_HASH(MENU_ENUM_LABEL_INPUT_BIND_TIMEOUT, "input_bind_timeout") MSG_HASH(MENU_ENUM_LABEL_INPUT_DESCRIPTOR_HIDE_UNBOUND, "input_descriptor_hide_unbound") MSG_HASH(MENU_ENUM_LABEL_INPUT_DESCRIPTOR_LABEL_SHOW, "input_descriptor_label_show") MSG_HASH(MENU_ENUM_LABEL_INPUT_DRIVER, "input_driver") MSG_HASH(MENU_ENUM_LABEL_INPUT_DUTY_CYCLE, "input_duty_cycle") MSG_HASH(MENU_ENUM_LABEL_INPUT_HOTKEY_BINDS, "input_hotkey_binds") MSG_HASH(MENU_ENUM_LABEL_INPUT_HOTKEY_BINDS_BEGIN, "input_hotkey_binds_begin") MSG_HASH(MENU_ENUM_LABEL_INPUT_ICADE_ENABLE, "input_icade_enable") MSG_HASH(MENU_ENUM_LABEL_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, "keyboard_gamepad_mapping_type") MSG_HASH(MENU_ENUM_LABEL_INPUT_LIBRETRO_DEVICE, "input_libretro_device_p%u") MSG_HASH(MENU_ENUM_LABEL_INPUT_MAX_USERS, "input_max_users") MSG_HASH(MENU_ENUM_LABEL_INPUT_MENU_ENUM_TOGGLE_GAMEPAD_COMBO, "input_menu_toggle_gamepad_combo") MSG_HASH(MENU_ENUM_LABEL_INPUT_OVERLAY_ENABLE, "input_overlay_enable") MSG_HASH(MENU_ENUM_LABEL_INPUT_OVERLAY_HIDE_IN_MENU, "overlay_hide_in_menu") MSG_HASH(MENU_ENUM_LABEL_INPUT_PLAYER_ANALOG_DPAD_MODE, "input_player%u_analog_dpad_mode") MSG_HASH(MENU_ENUM_LABEL_INPUT_POLL_TYPE_BEHAVIOR, "input_poll_type_behavior") MSG_HASH(MENU_ENUM_LABEL_INPUT_PREFER_FRONT_TOUCH, "input_prefer_front_touch") MSG_HASH(MENU_ENUM_LABEL_INPUT_REMAPPING_DIRECTORY, "input_remapping_directory") MSG_HASH(MENU_ENUM_LABEL_INPUT_REMAP_BINDS_ENABLE, "input_remap_binds_enable") MSG_HASH(MENU_ENUM_LABEL_INPUT_SETTINGS, "input_settings") MSG_HASH(MENU_ENUM_LABEL_INPUT_SETTINGS_BEGIN, "input_settings_begin") MSG_HASH(MENU_ENUM_LABEL_INPUT_SMALL_KEYBOARD_ENABLE, "input_small_keyboard_enable") MSG_HASH(MENU_ENUM_LABEL_INPUT_TOUCH_ENABLE, "input_touch_enable") MSG_HASH(MENU_ENUM_LABEL_INPUT_TURBO_PERIOD, "input_turbo_period") MSG_HASH(MENU_ENUM_LABEL_INPUT_USER_10_BINDS, "10_input_binds_list") MSG_HASH(MENU_ENUM_LABEL_INPUT_USER_11_BINDS, "11_input_binds_list") MSG_HASH(MENU_ENUM_LABEL_INPUT_USER_12_BINDS, "12_input_binds_list") MSG_HASH(MENU_ENUM_LABEL_INPUT_USER_13_BINDS, "13_input_binds_list") MSG_HASH(MENU_ENUM_LABEL_INPUT_USER_14_BINDS, "14_input_binds_list") MSG_HASH(MENU_ENUM_LABEL_INPUT_USER_15_BINDS, "15_input_binds_list") MSG_HASH(MENU_ENUM_LABEL_INPUT_USER_16_BINDS, "16_input_binds_list") MSG_HASH(MENU_ENUM_LABEL_INPUT_USER_1_BINDS, "1_input_binds_list") MSG_HASH(MENU_ENUM_LABEL_INPUT_USER_2_BINDS, "2_input_binds_list") MSG_HASH(MENU_ENUM_LABEL_INPUT_USER_3_BINDS, "3_input_binds_list") MSG_HASH(MENU_ENUM_LABEL_INPUT_USER_4_BINDS, "4_input_binds_list") MSG_HASH(MENU_ENUM_LABEL_INPUT_USER_5_BINDS, "5_input_binds_list") MSG_HASH(MENU_ENUM_LABEL_INPUT_USER_6_BINDS, "6_input_binds_list") MSG_HASH(MENU_ENUM_LABEL_INPUT_USER_7_BINDS, "7_input_binds_list") MSG_HASH(MENU_ENUM_LABEL_INPUT_USER_8_BINDS, "8_input_binds_list") MSG_HASH(MENU_ENUM_LABEL_INPUT_USER_9_BINDS, "9_input_binds_list") MSG_HASH(MENU_ENUM_LABEL_JOYPAD_AUTOCONFIG_DIR, "joypad_autoconfig_dir") MSG_HASH(MENU_ENUM_LABEL_JOYPAD_DRIVER, "input_joypad_driver") MSG_HASH(MENU_ENUM_LABEL_LAKKA_SERVICES, "lakka_services") MSG_HASH(MENU_ENUM_LABEL_LIBRETRO_DIR_PATH, "libretro_dir_path") MSG_HASH(MENU_ENUM_LABEL_LIBRETRO_INFO_PATH, "libretro_info_path") MSG_HASH(MENU_ENUM_LABEL_LIBRETRO_LOG_LEVEL, "libretro_log_level") MSG_HASH(MENU_ENUM_LABEL_LOAD_ARCHIVE, "load_archive") MSG_HASH(MENU_ENUM_LABEL_LOAD_ARCHIVE_DETECT_CORE, "load_archive_detect_core") MSG_HASH(MENU_ENUM_LABEL_LOAD_CONTENT_HISTORY, "load_recent") MSG_HASH(MENU_ENUM_LABEL_LOAD_CONTENT_LIST, "load_content") MSG_HASH(MENU_ENUM_LABEL_LOAD_STATE, "loadstate") MSG_HASH(MENU_ENUM_LABEL_LOCATION_ALLOW, "location_allow") MSG_HASH(MENU_ENUM_LABEL_LOCATION_DRIVER, "location_driver") MSG_HASH(MENU_ENUM_LABEL_LOGGING_SETTINGS, "logging_settings") MSG_HASH(MENU_ENUM_LABEL_LOG_VERBOSITY, "log_verbosity") MSG_HASH(MENU_ENUM_LABEL_MAIN_MENU, "main_menu") MSG_HASH(MENU_ENUM_LABEL_MANAGEMENT, "database_settings") MSG_HASH(MENU_ENUM_LABEL_MATERIALUI_MENU_COLOR_THEME, "materialui_menu_color_theme") MSG_HASH(MENU_ENUM_LABEL_MATERIALUI_MENU_FOOTER_OPACITY, "materialui_menu_footer_opacity") MSG_HASH(MENU_ENUM_LABEL_MATERIALUI_MENU_HEADER_OPACITY, "materialui_menu_header_opacity") MSG_HASH(MENU_ENUM_LABEL_MENU_DRIVER, "menu_driver") MSG_HASH(MENU_ENUM_LABEL_MENU_ENUM_THROTTLE_FRAMERATE, "menu_throttle_framerate") MSG_HASH(MENU_ENUM_LABEL_MENU_FILE_BROWSER_SETTINGS, "menu_file_browser_settings") MSG_HASH(MENU_ENUM_LABEL_MENU_LINEAR_FILTER, "menu_linear_filter") MSG_HASH(MENU_ENUM_LABEL_MENU_SETTINGS, "menu_settings") MSG_HASH(MENU_ENUM_LABEL_MENU_WALLPAPER, "menu_wallpaper") MSG_HASH(MENU_ENUM_LABEL_MENU_WALLPAPER_OPACITY, "menu_wallpaper_opacity") MSG_HASH(MENU_ENUM_LABEL_MOUSE_ENABLE, "menu_mouse_enable") MSG_HASH(MENU_ENUM_LABEL_MUSIC_TAB, "music_tab") MSG_HASH(MENU_ENUM_LABEL_NAVIGATION_BROWSER_FILTER_SUPPORTED_EXTENSIONS_ENABLE, "menu_navigation_browser_filter_supported_extensions_enable") MSG_HASH(MENU_ENUM_LABEL_NAVIGATION_WRAPAROUND, "menu_navigation_wraparound_enable") MSG_HASH(MENU_ENUM_LABEL_NETPLAY, "netplay") MSG_HASH(MENU_ENUM_LABEL_NETPLAY_CHECK_FRAMES, "netplay_check_frames") MSG_HASH(MENU_ENUM_LABEL_NETPLAY_CLIENT_SWAP_INPUT, "netplay_client_swap_input") MSG_HASH(MENU_ENUM_LABEL_NETPLAY_INPUT_LATENCY_FRAMES_MIN, "netplay_input_latency_frames_min") MSG_HASH(MENU_ENUM_LABEL_NETPLAY_INPUT_LATENCY_FRAMES_RANGE, "netplay_input_latency_frames_range") MSG_HASH(MENU_ENUM_LABEL_NETPLAY_DISCONNECT, "menu_netplay_disconnect") MSG_HASH(MENU_ENUM_LABEL_NETPLAY_ENABLE, "netplay_enable") MSG_HASH(MENU_ENUM_LABEL_NETPLAY_ENABLE_CLIENT, "menu_netplay_enable_client") MSG_HASH(MENU_ENUM_LABEL_NETPLAY_ENABLE_HOST, "menu_netplay_enable_host") MSG_HASH(MENU_ENUM_LABEL_NETPLAY_IP_ADDRESS, "netplay_ip_address") MSG_HASH(MENU_ENUM_LABEL_NETPLAY_MODE, "netplay_mode") MSG_HASH(MENU_ENUM_LABEL_NETPLAY_NAT_TRAVERSAL, "netplay_nat_traversal") MSG_HASH(MENU_ENUM_LABEL_NETPLAY_NICKNAME, "netplay_nickname") MSG_HASH(MENU_ENUM_LABEL_NETPLAY_PASSWORD, "netplay_password") MSG_HASH(MENU_ENUM_LABEL_NETPLAY_SETTINGS, "menu_netplay_settings") MSG_HASH(MENU_ENUM_LABEL_NETPLAY_SPECTATE_PASSWORD, "netplay_spectate_password") MSG_HASH(MENU_ENUM_LABEL_NETPLAY_SPECTATOR_MODE_ENABLE, "netplay_spectator_mode_enable") MSG_HASH(MENU_ENUM_LABEL_NETPLAY_STATELESS_MODE, "netplay_stateless_mode") MSG_HASH(MENU_ENUM_LABEL_NETPLAY_TCP_UDP_PORT, "netplay_tcp_udp_port") MSG_HASH(MENU_ENUM_LABEL_NETPLAY_LAN_SCAN_SETTINGS, "Search for and connect to netplay hosts on the local network.") MSG_HASH(MENU_ENUM_LABEL_NETWORK_CMD_ENABLE, "network_cmd_enable") MSG_HASH(MENU_ENUM_LABEL_NETWORK_CMD_PORT, "network_cmd_port") MSG_HASH(MENU_ENUM_LABEL_NETWORK_INFORMATION, "network_information") MSG_HASH(MENU_ENUM_LABEL_NETWORK_INFO_ENTRY, "network_info_entry") MSG_HASH(MENU_ENUM_LABEL_NETWORK_REMOTE_ENABLE, "network_remote_enable") MSG_HASH(MENU_ENUM_LABEL_NETWORK_REMOTE_PORT, "network_remote_base_port") MSG_HASH(MENU_ENUM_LABEL_NETWORK_REMOTE_USER_1_ENABLE, "network_remote_user_1_enable") MSG_HASH(MENU_ENUM_LABEL_NETWORK_REMOTE_USER_LAST_ENABLE, "network_remote_user_last_enable") MSG_HASH(MENU_ENUM_LABEL_NETWORK_SETTINGS, "network_settings") MSG_HASH(MENU_ENUM_LABEL_NO_ACHIEVEMENTS_TO_DISPLAY, "no_achievements_to_display") MSG_HASH(MENU_ENUM_LABEL_NO_CORES_AVAILABLE, "no_cores_available") MSG_HASH(MENU_ENUM_LABEL_NO_CORE_INFORMATION_AVAILABLE, "no_core_information_available") MSG_HASH(MENU_ENUM_LABEL_NO_CORE_OPTIONS_AVAILABLE, "no_core_options_available") MSG_HASH(MENU_ENUM_LABEL_NO_ENTRIES_TO_DISPLAY, "no_entries_to_display") MSG_HASH(MENU_ENUM_LABEL_NO_HISTORY_AVAILABLE, "no_history") MSG_HASH(MENU_ENUM_LABEL_NO_ITEMS, "no_items") MSG_HASH(MENU_ENUM_LABEL_NO_NETPLAY_HOSTS_FOUND, "no_netplay_hosts_found") MSG_HASH(MENU_ENUM_LABEL_NO_NETWORKS_FOUND, "no_networks_found") MSG_HASH(MENU_ENUM_LABEL_NO_PERFORMANCE_COUNTERS, "no_performance_counters") MSG_HASH(MENU_ENUM_LABEL_NO_PLAYLISTS, "no_playlists") MSG_HASH(MENU_ENUM_LABEL_NO_PLAYLIST_ENTRIES_AVAILABLE, "no_playlist_entries_available") MSG_HASH(MENU_ENUM_LABEL_NO_SETTINGS_FOUND, "menu_label_no_settings_found") MSG_HASH(MENU_ENUM_LABEL_NO_SHADER_PARAMETERS, "no_shader_parameters.") MSG_HASH(MENU_ENUM_LABEL_ONLINE, "online") MSG_HASH(MENU_ENUM_LABEL_ONLINE_UPDATER, "online_updater") MSG_HASH(MENU_ENUM_LABEL_ONSCREEN_DISPLAY_SETTINGS, "onscreen_display_settings") MSG_HASH(MENU_ENUM_LABEL_ONSCREEN_OVERLAY_SETTINGS, "onscreen_overlay_settings") MSG_HASH(MENU_ENUM_LABEL_ONSCREEN_NOTIFICATIONS_SETTINGS, "onscreen_notifications_settings") MSG_HASH(MENU_ENUM_LABEL_OPEN_ARCHIVE, "open_archive") MSG_HASH(MENU_ENUM_LABEL_OPEN_ARCHIVE_DETECT_CORE, "open_archive_detect_core") MSG_HASH(MENU_ENUM_LABEL_OVERLAY_AUTOLOAD_PREFERRED, "overlay_autoload_preferred") MSG_HASH(MENU_ENUM_LABEL_OVERLAY_DIRECTORY, "overlay_directory") MSG_HASH(MENU_ENUM_LABEL_OVERLAY_OPACITY, "input_overlay_opacity") MSG_HASH(MENU_ENUM_LABEL_OVERLAY_PRESET, "input_overlay") MSG_HASH(MENU_ENUM_LABEL_OVERLAY_SCALE, "input_overlay_scale") MSG_HASH(MENU_ENUM_LABEL_PAL60_ENABLE, "pal60_enable") MSG_HASH(MENU_ENUM_LABEL_PARENT_DIRECTORY, "parent_directory") MSG_HASH(MENU_ENUM_LABEL_PAUSE_LIBRETRO, "menu_pause_libretro") MSG_HASH(MENU_ENUM_LABEL_PAUSE_NONACTIVE, "pause_nonactive") MSG_HASH(MENU_ENUM_LABEL_PERFCNT_ENABLE, "perfcnt_enable") MSG_HASH(MENU_ENUM_LABEL_PLAYLISTS_TAB, "playlists_tab") MSG_HASH(MENU_ENUM_LABEL_PLAYLIST_COLLECTION_ENTRY, "playlist_collection_entry") MSG_HASH(MENU_ENUM_LABEL_PLAYLIST_DIRECTORY, "playlist_directory") MSG_HASH(MENU_ENUM_LABEL_PLAYLIST_ENTRY, "playlist_entry") MSG_HASH(MENU_ENUM_LABEL_PLAYLIST_SETTINGS, "playlist_settings") MSG_HASH(MENU_ENUM_LABEL_PLAYLIST_SETTINGS_BEGIN, "playlist_settings_begin") MSG_HASH(MENU_ENUM_LABEL_POINTER_ENABLE, "menu_pointer_enable") MSG_HASH(MENU_ENUM_LABEL_PRIVACY_SETTINGS, "privacy_settings") MSG_HASH(MENU_ENUM_LABEL_QUIT_RETROARCH, "quit_retroarch") MSG_HASH(MENU_ENUM_LABEL_RDB_ENTRY, "rdb_entry") MSG_HASH(MENU_ENUM_LABEL_RDB_ENTRY_ANALOG, "rdb_entry_analog") MSG_HASH(MENU_ENUM_LABEL_RDB_ENTRY_BBFC_RATING, "rdb_entry_bbfc_rating") MSG_HASH(MENU_ENUM_LABEL_RDB_ENTRY_CERO_RATING, "rdb_entry_cero_rating") MSG_HASH(MENU_ENUM_LABEL_RDB_ENTRY_CRC32, "rdb_entry_crc32") MSG_HASH(MENU_ENUM_LABEL_RDB_ENTRY_DESCRIPTION, "rdb_entry_description") MSG_HASH(MENU_ENUM_LABEL_RDB_ENTRY_DEVELOPER, "rdb_entry_developer") MSG_HASH(MENU_ENUM_LABEL_RDB_ENTRY_EDGE_MAGAZINE_ISSUE, "rdb_entry_edge_magazine_issue") MSG_HASH(MENU_ENUM_LABEL_RDB_ENTRY_EDGE_MAGAZINE_RATING, "rdb_entry_edge_magazine_rating") MSG_HASH(MENU_ENUM_LABEL_RDB_ENTRY_EDGE_MAGAZINE_REVIEW, "rdb_entry_edge_magazine_review") MSG_HASH(MENU_ENUM_LABEL_RDB_ENTRY_ELSPA_RATING, "rdb_entry_elspa_rating") MSG_HASH(MENU_ENUM_LABEL_RDB_ENTRY_ENHANCEMENT_HW, "rdb_entry_enhancement_hw") MSG_HASH(MENU_ENUM_LABEL_RDB_ENTRY_ESRB_RATING, "rdb_entry_esrb_rating") MSG_HASH(MENU_ENUM_LABEL_RDB_ENTRY_FAMITSU_MAGAZINE_RATING, "rdb_entry_famitsu_magazine_rating") MSG_HASH(MENU_ENUM_LABEL_RDB_ENTRY_FRANCHISE, "rdb_entry_franchise") MSG_HASH(MENU_ENUM_LABEL_RDB_ENTRY_GENRE, "rdb_entry_genre") MSG_HASH(MENU_ENUM_LABEL_RDB_ENTRY_MAX_USERS, "rdb_entry_max_users") MSG_HASH(MENU_ENUM_LABEL_RDB_ENTRY_MD5, "rdb_entry_md5") MSG_HASH(MENU_ENUM_LABEL_RDB_ENTRY_NAME, "rdb_entry_name") MSG_HASH(MENU_ENUM_LABEL_RDB_ENTRY_ORIGIN, "rdb_entry_origin") MSG_HASH(MENU_ENUM_LABEL_RDB_ENTRY_PEGI_RATING, "rdb_entry_pegi_rating") MSG_HASH(MENU_ENUM_LABEL_RDB_ENTRY_PUBLISHER, "rdb_entry_publisher") MSG_HASH(MENU_ENUM_LABEL_RDB_ENTRY_RELEASE_MONTH, "rdb_entry_releasemonth") MSG_HASH(MENU_ENUM_LABEL_RDB_ENTRY_RELEASE_YEAR, "rdb_entry_releaseyear") MSG_HASH(MENU_ENUM_LABEL_RDB_ENTRY_SERIAL, "rdb_entry_serial") MSG_HASH(MENU_ENUM_LABEL_RDB_ENTRY_SHA1, "rdb_entry_sha1") MSG_HASH(MENU_ENUM_LABEL_RDB_ENTRY_START_CONTENT, "rdb_entry_start_content") MSG_HASH(MENU_ENUM_LABEL_RDB_ENTRY_TGDB_RATING, "rdb_entry_tgdb_rating") MSG_HASH(MENU_ENUM_LABEL_REBOOT, "reboot") MSG_HASH(MENU_ENUM_LABEL_RECORDING_CONFIG_DIRECTORY, "recording_config_directory") MSG_HASH(MENU_ENUM_LABEL_RECORDING_OUTPUT_DIRECTORY, "recording_output_directory") MSG_HASH(MENU_ENUM_LABEL_RECORDING_SETTINGS, "recording_settings") MSG_HASH(MENU_ENUM_LABEL_RECORD_CONFIG, "record_config") MSG_HASH(MENU_ENUM_LABEL_RECORD_DRIVER, "record_driver") MSG_HASH(MENU_ENUM_LABEL_RECORD_ENABLE, "record_enable") MSG_HASH(MENU_ENUM_LABEL_RECORD_PATH, "record_path") MSG_HASH(MENU_ENUM_LABEL_RECORD_USE_OUTPUT_DIRECTORY, "record_use_output_directory") MSG_HASH(MENU_ENUM_LABEL_REMAP_FILE_LOAD, "remap_file_load") MSG_HASH(MENU_ENUM_LABEL_REMAP_FILE_SAVE_CORE, "remap_file_save_core") MSG_HASH(MENU_ENUM_LABEL_REMAP_FILE_SAVE_GAME, "remap_file_save_game") MSG_HASH(MENU_ENUM_LABEL_RESTART_CONTENT, "restart_content") MSG_HASH(MENU_ENUM_LABEL_RESTART_RETROARCH, "restart_retroarch") MSG_HASH(MENU_ENUM_LABEL_RESUME, "resume") MSG_HASH(MENU_ENUM_LABEL_RESUME_CONTENT, "resume_content") MSG_HASH(MENU_ENUM_LABEL_RETRO_ACHIEVEMENTS_SETTINGS, "retro_achievements_settings") MSG_HASH(MENU_ENUM_LABEL_INPUT_META_REWIND, "input_meta_rewind") MSG_HASH(MENU_ENUM_LABEL_REWIND_ENABLE, "rewind_enable") MSG_HASH(MENU_ENUM_LABEL_REWIND_GRANULARITY, "rewind_granularity") MSG_HASH(MENU_ENUM_LABEL_REWIND_SETTINGS, "rewind_settings") MSG_HASH(MENU_ENUM_LABEL_RGUI_BROWSER_DIRECTORY, "rgui_browser_directory") MSG_HASH(MENU_ENUM_LABEL_RGUI_CONFIG_DIRECTORY, "rgui_config_directory") MSG_HASH(MENU_ENUM_LABEL_RGUI_SHOW_START_SCREEN, "rgui_show_start_screen") MSG_HASH(MENU_ENUM_LABEL_RUN, "collection") MSG_HASH(MENU_ENUM_LABEL_SAMBA_ENABLE, "samba_enable") MSG_HASH(MENU_ENUM_LABEL_SAVEFILE_DIRECTORY, "savefile_directory") MSG_HASH(MENU_ENUM_LABEL_SAVESTATE_AUTO_INDEX, "savestate_auto_index") MSG_HASH(MENU_ENUM_LABEL_SAVESTATE_AUTO_LOAD, "savestate_auto_load") MSG_HASH(MENU_ENUM_LABEL_SAVESTATE_AUTO_SAVE, "savestate_auto_save") MSG_HASH(MENU_ENUM_LABEL_SAVESTATE_DIRECTORY, "savestate_directory") MSG_HASH(MENU_ENUM_LABEL_SAVE_CURRENT_CONFIG, "save_current_config") MSG_HASH(MENU_ENUM_LABEL_SAVE_CURRENT_CONFIG_OVERRIDE_CORE, "save_current_config_override_core") MSG_HASH(MENU_ENUM_LABEL_SAVE_CURRENT_CONFIG_OVERRIDE_GAME, "save_current_config_override_game") MSG_HASH(MENU_ENUM_LABEL_SAVE_NEW_CONFIG, "save_new_config") MSG_HASH(MENU_ENUM_LABEL_SAVE_STATE, "savestate") MSG_HASH(MENU_ENUM_LABEL_SAVING_SETTINGS, "saving_settings") MSG_HASH(MENU_ENUM_LABEL_SCAN_DIRECTORY, "scan_directory") MSG_HASH(MENU_ENUM_LABEL_SCAN_FILE, "scan_file") MSG_HASH(MENU_ENUM_LABEL_NETPLAY_REFRESH_ROOMS, "refresh_rooms") MSG_HASH(MENU_ENUM_LABEL_SCAN_THIS_DIRECTORY, "scan_this_directory") MSG_HASH(MENU_ENUM_LABEL_SCREENSHOT_DIRECTORY, "screenshot_directory") MSG_HASH(MENU_ENUM_LABEL_SCREEN_RESOLUTION, "screen_resolution") MSG_HASH(MENU_ENUM_LABEL_SETTINGS, "settings") MSG_HASH(MENU_ENUM_LABEL_SETTINGS_TAB, "settings_tab") MSG_HASH(MENU_ENUM_LABEL_SHADER_APPLY_CHANGES, "shader_apply_changes") MSG_HASH(MENU_ENUM_LABEL_SHADER_OPTIONS, "shader_options") MSG_HASH(MENU_ENUM_LABEL_SHADER_PARAMETERS_ENTRY, "shader_parameters_entry") MSG_HASH(MENU_ENUM_LABEL_SHOW_ADVANCED_SETTINGS, "menu_show_advanced_settings") MSG_HASH(MENU_ENUM_LABEL_SHOW_HIDDEN_FILES, "show_hidden_files") MSG_HASH(MENU_ENUM_LABEL_SHUTDOWN, "shutdown") MSG_HASH(MENU_ENUM_LABEL_SLOWMOTION_RATIO, "slowmotion_ratio") MSG_HASH(MENU_ENUM_LABEL_SORT_SAVEFILES_ENABLE, "sort_savefiles_enable") MSG_HASH(MENU_ENUM_LABEL_SORT_SAVESTATES_ENABLE, "sort_savestates_enable") MSG_HASH(MENU_ENUM_LABEL_SSH_ENABLE, "ssh_enable") MSG_HASH(MENU_ENUM_LABEL_START_CORE, "start_core") MSG_HASH(MENU_ENUM_LABEL_START_NET_RETROPAD, "menu_start_net_retropad") MSG_HASH(MENU_ENUM_LABEL_START_VIDEO_PROCESSOR, "menu_start_video_processor") MSG_HASH(MENU_ENUM_LABEL_STATE_SLOT, "state_slot") MSG_HASH(MENU_ENUM_LABEL_STDIN_CMD_ENABLE, "stdin_commands") MSG_HASH(MENU_ENUM_LABEL_SUSPEND_SCREENSAVER_ENABLE, "suspend_screensaver_enable") MSG_HASH(MENU_ENUM_LABEL_SYSTEM_BGM_ENABLE, "system_bgm_enable") MSG_HASH(MENU_ENUM_LABEL_SYSTEM_DIRECTORY, "system_directory") MSG_HASH(MENU_ENUM_LABEL_SYSTEM_INFORMATION, "system_information") MSG_HASH(MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, "system_info_entry") MSG_HASH(MENU_ENUM_LABEL_TAKE_SCREENSHOT, "take_screenshot") 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_THUMBNAILS_DIRECTORY, "thumbnails_directory") MSG_HASH(MENU_ENUM_LABEL_THUMBNAILS_UPDATER_LIST, "thumbnails_updater_list") MSG_HASH(MENU_ENUM_LABEL_TIMEDATE_ENABLE, "menu_timedate_enable") MSG_HASH(MENU_ENUM_LABEL_TITLE_COLOR, "menu_title_color") MSG_HASH(MENU_ENUM_LABEL_UI_COMPANION_ENABLE, "ui_companion_enable") MSG_HASH(MENU_ENUM_LABEL_UI_COMPANION_START_ON_BOOT, "ui_companion_start_on_boot") MSG_HASH(MENU_ENUM_LABEL_UI_MENUBAR_ENABLE, "ui_menubar_enable") MSG_HASH(MENU_ENUM_LABEL_UNDO_LOAD_STATE, "undoloadstate") MSG_HASH(MENU_ENUM_LABEL_UNDO_SAVE_STATE, "undosavestate") MSG_HASH(MENU_ENUM_LABEL_UPDATER_SETTINGS, "updater_settings") MSG_HASH(MENU_ENUM_LABEL_UPDATE_ASSETS, "update_assets") MSG_HASH(MENU_ENUM_LABEL_UPDATE_AUTOCONFIG_PROFILES, "update_autoconfig_profiles") MSG_HASH(MENU_ENUM_LABEL_UPDATE_CG_SHADERS, "update_cg_shaders") MSG_HASH(MENU_ENUM_LABEL_UPDATE_CHEATS, "update_cheats") MSG_HASH(MENU_ENUM_LABEL_UPDATE_CORE_INFO_FILES, "update_core_info_files") MSG_HASH(MENU_ENUM_LABEL_UPDATE_DATABASES, "update_databases") MSG_HASH(MENU_ENUM_LABEL_UPDATE_GLSL_SHADERS, "update_glsl_shaders") MSG_HASH(MENU_ENUM_LABEL_UPDATE_LAKKA, "update_lakka") MSG_HASH(MENU_ENUM_LABEL_UPDATE_OVERLAYS, "update_overlays") MSG_HASH(MENU_ENUM_LABEL_UPDATE_SLANG_SHADERS, "update_slang_shaders") MSG_HASH(MENU_ENUM_LABEL_URL_ENTRY, "url_entry") MSG_HASH(MENU_ENUM_LABEL_USER_INTERFACE_SETTINGS, "user_interface_settings") MSG_HASH(MENU_ENUM_LABEL_USER_LANGUAGE, "user_language") MSG_HASH(MENU_ENUM_LABEL_USER_SETTINGS, "user_settings") MSG_HASH(MENU_ENUM_LABEL_USE_BUILTIN_IMAGE_VIEWER, "use_builtin_image_viewer") MSG_HASH(MENU_ENUM_LABEL_USE_BUILTIN_PLAYER, "use_builtin_player") MSG_HASH(MENU_ENUM_LABEL_USE_THIS_DIRECTORY, "use_this_directory") MSG_HASH(MENU_ENUM_LABEL_VIDEO_ALLOW_ROTATE, "video_allow_rotate") MSG_HASH(MENU_ENUM_LABEL_VIDEO_ASPECT_RATIO_AUTO, "video_aspect_ratio_auto") MSG_HASH(MENU_ENUM_LABEL_VIDEO_ASPECT_RATIO_INDEX, "aspect_ratio_index") MSG_HASH(MENU_ENUM_LABEL_VIDEO_BLACK_FRAME_INSERTION, "video_black_frame_insertion") MSG_HASH(MENU_ENUM_LABEL_VIDEO_CROP_OVERSCAN, "video_crop_overscan") MSG_HASH(MENU_ENUM_LABEL_VIDEO_DISABLE_COMPOSITION, "video_disable_composition") MSG_HASH(MENU_ENUM_LABEL_VIDEO_DRIVER, "video_driver") MSG_HASH(MENU_ENUM_LABEL_VIDEO_FILTER, "video_filter") MSG_HASH(MENU_ENUM_LABEL_VIDEO_FILTER_DIR, "video_filter_dir") MSG_HASH(MENU_ENUM_LABEL_VIDEO_FILTER_FLICKER, "video_filter_flicker") MSG_HASH(MENU_ENUM_LABEL_VIDEO_FONT_ENABLE, "video_font_enable") MSG_HASH(MENU_ENUM_LABEL_VIDEO_FONT_PATH, "video_font_path") MSG_HASH(MENU_ENUM_LABEL_VIDEO_FONT_SIZE, "video_font_size") MSG_HASH(MENU_ENUM_LABEL_VIDEO_FORCE_ASPECT, "video_force_aspect") MSG_HASH(MENU_ENUM_LABEL_VIDEO_FORCE_SRGB_DISABLE, "video_force_srgb_disable") MSG_HASH(MENU_ENUM_LABEL_VIDEO_FRAME_DELAY, "video_frame_delay") MSG_HASH(MENU_ENUM_LABEL_VIDEO_FULLSCREEN, "video_fullscreen") MSG_HASH(MENU_ENUM_LABEL_VIDEO_GAMMA, "video_gamma") MSG_HASH(MENU_ENUM_LABEL_VIDEO_GPU_RECORD, "video_gpu_record") MSG_HASH(MENU_ENUM_LABEL_VIDEO_GPU_SCREENSHOT, "video_gpu_screenshot") MSG_HASH(MENU_ENUM_LABEL_VIDEO_HARD_SYNC, "video_hard_sync") MSG_HASH(MENU_ENUM_LABEL_VIDEO_HARD_SYNC_FRAMES, "video_hard_sync_frames") MSG_HASH(MENU_ENUM_LABEL_VIDEO_MAX_SWAPCHAIN_IMAGES, "video_max_swapchain_images") MSG_HASH(MENU_ENUM_LABEL_VIDEO_MESSAGE_POS_X, "video_message_pos_x") MSG_HASH(MENU_ENUM_LABEL_VIDEO_MESSAGE_POS_Y, "video_message_pos_y") MSG_HASH(MENU_ENUM_LABEL_VIDEO_MONITOR_INDEX, "video_monitor_index") MSG_HASH(MENU_ENUM_LABEL_VIDEO_POST_FILTER_RECORD, "video_post_filter_record") MSG_HASH(MENU_ENUM_LABEL_VIDEO_REFRESH_RATE, "video_refresh_rate") MSG_HASH(MENU_ENUM_LABEL_VIDEO_REFRESH_RATE_AUTO, "video_refresh_rate_auto") MSG_HASH(MENU_ENUM_LABEL_VIDEO_ROTATION, "video_rotation") MSG_HASH(MENU_ENUM_LABEL_VIDEO_SCALE, "video_scale") MSG_HASH(MENU_ENUM_LABEL_VIDEO_SCALE_INTEGER, "video_scale_integer") MSG_HASH(MENU_ENUM_LABEL_VIDEO_SETTINGS, "video_settings") MSG_HASH(MENU_ENUM_LABEL_VIDEO_SHADER_DIR, "video_shader_dir") MSG_HASH(MENU_ENUM_LABEL_VIDEO_SHADER_FILTER_PASS, "video_shader_filter_pass") MSG_HASH(MENU_ENUM_LABEL_VIDEO_SHADER_NUM_PASSES, "video_shader_num_passes") MSG_HASH(MENU_ENUM_LABEL_VIDEO_SHADER_PARAMETERS, "video_shader_parameters") MSG_HASH(MENU_ENUM_LABEL_VIDEO_SHADER_PASS, "video_shader_pass") MSG_HASH(MENU_ENUM_LABEL_VIDEO_SHADER_PRESET, "video_shader_preset") MSG_HASH(MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_PARAMETERS, "video_shader_preset_parameters") MSG_HASH(MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_AS, "video_shader_preset_save_as") MSG_HASH(MENU_ENUM_LABEL_VIDEO_SHADER_SCALE_PASS, "video_shader_scale_pass") MSG_HASH(MENU_ENUM_LABEL_VIDEO_SHARED_CONTEXT, "video_shared_context") MSG_HASH(MENU_ENUM_LABEL_VIDEO_SMOOTH, "video_smooth") MSG_HASH(MENU_ENUM_LABEL_VIDEO_SOFT_FILTER, "soft_filter") MSG_HASH(MENU_ENUM_LABEL_VIDEO_SWAP_INTERVAL, "video_swap_interval") MSG_HASH(MENU_ENUM_LABEL_VIDEO_TAB, "video_tab") MSG_HASH(MENU_ENUM_LABEL_VIDEO_THREADED, "video_threaded") MSG_HASH(MENU_ENUM_LABEL_VIDEO_VFILTER, "video_vfilter") MSG_HASH(MENU_ENUM_LABEL_VIDEO_VIEWPORT_CUSTOM_HEIGHT, "video_viewport_custom_height") MSG_HASH(MENU_ENUM_LABEL_VIDEO_VIEWPORT_CUSTOM_WIDTH, "video_viewport_custom_width") MSG_HASH(MENU_ENUM_LABEL_VIDEO_VIEWPORT_CUSTOM_X, "video_viewport_custom_x") MSG_HASH(MENU_ENUM_LABEL_VIDEO_VIEWPORT_CUSTOM_Y, "video_viewport_custom_y") MSG_HASH(MENU_ENUM_LABEL_VIDEO_VI_WIDTH, "video_vi_width") MSG_HASH(MENU_ENUM_LABEL_VIDEO_VSYNC, "video_vsync") MSG_HASH(MENU_ENUM_LABEL_VIDEO_WINDOWED_FULLSCREEN, "video_windowed_fullscreen") MSG_HASH(MENU_ENUM_LABEL_VIDEO_WINDOW_WIDTH, "video_window_width") MSG_HASH(MENU_ENUM_LABEL_VIDEO_WINDOW_HEIGHT, "video_window_height") MSG_HASH(MENU_ENUM_LABEL_WIFI_DRIVER, "wifi_driver") MSG_HASH(MENU_ENUM_LABEL_WIFI_SETTINGS, "wifi_settings") MSG_HASH(MENU_ENUM_LABEL_XMB_ALPHA_FACTOR, "xmb_alpha_factor") MSG_HASH(MENU_ENUM_LABEL_XMB_FONT, "xmb_font") MSG_HASH(MENU_ENUM_LABEL_XMB_MENU_COLOR_THEME, "xmb_menu_color_theme") MSG_HASH(MENU_ENUM_LABEL_XMB_RIBBON_ENABLE, "xmb_ribbon_enable") MSG_HASH(MENU_ENUM_LABEL_XMB_SCALE_FACTOR, "xmb_scale_factor") MSG_HASH(MENU_ENUM_LABEL_XMB_SHADOWS_ENABLE, "xmb_shadows_enable") MSG_HASH(MENU_ENUM_LABEL_XMB_SHOW_HISTORY, "xmb_show_history") MSG_HASH(MENU_ENUM_LABEL_XMB_SHOW_ADD, "xmb_show_add") MSG_HASH(MENU_ENUM_LABEL_XMB_SHOW_IMAGES, "xmb_show_images") MSG_HASH(MENU_ENUM_LABEL_XMB_SHOW_MUSIC, "xmb_show_music") MSG_HASH(MENU_ENUM_LABEL_XMB_SHOW_SETTINGS, "xmb_show_settings") MSG_HASH(MENU_ENUM_LABEL_XMB_SHOW_VIDEO, "xmb_show_video") MSG_HASH(MENU_ENUM_LABEL_XMB_THEME, "xmb_theme") MSG_HASH(MSG_BRINGING_UP_COMMAND_INTERFACE_ON_PORT, "bringing_up_command_interface_at_port") MSG_HASH(MSG_CONNECT_DEVICE_FROM_A_VALID_PORT, "connect_device_from_a_valid_port") MSG_HASH(MSG_DEVICE_CONFIGURED_IN_PORT, "configured in port") MSG_HASH(MSG_DISCONNECTING_DEVICE_FROM_PORT, "disconnecting_device_from_port") MSG_HASH(MSG_DISCONNECT_DEVICE_FROM_A_VALID_PORT, "disconnect_device_from_a_valid_port") MSG_HASH(MSG_FAILED_TO_SET_DISK, "Failed to set disk") MSG_HASH(MSG_FAILED_TO_START_AUDIO_DRIVER, "failed_to_start_audio_driver") MSG_HASH(MSG_FOUND_LAST_STATE_SLOT, "found_last_state_slot") MSG_HASH(MENU_ENUM_LABEL_DATABASE_SELECTION, "database_selection") MSG_HASH(MENU_ENUM_LABEL_DATABASE_CURSOR_LIST, "database_cursor_list") MSG_HASH(MENU_ENUM_LABEL_DATABASE_CURSOR_LIST_ENTRY_DEVELOPER, "database_cursor_list_entry_developer") MSG_HASH(MENU_ENUM_LABEL_DATABASE_CURSOR_LIST_ENTRY_PUBLISHER, "database_cursor_list_entry_publisher") MSG_HASH(MENU_ENUM_LABEL_OFF, "off") MSG_HASH(MENU_ENUM_LABEL_ON, "on") MSG_HASH(MENU_ENUM_LABEL_DISABLED, "disabled") MSG_HASH(MENU_ENUM_LABEL_ENABLED, "enabled") MSG_HASH(MENU_ENUM_LABEL_SECONDS, "seconds") MSG_HASH(MENU_ENUM_LABEL_STATUS, "status") MSG_HASH(MENU_ENUM_LABEL_DETECT_CORE_LIST_OK, "detect_core_list_ok") MSG_HASH(MENU_ENUM_LABEL_DETECT_CORE_LIST_OK_CURRENT_CORE, "detect_core_list_ok_current_core") MSG_HASH(MENU_ENUM_LABEL_NO_DISK, "no_disk") MSG_HASH(MENU_ENUM_LABEL_DEFERRED_RPL_ENTRY_ACTIONS, "deferred_rpl_entry_actions") MSG_HASH(MENU_ENUM_LABEL_MENU_THROTTLE_FRAMERATE, "menu_throttle_framerate") MSG_HASH(MENU_ENUM_LABEL_OVERLAY_SETTINGS, "overlay_settings") MSG_HASH(MENU_ENUM_LABEL_DATABASE_CURSOR_LIST_ENTRY_ORIGIN, "database_cursor_list_entry_origin") MSG_HASH(MENU_ENUM_LABEL_DATABASE_CURSOR_LIST_ENTRY_FRANCHISE, "database_cursor_list_entry_franchise") MSG_HASH(MENU_ENUM_LABEL_DATABASE_CURSOR_LIST_ENTRY_ESRB_RATING, "database_cursor_list_entry_esrb_rating") MSG_HASH(MENU_ENUM_LABEL_DATABASE_CURSOR_LIST_ENTRY_ELSPA_RATING, "database_cursor_list_entry_elspa_rating") MSG_HASH(MENU_ENUM_LABEL_DATABASE_CURSOR_LIST_ENTRY_PEGI_RATING, "database_cursor_list_entry_pegi_rating") MSG_HASH(MENU_ENUM_LABEL_DATABASE_CURSOR_LIST_ENTRY_CERO_RATING, "database_cursor_list_entry_cero_rating") MSG_HASH(MENU_ENUM_LABEL_DATABASE_CURSOR_LIST_ENTRY_BBFC_RATING, "database_cursor_list_entry_bbfc_rating") MSG_HASH(MENU_ENUM_LABEL_DATABASE_CURSOR_LIST_ENTRY_MAX_USERS, "database_cursor_list_entry_max_users") MSG_HASH(MENU_ENUM_LABEL_DATABASE_CURSOR_LIST_ENTRY_RELEASEDATE_BY_MONTH, "database_cursor_list_releasedate_by_month") MSG_HASH(MENU_ENUM_LABEL_DATABASE_CURSOR_LIST_ENTRY_RELEASEDATE_BY_YEAR, "database_cursor_list_releasedate_by_year") MSG_HASH(MENU_ENUM_LABEL_DATABASE_CURSOR_LIST_ENTRY_EDGE_MAGAZINE_ISSUE, "database_cursor_list_edge_magazine_issue") MSG_HASH(MENU_ENUM_LABEL_DATABASE_CURSOR_LIST_ENTRY_EDGE_MAGAZINE_RATING, "database_cursor_list_edge_magazine_rating") MSG_HASH(MENU_ENUM_LABEL_DATABASE_CURSOR_LIST_ENTRY_DATABASE_INFO, "database_info") MSG_HASH(MENU_ENUM_LABEL_SHADER_PIPELINE_RIBBON, "shader_pipeline_ribbon") MSG_HASH(MENU_ENUM_LABEL_SHADER_PIPELINE_RIBBON_SIMPLIFIED, "shader_pipeline_ribbon_simplified") MSG_HASH(MENU_ENUM_LABEL_SHADER_PIPELINE_SIMPLE_SNOW, "shader_pipeline_simple_snow") MSG_HASH(MENU_ENUM_LABEL_SHADER_PIPELINE_SNOW, "shader_pipeline_snow") MSG_HASH(MENU_ENUM_LABEL_INPUT_UNIFIED_MENU_CONTROLS, "unified_menu_controls") MSG_HASH(MENU_ENUM_LABEL_FILE_DETECT_CORE_LIST_PUSH_DIR, "detect_core_list_push_dir") MSG_HASH(MENU_ENUM_LABEL_BATTERY_LEVEL_ENABLE, "menu_battery_level_enable") MSG_HASH(MENU_ENUM_LABEL_BROWSE_URL, "browse_url") MSG_HASH(MENU_ENUM_LABEL_BROWSE_START, "browse_start") MSG_HASH(MENU_ENUM_LABEL_SHADER_PIPELINE_BOKEH, "shader_pipeline_bokeh") tools/ps3/ps3py/pkg.py000775 001750 001750 00000053460 13044721241 015771 0ustar00sergiosergio000000 000000 #!/usr/bin/env python from __future__ import with_statement import struct, sys class StructType(tuple): def __getitem__(self, value): return [self] * value def __call__(self, value, endian='<'): if isinstance(value, str): return struct.unpack(endian + tuple.__getitem__(self, 0), value[:tuple.__getitem__(self, 1)])[0] else: return struct.pack(endian + tuple.__getitem__(self, 0), value) class Struct(object): __slots__ = ('__attrs__', '__baked__', '__defs__', '__endian__', '__next__', '__sizes__', '__values__') int8 = StructType(('b', 1)) uint8 = StructType(('B', 1)) int16 = StructType(('h', 2)) uint16 = StructType(('H', 2)) int32 = StructType(('l', 4)) uint32 = StructType(('L', 4)) int64 = StructType(('q', 8)) uint64 = StructType(('Q', 8)) float = StructType(('f', 4)) def string(cls, len, offset=0, encoding=None, stripNulls=False, value=''): return StructType(('string', (len, offset, encoding, stripNulls, value))) string = classmethod(string) LE = '<' BE = '>' __endian__ = '<' def __init__(self, func=None, unpack=None, **kwargs): self.__defs__ = [] self.__sizes__ = [] self.__attrs__ = [] self.__values__ = {} self.__next__ = True self.__baked__ = False if func == None: self.__format__() else: sys.settrace(self.__trace__) func() for name in func.func_code.co_varnames: value = self.__frame__.f_locals[name] self.__setattr__(name, value) self.__baked__ = True if unpack != None: if isinstance(unpack, tuple): self.unpack(*unpack) else: self.unpack(unpack) if len(kwargs): for name in kwargs: self.__values__[name] = kwargs[name] def __trace__(self, frame, event, arg): self.__frame__ = frame sys.settrace(None) def __setattr__(self, name, value): if name in self.__slots__: return object.__setattr__(self, name, value) if self.__baked__ == False: if not isinstance(value, list): value = [value] attrname = name else: attrname = '*' + name self.__values__[name] = None for sub in value: if isinstance(sub, Struct): sub = sub.__class__ try: if issubclass(sub, Struct): sub = ('struct', sub) except TypeError: pass type_, size = tuple(sub) if type_ == 'string': self.__defs__.append(Struct.string) self.__sizes__.append(size) self.__attrs__.append(attrname) self.__next__ = True if attrname[0] != '*': self.__values__[name] = size[3] elif self.__values__[name] == None: self.__values__[name] = [size[3] for val in value] elif type_ == 'struct': self.__defs__.append(Struct) self.__sizes__.append(size) self.__attrs__.append(attrname) self.__next__ = True if attrname[0] != '*': self.__values__[name] = size() elif self.__values__[name] == None: self.__values__[name] = [size() for val in value] else: if self.__next__: self.__defs__.append('') self.__sizes__.append(0) self.__attrs__.append([]) self.__next__ = False self.__defs__[-1] += type_ self.__sizes__[-1] += size self.__attrs__[-1].append(attrname) if attrname[0] != '*': self.__values__[name] = 0 elif self.__values__[name] == None: self.__values__[name] = [0 for val in value] else: try: self.__values__[name] = value except KeyError: raise AttributeError(name) def __getattr__(self, name): if self.__baked__ == False: return name else: try: return self.__values__[name] except KeyError: raise AttributeError(name) def __len__(self): ret = 0 arraypos, arrayname = None, None for i in range(len(self.__defs__)): sdef, size, attrs = self.__defs__[i], self.__sizes__[i], self.__attrs__[i] if sdef == Struct.string: size, offset, encoding, stripNulls, value = size if isinstance(size, str): size = self.__values__[size] + offset elif sdef == Struct: if attrs[0] == '*': if arrayname != attrs: arrayname = attrs arraypos = 0 size = len(self.__values__[attrs[1:]][arraypos]) size = len(self.__values__[attrs]) ret += size return ret def unpack(self, data, pos=0): for name in self.__values__: if not isinstance(self.__values__[name], Struct): self.__values__[name] = None elif self.__values__[name].__class__ == list and len(self.__values__[name]) != 0: if not isinstance(self.__values__[name][0], Struct): self.__values__[name] = None arraypos, arrayname = None, None for i in range(len(self.__defs__)): sdef, size, attrs = self.__defs__[i], self.__sizes__[i], self.__attrs__[i] if sdef == Struct.string: size, offset, encoding, stripNulls, value = size if isinstance(size, str): size = self.__values__[size] + offset temp = data[pos:pos+size] if len(temp) != size: raise StructException('Expected %i byte string, got %i' % (size, len(temp))) if encoding != None: temp = temp.decode(encoding) if stripNulls: temp = temp.rstrip('\0') if attrs[0] == '*': name = attrs[1:] if self.__values__[name] == None: self.__values__[name] = [] self.__values__[name].append(temp) else: self.__values__[attrs] = temp pos += size elif sdef == Struct: if attrs[0] == '*': if arrayname != attrs: arrayname = attrs arraypos = 0 name = attrs[1:] self.__values__[attrs][arraypos].unpack(data, pos) pos += len(self.__values__[attrs][arraypos]) arraypos += 1 else: self.__values__[attrs].unpack(data, pos) pos += len(self.__values__[attrs]) else: values = struct.unpack(self.__endian__+sdef, data[pos:pos+size]) pos += size j = 0 for name in attrs: if name[0] == '*': name = name[1:] if self.__values__[name] == None: self.__values__[name] = [] self.__values__[name].append(values[j]) else: self.__values__[name] = values[j] j += 1 return self def pack(self): arraypos, arrayname = None, None ret = '' for i in range(len(self.__defs__)): sdef, size, attrs = self.__defs__[i], self.__sizes__[i], self.__attrs__[i] if sdef == Struct.string: size, offset, encoding, stripNulls, value = size if isinstance(size, str): size = self.__values__[size]+offset if attrs[0] == '*': if arrayname != attrs: arraypos = 0 arrayname = attrs temp = self.__values__[attrs[1:]][arraypos] arraypos += 1 else: temp = self.__values__[attrs] if encoding != None: temp = temp.encode(encoding) temp = temp[:size] ret += temp + ('\0' * (size - len(temp))) elif sdef == Struct: if attrs[0] == '*': if arrayname != attrs: arraypos = 0 arrayname = attrs ret += self.__values__[attrs[1:]][arraypos].pack() arraypos += 1 else: ret += self.__values__[attrs].pack() else: values = [] for name in attrs: if name[0] == '*': if arrayname != name: arraypos = 0 arrayname = name values.append(self.__values__[name[1:]][arraypos]) arraypos += 1 else: values.append(self.__values__[name]) ret += struct.pack(self.__endian__+sdef, *values) return ret def __getitem__(self, value): return [('struct', self.__class__)] * value class SelfHeader(Struct): __endian__ = Struct.BE def __format__(self): self.magic = Struct.uint32 self.headerVer = Struct.uint32 self.flags = Struct.uint16 self.type = Struct.uint16 self.meta = Struct.uint32 self.headerSize = Struct.uint64 self.encryptedSize = Struct.uint64 self.unknown = Struct.uint64 self.AppInfo = Struct.uint64 self.elf = Struct.uint64 self.phdr = Struct.uint64 self.shdr = Struct.uint64 self.phdrOffsets = Struct.uint64 self.sceversion = Struct.uint64 self.digest = Struct.uint64 self.digestSize = Struct.uint64 class AppInfo(Struct): __endian__ = Struct.BE def __format__(self): self.authid = Struct.uint64 self.unknown = Struct.uint32 self.appType = Struct.uint32 self.appVersion = Struct.uint64 import struct import sys import hashlib import os import getopt import ConfigParser import io import glob TYPE_NPDRMSELF = 0x1 TYPE_RAW = 0x3 TYPE_DIRECTORY = 0x4 TYPE_OVERWRITE_ALLOWED = 0x80000000 class EbootMeta(Struct): __endian__ = Struct.BE def __format__(self): self.magic = Struct.uint32 self.unk1 = Struct.uint32 self.drmType = Struct.uint32 self.unk2 = Struct.uint32 self.contentID = Struct.uint8[0x30] self.fileSHA1 = Struct.uint8[0x10] self.notSHA1 = Struct.uint8[0x10] self.notXORKLSHA1 = Struct.uint8[0x10] self.nulls = Struct.uint8[0x10] class MetaHeader(Struct): __endian__ = Struct.BE def __format__(self): self.unk1 = Struct.uint32 self.unk2 = Struct.uint32 self.drmType = Struct.uint32 self.unk4 = Struct.uint32 self.unk21 = Struct.uint32 self.unk22 = Struct.uint32 self.unk23 = Struct.uint32 self.unk24 = Struct.uint32 self.unk31 = Struct.uint32 self.unk32 = Struct.uint32 self.unk33 = Struct.uint32 self.secondaryVersion = Struct.uint16 self.unk34 = Struct.uint16 self.dataSize = Struct.uint32 self.unk42 = Struct.uint32 self.unk43 = Struct.uint32 self.packagedBy = Struct.uint16 self.packageVersion = Struct.uint16 class DigestBlock(Struct): __endian__ = Struct.BE def __format__(self): self.type = Struct.uint32 self.size = Struct.uint32 self.isNext = Struct.uint64 class FileHeader(Struct): __endian__ = Struct.BE def __format__(self): self.fileNameOff = Struct.uint32 self.fileNameLength = Struct.uint32 self.fileOff = Struct.uint64 self.fileSize = Struct.uint64 self.flags = Struct.uint32 self.padding = Struct.uint32 def __str__(self): out = "" out += "[X] File Name: %s [" % self.fileName if self.flags & 0xFF == TYPE_NPDRMSELF: out += "NPDRM Self]" elif self.flags & 0xFF == TYPE_DIRECTORY: out += "Directory]" elif self.flags & 0xFF == TYPE_RAW: out += "Raw Data]" else: out += "Unknown]" if (self.flags & TYPE_OVERWRITE_ALLOWED ) != 0: out += " Overwrite allowed.\n" else: out += " Overwrite NOT allowed.\n" out += "\n" out += "[X] File Name offset: %08x\n" % self.fileNameOff out += "[X] File Name Length: %08x\n" % self.fileNameLength out += "[X] Offset To File Data: %016x\n" % self.fileOff out += "[X] File Size: %016x\n" % self.fileSize out += "[X] Flags: %08x\n" % self.flags out += "[X] Padding: %08x\n\n" % self.padding assert self.padding == 0, "I guess I was wrong, this is not padding." return out def __repr__(self): return self.fileName + (" Size: 0x%016x" % self.fileSize) def __init__(self): Struct.__init__(self) self.fileName = "" class Header(Struct): __endian__ = Struct.BE def __format__(self): self.magic = Struct.uint32 self.type = Struct.uint32 self.pkgInfoOff = Struct.uint32 self.unk1 = Struct.uint32 self.headSize = Struct.uint32 self.itemCount = Struct.uint32 self.packageSize = Struct.uint64 self.dataOff = Struct.uint64 self.dataSize = Struct.uint64 self.contentID = Struct.uint8[0x30] self.QADigest = Struct.uint8[0x10] self.KLicensee = Struct.uint8[0x10] def __str__(self): context = keyToContext(self.QADigest) setContextNum(context, 0xFFFFFFFFFFFFFFFF) licensee = crypt(context, listToString(self.KLicensee), 0x10) out = "" out += "[X] Magic: %08x\n" % self.magic out += "[X] Type: %08x\n" % self.type out += "[X] Offset to package info: %08x\n" % self.pkgInfoOff out += "[ ] unk1: %08x\n" % self.unk1 out += "[X] Head Size: %08x\n" % self.headSize out += "[X] Item Count: %08x\n" % self.itemCount out += "[X] Package Size: %016x\n" % self.packageSize out += "[X] Data Offset: %016x\n" % self.dataOff out += "[X] Data Size: %016x\n" % self.dataSize out += "[X] ContentID: '%s'\n" % (nullterm(self.contentID)) out += "[X] QA_Digest: %s\n" % (nullterm(self.QADigest, True)) out += "[X] K Licensee: %s\n" % licensee.encode('hex') return out def listToString(inlist): if isinstance(inlist, list): return ''.join(["%c" % el for el in inlist]) else: return "" def nullterm(str_plus, printhex=False): if isinstance(str_plus, list): if printhex: str_plus = ''.join(["%X" % el for el in str_plus]) else: str_plus = listToString(str_plus) z = str_plus.find('\0') if z != -1: return str_plus[:z] else: return str_plus def keyToContext(key): if isinstance(key, list): key = listToString(key) key = key[0:16] largekey = [] for i in range(0, 8): largekey.append(ord(key[i])) for i in range(0, 8): largekey.append(ord(key[i])) for i in range(0, 8): largekey.append(ord(key[i+8])) for i in range(0, 8): largekey.append(ord(key[i+8])) for i in range(0, 0x20): largekey.append(0) return largekey #Thanks to anonymous for the help with the RE of this part, # the x86 mess of ands and ors made my head go BOOM headshot. def manipulate(key): if not isinstance(key, list): return tmp = listToString(key[0x38:]) tmpnum = struct.unpack('>Q', tmp)[0] tmpnum += 1 tmpnum = tmpnum & 0xFFFFFFFFFFFFFFFF setContextNum(key, tmpnum) def setContextNum(key, tmpnum): tmpchrs = struct.pack('>Q', tmpnum) key[0x38] = ord(tmpchrs[0]) key[0x39] = ord(tmpchrs[1]) key[0x3a] = ord(tmpchrs[2]) key[0x3b] = ord(tmpchrs[3]) key[0x3c] = ord(tmpchrs[4]) key[0x3d] = ord(tmpchrs[5]) key[0x3e] = ord(tmpchrs[6]) key[0x3f] = ord(tmpchrs[7]) try: import pkgcrypt except: print "" print "---------------------" print "RETROARCH BUILD ERROR" print "---------------------" print "Couldn't make PKG file. Go into the ps3py directory, and type the following:" print "" print "python2 setup.py build" print "" print "This should create a pkgcrypt.so file in the build/ directory. Move that file" print "over to the root of the ps3py directory and try running this script again." def crypt(key, inbuf, length): if not isinstance(key, list): return "" return pkgcrypt.pkgcrypt(listToString(key), inbuf, length); # Original python (slow) implementation ret = "" offset = 0 while length > 0: bytes_to_dump = length if length > 0x10: bytes_to_dump = 0x10 outhash = SHA1(listToString(key)[0:0x40]) for i in range(0, bytes_to_dump): ret += chr(ord(outhash[i]) ^ ord(inbuf[offset])) offset += 1 manipulate(key) length -= bytes_to_dump return ret def SHA1(data): m = hashlib.sha1() m.update(data) return m.digest() pkgcrypt.register_sha1_callback(SHA1) def getFiles(files, folder, original): oldfolder = folder foundFiles = glob.glob( os.path.join(folder, '*') ) sortedList = [] for filepath in foundFiles: if not os.path.isdir(filepath): sortedList.append(filepath) for filepath in foundFiles: if os.path.isdir(filepath): sortedList.append(filepath) for filepath in sortedList: newpath = filepath.replace("\\", "/") newpath = newpath[len(original):] if os.path.isdir(filepath): folder = FileHeader() folder.fileName = newpath folder.fileNameOff = 0 folder.fileNameLength = len(folder.fileName) folder.fileOff = 0 folder.fileSize = 0 folder.flags = TYPE_OVERWRITE_ALLOWED | TYPE_DIRECTORY folder.padding = 0 files.append(folder) getFiles(files, filepath, original) else: file = FileHeader() file.fileName = newpath file.fileNameOff = 0 file.fileNameLength = len(file.fileName) file.fileOff = 0 file.fileSize = os.path.getsize(filepath) file.flags = TYPE_OVERWRITE_ALLOWED | TYPE_RAW if newpath == "USRDIR/EBOOT.BIN": file.fileSize = ((file.fileSize - 0x30 + 63) & ~63) + 0x30 file.flags = TYPE_OVERWRITE_ALLOWED | TYPE_NPDRMSELF file.padding = 0 files.append(file) def pack(folder, contentid, outname=None): qadigest = hashlib.sha1() header = Header() header.magic = 0x7F504B47 header.type = 0x01 header.pkgInfoOff = 0xC0 header.unk1 = 0x05 header.headSize = 0x80 header.itemCount = 0 header.packageSize = 0 header.dataOff = 0x140 header.dataSize = 0 for i in range(0, 0x30): header.contentID[i] = 0 for i in range(0,0x10): header.QADigest[i] = 0 header.KLicensee[i] = 0 metaBlock = MetaHeader() metaBlock.unk1 = 1 #doesnt change output of --extract metaBlock.unk2 = 4 #doesnt change output of --extract metaBlock.drmType = 3 #1 = Network, 2 = Local, 3 = Free, anything else = unknown metaBlock.unk4 = 2 metaBlock.unk21 = 4 metaBlock.unk22 = 5 #5 == gameexec, 4 == gamedata metaBlock.unk23 = 3 metaBlock.unk24 = 4 metaBlock.unk31 = 0xE #packageType 0x10 == patch, 0x8 == Demo&Key, 0x0 == Demo&Key (AND UserFiles = NotOverWrite), 0xE == normal, use 0xE for gamexec, and 8 for gamedata metaBlock.unk32 = 4 #when this is 5 secondary version gets used?? metaBlock.unk33 = 8 #doesnt change output of --extract metaBlock.secondaryVersion = 0 metaBlock.unk34 = 0 metaBlock.dataSize = 0 metaBlock.unk42 = 5 metaBlock.unk43 = 4 metaBlock.packagedBy = 0x1061 metaBlock.packageVersion = 0 files = [] getFiles(files, folder, folder) header.itemCount = len(files) dataToEncrypt = "" fileDescLength = 0 fileOff = 0x20 * len(files) for file in files: alignedSize = (file.fileNameLength + 0x0F) & ~0x0F file.fileNameOff = fileOff fileOff += alignedSize for file in files: file.fileOff = fileOff fileOff += (file.fileSize + 0x0F) & ~0x0F dataToEncrypt += file.pack() for file in files: alignedSize = (file.fileNameLength + 0x0F) & ~0x0F dataToEncrypt += file.fileName dataToEncrypt += "\0" * (alignedSize-file.fileNameLength) fileDescLength = len(dataToEncrypt) for file in files: if not file.flags & 0xFF == TYPE_DIRECTORY: path = os.path.join(folder, file.fileName) fp = open(path, 'rb') fileData = fp.read() qadigest.update(fileData) fileSHA1 = SHA1(fileData) fp.close() if fileData[0:9] == "SCE\0\0\0\0\x02\x80": fselfheader = SelfHeader() fselfheader.unpack(fileData[0:len(fselfheader)]) appheader = AppInfo() appheader.unpack(fileData[fselfheader.AppInfo:fselfheader.AppInfo+len(appheader)]) found = False digestOff = fselfheader.digest while not found: digest = DigestBlock() digest.unpack(fileData[digestOff:digestOff+len(digest)]) if digest.type == 3: found = True else: digestOff += digest.size if digest.isNext != 1: break digestOff += len(digest) if appheader.appType == 8 and found: dataToEncrypt += fileData[0:digestOff] meta = EbootMeta() meta.magic = 0x4E504400 meta.unk1 = 1 meta.drmType = metaBlock.drmType meta.unk2 = 1 for i in range(0,min(len(contentid), 0x30)): meta.contentID[i] = ord(contentid[i]) for i in range(0,0x10): meta.fileSHA1[i] = ord(fileSHA1[i]) meta.notSHA1[i] = (~meta.fileSHA1[i]) & 0xFF if i == 0xF: meta.notXORKLSHA1[i] = (1 ^ meta.notSHA1[i] ^ 0xAA) & 0xFF else: meta.notXORKLSHA1[i] = (0 ^ meta.notSHA1[i] ^ 0xAA) & 0xFF meta.nulls[i] = 0 dataToEncrypt += meta.pack() dataToEncrypt += fileData[digestOff + 0x80:] else: dataToEncrypt += fileData else: dataToEncrypt += fileData dataToEncrypt += '\0' * (((file.fileSize + 0x0F) & ~0x0F) - len(fileData)) header.dataSize = len(dataToEncrypt) metaBlock.dataSize = header.dataSize header.packageSize = header.dataSize + 0x1A0 head = header.pack() qadigest.update(head) qadigest.update(dataToEncrypt[0:fileDescLength]) QA_Digest = qadigest.digest() for i in range(0, 0x10): header.QADigest[i] = ord(QA_Digest[i]) for i in range(0, min(len(contentid), 0x30)): header.contentID[i] = ord(contentid[i]) context = keyToContext(header.QADigest) setContextNum(context, 0xFFFFFFFFFFFFFFFF) licensee = crypt(context, listToString(header.KLicensee), 0x10) for i in range(0, min(len(contentid), 0x10)): header.KLicensee[i] = ord(licensee[i]) if outname != None: outFile = open(outname, 'wb') else: outFile = open(contentid + ".pkg", 'wb') outFile.write(header.pack()) headerSHA = SHA1(header.pack())[3:19] outFile.write(headerSHA) metaData = metaBlock.pack() metaBlockSHA = SHA1(metaData)[3:19] metaBlockSHAPad = '\0' * 0x30 context = keyToContext([ord(c) for c in metaBlockSHA]) metaBlockSHAPadEnc = crypt(context, metaBlockSHAPad, 0x30) context = keyToContext([ord(c) for c in headerSHA]) metaBlockSHAPadEnc2 = crypt(context, metaBlockSHAPadEnc, 0x30) outFile.write(metaBlockSHAPadEnc2) outFile.write(metaData) outFile.write(metaBlockSHA) outFile.write(metaBlockSHAPadEnc) context = keyToContext(header.QADigest) encData = crypt(context, dataToEncrypt, header.dataSize) outFile.write(encData) outFile.write('\0' * 0x60) outFile.close() print header def usage(): print """usage: [based on revision 1061] python pkg.py target-directory [out-file] python pkg.py [options] npdrm-package -l | --list list packaged files. -x | --extract extract package. python pkg.py [options] --version print revision. --help print this message.""" def version(): print """pkg.py 0.5""" def main(): extract = False list = False contentid = None try: opts, args = getopt.getopt(sys.argv[1:], "hx:dvl:c:", ["help", "extract=", "version", "list=", "contentid="]) except getopt.GetoptError: usage() sys.exit(2) for opt, arg in opts: if opt in ("-h", "--help"): usage() sys.exit(2) elif opt in ("-v", "--version"): version() sys.exit(2) elif opt in ("-x", "--extract"): fileToExtract = arg extract = True elif opt in ("-l", "--list"): fileToList = arg list = True elif opt in ("-c", "--contentid"): contentid = arg else: usage() sys.exit(2) if extract: unpack(fileToExtract) else: if len(args) == 1 and contentid != None: pack(args[0], contentid) elif len(args) == 2 and contentid != None: pack(args[0], contentid, args[1]) else: usage() sys.exit(2) if __name__ == "__main__": main() cores/libretro-ffmpeg/gl_shaders/000775 001750 001750 00000000000 13044721241 020212 5ustar00sergiosergio000000 000000 libretro-common/include/rthreads/000775 001750 001750 00000000000 13044721241 020247 5ustar00sergiosergio000000 000000 pkg/android/phoenix/libs/googleplay/proguard.txt000664 001750 001750 00000001336 13044721241 023235 0ustar00sergiosergio000000 000000 -keep class * extends java.util.ListResourceBundle { protected Object[][] getContents(); } # Keep SafeParcelable value, needed for reflection. This is required to support backwards # compatibility of some classes. -keep public class com.google.android.gms.common.internal.safeparcel.SafeParcelable { public static final *** NULL; } # Keep the names of classes/members we need for client functionality. -keepnames @com.google.android.gms.common.annotation.KeepName class * -keepclassmembernames class * { @com.google.android.gms.common.annotation.KeepName *; } # Needed for Parcelable/SafeParcelable Creators to not get stripped -keepnames class * implements android.os.Parcelable { public static final ** CREATOR; }network/net_http_special.c000664 001750 001750 00000005360 13044721241 017066 0ustar00sergiosergio000000 000000 /* RetroArch - A frontend for libretro. * Copyright (C) 2011-2016 - Daniel De Matteis * Copyright (C) 2015-2017 - Andre Leiradella * Copyright (C) 2016-2017 - Brad Parker * * 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- * ation, either version 3 of the License, or (at your option) any later version. * * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with RetroArch. * If not, see . */ #include #include #include #include "net_http_special.h" int net_http_get(const char **result, size_t *size, const char *url, retro_time_t *timeout) { size_t length; uint8_t* data = NULL; char* res = NULL; int ret = NET_HTTP_GET_OK; struct http_t* http = NULL; retro_time_t t0 = cpu_features_get_time_usec(); struct http_connection_t *conn = net_http_connection_new(url); *result = NULL; /* Error creating the connection descriptor. */ if (!conn) goto error; /* Don't bother with timeouts here, it's just a string scan. */ while (!net_http_connection_iterate(conn)) {} /* Error finishing the connection descriptor. */ if (!net_http_connection_done(conn)) { ret = NET_HTTP_GET_MALFORMED_URL; goto error; } http = net_http_new(conn); /* Error connecting to the endpoint. */ if (!http) { ret = NET_HTTP_GET_CONNECT_ERROR; goto error; } while (!net_http_update(http, NULL, NULL)) { /* Timeout error. */ if (timeout && (cpu_features_get_time_usec() - t0) > *timeout) { ret = NET_HTTP_GET_TIMEOUT; goto error; } } data = net_http_data(http, &length, false); if (data) { res = (char*)malloc(length + 1); /* Allocation error. */ if ( !res ) goto error; memcpy((void*)res, (void*)data, length); free(data); res[length] = 0; *result = res; } else { length = 0; *result = NULL; } if (size) *size = length; error: if ( http ) net_http_delete( http ); if ( conn ) net_http_connection_free( conn ); if (timeout) { t0 = cpu_features_get_time_usec() - t0; if (t0 < *timeout) *timeout -= t0; else *timeout = 0; } return ret; } pkg/android/phoenix/libs/googleplay/res/values-et/strings.xml000664 001750 001750 00000007676 13044721241 025577 0ustar00sergiosergio000000 000000 "Hankige Google Play teenused" "Selle rakenduse käitamiseks on vaja Google Play teenuseid, mida teie telefonis pole." "Selle rakenduse käitamiseks on vaja Google Play teenuseid, mida teie tahvelarvutis pole." "Hankige Google Play teenused" "Lubage Google Play teenused" "See rakendus ei tööta, kui te ei luba Google Play teenuseid." "Lubage Google Play teenused" "Värskendage Google Play teenuseid" "Seda rakendust ei saa käitada, kui te ei värskenda Google Play teenuseid." "Võrgu viga" "Google Play teenustega ühenduse loomiseks on vajalik andmesideühendus." "Vale konto" "Määratud kontot pole selles seadmes olemas. Valige muu konto." "Google Play teenuste tundmatu probleem." "Google Play teenused" "Teie seade ei toeta Google Play teenuseid, millele mõni teie rakendustest toetub. Abi saamiseks võtke ühendust tootjaga." "Seadme kuupäev paistab olevat vale. Kontrollige seadme kuupäeva." "Värskenda" "Logi sisse" "Logi sisse Google\'iga" "Rakendus püüdis kasutada Google Play teenuste sobimatut versiooni." "Rakenduse kasutamiseks peavad olema lubatud Google Play teenused." "Rakenduse kasutamiseks peavad olema installitud Google Play teenused." "Rakenduse kasutamiseks tuleb värskendada Google Play teenuseid." "Viga Google Play teenustes" "Päringu esitas: %1$s" wiiu/include/wiiu/gx2r.h000664 001750 001750 00000000305 13044721241 016306 0ustar00sergiosergio000000 000000 #pragma once #include #include #include #include #include #include pkg/android/phoenix/version_increment.py000664 001750 001750 00000001162 13044721241 021656 0ustar00sergiosergio000000 000000 #!/usr/bin/python import time from xml.dom.minidom import parse dom1 = parse("AndroidManifest.xml") oldVersion = dom1.documentElement.getAttribute("android:versionCode") versionNumbers = oldVersion.split('.') versionName = dom1.documentElement.getAttribute("android:versionName") versionName = versionName + "_GIT" versionNumbers[-1] = unicode(int(time.time())) dom1.documentElement.setAttribute("android:versionCode", u'.'.join(versionNumbers)) dom1.documentElement.setAttribute("android:versionName", versionName) with open("AndroidManifest.xml", 'wb') as f: for line in dom1.toxml("utf-8"): f.write(line) menu/menu_displaylist.h000664 001750 001750 00000014700 13044721241 016404 0ustar00sergiosergio000000 000000 /* RetroArch - A frontend for libretro. * Copyright (C) 2011-2017 - Daniel De Matteis * * 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- * ation, either version 3 of the License, or (at your option) any later version. * * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with RetroArch. * If not, see . */ #ifndef _MENU_DISPLAYLIST_H #define _MENU_DISPLAYLIST_H #include #include #include #include #include #ifndef COLLECTION_SIZE #define COLLECTION_SIZE 99999 #endif RETRO_BEGIN_DECLS enum menu_displaylist_parse_type { PARSE_NONE = (1 << 0), PARSE_GROUP = (1 << 1), PARSE_ACTION = (1 << 2), PARSE_ONLY_INT = (1 << 3), PARSE_ONLY_UINT = (1 << 4), PARSE_ONLY_BOOL = (1 << 5), PARSE_ONLY_FLOAT = (1 << 6), PARSE_ONLY_BIND = (1 << 7), PARSE_ONLY_GROUP = (1 << 8), PARSE_ONLY_STRING = (1 << 9), PARSE_ONLY_PATH = (1 << 10), PARSE_ONLY_STRING_OPTIONS = (1 << 11), PARSE_ONLY_HEX = (1 << 12), PARSE_ONLY_DIR = (1 << 13), PARSE_SUB_GROUP = (1 << 14) }; enum menu_displaylist_ctl_state { DISPLAYLIST_NONE = 0, DISPLAYLIST_INFO, DISPLAYLIST_HELP, DISPLAYLIST_HELP_SCREEN_LIST, DISPLAYLIST_MAIN_MENU, DISPLAYLIST_GENERIC, DISPLAYLIST_SETTING_ENUM, DISPLAYLIST_SETTINGS_ALL, DISPLAYLIST_HORIZONTAL, DISPLAYLIST_HORIZONTAL_CONTENT_ACTIONS, DISPLAYLIST_HISTORY, DISPLAYLIST_VIDEO_HISTORY, DISPLAYLIST_MUSIC_HISTORY, DISPLAYLIST_IMAGES_HISTORY, DISPLAYLIST_PLAYLIST_COLLECTION, DISPLAYLIST_DEFAULT, DISPLAYLIST_FILE_BROWSER_SELECT_DIR, DISPLAYLIST_FILE_BROWSER_SCAN_DIR, DISPLAYLIST_FILE_BROWSER_SELECT_FILE, DISPLAYLIST_FILE_BROWSER_SELECT_CORE, DISPLAYLIST_FILE_BROWSER_SELECT_COLLECTION, DISPLAYLIST_CORES, DISPLAYLIST_CORES_SUPPORTED, DISPLAYLIST_CORES_COLLECTION_SUPPORTED, DISPLAYLIST_CORES_UPDATER, DISPLAYLIST_THUMBNAILS_UPDATER, DISPLAYLIST_LAKKA, DISPLAYLIST_CORES_DETECTED, DISPLAYLIST_CORE_OPTIONS, DISPLAYLIST_CORE_INFO, DISPLAYLIST_PERFCOUNTERS_CORE, DISPLAYLIST_PERFCOUNTERS_FRONTEND, DISPLAYLIST_SHADER_PASS, DISPLAYLIST_SHADER_PRESET, DISPLAYLIST_DATABASES, DISPLAYLIST_DATABASE_CURSORS, DISPLAYLIST_DATABASE_PLAYLISTS, DISPLAYLIST_DATABASE_PLAYLISTS_HORIZONTAL, DISPLAYLIST_DATABASE_QUERY, DISPLAYLIST_DATABASE_ENTRY, DISPLAYLIST_AUDIO_FILTERS, DISPLAYLIST_VIDEO_FILTERS, DISPLAYLIST_CHEAT_FILES, DISPLAYLIST_REMAP_FILES, DISPLAYLIST_RECORD_CONFIG_FILES, DISPLAYLIST_CONFIG_FILES, DISPLAYLIST_CONTENT_HISTORY, DISPLAYLIST_IMAGES, DISPLAYLIST_FONTS, DISPLAYLIST_OVERLAYS, DISPLAYLIST_SHADER_PARAMETERS, DISPLAYLIST_SHADER_PARAMETERS_PRESET, DISPLAYLIST_NETWORK_INFO, DISPLAYLIST_SYSTEM_INFO, DISPLAYLIST_ACHIEVEMENT_LIST, DISPLAYLIST_ACHIEVEMENT_LIST_HARDCORE, DISPLAYLIST_USER_BINDS_LIST, DISPLAYLIST_ACCOUNTS_LIST, DISPLAYLIST_DRIVER_SETTINGS_LIST, DISPLAYLIST_VIDEO_SETTINGS_LIST, DISPLAYLIST_CONFIGURATION_SETTINGS_LIST, DISPLAYLIST_SAVING_SETTINGS_LIST, DISPLAYLIST_LOGGING_SETTINGS_LIST, DISPLAYLIST_FRAME_THROTTLE_SETTINGS_LIST, DISPLAYLIST_REWIND_SETTINGS_LIST, DISPLAYLIST_AUDIO_SETTINGS_LIST, DISPLAYLIST_CORE_SETTINGS_LIST, DISPLAYLIST_INPUT_SETTINGS_LIST, DISPLAYLIST_INPUT_HOTKEY_BINDS_LIST, DISPLAYLIST_ONSCREEN_OVERLAY_SETTINGS_LIST, DISPLAYLIST_ONSCREEN_DISPLAY_SETTINGS_LIST, DISPLAYLIST_ONSCREEN_NOTIFICATIONS_SETTINGS_LIST, DISPLAYLIST_MENU_FILE_BROWSER_SETTINGS_LIST, DISPLAYLIST_MENU_SETTINGS_LIST, DISPLAYLIST_USER_INTERFACE_SETTINGS_LIST, DISPLAYLIST_RETRO_ACHIEVEMENTS_SETTINGS_LIST, DISPLAYLIST_UPDATER_SETTINGS_LIST, DISPLAYLIST_WIFI_SETTINGS_LIST, DISPLAYLIST_NETWORK_SETTINGS_LIST, DISPLAYLIST_NETPLAY_LAN_SCAN_SETTINGS_LIST, DISPLAYLIST_LAKKA_SERVICES_LIST, DISPLAYLIST_USER_SETTINGS_LIST, DISPLAYLIST_DIRECTORY_SETTINGS_LIST, DISPLAYLIST_PRIVACY_SETTINGS_LIST, DISPLAYLIST_RECORDING_SETTINGS_LIST, DISPLAYLIST_PLAYLIST_SETTINGS_LIST, DISPLAYLIST_ACCOUNTS_CHEEVOS_LIST, DISPLAYLIST_BROWSE_URL_LIST, DISPLAYLIST_BROWSE_URL_START, DISPLAYLIST_LOAD_CONTENT_LIST, DISPLAYLIST_INFORMATION_LIST, DISPLAYLIST_CONTENT_SETTINGS, DISPLAYLIST_OPTIONS, DISPLAYLIST_OPTIONS_CHEATS, DISPLAYLIST_OPTIONS_REMAPPINGS, DISPLAYLIST_OPTIONS_MANAGEMENT, DISPLAYLIST_OPTIONS_DISK, DISPLAYLIST_OPTIONS_SHADERS, DISPLAYLIST_NETPLAY, DISPLAYLIST_ADD_CONTENT_LIST, DISPLAYLIST_CONFIGURATIONS_LIST, DISPLAYLIST_SCAN_DIRECTORY_LIST, DISPLAYLIST_NETPLAY_ROOM_LIST, DISPLAYLIST_ARCHIVE_ACTION, DISPLAYLIST_ARCHIVE_ACTION_DETECT_CORE, DISPLAYLIST_CORE_CONTENT, DISPLAYLIST_CORE_CONTENT_DIRS, DISPLAYLIST_CORE_CONTENT_DIRS_SUBDIR, DISPLAYLIST_PROCESS, DISPLAYLIST_PUSH_ONTO_STACK, DISPLAYLIST_PENDING_CLEAR }; typedef struct menu_displaylist_info { bool need_sort; bool need_refresh; bool need_entries_refresh; bool need_push; bool need_clear; bool push_builtin_cores; bool download_core; bool need_navigation_clear; file_list_t *list; file_list_t *menu_list; char path[PATH_MAX_LENGTH]; char path_b[PATH_MAX_LENGTH]; char path_c[PATH_MAX_LENGTH]; char label[255]; uint32_t label_hash; char exts[PATH_MAX_LENGTH]; unsigned type; unsigned type_default; size_t directory_ptr; unsigned flags; enum msg_hash_enums enum_idx; rarch_setting_t *setting; } menu_displaylist_info_t; typedef struct menu_displaylist_ctx_parse_entry { void *data; menu_displaylist_info_t *info; const char *info_label; enum msg_hash_enums enum_idx; enum menu_displaylist_parse_type parse_type; bool add_empty_entry; } menu_displaylist_ctx_parse_entry_t; typedef struct menu_displaylist_ctx_entry { file_list_t *stack; file_list_t *list; } menu_displaylist_ctx_entry_t; bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, void *data); RETRO_END_DECLS #endif pkg/android/phoenix/libs/googleplay/res/drawable-xhdpi/ic_plusone_tall_off_client.png000664 001750 001750 00000003315 13044721241 032406 0ustar00sergiosergio000000 000000 PNG  IHDRd(x_CIDAThOW??MӴ6imӴi}ki4}[ژ)5P^*"(,. E¾e} \ާ{qv]Xۙ{~عwr|FDLf0L Ҕ:GD[V q8>$M/{` h4vtwwB!9M) =YX, FZW333O` JedGCWWA QM)b9@FFF bdLS@ i||\   :::x[[LH$i& AGvf++lv6Š2Jf5H$H aK92vm!ǩXU*ǻg8~݅x EYpg|!V%sQ? ï]FS47=%E[xv?|[aЕ+W$| zv8F[{0 ÆBIi5Q*ˋ.[eZW)|l~@ZՅ?;7@w BGNy2G~&堂/yNg6U aY tÏ?oܸA:7uuu}^^iZdt }*)sFil(774ND mY nBIENDB`pkg/android/phoenix/libs/googleplay/res/values-mn-rMN/strings.xml000664 001750 001750 00000011573 13044721241 026262 0ustar00sergiosergio000000 000000 "Google Play үйлчилгээ авах" "Таны утсанд байхгүй байгаа Google Play үйлчилгээг идэвхжүүлж байж энэ апп-г ажиллуулах боломжтой." "Таны таблетэд байхгүй Google Play үйлчилгээг идэвхжүүлж байж энэ апп-г ажиллуулах боломжтой." "Google Play үйлчилгээ авах" "Google Play үйлчилгээг идэвхжүүлэх" "Та Google Play үйлчилгээг идэвхжүүлж байж энэ апп-г ажиллуулах боломжтой." "Google Play үйлчилгээг идэвхжүүлэх" "Google Play үйлчилгээг шинэчлэх" "Та Google Play үйлчилгээг шинэчлэхгүй бол энэ апп ажиллах боломжгүй." "Сүлжээний алдаа" "Google Play үйлчилгээнд холбогдохын тулд дата холболт шаардлагатай." "Буруу акаунт" "Заасан акаунт энэ төхөөрөмж дээр байхгүй байна. Өөр акаунт сонгоно уу." "Google Play үйлчилгээтэй холбоотой тодорхойгүй алдаа." "Google Play үйлчилгээ" "Таны зарим аппликешнүүдийн хамаардаг Google Play үйлчилгээ таны төхөөрөмжид дэмжигдэхгүй байна. Тусламж авахын тулд үйлдвэрлэгчтэй холбоо барина уу." "Төхөөрөмжийн огноо буруу байгаа бололтой. Төхөөрөмжийн огноог шалгана уу." "Шинэчлэх" "Нэвтрэх" "Google-р нэвтрэх:" "Аппликешн Google Play Үйлчилгээний муу хувилбарыг ашиглахыг оролдлоо." "Аппликешн Google Play Үйлчилгээг идэвхжүүлсэн байхыг шаардана." "Аппликешн Google Play Үйлчилгээг суулгахыг шаардана." "Аппликешн Google Play Үйлчилгээг шинэчлэхийг шаардана." "Google Play үйлчилгээний алдаа" "Хүсэлт гаргасан %1$s" menu/menu_displaylist.c000664 001750 001750 00000706320 13047445627 016423 0ustar00sergiosergio000000 000000 /* RetroArch - A frontend for libretro. * Copyright (C) 2011-2017 - Daniel De Matteis * Copyright (C) 2014-2017 - Jean-André Santoni * Copyright (C) 2016-2017 - Brad Parker * * 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- * ation, either version 3 of the License, or (at your option) any later version. * * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with RetroArch. * If not, see . */ #include #include #include #include #include #include #include #include #include #include #ifdef HAVE_CONFIG_H #include "../config.h" #endif #ifdef HAVE_LIBRETRODB #include "../database_info.h" #endif #ifdef HAVE_CHEEVOS #include "../cheevos.h" #endif #ifdef HAVE_NETWORKING #include #include "../network/netplay/netplay_discovery.h" #endif #ifdef __linux__ #include "../frontend/drivers/platform_linux.h" #endif #include "menu_content.h" #include "menu_driver.h" #include "menu_navigation.h" #include "menu_shader.h" #include "widgets/menu_dialog.h" #include "widgets/menu_list.h" #include "widgets/menu_filebrowser.h" #include "menu_cbs.h" #include "../configuration.h" #include "../file_path_special.h" #include "../defaults.h" #include "../managers/cheat_manager.h" #include "../managers/core_option_manager.h" #include "../paths.h" #include "../retroarch.h" #include "../runloop.h" #include "../core.h" #include "../frontend/frontend_driver.h" #include "../ui/ui_companion_driver.h" #include "../gfx/video_shader_driver.h" #include "../config.features.h" #include "../version_git.h" #include "../input/input_config.h" #include "../list_special.h" #include "../performance_counters.h" #include "../core_info.h" #include "../wifi/wifi_driver.h" #include "../tasks/tasks_internal.h" static char new_path_entry[4096] = {0}; static char new_lbl_entry[4096] = {0}; static char new_entry[4096] = {0}; static enum msg_hash_enums new_type = MSG_UNKNOWN; #ifdef HAVE_NETWORKING static void print_buf_lines(file_list_t *list, char *buf, const char *label, int buf_size, enum msg_file_type type, bool append, bool extended) { char c; int i, j = 0; char *line_start = buf; if (!buf || !buf_size) { menu_entries_append_enum(list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_ENTRIES_TO_DISPLAY), msg_hash_to_str(MENU_ENUM_LABEL_NO_ENTRIES_TO_DISPLAY), MENU_ENUM_LABEL_NO_ENTRIES_TO_DISPLAY, FILE_TYPE_NONE, 0, 0); return; } for (i = 0; i < buf_size; i++) { size_t ln; const char *core_date = NULL; const char *core_crc = NULL; const char *core_pathname = NULL; struct string_list *str_list = NULL; /* The end of the buffer, print the last bit */ if (*(buf + i) == '\0') break; if (*(buf + i) != '\n') continue; /* Found a line ending, print the line and compute new line_start */ /* Save the next char */ c = *(buf + i + 1); /* replace with \0 */ *(buf + i + 1) = '\0'; /* We need to strip the newline. */ ln = strlen(line_start) - 1; if (line_start[ln] == '\n') line_start[ln] = '\0'; str_list = string_split(line_start, " "); if (str_list->elems[0].data) core_date = str_list->elems[0].data; if (str_list->elems[1].data) core_crc = str_list->elems[1].data; if (str_list->elems[2].data) core_pathname = str_list->elems[2].data; (void)core_date; (void)core_crc; if (extended) { if (append) menu_entries_append_enum(list, core_pathname, "", MENU_ENUM_LABEL_URL_ENTRY, type, 0, 0); else menu_entries_prepend(list, core_pathname, "", MENU_ENUM_LABEL_URL_ENTRY, type, 0, 0); } else { if (append) menu_entries_append_enum(list, line_start, label, MENU_ENUM_LABEL_URL_ENTRY, type, 0, 0); else menu_entries_prepend(list, line_start, label, MENU_ENUM_LABEL_URL_ENTRY, type, 0, 0); } switch (type) { case FILE_TYPE_DOWNLOAD_CORE: { settings_t *settings = config_get_ptr(); if (settings) { char display_name[255]; char core_path[PATH_MAX_LENGTH]; char *last = NULL; display_name[0] = core_path[0] = '\0'; fill_pathname_join_noext( core_path, settings->path.libretro_info, (extended && !string_is_empty(core_pathname)) ? core_pathname : line_start, sizeof(core_path)); path_remove_extension(core_path); last = (char*)strrchr(core_path, '_'); if (!string_is_empty(last)) { if (!string_is_equal(last, "_libretro")) *last = '\0'; } strlcat(core_path, file_path_str(FILE_PATH_CORE_INFO_EXTENSION), sizeof(core_path)); if ( path_file_exists(core_path) && core_info_get_display_name( core_path, display_name, sizeof(display_name))) menu_entries_set_alt_at_offset(list, j, display_name); } } break; default: case FILE_TYPE_NONE: break; } j++; string_list_free(str_list); /* Restore the saved char */ *(buf + i + 1) = c; line_start = buf + i + 1; } if (append) file_list_sort_on_alt(list); /* If the buffer was completely full, and didn't end * with a newline, just ignore the partial last line. */ } static int menu_displaylist_parse_netplay( menu_displaylist_info_t *info) { settings_t *settings = config_get_ptr(); menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NETPLAY_ENABLE_HOST), msg_hash_to_str(MENU_ENUM_LABEL_NETPLAY_ENABLE_HOST), MENU_ENUM_LABEL_NETPLAY_ENABLE_HOST, MENU_SETTING_ACTION, 0, 0); menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NETPLAY_ENABLE_CLIENT), msg_hash_to_str(MENU_ENUM_LABEL_NETPLAY_ENABLE_CLIENT), MENU_ENUM_LABEL_NETPLAY_ENABLE_CLIENT, MENU_SETTING_ACTION, 0, 0); menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NETPLAY_DISCONNECT), msg_hash_to_str(MENU_ENUM_LABEL_NETPLAY_DISCONNECT), MENU_ENUM_LABEL_NETPLAY_DISCONNECT, MENU_SETTING_ACTION, 0, 0); menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NETPLAY_LAN_SCAN_SETTINGS), msg_hash_to_str(MENU_ENUM_LABEL_NETPLAY_LAN_SCAN_SETTINGS), MENU_ENUM_LABEL_NETPLAY_LAN_SCAN_SETTINGS, MENU_SETTING_GROUP, 0, 0); if (!string_is_equal(settings->menu.driver, "xmb")) menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NETPLAY_TAB), msg_hash_to_str(MENU_ENUM_LABEL_NETPLAY_TAB), MENU_ENUM_LABEL_NETPLAY_TAB, MENU_SETTING_GROUP, 0, 0); return 0; } #ifndef HAVE_SOCKET_LEGACY #include static int menu_displaylist_parse_network_info(menu_displaylist_info_t *info) { unsigned k = 0; net_ifinfo_t list; if (!net_ifinfo_new(&list)) return -1; for (k = 0; k < list.size; k++) { char tmp[255]; tmp[0] = '\0'; snprintf(tmp, sizeof(tmp), "%s (%s) : %s\n", msg_hash_to_str(MSG_INTERFACE), list.entries[k].name, list.entries[k].host); menu_entries_append_enum(info->list, tmp, "", MENU_ENUM_LABEL_NETWORK_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); } net_ifinfo_free(&list); return 0; } #endif #endif static void menu_displaylist_push_perfcounter( menu_displaylist_info_t *info, struct retro_perf_counter **counters, unsigned num, unsigned id) { unsigned i; if (!counters || num == 0) { menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_PERFORMANCE_COUNTERS), msg_hash_to_str(MENU_ENUM_LABEL_NO_PERFORMANCE_COUNTERS), MENU_ENUM_LABEL_NO_PERFORMANCE_COUNTERS, 0, 0, 0); return; } for (i = 0; i < num; i++) if (counters[i] && counters[i]->ident) menu_entries_append_enum(info->list, counters[i]->ident, "", (enum msg_hash_enums)(id + i), id + i , 0, 0); } static int menu_displaylist_parse_core_info(menu_displaylist_info_t *info) { unsigned i; char tmp[PATH_MAX_LENGTH]; core_info_t *core_info = NULL; tmp[0] = '\0'; core_info_get_current_core(&core_info); if (!core_info || !core_info->config_data) { menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_CORE_INFORMATION_AVAILABLE), msg_hash_to_str(MENU_ENUM_LABEL_NO_CORE_INFORMATION_AVAILABLE), MENU_ENUM_LABEL_NO_CORE_INFORMATION_AVAILABLE, 0, 0, 0); return 0; } fill_pathname_noext(tmp, msg_hash_to_str( MENU_ENUM_LABEL_VALUE_CORE_INFO_CORE_NAME), ": ", sizeof(tmp)); if (core_info->core_name) strlcat(tmp, core_info->core_name, sizeof(tmp)); menu_entries_append_enum(info->list, tmp, "", MENU_ENUM_LABEL_CORE_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); fill_pathname_noext(tmp, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CORE_INFO_CORE_LABEL), ": ", sizeof(tmp)); if (core_info->display_name) strlcat(tmp, core_info->display_name, sizeof(tmp)); menu_entries_append_enum(info->list, tmp, "", MENU_ENUM_LABEL_CORE_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); if (core_info->systemname) { fill_pathname_noext(tmp, msg_hash_to_str( MENU_ENUM_LABEL_VALUE_CORE_INFO_SYSTEM_NAME), ": ", sizeof(tmp)); strlcat(tmp, core_info->systemname, sizeof(tmp)); menu_entries_append_enum(info->list, tmp, "", MENU_ENUM_LABEL_CORE_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); } if (core_info->system_manufacturer) { fill_pathname_noext(tmp, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CORE_INFO_SYSTEM_MANUFACTURER), ": ", sizeof(tmp)); strlcat(tmp, core_info->system_manufacturer, sizeof(tmp)); menu_entries_append_enum(info->list, tmp, "", MENU_ENUM_LABEL_CORE_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); } if (core_info->categories_list) { fill_pathname_noext(tmp, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CORE_INFO_CATEGORIES), ": ", sizeof(tmp)); string_list_join_concat(tmp, sizeof(tmp), core_info->categories_list, ", "); menu_entries_append_enum(info->list, tmp, "", MENU_ENUM_LABEL_CORE_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); } if (core_info->authors_list) { fill_pathname_noext(tmp, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CORE_INFO_AUTHORS), ": ", sizeof(tmp)); string_list_join_concat(tmp, sizeof(tmp), core_info->authors_list, ", "); menu_entries_append_enum(info->list, tmp, "", MENU_ENUM_LABEL_CORE_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); } if (core_info->permissions_list) { fill_pathname_noext(tmp, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CORE_INFO_PERMISSIONS), ": ", sizeof(tmp)); string_list_join_concat(tmp, sizeof(tmp), core_info->permissions_list, ", "); menu_entries_append_enum(info->list, tmp, "", MENU_ENUM_LABEL_CORE_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); } if (core_info->licenses_list) { fill_pathname_noext(tmp, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CORE_INFO_LICENSES), ": ", sizeof(tmp)); string_list_join_concat(tmp, sizeof(tmp), core_info->licenses_list, ", "); menu_entries_append_enum(info->list, tmp, "", MENU_ENUM_LABEL_CORE_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); } if (core_info->supported_extensions_list) { fill_pathname_noext(tmp, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CORE_INFO_SUPPORTED_EXTENSIONS), ": ", sizeof(tmp)); string_list_join_concat(tmp, sizeof(tmp), core_info->supported_extensions_list, ", "); menu_entries_append_enum(info->list, tmp, "", MENU_ENUM_LABEL_CORE_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); } if (core_info->firmware_count > 0) { core_info_ctx_firmware_t firmware_info; settings_t *settings = config_get_ptr(); firmware_info.path = core_info->path; firmware_info.directory.system = settings->directory.system; if (core_info_list_update_missing_firmware(&firmware_info)) { fill_pathname_noext(tmp, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CORE_INFO_FIRMWARE), ": ", sizeof(tmp)); menu_entries_append_enum(info->list, tmp, "", MENU_ENUM_LABEL_CORE_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); /* FIXME: This looks hacky and probably * needs to be improved for good translation support. */ for (i = 0; i < core_info->firmware_count; i++) { if (core_info->firmware[i].desc) { snprintf(tmp, sizeof(tmp), "(!) %s, %s: %s", core_info->firmware[i].missing ? msg_hash_to_str(MENU_ENUM_LABEL_VALUE_MISSING) : msg_hash_to_str(MENU_ENUM_LABEL_VALUE_PRESENT), core_info->firmware[i].optional ? msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OPTIONAL) : msg_hash_to_str(MENU_ENUM_LABEL_VALUE_REQUIRED), core_info->firmware[i].desc ? core_info->firmware[i].desc : msg_hash_to_str(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_NAME) ); menu_entries_append_enum(info->list, tmp, "", MENU_ENUM_LABEL_CORE_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); } } } } if (core_info->notes) { for (i = 0; i < core_info->note_list->size; i++) { strlcpy(tmp, core_info->note_list->elems[i].data, sizeof(tmp)); menu_entries_append_enum(info->list, tmp, "", MENU_ENUM_LABEL_CORE_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); } } return 0; } static uint64_t bytes_to_kb(uint64_t bytes) { return bytes / 1024; } static uint64_t bytes_to_mb(uint64_t bytes) { return bytes / 1024 / 1024; } static uint64_t bytes_to_gb(uint64_t bytes) { return bytes_to_kb(bytes) / 1024 / 1024; } static int menu_displaylist_parse_system_info(menu_displaylist_info_t *info) { int controller; #if defined(HAVE_OPENGL) || defined(HAVE_OPENGLES) gfx_ctx_ident_t ident_info; #endif char tmp[PATH_MAX_LENGTH]; char feat_str[255]; #ifdef ANDROID bool perms = false; #endif const char *tmp_string = NULL; const frontend_ctx_driver_t *frontend = frontend_get_ptr(); settings_t *settings = config_get_ptr(); tmp[0] = feat_str[0] = '\0'; snprintf(tmp, sizeof(tmp), "%s: %s", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_BUILD_DATE), __DATE__); menu_entries_append_enum(info->list, tmp, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); (void)tmp_string; #ifdef HAVE_GIT_VERSION fill_pathname_noext(tmp, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_GIT_VERSION), ": ", sizeof(tmp)); strlcat(tmp, retroarch_git_version, sizeof(tmp)); menu_entries_append_enum(info->list, tmp, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); #endif retroarch_get_capabilities(RARCH_CAPABILITIES_COMPILER, tmp, sizeof(tmp)); menu_entries_append_enum(info->list, tmp, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); #ifdef ANDROID perms = test_permissions(internal_storage_path); snprintf(tmp, sizeof(tmp), "%s: %s", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_INTERNAL_STORAGE_STATUS), perms ? "read-write" : "read-only"); menu_entries_append_enum(info->list, tmp, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); #endif { char cpu_str[255]; cpu_str[0] = '\0'; fill_pathname_noext(cpu_str, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_CPU_FEATURES), ": ", sizeof(cpu_str)); retroarch_get_capabilities(RARCH_CAPABILITIES_CPU, cpu_str, sizeof(cpu_str)); menu_entries_append_enum(info->list, cpu_str, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); } { char cpu_str[255]; char cpu_arch_str[PATH_MAX_LENGTH]; char cpu_text_str[PATH_MAX_LENGTH]; enum frontend_architecture arch = frontend_driver_get_cpu_architecture(); cpu_str[0] = cpu_arch_str[0] = cpu_text_str[0] = '\0'; strlcpy(cpu_text_str, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CPU_ARCHITECTURE), sizeof(cpu_text_str)); switch (arch) { case FRONTEND_ARCH_X86: strlcpy(cpu_arch_str, "x86", sizeof(cpu_arch_str)); break; case FRONTEND_ARCH_X86_64: strlcpy(cpu_arch_str, "x86-64", sizeof(cpu_arch_str)); break; case FRONTEND_ARCH_PPC: strlcpy(cpu_arch_str, "PPC", sizeof(cpu_arch_str)); break; case FRONTEND_ARCH_ARM: strlcpy(cpu_arch_str, "ARM", sizeof(cpu_arch_str)); break; case FRONTEND_ARCH_ARMV7: strlcpy(cpu_arch_str, "ARMv7", sizeof(cpu_arch_str)); break; case FRONTEND_ARCH_ARMV8: strlcpy(cpu_arch_str, "ARMv8", sizeof(cpu_arch_str)); break; case FRONTEND_ARCH_MIPS: strlcpy(cpu_arch_str, "MIPS", sizeof(cpu_arch_str)); break; case FRONTEND_ARCH_TILE: strlcpy(cpu_arch_str, "Tilera", sizeof(cpu_arch_str)); break; case FRONTEND_ARCH_NONE: default: strlcpy(cpu_arch_str, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NOT_AVAILABLE), sizeof(cpu_arch_str)); break; } snprintf(cpu_str, sizeof(cpu_str), "%s %s", cpu_text_str, cpu_arch_str); menu_entries_append_enum(info->list, cpu_str, msg_hash_to_str(MENU_ENUM_LABEL_CPU_ARCHITECTURE), MENU_ENUM_LABEL_CPU_ARCHITECTURE, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); } { char cpu_str[PATH_MAX_LENGTH]; unsigned amount_cores = cpu_features_get_core_amount(); cpu_str[0] = '\0'; snprintf(cpu_str, sizeof(cpu_str), "%s %d\n", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CPU_CORES), amount_cores); menu_entries_append_enum(info->list, cpu_str, msg_hash_to_str(MENU_ENUM_LABEL_CPU_CORES), MENU_ENUM_LABEL_CPU_CORES, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); } for(controller = 0; controller < MAX_USERS; controller++) { if (settings->input.autoconfigured[controller]) { snprintf(tmp, sizeof(tmp), "Port #%d device name: %s (#%d)", controller, settings->input.device_names[controller], settings->input.device_name_index[controller]); 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 VID/PID: %d/%d", controller, settings->input.vid[controller], settings->input.pid[controller]); menu_entries_append_enum(info->list, tmp, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); } } if (frontend) { char tmp2[PATH_MAX_LENGTH]; int major = 0; int minor = 0; tmp2[0] = '\0'; fill_pathname_noext(tmp, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_FRONTEND_IDENTIFIER), ": ", sizeof(tmp)); strlcat(tmp, frontend->ident, sizeof(tmp)); menu_entries_append_enum(info->list, tmp, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); if (frontend->get_name) { frontend->get_name(tmp2, sizeof(tmp2)); fill_pathname_noext(tmp, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_FRONTEND_NAME), ": ", sizeof(tmp)); strlcat(tmp, frontend->get_name ? tmp2 : msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NOT_AVAILABLE), sizeof(tmp)); menu_entries_append_enum(info->list, tmp, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); } if (frontend->get_os) { frontend->get_os(tmp2, sizeof(tmp2), &major, &minor); snprintf(tmp, sizeof(tmp), "%s : %s %d.%d", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_FRONTEND_OS), frontend->get_os ? tmp2 : msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NOT_AVAILABLE), major, minor); menu_entries_append_enum(info->list, tmp, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); } snprintf(tmp, sizeof(tmp), "%s : %d", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_RETRORATING_LEVEL), frontend->get_rating ? frontend->get_rating() : -1); menu_entries_append_enum(info->list, tmp, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); { char tmp[PATH_MAX_LENGTH]; char tmp2[PATH_MAX_LENGTH]; char tmp3[PATH_MAX_LENGTH]; uint64_t memory_used = frontend_driver_get_used_memory(); uint64_t memory_total = frontend_driver_get_total_memory(); tmp[0] = tmp2[0] = tmp3[0] = '\0'; if (memory_used != 0 && memory_total != 0) { #ifdef _WIN32 snprintf(tmp, sizeof(tmp), "%s %s: %Iu/%Iu B", msg_hash_to_str(MSG_MEMORY), msg_hash_to_str(MSG_IN_BYTES), memory_used, memory_total ); snprintf(tmp2, sizeof(tmp2), "%s %s: %Iu/%Iu MB", msg_hash_to_str(MSG_MEMORY), msg_hash_to_str(MSG_IN_MEGABYTES), bytes_to_mb(memory_used), bytes_to_mb(memory_total) ); snprintf(tmp3, sizeof(tmp3), "%s %s: %Iu/%Iu GB", msg_hash_to_str(MSG_MEMORY), msg_hash_to_str(MSG_IN_GIGABYTES), bytes_to_gb(memory_used), bytes_to_gb(memory_total) ); #elif defined(__STDC_VERSION__) && __STDC_VERSION__>=199901L snprintf(tmp, sizeof(tmp), "%s %s : %llu/%llu B", msg_hash_to_str(MSG_MEMORY), msg_hash_to_str(MSG_IN_BYTES), (unsigned long long)memory_used, (unsigned long long)memory_total ); snprintf(tmp2, sizeof(tmp2), "%s %s : %llu/%llu MB", msg_hash_to_str(MSG_MEMORY), msg_hash_to_str(MSG_IN_MEGABYTES), (unsigned long long)bytes_to_mb(memory_used), (unsigned long long)bytes_to_mb(memory_total) ); snprintf(tmp3, sizeof(tmp3), "%s %s: %llu/%llu GB", msg_hash_to_str(MSG_MEMORY), msg_hash_to_str(MSG_IN_GIGABYTES), (unsigned long long)bytes_to_gb(memory_used), (unsigned long long)bytes_to_gb(memory_total) ); #else snprintf(tmp, sizeof(tmp), "%s %s: %lu/%lu B", msg_hash_to_str(MSG_MEMORY), msg_hash_to_str(MSG_IN_BYTES), memory_used, memory_total ); snprintf(tmp2, sizeof(tmp2), "%s %s : %lu/%lu MB", msg_hash_to_str(MSG_MEMORY), msg_hash_to_str(MSG_IN_MEGABYTES), bytes_to_mb(memory_used), bytes_to_mb(memory_total) ); snprintf(tmp3, sizeof(tmp3), "%s %s : %lu/%lu GB", msg_hash_to_str(MSG_MEMORY), msg_hash_to_str(MSG_IN_GIGABYTES), bytes_to_gb(memory_used), bytes_to_gb(memory_total) ); #endif menu_entries_append_enum(info->list, tmp, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); menu_entries_append_enum(info->list, tmp2, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); menu_entries_append_enum(info->list, tmp3, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); } } if (frontend->get_powerstate) { int seconds = 0, percent = 0; enum frontend_powerstate state = frontend->get_powerstate(&seconds, &percent); tmp2[0] = '\0'; if (percent != 0) snprintf(tmp2, sizeof(tmp2), "%d%%", percent); switch (state) { case FRONTEND_POWERSTATE_NONE: strlcat(tmp2, " ", sizeof(tmp)); strlcat(tmp2, msg_hash_to_str( MENU_ENUM_LABEL_VALUE_NOT_AVAILABLE), sizeof(tmp)); break; case FRONTEND_POWERSTATE_NO_SOURCE: strlcat(tmp2, " (", sizeof(tmp)); strlcat(tmp2, msg_hash_to_str( MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_POWER_SOURCE_NO_SOURCE), sizeof(tmp)); strlcat(tmp2, ")", sizeof(tmp)); break; case FRONTEND_POWERSTATE_CHARGING: strlcat(tmp2, " (", sizeof(tmp)); strlcat(tmp2, msg_hash_to_str( MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_POWER_SOURCE_CHARGING), sizeof(tmp)); strlcat(tmp2, ")", sizeof(tmp)); break; case FRONTEND_POWERSTATE_CHARGED: strlcat(tmp2, " (", sizeof(tmp)); strlcat(tmp2, msg_hash_to_str( MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_POWER_SOURCE_CHARGED), sizeof(tmp)); strlcat(tmp2, ")", sizeof(tmp)); break; case FRONTEND_POWERSTATE_ON_POWER_SOURCE: strlcat(tmp2, " (", sizeof(tmp)); strlcat(tmp2, msg_hash_to_str( MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_POWER_SOURCE_DISCHARGING), sizeof(tmp)); strlcat(tmp2, ")", sizeof(tmp)); break; } fill_pathname_noext(tmp, msg_hash_to_str( MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_POWER_SOURCE), ": ", sizeof(tmp)); strlcat(tmp, tmp2, sizeof(tmp)); menu_entries_append_enum(info->list, tmp, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); } } #if defined(HAVE_OPENGL) || defined(HAVE_OPENGLES) video_context_driver_get_ident(&ident_info); tmp_string = ident_info.ident; fill_pathname_noext(tmp, msg_hash_to_str( MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_VIDEO_CONTEXT_DRIVER), ": ", sizeof(tmp)); strlcat(tmp, tmp_string ? tmp_string : msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NOT_AVAILABLE), sizeof(tmp)); menu_entries_append_enum(info->list, tmp, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); { gfx_ctx_metrics_t metrics; float val = 0.0f; metrics.type = DISPLAY_METRIC_MM_WIDTH; metrics.value = &val; if (video_context_driver_get_metrics(&metrics)) { snprintf(tmp, sizeof(tmp), "%s: %.2f", msg_hash_to_str( MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_DISPLAY_METRIC_MM_WIDTH), val); menu_entries_append_enum(info->list, tmp, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); } metrics.type = DISPLAY_METRIC_MM_HEIGHT; if (video_context_driver_get_metrics(&metrics)) { snprintf(tmp, sizeof(tmp), "%s: %.2f", msg_hash_to_str( MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_DISPLAY_METRIC_MM_HEIGHT), val); menu_entries_append_enum(info->list, tmp, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); } metrics.type = DISPLAY_METRIC_DPI; if (video_context_driver_get_metrics(&metrics)) { snprintf(tmp, sizeof(tmp), "%s: %.2f", msg_hash_to_str( MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_DISPLAY_METRIC_DPI), val); menu_entries_append_enum(info->list, tmp, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); } } #endif fill_pathname_noext(feat_str, msg_hash_to_str( MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBRETRODB_SUPPORT), ": ", sizeof(feat_str)); strlcat(feat_str, _libretrodb_supp ? msg_hash_to_str(MENU_ENUM_LABEL_VALUE_YES) : msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO), sizeof(feat_str)); menu_entries_append_enum(info->list, feat_str, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); fill_pathname_noext(feat_str, msg_hash_to_str( MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_OVERLAY_SUPPORT), ": ", sizeof(feat_str)); strlcat(feat_str, _overlay_supp ? msg_hash_to_str(MENU_ENUM_LABEL_VALUE_YES) : msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO), sizeof(feat_str)); menu_entries_append_enum(info->list, feat_str, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); fill_pathname_noext(feat_str, msg_hash_to_str( MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_COMMAND_IFACE_SUPPORT), ": ", sizeof(feat_str)); strlcat(feat_str, _command_supp ? msg_hash_to_str(MENU_ENUM_LABEL_VALUE_YES) : msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO), sizeof(feat_str)); menu_entries_append_enum(info->list, feat_str, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); snprintf(feat_str, sizeof(feat_str), "%s : %s", msg_hash_to_str( MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_NETWORK_COMMAND_IFACE_SUPPORT), _network_command_supp ? msg_hash_to_str(MENU_ENUM_LABEL_VALUE_YES) : msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO)); menu_entries_append_enum(info->list, feat_str, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); snprintf(feat_str, sizeof(feat_str), "%s : %s", msg_hash_to_str( MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_NETWORK_REMOTE_SUPPORT), _network_gamepad_supp ? msg_hash_to_str(MENU_ENUM_LABEL_VALUE_YES) : msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO)); menu_entries_append_enum(info->list, feat_str, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); snprintf(feat_str, sizeof(feat_str), "%s: %s", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_COCOA_SUPPORT), _cocoa_supp ? msg_hash_to_str(MENU_ENUM_LABEL_VALUE_YES) : msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO)); menu_entries_append_enum(info->list, feat_str, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); snprintf(feat_str, sizeof(feat_str), "%s: %s", msg_hash_to_str( MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_RPNG_SUPPORT), _rpng_supp ? msg_hash_to_str(MENU_ENUM_LABEL_VALUE_YES) : msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO)); menu_entries_append_enum(info->list, feat_str, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); snprintf(feat_str, sizeof(feat_str), "%s: %s", msg_hash_to_str( MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_RJPEG_SUPPORT), _rjpeg_supp ? msg_hash_to_str(MENU_ENUM_LABEL_VALUE_YES) : msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO)); menu_entries_append_enum(info->list, feat_str, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); snprintf(feat_str, sizeof(feat_str), "%s: %s", msg_hash_to_str( MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_RBMP_SUPPORT), _rbmp_supp ? msg_hash_to_str(MENU_ENUM_LABEL_VALUE_YES) : msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO)); menu_entries_append_enum(info->list, feat_str, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); snprintf(feat_str, sizeof(feat_str), "%s: %s", msg_hash_to_str( MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_RTGA_SUPPORT), _rtga_supp ? msg_hash_to_str(MENU_ENUM_LABEL_VALUE_YES) : msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO)); menu_entries_append_enum(info->list, feat_str, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); snprintf(feat_str, sizeof(feat_str), "%s: %s", msg_hash_to_str( MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_SDL_SUPPORT), _sdl_supp ? msg_hash_to_str(MENU_ENUM_LABEL_VALUE_YES) : msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO)); menu_entries_append_enum(info->list, feat_str, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); snprintf(feat_str, sizeof(feat_str), "%s: %s", msg_hash_to_str( MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_SDL2_SUPPORT), _sdl2_supp ? msg_hash_to_str(MENU_ENUM_LABEL_VALUE_YES) : msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO)); menu_entries_append_enum(info->list, feat_str, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); snprintf(feat_str, sizeof(feat_str), "%s: %s", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_VULKAN_SUPPORT), _vulkan_supp ? msg_hash_to_str(MENU_ENUM_LABEL_VALUE_YES) : msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO)); menu_entries_append_enum(info->list, feat_str, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); snprintf(feat_str, sizeof(feat_str), "%s: %s", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_OPENGL_SUPPORT), _opengl_supp ? msg_hash_to_str(MENU_ENUM_LABEL_VALUE_YES) : msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO)); menu_entries_append_enum(info->list, feat_str, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); snprintf(feat_str, sizeof(feat_str), "%s: %s", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_OPENGLES_SUPPORT), _opengles_supp ? msg_hash_to_str(MENU_ENUM_LABEL_VALUE_YES) : msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO)); menu_entries_append_enum(info->list, feat_str, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); snprintf(feat_str, sizeof(feat_str), "%s: %s", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_THREADING_SUPPORT), _thread_supp ? msg_hash_to_str(MENU_ENUM_LABEL_VALUE_YES) : msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO)); menu_entries_append_enum(info->list, feat_str, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); snprintf(feat_str, sizeof(feat_str), "%s: %s", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_KMS_SUPPORT), _kms_supp ? msg_hash_to_str(MENU_ENUM_LABEL_VALUE_YES) : msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO)); menu_entries_append_enum(info->list, feat_str, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); snprintf(feat_str, sizeof(feat_str), "%s: %s", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_UDEV_SUPPORT), _udev_supp ? msg_hash_to_str(MENU_ENUM_LABEL_VALUE_YES) : msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO)); menu_entries_append_enum(info->list, feat_str, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); snprintf(feat_str, sizeof(feat_str), "%s: %s", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_OPENVG_SUPPORT), _vg_supp ? msg_hash_to_str(MENU_ENUM_LABEL_VALUE_YES) : msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO)); menu_entries_append_enum(info->list, feat_str, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); snprintf(feat_str, sizeof(feat_str), "%s: %s", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_EGL_SUPPORT), _egl_supp ? msg_hash_to_str(MENU_ENUM_LABEL_VALUE_YES) : msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO)); menu_entries_append_enum(info->list, feat_str, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); snprintf(feat_str, sizeof(feat_str), "%s: %s", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_X11_SUPPORT), _x11_supp ? msg_hash_to_str(MENU_ENUM_LABEL_VALUE_YES) : msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO)); menu_entries_append_enum(info->list, feat_str, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); snprintf(feat_str, sizeof(feat_str), "%s: %s", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_WAYLAND_SUPPORT), _wayland_supp ? msg_hash_to_str(MENU_ENUM_LABEL_VALUE_YES) : msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO)); menu_entries_append_enum(info->list, feat_str, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); snprintf(feat_str, sizeof(feat_str), "%s: %s", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_XVIDEO_SUPPORT), _xvideo_supp ? msg_hash_to_str(MENU_ENUM_LABEL_VALUE_YES) : msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO)); menu_entries_append_enum(info->list, feat_str, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); snprintf(feat_str, sizeof(feat_str), "%s: %s", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_ALSA_SUPPORT), _alsa_supp ? msg_hash_to_str(MENU_ENUM_LABEL_VALUE_YES) : msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO)); menu_entries_append_enum(info->list, feat_str, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); snprintf(feat_str, sizeof(feat_str), "%s: %s", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_OSS_SUPPORT), _oss_supp ? msg_hash_to_str(MENU_ENUM_LABEL_VALUE_YES) : msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO)); menu_entries_append_enum(info->list, feat_str, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); snprintf(feat_str, sizeof(feat_str), "%s: %s", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_OPENAL_SUPPORT), _al_supp ? msg_hash_to_str(MENU_ENUM_LABEL_VALUE_YES) : msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO)); menu_entries_append_enum(info->list, feat_str, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); snprintf(feat_str, sizeof(feat_str), "%s: %s", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_OPENSL_SUPPORT), _sl_supp ? msg_hash_to_str(MENU_ENUM_LABEL_VALUE_YES) : msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO)); menu_entries_append_enum(info->list, feat_str, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); snprintf(feat_str, sizeof(feat_str), "%s: %s", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_RSOUND_SUPPORT), _rsound_supp ? msg_hash_to_str(MENU_ENUM_LABEL_VALUE_YES) : msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO)); menu_entries_append_enum(info->list, feat_str, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); snprintf(feat_str, sizeof(feat_str), "%s: %s", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_ROARAUDIO_SUPPORT), _roar_supp ? msg_hash_to_str(MENU_ENUM_LABEL_VALUE_YES) : msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO)); menu_entries_append_enum(info->list, feat_str, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); snprintf(feat_str, sizeof(feat_str), "%s: %s", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_JACK_SUPPORT), _jack_supp ? msg_hash_to_str(MENU_ENUM_LABEL_VALUE_YES) : msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO)); menu_entries_append_enum(info->list, feat_str, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); snprintf(feat_str, sizeof(feat_str), "%s: %s", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_PULSEAUDIO_SUPPORT), _pulse_supp ? msg_hash_to_str(MENU_ENUM_LABEL_VALUE_YES) : msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO)); menu_entries_append_enum(info->list, feat_str, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); snprintf(feat_str, sizeof(feat_str), "%s: %s", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_DSOUND_SUPPORT), _dsound_supp ? msg_hash_to_str(MENU_ENUM_LABEL_VALUE_YES) : msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO)); menu_entries_append_enum(info->list, feat_str, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); snprintf(feat_str, sizeof(feat_str), "%s: %s", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_XAUDIO2_SUPPORT), _xaudio_supp ? msg_hash_to_str(MENU_ENUM_LABEL_VALUE_YES) : msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO)); menu_entries_append_enum(info->list, feat_str, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); snprintf(feat_str, sizeof(feat_str), "%s: %s", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_ZLIB_SUPPORT), _zlib_supp ? msg_hash_to_str(MENU_ENUM_LABEL_VALUE_YES) : msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO)); menu_entries_append_enum(info->list, feat_str, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); snprintf(feat_str, sizeof(feat_str), "%s: %s", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_7ZIP_SUPPORT), _7zip_supp ? msg_hash_to_str(MENU_ENUM_LABEL_VALUE_YES) : msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO)); menu_entries_append_enum(info->list, feat_str, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); snprintf(feat_str, sizeof(feat_str), "%s: %s", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_DYLIB_SUPPORT), _dylib_supp ? msg_hash_to_str(MENU_ENUM_LABEL_VALUE_YES) : msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO)); menu_entries_append_enum(info->list, feat_str, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); snprintf(feat_str, sizeof(feat_str), "%s: %s", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_DYNAMIC_SUPPORT), _dynamic_supp ? msg_hash_to_str(MENU_ENUM_LABEL_VALUE_YES) : msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO)); menu_entries_append_enum(info->list, feat_str, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); snprintf(feat_str, sizeof(feat_str), "%s: %s", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_CG_SUPPORT), _cg_supp ? msg_hash_to_str(MENU_ENUM_LABEL_VALUE_YES) : msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO)); menu_entries_append_enum(info->list, feat_str, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); snprintf(feat_str, sizeof(feat_str), "%s: %s", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_GLSL_SUPPORT), _glsl_supp ? msg_hash_to_str(MENU_ENUM_LABEL_VALUE_YES) : msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO)); menu_entries_append_enum(info->list, feat_str, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); snprintf(feat_str, sizeof(feat_str), "%s: %s", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_HLSL_SUPPORT), _hlsl_supp ? msg_hash_to_str(MENU_ENUM_LABEL_VALUE_YES) : msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO)); menu_entries_append_enum(info->list, feat_str, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); snprintf(feat_str, sizeof(feat_str), "%s: %s", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBXML2_SUPPORT), _libxml2_supp ? msg_hash_to_str(MENU_ENUM_LABEL_VALUE_YES) : msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO)); menu_entries_append_enum(info->list, feat_str, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); snprintf(feat_str, sizeof(feat_str), "%s: %s", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_SDL_IMAGE_SUPPORT), _sdl_image_supp ? msg_hash_to_str(MENU_ENUM_LABEL_VALUE_YES) : msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO)); menu_entries_append_enum(info->list, feat_str, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); snprintf(feat_str, sizeof(feat_str), "%s: %s", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_FBO_SUPPORT), _fbo_supp ? msg_hash_to_str(MENU_ENUM_LABEL_VALUE_YES) : msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO)); menu_entries_append_enum(info->list, feat_str, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); snprintf(feat_str, sizeof(feat_str), "%s: %s", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_FFMPEG_SUPPORT), _ffmpeg_supp ? msg_hash_to_str(MENU_ENUM_LABEL_VALUE_YES) : msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO)); menu_entries_append_enum(info->list, feat_str, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); snprintf(feat_str, sizeof(feat_str), "%s: %s", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_CORETEXT_SUPPORT), _coretext_supp ? msg_hash_to_str(MENU_ENUM_LABEL_VALUE_YES) : msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO)); menu_entries_append_enum(info->list, feat_str, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); snprintf(feat_str, sizeof(feat_str), "%s: %s", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_FREETYPE_SUPPORT), _freetype_supp ? msg_hash_to_str(MENU_ENUM_LABEL_VALUE_YES) : msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO)); menu_entries_append_enum(info->list, feat_str, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); snprintf(feat_str, sizeof(feat_str), "%s: %s", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_NETPLAY_SUPPORT), _netplay_supp ? msg_hash_to_str(MENU_ENUM_LABEL_VALUE_YES) : msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO)); menu_entries_append_enum(info->list, feat_str, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); snprintf(feat_str, sizeof(feat_str), "%s: %s", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_PYTHON_SUPPORT), _python_supp ? msg_hash_to_str(MENU_ENUM_LABEL_VALUE_YES) : msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO)); menu_entries_append_enum(info->list, feat_str, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); snprintf(feat_str, sizeof(feat_str), "%s: %s", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_V4L2_SUPPORT), _v4l2_supp ? msg_hash_to_str(MENU_ENUM_LABEL_VALUE_YES) : msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO)); menu_entries_append_enum(info->list, feat_str, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); snprintf(feat_str, sizeof(feat_str), "%s: %s", msg_hash_to_str( MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBUSB_SUPPORT), _libusb_supp ? msg_hash_to_str(MENU_ENUM_LABEL_VALUE_YES) : msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO)); menu_entries_append_enum(info->list, feat_str, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); return 0; } static int menu_displaylist_parse_playlist(menu_displaylist_info_t *info, playlist_t *playlist, const char *path_playlist, bool is_history) { unsigned i; size_t list_size = 0; if (!playlist) return -1; list_size = playlist_size(playlist); if (list_size == 0) { menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_PLAYLIST_ENTRIES_AVAILABLE), msg_hash_to_str(MENU_ENUM_LABEL_NO_PLAYLIST_ENTRIES_AVAILABLE), MENU_ENUM_LABEL_NO_PLAYLIST_ENTRIES_AVAILABLE, MENU_INFO_MESSAGE, 0, 0); return 0; } for (i = 0; i < list_size; i++) { char fill_buf[PATH_MAX_LENGTH]; char path_copy[PATH_MAX_LENGTH]; const char *core_name = NULL; const char *path = NULL; const char *label = NULL; fill_buf[0] = path_copy[0] = '\0'; strlcpy(path_copy, info->path, sizeof(path_copy)); path = path_copy; playlist_get_index(playlist, i, &path, &label, NULL, &core_name, NULL, NULL); if (core_name) strlcpy(fill_buf, core_name, sizeof(fill_buf)); if (path) { char path_short[PATH_MAX_LENGTH]; path_short[0] = '\0'; fill_short_pathname_representation(path_short, path, sizeof(path_short)); strlcpy(fill_buf, (!string_is_empty(label)) ? label : path_short, sizeof(fill_buf)); if (!string_is_empty(core_name)) { if (!string_is_equal(core_name, file_path_str(FILE_PATH_DETECT))) { char tmp[PATH_MAX_LENGTH]; tmp[0] = '\0'; snprintf(tmp, sizeof(tmp), " (%s)", core_name); strlcat(fill_buf, tmp, sizeof(fill_buf)); } } } if (!path) menu_entries_append_enum(info->list, fill_buf, path_playlist, MENU_ENUM_LABEL_PLAYLIST_ENTRY, FILE_TYPE_PLAYLIST_ENTRY, 0, i); else if (is_history) menu_entries_append_enum(info->list, fill_buf, path, MENU_ENUM_LABEL_PLAYLIST_ENTRY, FILE_TYPE_RPL_ENTRY, 0, i); else menu_entries_append_enum(info->list, label, path, MENU_ENUM_LABEL_PLAYLIST_ENTRY, FILE_TYPE_RPL_ENTRY, 0, i); } return 0; } static int menu_displaylist_parse_shader_options(menu_displaylist_info_t *info) { unsigned i; unsigned pass_count = menu_shader_manager_get_amount_passes(); menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SHADER_APPLY_CHANGES), msg_hash_to_str(MENU_ENUM_LABEL_SHADER_APPLY_CHANGES), MENU_ENUM_LABEL_SHADER_APPLY_CHANGES, MENU_SETTING_ACTION, 0, 0); menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET), msg_hash_to_str(MENU_ENUM_LABEL_VIDEO_SHADER_PRESET), MENU_ENUM_LABEL_VIDEO_SHADER_PRESET, FILE_TYPE_PATH, 0, 0); menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_AS), msg_hash_to_str(MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_AS), MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_AS, MENU_SETTING_ACTION, 0, 0); menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_CORE), msg_hash_to_str(MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_AS), MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_CORE, MENU_SETTING_ACTION, 0, 0); menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_GAME), msg_hash_to_str(MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_AS), MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_GAME, MENU_SETTING_ACTION, 0, 0); menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PARAMETERS), msg_hash_to_str(MENU_ENUM_LABEL_VIDEO_SHADER_PARAMETERS), MENU_ENUM_LABEL_VIDEO_SHADER_PARAMETERS, MENU_SETTING_ACTION, 0, 0); menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_PARAMETERS), msg_hash_to_str(MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_PARAMETERS), MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_PARAMETERS, MENU_SETTING_ACTION, 0, 0); menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_NUM_PASSES), msg_hash_to_str(MENU_ENUM_LABEL_VIDEO_SHADER_NUM_PASSES), MENU_ENUM_LABEL_VIDEO_SHADER_NUM_PASSES, 0, 0, 0); for (i = 0; i < pass_count; i++) { char buf_tmp[64]; char buf[64]; buf[0] = buf_tmp[0] = '\0'; snprintf(buf_tmp, sizeof(buf_tmp), "%s #%u", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SHADER), i); menu_entries_append_enum(info->list, buf_tmp, msg_hash_to_str(MENU_ENUM_LABEL_VIDEO_SHADER_PASS), MENU_ENUM_LABEL_VIDEO_SHADER_PASS, MENU_SETTINGS_SHADER_PASS_0 + i, 0, 0); snprintf(buf, sizeof(buf), "%s %s", buf_tmp, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_FILTER)); menu_entries_append_enum(info->list, buf, msg_hash_to_str(MENU_ENUM_LABEL_VIDEO_SHADER_FILTER_PASS), MENU_ENUM_LABEL_VIDEO_SHADER_FILTER_PASS, MENU_SETTINGS_SHADER_PASS_FILTER_0 + i, 0, 0); snprintf(buf, sizeof(buf), "%s %s", buf_tmp, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SCALE)); menu_entries_append_enum(info->list, buf, msg_hash_to_str(MENU_ENUM_LABEL_VIDEO_SHADER_SCALE_PASS), MENU_ENUM_LABEL_VIDEO_SHADER_SCALE_PASS, MENU_SETTINGS_SHADER_PASS_SCALE_0 + i, 0, 0); } return 0; } #ifdef HAVE_LIBRETRODB static int create_string_list_rdb_entry_string( enum msg_hash_enums enum_idx, const char *desc, const char *label, const char *actual_string, const char *path, file_list_t *list) { char tmp[PATH_MAX_LENGTH]; union string_list_elem_attr attr; char *output_label = NULL; int str_len = 0; struct string_list *str_list = string_list_new(); if (!str_list) return -1; attr.i = 0; tmp[0] = '\0'; str_len += strlen(label) + 1; string_list_append(str_list, label, attr); str_len += strlen(actual_string) + 1; string_list_append(str_list, actual_string, attr); str_len += strlen(path) + 1; string_list_append(str_list, path, attr); output_label = (char*)calloc(str_len, sizeof(char)); if (!output_label) { string_list_free(str_list); return -1; } string_list_join_concat(output_label, str_len, str_list, "|"); fill_pathname_noext(tmp, desc, ": ", sizeof(tmp)); strlcat(tmp, actual_string, sizeof(tmp)); menu_entries_append_enum(list, tmp, output_label, enum_idx, 0, 0, 0); if (output_label) free(output_label); string_list_free(str_list); str_list = NULL; return 0; } static int create_string_list_rdb_entry_int( enum msg_hash_enums enum_idx, const char *desc, const char *label, int actual_int, const char *path, file_list_t *list) { char tmp[PATH_MAX_LENGTH]; char str[PATH_MAX_LENGTH]; union string_list_elem_attr attr; char *output_label = NULL; int str_len = 0; struct string_list *str_list = string_list_new(); if (!str_list) return -1; attr.i = 0; tmp[0] = str[0] = '\0'; str_len += strlen(label) + 1; string_list_append(str_list, label, attr); snprintf(str, sizeof(str), "%d", actual_int); str_len += strlen(str) + 1; string_list_append(str_list, str, attr); str_len += strlen(path) + 1; string_list_append(str_list, path, attr); output_label = (char*)calloc(str_len, sizeof(char)); if (!output_label) { string_list_free(str_list); return -1; } string_list_join_concat(output_label, str_len, str_list, "|"); snprintf(tmp, sizeof(tmp), "%s : %d", desc, actual_int); menu_entries_append_enum(list, tmp, output_label, enum_idx, 0, 0, 0); if (output_label) free(output_label); string_list_free(str_list); str_list = NULL; return 0; } static int menu_displaylist_parse_database_entry(menu_displaylist_info_t *info) { unsigned i, j, k; char path_playlist[PATH_MAX_LENGTH]; char path_base[PATH_MAX_LENGTH]; char query[PATH_MAX_LENGTH]; playlist_t *playlist = NULL; database_info_list_t *db_info = NULL; menu_handle_t *menu = NULL; settings_t *settings = config_get_ptr(); path_playlist[0] = path_base[0] = query[0] = '\0'; if (!menu_driver_ctl(RARCH_MENU_CTL_DRIVER_DATA_GET, &menu)) goto error; database_info_build_query_enum(query, sizeof(query), DATABASE_QUERY_ENTRY, info->path_b); db_info = database_info_list_new(info->path, query); if (!db_info) goto error; fill_short_pathname_representation_noext(path_base, info->path, sizeof(path_base)); strlcat(path_base, file_path_str(FILE_PATH_LPL_EXTENSION), sizeof(path_base)); fill_pathname_join(path_playlist, settings->directory.playlist, path_base, sizeof(path_playlist)); playlist = playlist_init(path_playlist, COLLECTION_SIZE); if (playlist) strlcpy(menu->db_playlist_file, path_playlist, sizeof(menu->db_playlist_file)); for (i = 0; i < db_info->count; i++) { char tmp[PATH_MAX_LENGTH]; char crc_str[20]; database_info_t *db_info_entry = &db_info->list[i]; bool show_advanced_settings = settings->menu.show_advanced_settings; crc_str[0] = tmp[0] = '\0'; snprintf(crc_str, sizeof(crc_str), "%08X", db_info_entry->crc32); if (playlist) { for (j = 0; j < playlist_size(playlist); j++) { char elem0[PATH_MAX_LENGTH]; char elem1[PATH_MAX_LENGTH]; const char *crc32 = NULL; bool match_found = false; struct string_list *tmp_str_list = NULL; elem0[0] = elem1[0] = '\0'; playlist_get_index(playlist, j, NULL, NULL, NULL, NULL, NULL, &crc32); tmp_str_list = string_split(crc32, "|"); if (!tmp_str_list) continue; if (tmp_str_list->size > 0) strlcpy(elem0, tmp_str_list->elems[0].data, sizeof(elem0)); if (tmp_str_list->size > 1) strlcpy(elem1, tmp_str_list->elems[1].data, sizeof(elem1)); switch (msg_hash_to_file_type(msg_hash_calculate(elem1))) { case FILE_TYPE_CRC: if (string_is_equal(crc_str, elem0)) match_found = true; break; case FILE_TYPE_SHA1: if (string_is_equal(db_info_entry->sha1, elem0)) match_found = true; break; case FILE_TYPE_MD5: if (string_is_equal(db_info_entry->md5, elem0)) match_found = true; break; default: break; } string_list_free(tmp_str_list); if (!match_found) continue; rdb_entry_start_game_selection_ptr = j; } } if (db_info_entry->name) { fill_pathname_noext(tmp, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_NAME), ": ", sizeof(tmp)); strlcat(tmp, db_info_entry->name, sizeof(tmp)); menu_entries_append_enum(info->list, tmp, msg_hash_to_str(MENU_ENUM_LABEL_RDB_ENTRY_NAME), MENU_ENUM_LABEL_RDB_ENTRY_NAME, 0, 0, 0); } if (db_info_entry->description) { fill_pathname_noext(tmp, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_DESCRIPTION), ": ", sizeof(tmp)); strlcat(tmp, db_info_entry->description, sizeof(tmp)); menu_entries_append_enum(info->list, tmp, msg_hash_to_str(MENU_ENUM_LABEL_RDB_ENTRY_DESCRIPTION), MENU_ENUM_LABEL_RDB_ENTRY_DESCRIPTION, 0, 0, 0); } if (db_info_entry->genre) { fill_pathname_noext(tmp, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_GENRE), ": ", sizeof(tmp)); strlcat(tmp, db_info_entry->genre, sizeof(tmp)); menu_entries_append_enum(info->list, tmp, msg_hash_to_str(MENU_ENUM_LABEL_RDB_ENTRY_GENRE), MENU_ENUM_LABEL_RDB_ENTRY_GENRE, 0, 0, 0); } if (db_info_entry->publisher) { if (create_string_list_rdb_entry_string( MENU_ENUM_LABEL_RDB_ENTRY_PUBLISHER, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_PUBLISHER), msg_hash_to_str(MENU_ENUM_LABEL_RDB_ENTRY_PUBLISHER), db_info_entry->publisher, info->path, info->list) == -1) goto error; } if (db_info_entry->developer) { for (k = 0; k < db_info_entry->developer->size; k++) { if (db_info_entry->developer->elems[k].data) { if (create_string_list_rdb_entry_string( MENU_ENUM_LABEL_RDB_ENTRY_DEVELOPER, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_DEVELOPER), msg_hash_to_str(MENU_ENUM_LABEL_RDB_ENTRY_DEVELOPER), db_info_entry->developer->elems[k].data, info->path, info->list) == -1) goto error; } } } if (db_info_entry->origin) { if (create_string_list_rdb_entry_string( MENU_ENUM_LABEL_RDB_ENTRY_ORIGIN, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_ORIGIN), msg_hash_to_str(MENU_ENUM_LABEL_RDB_ENTRY_ORIGIN), db_info_entry->origin, info->path, info->list) == -1) goto error; } if (db_info_entry->franchise) { if (create_string_list_rdb_entry_string( MENU_ENUM_LABEL_RDB_ENTRY_FRANCHISE, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_FRANCHISE), msg_hash_to_str(MENU_ENUM_LABEL_RDB_ENTRY_FRANCHISE), db_info_entry->franchise, info->path, info->list) == -1) goto error; } if (db_info_entry->max_users) { if (create_string_list_rdb_entry_int( MENU_ENUM_LABEL_RDB_ENTRY_MAX_USERS, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS), msg_hash_to_str(MENU_ENUM_LABEL_RDB_ENTRY_MAX_USERS), db_info_entry->max_users, info->path, info->list) == -1) goto error; } if (db_info_entry->tgdb_rating) { if (create_string_list_rdb_entry_int( MENU_ENUM_LABEL_RDB_ENTRY_TGDB_RATING, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_TGDB_RATING), msg_hash_to_str(MENU_ENUM_LABEL_RDB_ENTRY_TGDB_RATING), db_info_entry->tgdb_rating, info->path, info->list) == -1) goto error; } if (db_info_entry->famitsu_magazine_rating) { if (create_string_list_rdb_entry_int( MENU_ENUM_LABEL_RDB_ENTRY_FAMITSU_MAGAZINE_RATING, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_FAMITSU_MAGAZINE_RATING), msg_hash_to_str(MENU_ENUM_LABEL_RDB_ENTRY_FAMITSU_MAGAZINE_RATING), db_info_entry->famitsu_magazine_rating, info->path, info->list) == -1) goto error; } if (db_info_entry->edge_magazine_review) { if (create_string_list_rdb_entry_string( MENU_ENUM_LABEL_RDB_ENTRY_EDGE_MAGAZINE_REVIEW, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_EDGE_MAGAZINE_REVIEW), msg_hash_to_str(MENU_ENUM_LABEL_RDB_ENTRY_EDGE_MAGAZINE_REVIEW), db_info_entry->edge_magazine_review, info->path, info->list) == -1) goto error; } if (db_info_entry->edge_magazine_rating) { if (create_string_list_rdb_entry_int( MENU_ENUM_LABEL_RDB_ENTRY_EDGE_MAGAZINE_RATING, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_EDGE_MAGAZINE_RATING), msg_hash_to_str(MENU_ENUM_LABEL_RDB_ENTRY_EDGE_MAGAZINE_RATING), db_info_entry->edge_magazine_rating, info->path, info->list) == -1) goto error; } if (db_info_entry->edge_magazine_issue) { if (create_string_list_rdb_entry_int( MENU_ENUM_LABEL_RDB_ENTRY_EDGE_MAGAZINE_ISSUE, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_EDGE_MAGAZINE_ISSUE), msg_hash_to_str(MENU_ENUM_LABEL_RDB_ENTRY_EDGE_MAGAZINE_ISSUE), db_info_entry->edge_magazine_issue, info->path, info->list) == -1) goto error; } if (db_info_entry->releasemonth) { if (create_string_list_rdb_entry_int( MENU_ENUM_LABEL_RDB_ENTRY_RELEASE_MONTH, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_RELEASE_MONTH), msg_hash_to_str(MENU_ENUM_LABEL_RDB_ENTRY_RELEASE_MONTH), db_info_entry->releasemonth, info->path, info->list) == -1) goto error; } if (db_info_entry->releaseyear) { if (create_string_list_rdb_entry_int( MENU_ENUM_LABEL_RDB_ENTRY_RELEASE_YEAR, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_RELEASE_YEAR), msg_hash_to_str(MENU_ENUM_LABEL_RDB_ENTRY_RELEASE_YEAR), db_info_entry->releaseyear, info->path, info->list) == -1) goto error; } if (db_info_entry->bbfc_rating) { if (create_string_list_rdb_entry_string( MENU_ENUM_LABEL_RDB_ENTRY_BBFC_RATING, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_BBFC_RATING), msg_hash_to_str(MENU_ENUM_LABEL_RDB_ENTRY_BBFC_RATING), db_info_entry->bbfc_rating, info->path, info->list) == -1) goto error; } if (db_info_entry->esrb_rating) { if (create_string_list_rdb_entry_string( MENU_ENUM_LABEL_RDB_ENTRY_ESRB_RATING, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_ESRB_RATING), msg_hash_to_str(MENU_ENUM_LABEL_RDB_ENTRY_ESRB_RATING), db_info_entry->esrb_rating, info->path, info->list) == -1) goto error; } if (db_info_entry->elspa_rating) { if (create_string_list_rdb_entry_string( MENU_ENUM_LABEL_RDB_ENTRY_ELSPA_RATING, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_ELSPA_RATING), msg_hash_to_str(MENU_ENUM_LABEL_RDB_ENTRY_ELSPA_RATING), db_info_entry->elspa_rating, info->path, info->list) == -1) goto error; } if (db_info_entry->pegi_rating) { if (create_string_list_rdb_entry_string( MENU_ENUM_LABEL_RDB_ENTRY_PEGI_RATING, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_PEGI_RATING), msg_hash_to_str(MENU_ENUM_LABEL_RDB_ENTRY_PEGI_RATING), db_info_entry->pegi_rating, info->path, info->list) == -1) goto error; } if (db_info_entry->enhancement_hw) { if (create_string_list_rdb_entry_string( MENU_ENUM_LABEL_RDB_ENTRY_ENHANCEMENT_HW, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_ENHANCEMENT_HW), msg_hash_to_str(MENU_ENUM_LABEL_RDB_ENTRY_ENHANCEMENT_HW), db_info_entry->enhancement_hw, info->path, info->list) == -1) goto error; } if (db_info_entry->cero_rating) { if (create_string_list_rdb_entry_string( MENU_ENUM_LABEL_RDB_ENTRY_CERO_RATING, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_CERO_RATING), msg_hash_to_str(MENU_ENUM_LABEL_RDB_ENTRY_CERO_RATING), db_info_entry->cero_rating, info->path, info->list) == -1) goto error; } if (db_info_entry->serial) { if (create_string_list_rdb_entry_string( MENU_ENUM_LABEL_RDB_ENTRY_SERIAL, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_SERIAL), msg_hash_to_str(MENU_ENUM_LABEL_RDB_ENTRY_SERIAL), db_info_entry->serial, info->path, info->list) == -1) goto error; } if (db_info_entry->analog_supported == 1) { if (create_string_list_rdb_entry_string( MENU_ENUM_LABEL_RDB_ENTRY_ANALOG, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_ANALOG), msg_hash_to_str(MENU_ENUM_LABEL_RDB_ENTRY_ANALOG), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_TRUE), info->path, info->list) == -1) goto error; } if (db_info_entry->rumble_supported == 1) { if (create_string_list_rdb_entry_string( MENU_ENUM_LABEL_RDB_ENTRY_RUMBLE, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_RUMBLE), msg_hash_to_str(MENU_ENUM_LABEL_RDB_ENTRY_RUMBLE), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_TRUE), info->path, info->list) == -1) goto error; } if (db_info_entry->coop_supported == 1) { if (create_string_list_rdb_entry_string( MENU_ENUM_LABEL_RDB_ENTRY_COOP, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_COOP), msg_hash_to_str(MENU_ENUM_LABEL_RDB_ENTRY_COOP), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_TRUE), info->path, info->list) == -1) goto error; } if (!show_advanced_settings) continue; if (db_info_entry->crc32) { if (create_string_list_rdb_entry_string( MENU_ENUM_LABEL_RDB_ENTRY_CRC32, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_CRC32), msg_hash_to_str(MENU_ENUM_LABEL_RDB_ENTRY_CRC32), crc_str, info->path, info->list) == -1) goto error; } if (db_info_entry->sha1) { if (create_string_list_rdb_entry_string( MENU_ENUM_LABEL_RDB_ENTRY_SHA1, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_SHA1), msg_hash_to_str(MENU_ENUM_LABEL_RDB_ENTRY_SHA1), db_info_entry->sha1, info->path, info->list) == -1) goto error; } if (db_info_entry->md5) { if (create_string_list_rdb_entry_string( MENU_ENUM_LABEL_RDB_ENTRY_MD5, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_MD5), msg_hash_to_str(MENU_ENUM_LABEL_RDB_ENTRY_MD5), db_info_entry->md5, info->path, info->list) == -1) goto error; } } if (db_info->count < 1) menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_PLAYLIST_ENTRIES_AVAILABLE), msg_hash_to_str(MENU_ENUM_LABEL_NO_PLAYLIST_ENTRIES_AVAILABLE), MENU_ENUM_LABEL_NO_PLAYLIST_ENTRIES_AVAILABLE, 0, 0, 0); playlist_free(playlist); database_info_list_free(db_info); free(db_info); return 0; error: if (db_info) { database_info_list_free(db_info); free(db_info); } playlist_free(playlist); return -1; } static int menu_database_parse_query(file_list_t *list, const char *path, const char *query) { unsigned i; database_info_list_t *db_list = database_info_list_new(path, query); if (!db_list) return -1; for (i = 0; i < db_list->count; i++) { if (!string_is_empty(db_list->list[i].name)) menu_entries_append_enum(list, db_list->list[i].name, path, MENU_ENUM_LABEL_RDB_ENTRY, FILE_TYPE_RDB_ENTRY, 0, 0); } database_info_list_free(db_list); free(db_list); return 0; } #endif #ifdef HAVE_SHADER_MANAGER static int deferred_push_video_shader_parameters_common( menu_displaylist_info_t *info, struct video_shader *shader, unsigned base_parameter) { unsigned i; size_t list_size = shader->num_parameters; if (list_size == 0) { menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_SHADER_PARAMETERS), msg_hash_to_str(MENU_ENUM_LABEL_NO_SHADER_PARAMETERS), MENU_ENUM_LABEL_NO_SHADER_PARAMETERS, 0, 0, 0); return 0; } for (i = 0; i < list_size; i++) menu_entries_append_enum(info->list, shader->parameters[i].desc, info->label, MENU_ENUM_LABEL_SHADER_PARAMETERS_ENTRY, base_parameter + i, 0, 0); return 0; } #endif static int menu_displaylist_parse_settings_internal(void *data, menu_displaylist_info_t *info, enum menu_displaylist_parse_type parse_type, bool add_empty_entry, rarch_setting_t *setting ) { enum setting_type precond; size_t count = 0; uint64_t flags = 0; settings_t *settings = config_get_ptr(); if (!setting) return -1; flags = setting->flags; switch (parse_type) { case PARSE_GROUP: case PARSE_SUB_GROUP: precond = ST_NONE; break; case PARSE_ACTION: precond = ST_ACTION; break; case PARSE_ONLY_INT: precond = ST_INT; break; case PARSE_ONLY_UINT: precond = ST_UINT; break; case PARSE_ONLY_BIND: precond = ST_BIND; break; case PARSE_ONLY_BOOL: precond = ST_BOOL; break; case PARSE_ONLY_FLOAT: precond = ST_FLOAT; break; case PARSE_ONLY_HEX: precond = ST_HEX; break; case PARSE_ONLY_STRING: precond = ST_STRING; break; case PARSE_ONLY_PATH: precond = ST_PATH; break; case PARSE_ONLY_DIR: precond = ST_DIR; break; case PARSE_ONLY_STRING_OPTIONS: precond = ST_STRING_OPTIONS; break; case PARSE_ONLY_GROUP: default: precond = ST_END_GROUP; break; } for (;;) { bool time_to_exit = false; const char *short_description = setting->short_description; const char *name = setting->name; enum setting_type type = setting_get_type(setting); rarch_setting_t **list = &setting; switch (parse_type) { case PARSE_NONE: switch (type) { case ST_GROUP: case ST_END_GROUP: case ST_SUB_GROUP: case ST_END_SUB_GROUP: goto loop; default: break; } break; case PARSE_GROUP: case PARSE_ONLY_GROUP: if (type == ST_GROUP) break; goto loop; case PARSE_SUB_GROUP: break; case PARSE_ACTION: if (type == ST_ACTION) break; goto loop; case PARSE_ONLY_INT: if (type == ST_INT) break; goto loop; case PARSE_ONLY_UINT: if (type == ST_UINT) break; goto loop; case PARSE_ONLY_BIND: if (type == ST_BIND) break; goto loop; case PARSE_ONLY_BOOL: if (type == ST_BOOL) break; goto loop; case PARSE_ONLY_FLOAT: if (type == ST_FLOAT) break; goto loop; case PARSE_ONLY_HEX: if (type == ST_HEX) break; goto loop; case PARSE_ONLY_STRING: if (type == ST_STRING) break; goto loop; case PARSE_ONLY_PATH: if (type == ST_PATH) break; goto loop; case PARSE_ONLY_DIR: if (type == ST_DIR) break; goto loop; case PARSE_ONLY_STRING_OPTIONS: if (type == ST_STRING_OPTIONS) break; goto loop; } if (flags & SD_FLAG_ADVANCED && !settings->menu.show_advanced_settings) goto loop; menu_entries_append(info->list, short_description, name, menu_setting_set_flags(setting), 0, 0); count++; loop: switch (parse_type) { case PARSE_NONE: case PARSE_GROUP: case PARSE_ONLY_GROUP: case PARSE_SUB_GROUP: if (setting_get_type(setting) == precond) time_to_exit = true; break; case PARSE_ONLY_BIND: case PARSE_ONLY_FLOAT: case PARSE_ONLY_HEX: case PARSE_ONLY_BOOL: case PARSE_ONLY_INT: case PARSE_ONLY_UINT: case PARSE_ONLY_STRING: case PARSE_ONLY_PATH: case PARSE_ONLY_DIR: case PARSE_ONLY_STRING_OPTIONS: case PARSE_ACTION: time_to_exit = true; break; } if (time_to_exit) break; (*list = *list + 1); } if (count == 0 && add_empty_entry) menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_SETTINGS_FOUND), msg_hash_to_str(MENU_ENUM_LABEL_NO_SETTINGS_FOUND), MENU_ENUM_LABEL_NO_SETTINGS_FOUND, 0, 0, 0); return 0; } static int menu_displaylist_parse_settings_internal_enum(void *data, menu_displaylist_info_t *info, enum menu_displaylist_parse_type parse_type, bool add_empty_entry, rarch_setting_t *setting, enum msg_hash_enums enum_idx ) { enum setting_type precond; size_t count = 0; uint64_t flags = 0; settings_t *settings = config_get_ptr(); if (!setting) return -1; flags = setting->flags; switch (parse_type) { case PARSE_GROUP: case PARSE_SUB_GROUP: precond = ST_NONE; break; case PARSE_ACTION: precond = ST_ACTION; break; case PARSE_ONLY_INT: precond = ST_INT; break; case PARSE_ONLY_UINT: precond = ST_UINT; break; case PARSE_ONLY_BIND: precond = ST_BIND; break; case PARSE_ONLY_BOOL: precond = ST_BOOL; break; case PARSE_ONLY_FLOAT: precond = ST_FLOAT; break; case PARSE_ONLY_HEX: precond = ST_HEX; break; case PARSE_ONLY_STRING: precond = ST_STRING; break; case PARSE_ONLY_PATH: precond = ST_PATH; break; case PARSE_ONLY_DIR: precond = ST_DIR; break; case PARSE_ONLY_STRING_OPTIONS: precond = ST_STRING_OPTIONS; break; case PARSE_ONLY_GROUP: default: precond = ST_END_GROUP; break; } for (;;) { bool time_to_exit = false; const char *short_description = setting->short_description; const char *name = setting->name; enum setting_type type = setting_get_type(setting); rarch_setting_t **list = &setting; switch (parse_type) { case PARSE_NONE: switch (type) { case ST_GROUP: case ST_END_GROUP: case ST_SUB_GROUP: case ST_END_SUB_GROUP: goto loop; default: break; } break; case PARSE_GROUP: case PARSE_ONLY_GROUP: if (type == ST_GROUP) break; goto loop; case PARSE_SUB_GROUP: break; case PARSE_ACTION: if (type == ST_ACTION) break; goto loop; case PARSE_ONLY_INT: if (type == ST_INT) break; goto loop; case PARSE_ONLY_UINT: if (type == ST_UINT) break; goto loop; case PARSE_ONLY_BIND: if (type == ST_BIND) break; goto loop; case PARSE_ONLY_BOOL: if (type == ST_BOOL) break; goto loop; case PARSE_ONLY_FLOAT: if (type == ST_FLOAT) break; goto loop; case PARSE_ONLY_HEX: if (type == ST_HEX) break; goto loop; case PARSE_ONLY_STRING: if (type == ST_STRING) break; goto loop; case PARSE_ONLY_PATH: if (type == ST_PATH) break; goto loop; case PARSE_ONLY_DIR: if (type == ST_DIR) break; goto loop; case PARSE_ONLY_STRING_OPTIONS: if (type == ST_STRING_OPTIONS) break; goto loop; } if (flags & SD_FLAG_ADVANCED && !settings->menu.show_advanced_settings) goto loop; menu_entries_append_enum(info->list, short_description, name, enum_idx, menu_setting_set_flags(setting), 0, 0); count++; loop: switch (parse_type) { case PARSE_NONE: case PARSE_GROUP: case PARSE_ONLY_GROUP: case PARSE_SUB_GROUP: if (setting_get_type(setting) == precond) time_to_exit = true; break; case PARSE_ONLY_BIND: case PARSE_ONLY_FLOAT: case PARSE_ONLY_HEX: case PARSE_ONLY_BOOL: case PARSE_ONLY_INT: case PARSE_ONLY_UINT: case PARSE_ONLY_PATH: case PARSE_ONLY_DIR: case PARSE_ONLY_STRING: case PARSE_ONLY_STRING_OPTIONS: case PARSE_ACTION: time_to_exit = true; break; } if (time_to_exit) break; (*list = *list + 1); } if (count == 0) { if (add_empty_entry) menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_SETTINGS_FOUND), msg_hash_to_str(MENU_ENUM_LABEL_NO_SETTINGS_FOUND), MENU_ENUM_LABEL_NO_SETTINGS_FOUND, 0, 0, 0); return -1; } return 0; } static int menu_displaylist_parse_settings(void *data, menu_displaylist_info_t *info, const char *info_label, enum menu_displaylist_parse_type parse_type, bool add_empty_entry) { return menu_displaylist_parse_settings_internal(data, info, parse_type, add_empty_entry, menu_setting_find(info_label) ); } static int menu_displaylist_parse_settings_enum(void *data, menu_displaylist_info_t *info, enum msg_hash_enums label, enum menu_displaylist_parse_type parse_type, bool add_empty_entry) { return menu_displaylist_parse_settings_internal_enum(data, info, parse_type, add_empty_entry, menu_setting_find_enum(label), label ); } static int menu_displaylist_parse_horizontal_list( menu_displaylist_info_t *info) { menu_ctx_list_t list_info; menu_ctx_list_t list_horiz_info; char lpl_basename[PATH_MAX_LENGTH]; char path_playlist[PATH_MAX_LENGTH]; bool is_historylist = false; playlist_t *playlist = NULL; menu_handle_t *menu = NULL; struct item_file *item = NULL; settings_t *settings = config_get_ptr(); lpl_basename[0] = path_playlist[0] = '\0'; menu_driver_ctl(RARCH_MENU_CTL_LIST_GET_SELECTION, &list_info); list_info.type = MENU_LIST_TABS; menu_driver_ctl(RARCH_MENU_CTL_LIST_GET_SIZE, &list_info); list_horiz_info.type = MENU_LIST_HORIZONTAL; list_horiz_info.idx = list_info.selection - (list_info.size +1); menu_driver_ctl(RARCH_MENU_CTL_LIST_GET_ENTRY, &list_horiz_info); item = (struct item_file*)list_horiz_info.entry; if (!menu_driver_ctl(RARCH_MENU_CTL_DRIVER_DATA_GET, &menu)) return -1; if (!item) return -1; fill_pathname_base_noext(lpl_basename, item->path, sizeof(lpl_basename)); menu_driver_ctl(RARCH_MENU_CTL_PLAYLIST_FREE, NULL); fill_pathname_join( path_playlist, settings->directory.playlist, item->path, sizeof(path_playlist)); menu_driver_ctl(RARCH_MENU_CTL_PLAYLIST_INIT, (void*)path_playlist); strlcpy(menu->db_playlist_file, path_playlist, sizeof(menu->db_playlist_file)); strlcpy(path_playlist, msg_hash_to_str(MENU_ENUM_LABEL_COLLECTION), sizeof(path_playlist)); menu_driver_ctl(RARCH_MENU_CTL_PLAYLIST_GET, &playlist); playlist_qsort(playlist); if (string_is_equal(lpl_basename, "content_history")) is_historylist = true; menu_displaylist_parse_playlist(info, playlist, path_playlist, is_historylist); return 0; } static int menu_displaylist_parse_load_content_settings( menu_displaylist_info_t *info) { menu_handle_t *menu = NULL; settings_t *settings = config_get_ptr(); if (!menu_driver_ctl(RARCH_MENU_CTL_DRIVER_DATA_GET, &menu)) return -1; if (!rarch_ctl(RARCH_CTL_IS_DUMMY_CORE, NULL)) { bool show_advanced_settings = settings->menu.show_advanced_settings; rarch_system_info_t *system = NULL; runloop_ctl(RUNLOOP_CTL_SYSTEM_INFO_GET, &system); menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_RESUME_CONTENT), msg_hash_to_str(MENU_ENUM_LABEL_RESUME_CONTENT), MENU_ENUM_LABEL_RESUME_CONTENT, MENU_SETTING_ACTION_RUN, 0, 0); menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_RESTART_CONTENT), msg_hash_to_str(MENU_ENUM_LABEL_RESTART_CONTENT), MENU_ENUM_LABEL_RESTART_CONTENT, MENU_SETTING_ACTION_RUN, 0, 0); menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CLOSE_CONTENT), msg_hash_to_str(MENU_ENUM_LABEL_CLOSE_CONTENT), MENU_ENUM_LABEL_CLOSE_CONTENT, MENU_SETTING_ACTION_CLOSE, 0, 0); menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_TAKE_SCREENSHOT), msg_hash_to_str(MENU_ENUM_LABEL_TAKE_SCREENSHOT), MENU_ENUM_LABEL_TAKE_SCREENSHOT, MENU_SETTING_ACTION_SCREENSHOT, 0, 0); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_STATE_SLOT, PARSE_ONLY_INT, true); menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SAVE_STATE), msg_hash_to_str(MENU_ENUM_LABEL_SAVE_STATE), MENU_ENUM_LABEL_SAVE_STATE, MENU_SETTING_ACTION_SAVESTATE, 0, 0); menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LOAD_STATE), msg_hash_to_str(MENU_ENUM_LABEL_LOAD_STATE), MENU_ENUM_LABEL_LOAD_STATE, MENU_SETTING_ACTION_LOADSTATE, 0, 0); if (show_advanced_settings) { menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_UNDO_LOAD_STATE), msg_hash_to_str(MENU_ENUM_LABEL_UNDO_LOAD_STATE), MENU_ENUM_LABEL_UNDO_LOAD_STATE, MENU_SETTING_ACTION_LOADSTATE, 0, 0); menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_UNDO_SAVE_STATE), msg_hash_to_str(MENU_ENUM_LABEL_UNDO_SAVE_STATE), MENU_ENUM_LABEL_UNDO_SAVE_STATE, MENU_SETTING_ACTION_LOADSTATE, 0, 0); } menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CORE_OPTIONS), msg_hash_to_str(MENU_ENUM_LABEL_CORE_OPTIONS), MENU_ENUM_LABEL_CORE_OPTIONS, MENU_SETTING_ACTION, 0, 0); if (core_has_set_input_descriptor()) menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CORE_INPUT_REMAPPING_OPTIONS), msg_hash_to_str(MENU_ENUM_LABEL_CORE_INPUT_REMAPPING_OPTIONS), MENU_ENUM_LABEL_CORE_INPUT_REMAPPING_OPTIONS, MENU_SETTING_ACTION, 0, 0); #ifdef HAVE_NETWORKING menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_NETPLAY, PARSE_ACTION, false); #endif menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CORE_CHEAT_OPTIONS), msg_hash_to_str(MENU_ENUM_LABEL_CORE_CHEAT_OPTIONS), MENU_ENUM_LABEL_CORE_CHEAT_OPTIONS, MENU_SETTING_ACTION, 0, 0); if ( (!rarch_ctl(RARCH_CTL_IS_DUMMY_CORE, NULL)) && system && system->disk_control_cb.get_num_images) menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_DISK_OPTIONS), msg_hash_to_str(MENU_ENUM_LABEL_DISK_OPTIONS), MENU_ENUM_LABEL_DISK_OPTIONS, MENU_SETTING_ACTION_CORE_DISK_OPTIONS, 0, 0); #ifdef HAVE_SHADER_MANAGER menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SHADER_OPTIONS), msg_hash_to_str(MENU_ENUM_LABEL_SHADER_OPTIONS), MENU_ENUM_LABEL_SHADER_OPTIONS, MENU_SETTING_ACTION, 0, 0); #endif menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SAVE_CURRENT_CONFIG_OVERRIDE_CORE), msg_hash_to_str(MENU_ENUM_LABEL_SAVE_CURRENT_CONFIG_OVERRIDE_CORE), MENU_ENUM_LABEL_SAVE_CURRENT_CONFIG_OVERRIDE_CORE, MENU_SETTING_ACTION, 0, 0); menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SAVE_CURRENT_CONFIG_OVERRIDE_GAME), msg_hash_to_str(MENU_ENUM_LABEL_SAVE_CURRENT_CONFIG_OVERRIDE_GAME), MENU_ENUM_LABEL_SAVE_CURRENT_CONFIG_OVERRIDE_GAME, MENU_SETTING_ACTION, 0, 0); #ifdef HAVE_CHEEVOS if(settings->cheevos.enable) { menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_ACHIEVEMENT_LIST), msg_hash_to_str(MENU_ENUM_LABEL_ACHIEVEMENT_LIST), MENU_ENUM_LABEL_ACHIEVEMENT_LIST, MENU_SETTING_ACTION, 0, 0); menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_ACHIEVEMENT_LIST_HARDCORE), msg_hash_to_str(MENU_ENUM_LABEL_ACHIEVEMENT_LIST_HARDCORE), MENU_ENUM_LABEL_ACHIEVEMENT_LIST_HARDCORE, MENU_SETTING_ACTION, 0, 0); } #endif } else menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_ITEMS), msg_hash_to_str(MENU_ENUM_LABEL_NO_ITEMS), MENU_ENUM_LABEL_NO_ITEMS, MENU_SETTING_NO_ITEM, 0, 0); return 0; } static int menu_displaylist_parse_horizontal_content_actions( menu_displaylist_info_t *info) { unsigned idx = rpl_entry_selection_ptr; menu_handle_t *menu = NULL; const char *label = NULL; const char *core_path = NULL; const char *core_name = NULL; const char *db_name = NULL; playlist_t *playlist = NULL; settings_t *settings = config_get_ptr(); const char *fullpath = path_get(RARCH_PATH_CONTENT); if (!menu_driver_ctl(RARCH_MENU_CTL_DRIVER_DATA_GET, &menu)) return -1; if (!rarch_ctl(RARCH_CTL_IS_DUMMY_CORE, NULL) && string_is_equal(menu->deferred_path, fullpath)) menu_displaylist_parse_load_content_settings(info); else { menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_RUN), msg_hash_to_str(MENU_ENUM_LABEL_RUN), MENU_ENUM_LABEL_RUN, FILE_TYPE_PLAYLIST_ENTRY, 0, idx); if (settings->playlist_entry_remove) menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_DELETE_ENTRY), msg_hash_to_str(MENU_ENUM_LABEL_DELETE_ENTRY), MENU_ENUM_LABEL_DELETE_ENTRY, MENU_SETTING_ACTION_DELETE_ENTRY, 0, 0); } menu_driver_ctl(RARCH_MENU_CTL_PLAYLIST_GET, &playlist); playlist_get_index(playlist, idx, NULL, &label, &core_path, &core_name, NULL, &db_name); if (!string_is_empty(db_name)) { char db_path[PATH_MAX_LENGTH]; db_path[0] = '\0'; fill_pathname_join_noext(db_path, settings->path.content_database, db_name, sizeof(db_path)); strlcat(db_path, file_path_str(FILE_PATH_RDB_EXTENSION), sizeof(db_path)); if (path_file_exists(db_path)) menu_entries_append_enum(info->list, label, db_path, MENU_ENUM_LABEL_INFORMATION, FILE_TYPE_RDB_ENTRY, 0, idx); } return 0; } static int menu_displaylist_parse_information_list( menu_displaylist_info_t *info) { core_info_t *core_info = NULL; core_info_get_current_core(&core_info); if (core_info && core_info->config_data) menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CORE_INFORMATION), msg_hash_to_str(MENU_ENUM_LABEL_CORE_INFORMATION), MENU_ENUM_LABEL_CORE_INFORMATION, MENU_SETTING_ACTION, 0, 0); #ifdef HAVE_NETWORKING #ifndef HAVE_SOCKET_LEGACY menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NETWORK_INFORMATION), msg_hash_to_str(MENU_ENUM_LABEL_NETWORK_INFORMATION), MENU_ENUM_LABEL_NETWORK_INFORMATION, MENU_SETTING_ACTION, 0, 0); #endif #endif menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SYSTEM_INFORMATION), msg_hash_to_str(MENU_ENUM_LABEL_SYSTEM_INFORMATION), MENU_ENUM_LABEL_SYSTEM_INFORMATION, MENU_SETTING_ACTION, 0, 0); #ifdef HAVE_LIBRETRODB menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_DATABASE_MANAGER), msg_hash_to_str(MENU_ENUM_LABEL_DATABASE_MANAGER_LIST), MENU_ENUM_LABEL_DATABASE_MANAGER_LIST, MENU_SETTING_ACTION, 0, 0); menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CURSOR_MANAGER), msg_hash_to_str(MENU_ENUM_LABEL_CURSOR_MANAGER_LIST), MENU_ENUM_LABEL_CURSOR_MANAGER_LIST, MENU_SETTING_ACTION, 0, 0); #endif if (runloop_ctl(RUNLOOP_CTL_IS_PERFCNT_ENABLE, NULL)) { menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_FRONTEND_COUNTERS), msg_hash_to_str(MENU_ENUM_LABEL_FRONTEND_COUNTERS), MENU_ENUM_LABEL_FRONTEND_COUNTERS, MENU_SETTING_ACTION, 0, 0); menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CORE_COUNTERS), msg_hash_to_str(MENU_ENUM_LABEL_CORE_COUNTERS), MENU_ENUM_LABEL_CORE_COUNTERS, MENU_SETTING_ACTION, 0, 0); } return 0; } static int menu_displaylist_parse_configurations_list( menu_displaylist_info_t *info) { menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CONFIGURATIONS), msg_hash_to_str(MENU_ENUM_LABEL_CONFIGURATIONS), MENU_ENUM_LABEL_CONFIGURATIONS, MENU_SETTING_ACTION, 0, 0); menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SAVE_CURRENT_CONFIG), msg_hash_to_str(MENU_ENUM_LABEL_SAVE_CURRENT_CONFIG), MENU_ENUM_LABEL_SAVE_CURRENT_CONFIG, MENU_SETTING_ACTION, 0, 0); menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SAVE_NEW_CONFIG), msg_hash_to_str(MENU_ENUM_LABEL_SAVE_NEW_CONFIG), MENU_ENUM_LABEL_SAVE_NEW_CONFIG, MENU_SETTING_ACTION, 0, 0); return 0; } static int menu_displaylist_parse_add_content_list( menu_displaylist_info_t *info) { #ifdef HAVE_LIBRETRODB menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SCAN_DIRECTORY), msg_hash_to_str(MENU_ENUM_LABEL_SCAN_DIRECTORY), MENU_ENUM_LABEL_SCAN_DIRECTORY, MENU_SETTING_ACTION, 0, 0); menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SCAN_FILE), msg_hash_to_str(MENU_ENUM_LABEL_SCAN_FILE), MENU_ENUM_LABEL_SCAN_FILE, MENU_SETTING_ACTION, 0, 0); #endif #if !defined(HAVE_NETWORKING) && !defined(HAVE_LIBRETRODB) menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_ENTRIES_TO_DISPLAY), msg_hash_to_str(MENU_ENUM_LABEL_NO_ENTRIES_TO_DISPLAY), MENU_ENUM_LABEL_NO_ENTRIES_TO_DISPLAY, FILE_TYPE_NONE, 0, 0); #endif return 0; } static int menu_displaylist_parse_scan_directory_list( menu_displaylist_info_t *info) { #ifdef HAVE_LIBRETRODB menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SCAN_DIRECTORY), msg_hash_to_str(MENU_ENUM_LABEL_SCAN_DIRECTORY), MENU_ENUM_LABEL_SCAN_DIRECTORY, MENU_SETTING_ACTION, 0, 0); menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SCAN_FILE), msg_hash_to_str(MENU_ENUM_LABEL_SCAN_FILE), MENU_ENUM_LABEL_SCAN_FILE, MENU_SETTING_ACTION, 0, 0); #endif return 0; } static int menu_displaylist_parse_netplay_room_list( menu_displaylist_info_t *info) { #ifdef HAVE_NETWORKING menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NETPLAY_ENABLE_HOST), msg_hash_to_str(MENU_ENUM_LABEL_NETPLAY_ENABLE_HOST), MENU_ENUM_LABEL_NETPLAY_ENABLE_HOST, MENU_SETTING_ACTION, 0, 0); menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NETPLAY_REFRESH_ROOMS), msg_hash_to_str(MENU_ENUM_LABEL_NETPLAY_REFRESH_ROOMS), MENU_ENUM_LABEL_NETPLAY_REFRESH_ROOMS, MENU_SETTING_ACTION, 0, 0); if (netplay_room_count > 0) { unsigned i; for (i = 0; i < netplay_room_count; i++) { char s[PATH_MAX_LENGTH]; s[0] = '\0'; snprintf(s, sizeof(s), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NETPLAY_ROOM_NICKNAME), netplay_room_list[i].nickname); menu_entries_append_enum(info->list, s, msg_hash_to_str(MENU_ENUM_LABEL_CONNECT_NETPLAY_ROOM), MENU_ENUM_LABEL_CONNECT_NETPLAY_ROOM, MENU_WIFI, 0, 0); } } #endif return 0; } static int menu_displaylist_parse_options( menu_displaylist_info_t *info) { #ifdef HAVE_NETWORKING #ifdef HAVE_LAKKA menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_UPDATE_LAKKA), msg_hash_to_str(MENU_ENUM_LABEL_UPDATE_LAKKA), MENU_ENUM_LABEL_UPDATE_LAKKA, MENU_SETTING_ACTION, 0, 0); menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_THUMBNAILS_UPDATER_LIST), msg_hash_to_str(MENU_ENUM_LABEL_THUMBNAILS_UPDATER_LIST), MENU_ENUM_LABEL_THUMBNAILS_UPDATER_LIST, MENU_SETTING_ACTION, 0, 0); #else #if !defined(VITA) menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CORE_UPDATER_LIST), msg_hash_to_str(MENU_ENUM_LABEL_CORE_UPDATER_LIST), MENU_ENUM_LABEL_CORE_UPDATER_LIST, MENU_SETTING_ACTION, 0, 0); #endif menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_THUMBNAILS_UPDATER_LIST), msg_hash_to_str(MENU_ENUM_LABEL_THUMBNAILS_UPDATER_LIST), MENU_ENUM_LABEL_THUMBNAILS_UPDATER_LIST, MENU_SETTING_ACTION, 0, 0); #ifdef HAVE_NETWORKING menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_DOWNLOAD_CORE_CONTENT), msg_hash_to_str(MENU_ENUM_LABEL_DOWNLOAD_CORE_CONTENT_DIRS), MENU_ENUM_LABEL_DOWNLOAD_CORE_CONTENT_DIRS, MENU_SETTING_ACTION, 0, 0); #endif #if !defined(VITA) menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_UPDATE_CORE_INFO_FILES), msg_hash_to_str(MENU_ENUM_LABEL_UPDATE_CORE_INFO_FILES), MENU_ENUM_LABEL_UPDATE_CORE_INFO_FILES, MENU_SETTING_ACTION, 0, 0); #endif #ifdef HAVE_UPDATE_ASSETS menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_UPDATE_ASSETS), msg_hash_to_str(MENU_ENUM_LABEL_UPDATE_ASSETS), MENU_ENUM_LABEL_UPDATE_ASSETS, MENU_SETTING_ACTION, 0, 0); #endif menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_UPDATE_AUTOCONFIG_PROFILES), msg_hash_to_str(MENU_ENUM_LABEL_UPDATE_AUTOCONFIG_PROFILES), MENU_ENUM_LABEL_UPDATE_AUTOCONFIG_PROFILES, MENU_SETTING_ACTION, 0, 0); menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_UPDATE_CHEATS), msg_hash_to_str(MENU_ENUM_LABEL_UPDATE_CHEATS), MENU_ENUM_LABEL_UPDATE_CHEATS, MENU_SETTING_ACTION, 0, 0); #ifdef HAVE_LIBRETRODB #if !defined(VITA) menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_UPDATE_DATABASES), msg_hash_to_str(MENU_ENUM_LABEL_UPDATE_DATABASES), MENU_ENUM_LABEL_UPDATE_DATABASES, MENU_SETTING_ACTION, 0, 0); #endif #endif menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_UPDATE_OVERLAYS), msg_hash_to_str(MENU_ENUM_LABEL_UPDATE_OVERLAYS), MENU_ENUM_LABEL_UPDATE_OVERLAYS, MENU_SETTING_ACTION, 0, 0); #ifdef HAVE_CG menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_UPDATE_CG_SHADERS), msg_hash_to_str(MENU_ENUM_LABEL_UPDATE_CG_SHADERS), MENU_ENUM_LABEL_UPDATE_CG_SHADERS, MENU_SETTING_ACTION, 0, 0); #endif #ifdef HAVE_GLSL menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_UPDATE_GLSL_SHADERS), msg_hash_to_str(MENU_ENUM_LABEL_UPDATE_GLSL_SHADERS), MENU_ENUM_LABEL_UPDATE_GLSL_SHADERS, MENU_SETTING_ACTION, 0, 0); #endif #ifdef HAVE_VULKAN menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_UPDATE_SLANG_SHADERS), msg_hash_to_str(MENU_ENUM_LABEL_UPDATE_SLANG_SHADERS), MENU_ENUM_LABEL_UPDATE_SLANG_SHADERS, MENU_SETTING_ACTION, 0, 0); #endif #endif #else menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_ITEMS), msg_hash_to_str(MENU_ENUM_LABEL_NO_ITEMS), MENU_ENUM_LABEL_NO_ITEMS, MENU_SETTING_NO_ITEM, 0, 0); #endif return 0; } static int menu_displaylist_parse_options_cheats( menu_displaylist_info_t *info) { unsigned i; if (!cheat_manager_alloc_if_empty()) return -1; menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CHEAT_APPLY_CHANGES), msg_hash_to_str(MENU_ENUM_LABEL_CHEAT_APPLY_CHANGES), MENU_ENUM_LABEL_CHEAT_APPLY_CHANGES, MENU_SETTING_ACTION, 0, 0); menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CHEAT_FILE_LOAD), msg_hash_to_str(MENU_ENUM_LABEL_CHEAT_FILE_LOAD), MENU_ENUM_LABEL_CHEAT_FILE_LOAD, MENU_SETTING_ACTION, 0, 0); menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CHEAT_FILE_SAVE_AS), msg_hash_to_str(MENU_ENUM_LABEL_CHEAT_FILE_SAVE_AS), MENU_ENUM_LABEL_CHEAT_FILE_SAVE_AS, MENU_SETTING_ACTION, 0, 0); menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CHEAT_NUM_PASSES), msg_hash_to_str(MENU_ENUM_LABEL_CHEAT_NUM_PASSES), MENU_ENUM_LABEL_CHEAT_NUM_PASSES, 0, 0, 0); for (i = 0; i < cheat_manager_get_size(); i++) { char cheat_label[64]; cheat_label[0] = '\0'; snprintf(cheat_label, sizeof(cheat_label), "%s #%u: ", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CHEAT), i); if (cheat_manager_get_desc(i)) strlcat(cheat_label, cheat_manager_get_desc(i), sizeof(cheat_label)); menu_entries_append_enum(info->list, cheat_label, "", MSG_UNKNOWN, MENU_SETTINGS_CHEAT_BEGIN + i, 0, 0); } return 0; } static int menu_displaylist_parse_options_remappings( menu_displaylist_info_t *info) { unsigned p, retro_id; rarch_system_info_t *system = NULL; menu_handle_t *menu = NULL; settings_t *settings = config_get_ptr(); if (!menu_driver_ctl(RARCH_MENU_CTL_DRIVER_DATA_GET, &menu)) return -1; for (p = 0; p < settings->input.max_users; p++) { char key_type[PATH_MAX_LENGTH]; char key_analog[PATH_MAX_LENGTH]; unsigned val = p + 1; key_type[0] = key_analog[0] = '\0'; snprintf(key_type, sizeof(key_type), msg_hash_to_str(MENU_ENUM_LABEL_INPUT_LIBRETRO_DEVICE), val); snprintf(key_analog, sizeof(key_analog), msg_hash_to_str(MENU_ENUM_LABEL_INPUT_PLAYER_ANALOG_DPAD_MODE), val); menu_displaylist_parse_settings(menu, info, key_type, PARSE_ONLY_UINT, true); menu_displaylist_parse_settings(menu, info, key_analog, PARSE_ONLY_UINT, true); } menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_REMAP_FILE_LOAD), msg_hash_to_str(MENU_ENUM_LABEL_REMAP_FILE_LOAD), MENU_ENUM_LABEL_REMAP_FILE_LOAD, MENU_SETTING_ACTION, 0, 0); menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_REMAP_FILE_SAVE_CORE), msg_hash_to_str(MENU_ENUM_LABEL_REMAP_FILE_SAVE_CORE), MENU_ENUM_LABEL_REMAP_FILE_SAVE_CORE, MENU_SETTING_ACTION, 0, 0); menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_REMAP_FILE_SAVE_GAME), msg_hash_to_str(MENU_ENUM_LABEL_REMAP_FILE_SAVE_GAME), MENU_ENUM_LABEL_REMAP_FILE_SAVE_GAME, MENU_SETTING_ACTION, 0, 0); runloop_ctl(RUNLOOP_CTL_SYSTEM_INFO_GET, &system); if (system) { for (p = 0; p < settings->input.max_users; p++) { for (retro_id = 0; retro_id < RARCH_FIRST_CUSTOM_BIND + 4; retro_id++) { char desc_label[64]; unsigned user = p + 1; unsigned desc_offset = retro_id; const char *description = NULL; desc_label[0] = '\0'; if (desc_offset >= RARCH_FIRST_CUSTOM_BIND) desc_offset = RARCH_FIRST_CUSTOM_BIND + (desc_offset - RARCH_FIRST_CUSTOM_BIND) * 2; description = system->input_desc_btn[p][desc_offset]; if (!description) continue; snprintf(desc_label, sizeof(desc_label), "%s %u %s : ", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_USER), user, description); menu_entries_append_enum(info->list, desc_label, "", MSG_UNKNOWN, MENU_SETTINGS_INPUT_DESC_BEGIN + (p * (RARCH_FIRST_CUSTOM_BIND + 4)) + retro_id, 0, 0); } } } return 0; } static int menu_displaylist_parse_playlists( menu_displaylist_info_t *info, bool horizontal) { size_t i, list_size; struct string_list *str_list = NULL; unsigned items_found = 0; settings_t *settings = config_get_ptr(); if (string_is_empty(info->path)) { if (frontend_driver_parse_drive_list(info->list) != 0) menu_entries_append_enum(info->list, "/", "", MSG_UNKNOWN, FILE_TYPE_DIRECTORY, 0, 0); return 0; } str_list = dir_list_new(info->path, NULL, true, settings->show_hidden_files, true, false); if (!str_list) { const char *str = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_DIRECTORY_NOT_FOUND); (void)str; return 0; } dir_list_sort(str_list, true); list_size = str_list->size; #ifdef HAVE_LIBRETRODB if (!horizontal) { menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SCAN_DIRECTORY), msg_hash_to_str(MENU_ENUM_LABEL_SCAN_DIRECTORY), MENU_ENUM_LABEL_SCAN_DIRECTORY, MENU_SETTING_ACTION, 0, 0); menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SCAN_FILE), msg_hash_to_str(MENU_ENUM_LABEL_SCAN_FILE), MENU_ENUM_LABEL_SCAN_FILE, MENU_SETTING_ACTION, 0, 0); } #endif if (list_size == 0) { string_list_free(str_list); if (!horizontal) goto no_playlists; return 0; } for (i = 0; i < list_size; i++) { char label[PATH_MAX_LENGTH]; const char *path = NULL; enum msg_file_type file_type = FILE_TYPE_NONE; label[0] = '\0'; switch (str_list->elems[i].attr.i) { case RARCH_DIRECTORY: file_type = FILE_TYPE_DIRECTORY; break; case RARCH_PLAIN_FILE: default: file_type = (enum msg_file_type)info->type_default; break; } if (file_type == FILE_TYPE_DIRECTORY) continue; /* Need to preserve slash first time. */ path = str_list->elems[i].data; if (!strstr(path, file_path_str(FILE_PATH_LPL_EXTENSION)) || ((strcasestr(path, "content") && strcasestr(path, "history")))) continue; file_type = FILE_TYPE_PLAYLIST_COLLECTION; if (!string_is_empty(info->path)) path = path_basename(path); items_found++; menu_entries_append_enum(info->list, path, label, MENU_ENUM_LABEL_PLAYLIST_COLLECTION_ENTRY, file_type, 0, 0); } string_list_free(str_list); if (items_found == 0 && !horizontal) goto no_playlists; return 0; no_playlists: menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_PLAYLISTS), msg_hash_to_str(MENU_ENUM_LABEL_NO_PLAYLISTS), MENU_ENUM_LABEL_NO_PLAYLISTS, MENU_SETTING_NO_ITEM, 0, 0); return 0; } static int menu_displaylist_parse_cores( menu_handle_t *menu, menu_displaylist_info_t *info, enum menu_displaylist_ctl_state type) { size_t i, list_size; struct string_list *str_list = NULL; unsigned items_found = 0; settings_t *settings = config_get_ptr(); if (string_is_empty(info->path)) { if (frontend_driver_parse_drive_list(info->list) != 0) menu_entries_append_enum(info->list, "/", "", MSG_UNKNOWN, FILE_TYPE_DIRECTORY, 0, 0); return 0; } str_list = dir_list_new(info->path, info->exts, true, settings->show_hidden_files, true, false); { char out_dir[PATH_MAX_LENGTH]; out_dir[0] = '\0'; fill_pathname_parent_dir(out_dir, info->path, sizeof(out_dir)); if (string_is_empty(out_dir)) { menu_entries_prepend(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_PARENT_DIRECTORY), info->path, MENU_ENUM_LABEL_PARENT_DIRECTORY, FILE_TYPE_PARENT_DIRECTORY, 0, 0); } } if (!str_list) { const char *str = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_DIRECTORY_NOT_FOUND); menu_entries_append_enum(info->list, str, "", MENU_ENUM_LABEL_VALUE_DIRECTORY_NOT_FOUND, 0, 0, 0); return 0; } info->download_core = true; dir_list_sort(str_list, true); list_size = str_list->size; if (list_size == 0) { menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_ITEMS), msg_hash_to_str(MENU_ENUM_LABEL_NO_ITEMS), MENU_ENUM_LABEL_NO_ITEMS, MENU_SETTING_NO_ITEM, 0, 0); string_list_free(str_list); return 0; } for (i = 0; i < list_size; i++) { bool is_dir; char label[PATH_MAX_LENGTH]; const char *path = NULL; enum msg_hash_enums enum_idx = MSG_UNKNOWN; enum msg_file_type file_type = FILE_TYPE_NONE; label[0] = '\0'; switch (str_list->elems[i].attr.i) { case RARCH_DIRECTORY: file_type = FILE_TYPE_DIRECTORY; break; case RARCH_COMPRESSED_ARCHIVE: file_type = FILE_TYPE_CARCHIVE; break; case RARCH_COMPRESSED_FILE_IN_ARCHIVE: file_type = FILE_TYPE_IN_CARCHIVE; break; case RARCH_PLAIN_FILE: default: file_type = (enum msg_file_type)info->type_default; break; } is_dir = (file_type == FILE_TYPE_DIRECTORY); /* Need to preserve slash first time. */ path = str_list->elems[i].data; if (!string_is_empty(info->path)) path = path_basename(path); #ifndef HAVE_DYNAMIC if (frontend_driver_has_fork()) { char salamander_name[PATH_MAX_LENGTH]; salamander_name[0] = '\0'; if (frontend_driver_get_salamander_basename( salamander_name, sizeof(salamander_name))) { if (string_is_equal_noncase(path, salamander_name)) continue; } if (is_dir) continue; } #endif /* Compressed cores are unsupported */ if (file_type == FILE_TYPE_CARCHIVE) continue; if (is_dir) { file_type = FILE_TYPE_DIRECTORY; enum_idx = MENU_ENUM_LABEL_FILE_BROWSER_DIRECTORY; } else { file_type = FILE_TYPE_CORE; enum_idx = MENU_ENUM_LABEL_FILE_BROWSER_CORE; } items_found++; menu_entries_append_enum(info->list, path, label, enum_idx, file_type, 0, 0); } string_list_free(str_list); if (items_found == 0) { menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_ITEMS), msg_hash_to_str(MENU_ENUM_LABEL_NO_ITEMS), MENU_ENUM_LABEL_NO_ITEMS, MENU_SETTING_NO_ITEM, 0, 0); return 0; } { enum msg_hash_enums enum_idx = MSG_UNKNOWN; core_info_list_t *list = NULL; const char *dir = NULL; core_info_get_list(&list); menu_entries_get_last_stack(&dir, NULL, NULL, &enum_idx, NULL); list_size = file_list_get_size(info->list); for (i = 0; i < list_size; i++) { char core_path[PATH_MAX_LENGTH]; char display_name[PATH_MAX_LENGTH]; unsigned type = 0; const char *path = NULL; core_path[0] = display_name[0] = '\0'; menu_entries_get_at_offset(info->list, i, &path, NULL, &type, NULL, NULL); if (type != FILE_TYPE_CORE) continue; fill_pathname_join(core_path, dir, path, sizeof(core_path)); if (core_info_list_get_display_name(list, core_path, display_name, sizeof(display_name))) menu_entries_set_alt_at_offset(info->list, i, display_name); } info->need_sort = true; } return 0; } static void menu_displaylist_parse_playlist_associations( menu_displaylist_info_t *info) { settings_t *settings = config_get_ptr(); struct string_list *str_list = dir_list_new_special(settings->directory.playlist, DIR_LIST_COLLECTIONS, NULL); if (str_list && str_list->size) { unsigned i; char new_playlist_names[PATH_MAX_LENGTH]; char new_playlist_cores[PATH_MAX_LENGTH]; struct string_list *stnames = string_split(settings->playlist_names, ";"); struct string_list *stcores = string_split(settings->playlist_cores, ";"); new_playlist_names[0] = new_playlist_cores[0] = '\0'; for (i = 0; i < str_list->size; i++) { char path_base[PATH_MAX_LENGTH]; char core_path[PATH_MAX_LENGTH]; union string_list_elem_attr attr; unsigned found = 0; const char *path = path_basename(str_list->elems[i].data); attr.i = 0; path_base[0] = core_path[0] = '\0'; if (!menu_content_playlist_find_associated_core( path, core_path, sizeof(core_path))) strlcpy(core_path, file_path_str(FILE_PATH_DETECT), sizeof(core_path)); strlcpy(path_base, path, sizeof(path_base)); found = string_list_find_elem(stnames, path_base); if (found) string_list_set(stcores, found-1, core_path); else { string_list_append(stnames, path_base, attr); string_list_append(stcores, core_path, attr); } path_remove_extension(path_base); menu_entries_append_enum(info->list, path_base, path, MENU_ENUM_LABEL_PLAYLIST_ENTRY, MENU_SETTINGS_PLAYLIST_ASSOCIATION_START + i, 0, 0); } string_list_join_concat(new_playlist_names, sizeof(new_playlist_names), stnames, ";"); string_list_join_concat(new_playlist_cores, sizeof(new_playlist_cores), stcores, ";"); strlcpy(settings->playlist_names, new_playlist_names, sizeof(settings->playlist_names)); strlcpy(settings->playlist_cores, new_playlist_cores, sizeof(settings->playlist_cores)); string_list_free(stnames); string_list_free(stcores); } string_list_free(str_list); } static bool menu_displaylist_push_list_process(menu_displaylist_info_t *info) { size_t idx = 0; if (!info) return false; if (info->need_navigation_clear) { bool pending_push = true; menu_navigation_ctl(MENU_NAVIGATION_CTL_CLEAR, &pending_push); } if (info->need_entries_refresh) { bool refresh = false; menu_entries_ctl(MENU_ENTRIES_CTL_SET_REFRESH, &refresh); } if (info->need_sort) file_list_sort_on_alt(info->list); #ifdef HAVE_NETWORKING if (info->download_core) { menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_DOWNLOAD_CORE), msg_hash_to_str(MENU_ENUM_LABEL_CORE_UPDATER_LIST), MENU_ENUM_LABEL_CORE_UPDATER_LIST, MENU_SETTING_ACTION, 0, 0); } #endif if (info->push_builtin_cores) { #if defined(HAVE_VIDEO_PROCESSOR) menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_START_VIDEO_PROCESSOR), msg_hash_to_str(MENU_ENUM_LABEL_START_VIDEO_PROCESSOR), MENU_ENUM_LABEL_START_VIDEO_PROCESSOR, MENU_SETTING_ACTION, 0, 0); #endif #if defined(HAVE_NETWORKING) && defined(HAVE_NETWORKGAMEPAD) && defined(HAVE_NETWORKGAMEPAD_CORE) menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_START_NET_RETROPAD), msg_hash_to_str(MENU_ENUM_LABEL_START_NET_RETROPAD), MENU_ENUM_LABEL_START_NET_RETROPAD, MENU_SETTING_ACTION, 0, 0); #endif } if (!string_is_empty(new_entry)) { menu_entries_prepend(info->list, new_path_entry, new_lbl_entry, new_type, FILE_TYPE_CORE, 0, 0); menu_entries_set_alt_at_offset(info->list, 0, new_entry); new_type = MSG_UNKNOWN; new_lbl_entry[0] = '\0'; new_path_entry[0] = '\0'; new_entry[0] = '\0'; } if (info->need_refresh) menu_entries_ctl(MENU_ENTRIES_CTL_REFRESH, info->list); if (info->need_clear) menu_navigation_ctl(MENU_NAVIGATION_CTL_SET_SELECTION, &idx); if (info->need_push) { info->label_hash = msg_hash_calculate(info->label); menu_driver_ctl(RARCH_MENU_CTL_POPULATE_ENTRIES, info); ui_companion_driver_notify_list_loaded(info->list, info->menu_list); } return true; } static bool menu_displaylist_push_internal( const char *label, menu_displaylist_ctx_entry_t *entry, menu_displaylist_info_t *info) { if (string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_HISTORY_TAB))) { if (!menu_displaylist_ctl(DISPLAYLIST_HISTORY, info)) return false; return true; } else if (string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_SETTINGS_TAB))) { if (!menu_displaylist_ctl(DISPLAYLIST_SETTINGS_ALL, info)) return false; return true; } else if (string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_MUSIC_TAB))) { filebrowser_clear_type(); info->type = 42; strlcpy(info->exts, file_path_str(FILE_PATH_LPL_EXTENSION_NO_DOT), sizeof(info->exts)); strlcpy(info->label, msg_hash_to_str(MENU_ENUM_LABEL_CONTENT_COLLECTION_LIST), sizeof(info->label)); menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); menu_displaylist_ctl(DISPLAYLIST_MUSIC_HISTORY, info); return true; } else if (string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_VIDEO_TAB))) { filebrowser_clear_type(); info->type = 42; strlcpy(info->exts, file_path_str(FILE_PATH_LPL_EXTENSION_NO_DOT), sizeof(info->exts)); strlcpy(info->label, msg_hash_to_str(MENU_ENUM_LABEL_CONTENT_COLLECTION_LIST), sizeof(info->label)); menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); menu_displaylist_ctl(DISPLAYLIST_VIDEO_HISTORY, info); return true; } else if (string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_IMAGES_TAB))) { filebrowser_clear_type(); info->type = 42; strlcpy(info->exts, file_path_str(FILE_PATH_LPL_EXTENSION_NO_DOT), sizeof(info->exts)); strlcpy(info->label, msg_hash_to_str(MENU_ENUM_LABEL_CONTENT_COLLECTION_LIST), sizeof(info->label)); menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); #if 0 if (!rarch_ctl(RARCH_CTL_IS_DUMMY_CORE, NULL)) menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_TAKE_SCREENSHOT), msg_hash_to_str(MENU_ENUM_LABEL_TAKE_SCREENSHOT), MENU_ENUM_LABEL_TAKE_SCREENSHOT, MENU_SETTING_ACTION_SCREENSHOT, 0, 0); else menu_entries_append_enum(info->list, msg_hash_to_str( MENU_ENUM_LABEL_VALUE_NO_PLAYLIST_ENTRIES_AVAILABLE), msg_hash_to_str( MENU_ENUM_LABEL_NO_PLAYLIST_ENTRIES_AVAILABLE), MENU_ENUM_LABEL_NO_PLAYLIST_ENTRIES_AVAILABLE, MENU_INFO_MESSAGE, 0, 0); #endif menu_displaylist_ctl(DISPLAYLIST_IMAGES_HISTORY, info); return true; } else if (string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_PLAYLISTS_TAB))) { settings_t *settings = config_get_ptr(); filebrowser_clear_type(); info->type = 42; strlcpy(info->exts, file_path_str(FILE_PATH_LPL_EXTENSION_NO_DOT), sizeof(info->exts)); strlcpy(info->label, msg_hash_to_str(MENU_ENUM_LABEL_CONTENT_COLLECTION_LIST), sizeof(info->label)); if (string_is_empty(settings->directory.playlist)) { menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); menu_entries_append_enum(info->list, msg_hash_to_str( MENU_ENUM_LABEL_VALUE_NO_PLAYLIST_ENTRIES_AVAILABLE), msg_hash_to_str( MENU_ENUM_LABEL_NO_PLAYLIST_ENTRIES_AVAILABLE), MENU_ENUM_LABEL_NO_PLAYLIST_ENTRIES_AVAILABLE, MENU_INFO_MESSAGE, 0, 0); info->need_refresh = true; info->need_push = true; } else { strlcpy( info->path, settings->directory.playlist, sizeof(info->path)); if (!menu_displaylist_ctl( DISPLAYLIST_DATABASE_PLAYLISTS, info)) return false; } return true; } else if (string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_ADD_TAB))) { if (!menu_displaylist_ctl(DISPLAYLIST_SCAN_DIRECTORY_LIST, info)) return false; return true; } else if (string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_NETPLAY_TAB))) { if (!menu_displaylist_ctl(DISPLAYLIST_NETPLAY_ROOM_LIST, info)) return false; return true; } else if (string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_HORIZONTAL_MENU))) { if (!menu_displaylist_ctl(DISPLAYLIST_HORIZONTAL, info)) return false; return true; } return false; } static bool menu_displaylist_push(menu_displaylist_ctx_entry_t *entry) { menu_file_list_cbs_t *cbs = NULL; const char *path = NULL; const char *label = NULL; unsigned type = 0; enum msg_hash_enums enum_idx = MSG_UNKNOWN; menu_displaylist_info_t info = {0}; if (!entry) return false; menu_entries_get_last_stack(&path, &label, &type, &enum_idx, NULL); info.list = entry->list; info.menu_list = entry->stack; info.type = type; info.enum_idx = enum_idx; strlcpy(info.path, path, sizeof(info.path)); strlcpy(info.label, label, sizeof(info.label)); if (!info.list) return false; if (menu_displaylist_push_internal(label, entry, &info)) return menu_displaylist_push_list_process(&info); cbs = menu_entries_get_last_stack_actiondata(); if (cbs && cbs->action_deferred_push) { if (cbs->action_deferred_push(&info) != 0) return -1; } return true; } static void menu_displaylist_parse_playlist_history( menu_handle_t *menu, menu_displaylist_info_t *info, playlist_t *playlist, const char *playlist_name, const char *playlist_path, int *ret) { char path_playlist[PATH_MAX_LENGTH]; path_playlist[0] = '\0'; if (!playlist) command_event(CMD_EVENT_HISTORY_INIT, NULL); strlcpy(path_playlist, playlist_name, sizeof(path_playlist)); *ret = menu_displaylist_parse_playlist(info, playlist, path_playlist, true); strlcpy( menu->db_playlist_file, playlist_path, sizeof(menu->db_playlist_file)); menu_driver_ctl(RARCH_MENU_CTL_PLAYLIST_FREE, NULL); menu_driver_ctl(RARCH_MENU_CTL_PLAYLIST_INIT, (void*)menu->db_playlist_file); } bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, void *data) { size_t i; menu_ctx_displaylist_t disp_list; #ifdef HAVE_SHADER_MANAGER video_shader_ctx_t shader_info; #endif int ret = 0; core_info_list_t *list = NULL; menu_handle_t *menu = NULL; settings_t *settings = NULL; menu_displaylist_info_t *info = (menu_displaylist_info_t*)data; switch (type) { case DISPLAYLIST_PROCESS: return menu_displaylist_push_list_process(info); case DISPLAYLIST_PUSH_ONTO_STACK: return menu_displaylist_push((menu_displaylist_ctx_entry_t*)data); default: break; } if (!info) goto error; if (!menu_driver_ctl(RARCH_MENU_CTL_DRIVER_DATA_GET, &menu)) goto error; settings = config_get_ptr(); core_info_get_list(&list); disp_list.info = info; disp_list.type = type; if (menu_driver_ctl(RARCH_MENU_CTL_LIST_PUSH, &disp_list)) return true; switch (type) { case DISPLAYLIST_BROWSE_URL_LIST: case DISPLAYLIST_BROWSE_URL_START: case DISPLAYLIST_HELP_SCREEN_LIST: case DISPLAYLIST_MAIN_MENU: case DISPLAYLIST_SETTINGS_ALL: case DISPLAYLIST_HORIZONTAL: case DISPLAYLIST_HORIZONTAL_CONTENT_ACTIONS: case DISPLAYLIST_CONTENT_SETTINGS: case DISPLAYLIST_INFORMATION_LIST: case DISPLAYLIST_ADD_CONTENT_LIST: case DISPLAYLIST_CONFIGURATIONS_LIST: case DISPLAYLIST_SCAN_DIRECTORY_LIST: case DISPLAYLIST_NETPLAY_ROOM_LIST: case DISPLAYLIST_LOAD_CONTENT_LIST: case DISPLAYLIST_USER_BINDS_LIST: case DISPLAYLIST_ACCOUNTS_LIST: case DISPLAYLIST_ACCOUNTS_CHEEVOS_LIST: case DISPLAYLIST_OPTIONS: case DISPLAYLIST_OPTIONS_CHEATS: case DISPLAYLIST_OPTIONS_REMAPPINGS: case DISPLAYLIST_SHADER_PARAMETERS: case DISPLAYLIST_SHADER_PARAMETERS_PRESET: case DISPLAYLIST_PERFCOUNTERS_CORE: case DISPLAYLIST_PERFCOUNTERS_FRONTEND: case DISPLAYLIST_DATABASE_ENTRY: case DISPLAYLIST_DATABASE_QUERY: case DISPLAYLIST_OPTIONS_SHADERS: case DISPLAYLIST_NETPLAY: case DISPLAYLIST_CORE_CONTENT: case DISPLAYLIST_CORE_CONTENT_DIRS: case DISPLAYLIST_PLAYLIST_COLLECTION: case DISPLAYLIST_HISTORY: case DISPLAYLIST_OPTIONS_DISK: case DISPLAYLIST_NETWORK_INFO: case DISPLAYLIST_SYSTEM_INFO: case DISPLAYLIST_ACHIEVEMENT_LIST: case DISPLAYLIST_ACHIEVEMENT_LIST_HARDCORE: case DISPLAYLIST_CORES: case DISPLAYLIST_CORES_DETECTED: case DISPLAYLIST_CORES_UPDATER: case DISPLAYLIST_THUMBNAILS_UPDATER: case DISPLAYLIST_LAKKA: case DISPLAYLIST_CORES_SUPPORTED: case DISPLAYLIST_CORES_COLLECTION_SUPPORTED: case DISPLAYLIST_CORE_INFO: case DISPLAYLIST_CORE_OPTIONS: case DISPLAYLIST_DEFAULT: case DISPLAYLIST_SHADER_PASS: case DISPLAYLIST_SHADER_PRESET: case DISPLAYLIST_DATABASES: case DISPLAYLIST_DATABASE_CURSORS: case DISPLAYLIST_DATABASE_PLAYLISTS: case DISPLAYLIST_DATABASE_PLAYLISTS_HORIZONTAL: case DISPLAYLIST_VIDEO_FILTERS: case DISPLAYLIST_INPUT_HOTKEY_BINDS_LIST: case DISPLAYLIST_DRIVER_SETTINGS_LIST: case DISPLAYLIST_VIDEO_SETTINGS_LIST: case DISPLAYLIST_CONFIGURATION_SETTINGS_LIST: case DISPLAYLIST_LOGGING_SETTINGS_LIST: case DISPLAYLIST_SAVING_SETTINGS_LIST: case DISPLAYLIST_FRAME_THROTTLE_SETTINGS_LIST: case DISPLAYLIST_REWIND_SETTINGS_LIST: case DISPLAYLIST_ONSCREEN_DISPLAY_SETTINGS_LIST: case DISPLAYLIST_ONSCREEN_NOTIFICATIONS_SETTINGS_LIST: case DISPLAYLIST_ONSCREEN_OVERLAY_SETTINGS_LIST: case DISPLAYLIST_MENU_FILE_BROWSER_SETTINGS_LIST: case DISPLAYLIST_MENU_SETTINGS_LIST: case DISPLAYLIST_USER_INTERFACE_SETTINGS_LIST: case DISPLAYLIST_RETRO_ACHIEVEMENTS_SETTINGS_LIST: case DISPLAYLIST_UPDATER_SETTINGS_LIST: case DISPLAYLIST_WIFI_SETTINGS_LIST: case DISPLAYLIST_NETWORK_SETTINGS_LIST: case DISPLAYLIST_NETPLAY_LAN_SCAN_SETTINGS_LIST: case DISPLAYLIST_LAKKA_SERVICES_LIST: case DISPLAYLIST_USER_SETTINGS_LIST: case DISPLAYLIST_DIRECTORY_SETTINGS_LIST: case DISPLAYLIST_PRIVACY_SETTINGS_LIST: case DISPLAYLIST_AUDIO_SETTINGS_LIST: case DISPLAYLIST_CORE_SETTINGS_LIST: case DISPLAYLIST_INPUT_SETTINGS_LIST: case DISPLAYLIST_PLAYLIST_SETTINGS_LIST: case DISPLAYLIST_RECORDING_SETTINGS_LIST: case DISPLAYLIST_AUDIO_FILTERS: case DISPLAYLIST_IMAGES: case DISPLAYLIST_OVERLAYS: case DISPLAYLIST_FONTS: case DISPLAYLIST_CHEAT_FILES: case DISPLAYLIST_REMAP_FILES: case DISPLAYLIST_RECORD_CONFIG_FILES: case DISPLAYLIST_CONFIG_FILES: case DISPLAYLIST_CONTENT_HISTORY: case DISPLAYLIST_ARCHIVE_ACTION: case DISPLAYLIST_ARCHIVE_ACTION_DETECT_CORE: menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); break; default: break; } switch (type) { case DISPLAYLIST_NONE: break; case DISPLAYLIST_INFO: menu_entries_append_enum(info->list, info->path, info->label, MSG_UNKNOWN, info->type, info->directory_ptr, 0); break; case DISPLAYLIST_FILE_BROWSER_SCAN_DIR: case DISPLAYLIST_FILE_BROWSER_SELECT_DIR: case DISPLAYLIST_FILE_BROWSER_SELECT_FILE: case DISPLAYLIST_FILE_BROWSER_SELECT_CORE: case DISPLAYLIST_FILE_BROWSER_SELECT_COLLECTION: case DISPLAYLIST_GENERIC: { menu_ctx_list_t list_info; list_info.type = MENU_LIST_PLAIN; list_info.action = 0; menu_driver_ctl(RARCH_MENU_CTL_LIST_CACHE, &list_info); menu_entries_append_enum(info->list, info->path, info->label, MSG_UNKNOWN, info->type, info->directory_ptr, 0); info->need_navigation_clear = true; info->need_entries_refresh = true; } break; case DISPLAYLIST_PENDING_CLEAR: { menu_ctx_list_t list_info; list_info.type = MENU_LIST_PLAIN; list_info.action = 0; menu_driver_ctl(RARCH_MENU_CTL_LIST_CACHE, &list_info); menu_entries_append_enum(info->list, info->path, info->label, MSG_UNKNOWN, info->type, info->directory_ptr, 0); info->need_entries_refresh = true; } break; case DISPLAYLIST_USER_BINDS_LIST: { char lbl[PATH_MAX_LENGTH]; unsigned val = atoi(info->path); const char *temp_val = msg_hash_to_str( (enum msg_hash_enums)(MENU_ENUM_LABEL_INPUT_USER_1_BINDS + (val-1))); lbl[0] = '\0'; strlcpy(lbl, temp_val, sizeof(lbl)); ret = menu_displaylist_parse_settings(menu, info, lbl, PARSE_NONE, true); info->need_refresh = true; info->need_push = true; } break; case DISPLAYLIST_ACCOUNTS_LIST: #ifdef HAVE_CHEEVOS ret = menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_ACCOUNTS_RETRO_ACHIEVEMENTS, PARSE_ACTION, false); #else menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_ITEMS), msg_hash_to_str(MENU_ENUM_LABEL_NO_ITEMS), MENU_ENUM_LABEL_NO_ITEMS, MENU_SETTING_NO_ITEM, 0, 0); ret = 0; #endif info->need_refresh = true; info->need_push = true; break; case DISPLAYLIST_ACCOUNTS_CHEEVOS_LIST: #ifdef HAVE_CHEEVOS ret = menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_CHEEVOS_USERNAME, PARSE_ONLY_STRING, false); ret = menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_CHEEVOS_PASSWORD, PARSE_ONLY_STRING, false); #else menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_ITEMS), msg_hash_to_str(MENU_ENUM_LABEL_NO_ITEMS), MENU_ENUM_LABEL_NO_ITEMS, MENU_SETTING_NO_ITEM, 0, 0); ret = 0; #endif info->need_refresh = true; info->need_push = true; break; case DISPLAYLIST_BROWSE_URL_START: #ifdef HAVE_NETWORKING { char link[1024]; char name[1024]; const char *line = "Test\n"; link[0] = name[0] = '\0'; string_parse_html_anchor(line, link, name, sizeof(link), sizeof(name)); menu_entries_append_enum(info->list, link, name, MSG_UNKNOWN, 0, 0, 0); } #endif info->need_refresh = true; info->need_push = true; break; case DISPLAYLIST_BROWSE_URL_LIST: menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_BROWSE_URL), msg_hash_to_str(MENU_ENUM_LABEL_BROWSE_URL), MENU_ENUM_LABEL_BROWSE_URL, 0, 0, 0); menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_BROWSE_START), msg_hash_to_str(MENU_ENUM_LABEL_BROWSE_START), MENU_ENUM_LABEL_BROWSE_START, 0, 0, 0); info->need_refresh = true; info->need_push = true; break; case DISPLAYLIST_HELP_SCREEN_LIST: menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_HELP_CONTROLS), msg_hash_to_str(MENU_ENUM_LABEL_HELP_CONTROLS), MENU_ENUM_LABEL_HELP_CONTROLS, 0, 0, 0); menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_HELP_WHAT_IS_A_CORE), msg_hash_to_str(MENU_ENUM_LABEL_HELP_WHAT_IS_A_CORE), MENU_ENUM_LABEL_HELP_WHAT_IS_A_CORE, 0, 0, 0); menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_HELP_LOADING_CONTENT), msg_hash_to_str(MENU_ENUM_LABEL_HELP_LOADING_CONTENT), MENU_ENUM_LABEL_HELP_LOADING_CONTENT, 0, 0, 0); #ifdef HAVE_LIBRETRODB menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_HELP_SCANNING_CONTENT), msg_hash_to_str(MENU_ENUM_LABEL_HELP_SCANNING_CONTENT), MENU_ENUM_LABEL_HELP_SCANNING_CONTENT, 0, 0, 0); #endif #ifdef HAVE_OVERLAY menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_HELP_CHANGE_VIRTUAL_GAMEPAD), msg_hash_to_str(MENU_ENUM_LABEL_HELP_CHANGE_VIRTUAL_GAMEPAD), MENU_ENUM_LABEL_HELP_CHANGE_VIRTUAL_GAMEPAD, 0, 0, 0); #endif menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_HELP_AUDIO_VIDEO_TROUBLESHOOTING), msg_hash_to_str(MENU_ENUM_LABEL_HELP_AUDIO_VIDEO_TROUBLESHOOTING), MENU_ENUM_LABEL_HELP_AUDIO_VIDEO_TROUBLESHOOTING, 0, 0, 0); info->need_refresh = true; info->need_push = true; break; case DISPLAYLIST_HELP: menu_entries_append_enum(info->list, info->path, info->label, MSG_UNKNOWN, info->type, info->directory_ptr, 0); menu_dialog_unset_pending_push(); break; case DISPLAYLIST_SETTING_ENUM: { menu_displaylist_ctx_parse_entry_t *entry = (menu_displaylist_ctx_parse_entry_t*)data; if (menu_displaylist_parse_settings_enum(entry->data, entry->info, entry->enum_idx, entry->parse_type, entry->add_empty_entry) == -1) goto error; } return true; case DISPLAYLIST_MAIN_MENU: { rarch_system_info_t *system = NULL; runloop_ctl(RUNLOOP_CTL_SYSTEM_INFO_GET, &system); if (!rarch_ctl(RARCH_CTL_IS_DUMMY_CORE, NULL)) menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_CONTENT_SETTINGS, PARSE_ACTION, false); if (menu_driver_ctl(RARCH_MENU_CTL_HAS_LOAD_NO_CONTENT, NULL)) menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_START_CORE, PARSE_ACTION, false); #ifndef HAVE_DYNAMIC if (frontend_driver_has_fork()) #endif { menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_CORE_LIST, PARSE_ACTION, false); } menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_LOAD_CONTENT_LIST, PARSE_ACTION, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_LOAD_CONTENT_HISTORY, PARSE_ACTION, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_ADD_CONTENT_LIST, PARSE_ACTION, false); #ifdef HAVE_NETWORKING menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_NETPLAY, PARSE_ACTION, false); #endif #if defined(HAVE_NETWORKING) menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_ONLINE_UPDATER, PARSE_ACTION, false); #endif menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_SETTINGS, PARSE_ACTION, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_INFORMATION_LIST, PARSE_ACTION, false); #ifndef HAVE_DYNAMIC menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_RESTART_RETROARCH, PARSE_ACTION, false); #endif menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_CONFIGURATIONS_LIST, PARSE_ACTION, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_HELP_LIST, PARSE_ACTION, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_QUIT_RETROARCH, PARSE_ACTION, false); #if defined(HAVE_LAKKA) menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_SHUTDOWN, PARSE_ACTION, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_REBOOT, PARSE_ACTION, false); #endif info->need_push = true; } break; case DISPLAYLIST_RECORDING_SETTINGS_LIST: menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_RECORD_ENABLE, PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_RECORD_CONFIG, PARSE_ONLY_PATH, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_RECORD_PATH, PARSE_ONLY_STRING, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_RECORD_USE_OUTPUT_DIRECTORY, PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_VIDEO_GPU_RECORD, PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_VIDEO_POST_FILTER_RECORD, PARSE_ONLY_BOOL, false); info->need_push = true; break; case DISPLAYLIST_PLAYLIST_SETTINGS_LIST: ret = menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_HISTORY_LIST_ENABLE, PARSE_ONLY_BOOL, false); ret = menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_CONTENT_HISTORY_SIZE, PARSE_ONLY_UINT, false); ret = menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_PLAYLIST_ENTRY_REMOVE, PARSE_ONLY_BOOL, false); menu_displaylist_parse_playlist_associations(info); info->need_push = true; break; case DISPLAYLIST_INPUT_HOTKEY_BINDS_LIST: { unsigned i; for (i = 0; i < RARCH_BIND_LIST_END; i++) { ret = menu_displaylist_parse_settings_enum(menu, info, (enum msg_hash_enums)(MENU_ENUM_LABEL_INPUT_HOTKEY_BIND_BEGIN + i), PARSE_ONLY_BIND, false); (void)ret; } } info->need_push = true; break; case DISPLAYLIST_DRIVER_SETTINGS_LIST: ret = menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_INPUT_DRIVER, PARSE_ONLY_STRING_OPTIONS, false); ret = menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_JOYPAD_DRIVER, PARSE_ONLY_STRING_OPTIONS, false); ret = menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_VIDEO_DRIVER, PARSE_ONLY_STRING_OPTIONS, false); ret = menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_AUDIO_DRIVER, PARSE_ONLY_STRING_OPTIONS, false); ret = menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_AUDIO_RESAMPLER_DRIVER, PARSE_ONLY_STRING_OPTIONS, false); ret = menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_CAMERA_DRIVER, PARSE_ONLY_STRING_OPTIONS, false); ret = menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_LOCATION_DRIVER, PARSE_ONLY_STRING_OPTIONS, false); ret = menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_MENU_DRIVER, PARSE_ONLY_STRING_OPTIONS, false); ret = menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_RECORD_DRIVER, PARSE_ONLY_STRING_OPTIONS, false); ret = menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_WIFI_DRIVER, PARSE_ONLY_STRING_OPTIONS, false); info->need_refresh = true; info->need_push = true; break; case DISPLAYLIST_CONFIGURATION_SETTINGS_LIST: menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_CONFIG_SAVE_ON_EXIT, PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_GAME_SPECIFIC_OPTIONS, PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_AUTO_OVERRIDES_ENABLE, PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_AUTO_REMAPS_ENABLE, PARSE_ONLY_BOOL, false); info->need_refresh = true; info->need_push = true; break; case DISPLAYLIST_SAVING_SETTINGS_LIST: menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_SORT_SAVEFILES_ENABLE, PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_SORT_SAVESTATES_ENABLE, PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_BLOCK_SRAM_OVERWRITE, PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_AUTOSAVE_INTERVAL, PARSE_ONLY_UINT, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_SAVESTATE_AUTO_INDEX, PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_SAVESTATE_AUTO_SAVE, PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_SAVESTATE_AUTO_LOAD, PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_SAVESTATE_THUMBNAIL_ENABLE, PARSE_ONLY_BOOL, false); info->need_refresh = true; info->need_push = true; break; case DISPLAYLIST_LOGGING_SETTINGS_LIST: menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_LOG_VERBOSITY, PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_LIBRETRO_LOG_LEVEL, PARSE_ONLY_UINT, false); if (settings->menu.show_advanced_settings) menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_PERFCNT_ENABLE, PARSE_ONLY_BOOL, false); info->need_refresh = true; info->need_push = true; break; case DISPLAYLIST_FRAME_THROTTLE_SETTINGS_LIST: menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_REWIND_SETTINGS, PARSE_ACTION, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_FASTFORWARD_RATIO, PARSE_ONLY_FLOAT, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_SLOWMOTION_RATIO, PARSE_ONLY_FLOAT, false); if (settings->menu.show_advanced_settings) menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_MENU_THROTTLE_FRAMERATE, PARSE_ONLY_BOOL, false); info->need_refresh = true; info->need_push = true; break; case DISPLAYLIST_REWIND_SETTINGS_LIST: menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_REWIND_ENABLE, PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_REWIND_GRANULARITY, PARSE_ONLY_UINT, false); info->need_refresh = true; info->need_push = true; break; case DISPLAYLIST_ONSCREEN_DISPLAY_SETTINGS_LIST: menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_ONSCREEN_OVERLAY_SETTINGS, PARSE_ACTION, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_ONSCREEN_NOTIFICATIONS_SETTINGS, PARSE_ACTION, false); info->need_refresh = true; info->need_push = true; break; case DISPLAYLIST_ONSCREEN_NOTIFICATIONS_SETTINGS_LIST: menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_VIDEO_FONT_ENABLE, PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_VIDEO_FONT_PATH, PARSE_ONLY_PATH, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_VIDEO_FONT_SIZE, PARSE_ONLY_FLOAT, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_VIDEO_MESSAGE_POS_X, PARSE_ONLY_FLOAT, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_VIDEO_MESSAGE_POS_Y, PARSE_ONLY_FLOAT, false); info->need_refresh = true; info->need_push = true; break; case DISPLAYLIST_ONSCREEN_OVERLAY_SETTINGS_LIST: menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_INPUT_OVERLAY_ENABLE, PARSE_ONLY_BOOL, false); #if 0 menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_OVERLAY_AUTOLOAD_PREFERRED, PARSE_ONLY_BOOL, false); #endif menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_INPUT_OVERLAY_HIDE_IN_MENU, PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_OVERLAY_PRESET, PARSE_ONLY_PATH, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_OVERLAY_OPACITY, PARSE_ONLY_FLOAT, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_OVERLAY_SCALE, PARSE_ONLY_FLOAT, false); info->need_refresh = true; info->need_push = true; break; case DISPLAYLIST_MENU_FILE_BROWSER_SETTINGS_LIST: menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_SHOW_HIDDEN_FILES, PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_NAVIGATION_BROWSER_FILTER_SUPPORTED_EXTENSIONS_ENABLE, PARSE_ONLY_BOOL, false); info->need_refresh = true; info->need_push = true; break; case DISPLAYLIST_MENU_SETTINGS_LIST: menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_MENU_WALLPAPER, PARSE_ONLY_PATH, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_DYNAMIC_WALLPAPER, PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_MENU_WALLPAPER_OPACITY, PARSE_ONLY_FLOAT, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_PAUSE_LIBRETRO, PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_MOUSE_ENABLE, PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_POINTER_ENABLE, PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_MENU_LINEAR_FILTER, PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_NAVIGATION_WRAPAROUND, PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_ENTRY_NORMAL_COLOR, PARSE_ONLY_HEX, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_ENTRY_HOVER_COLOR, PARSE_ONLY_HEX, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_TITLE_COLOR, PARSE_ONLY_HEX, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_DPI_OVERRIDE_ENABLE, PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_DPI_OVERRIDE_VALUE, PARSE_ONLY_UINT, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_XMB_ALPHA_FACTOR, PARSE_ONLY_UINT, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_XMB_SCALE_FACTOR, PARSE_ONLY_UINT, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_XMB_FONT, PARSE_ONLY_PATH, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_XMB_THEME, PARSE_ONLY_UINT, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_XMB_SHADOWS_ENABLE, PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_XMB_RIBBON_ENABLE, PARSE_ONLY_UINT, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_XMB_MENU_COLOR_THEME, PARSE_ONLY_UINT, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_XMB_SHOW_SETTINGS, PARSE_ONLY_BOOL, false); #ifdef HAVE_IMAGEVIEWER menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_XMB_SHOW_IMAGES, PARSE_ONLY_BOOL, false); #endif #ifdef HAVE_FFMPEG menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_XMB_SHOW_MUSIC, PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_XMB_SHOW_VIDEO, PARSE_ONLY_BOOL, false); #endif menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_XMB_SHOW_HISTORY, PARSE_ONLY_BOOL, false); #ifdef HAVE_LIBRETRODB menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_XMB_SHOW_ADD, PARSE_ONLY_BOOL, false); #endif menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_MATERIALUI_MENU_COLOR_THEME, PARSE_ONLY_UINT, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_MATERIALUI_MENU_HEADER_OPACITY, PARSE_ONLY_FLOAT, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_MATERIALUI_MENU_FOOTER_OPACITY, PARSE_ONLY_FLOAT, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_RGUI_SHOW_START_SCREEN, PARSE_ONLY_BOOL, false); 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_TIMEDATE_ENABLE, PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_BATTERY_LEVEL_ENABLE, PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_CORE_ENABLE, PARSE_ONLY_BOOL, false); info->need_refresh = true; info->need_push = true; break; case DISPLAYLIST_USER_INTERFACE_SETTINGS_LIST: menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_MENU_SETTINGS, PARSE_ACTION, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_SHOW_ADVANCED_SETTINGS, PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_THREADED_DATA_RUNLOOP_ENABLE, PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_PAUSE_NONACTIVE, PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_VIDEO_DISABLE_COMPOSITION, PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_UI_COMPANION_ENABLE, PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_UI_COMPANION_START_ON_BOOT, PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_UI_MENUBAR_ENABLE, PARSE_ONLY_BOOL, false); info->need_refresh = true; info->need_push = true; break; case DISPLAYLIST_RETRO_ACHIEVEMENTS_SETTINGS_LIST: menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_CHEEVOS_ENABLE, PARSE_ONLY_BOOL, false); ret = menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_CHEEVOS_USERNAME, PARSE_ONLY_STRING, false); ret = menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_CHEEVOS_PASSWORD, PARSE_ONLY_STRING, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_CHEEVOS_TEST_UNOFFICIAL, PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_CHEEVOS_HARDCORE_MODE_ENABLE, PARSE_ONLY_BOOL, false); info->need_refresh = true; info->need_push = true; break; case DISPLAYLIST_UPDATER_SETTINGS_LIST: { unsigned count = 0; if (menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_CORE_UPDATER_BUILDBOT_URL, PARSE_ONLY_STRING, false) != -1) count++; if (menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_BUILDBOT_ASSETS_URL, PARSE_ONLY_STRING, false) != -1) count++; if (menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_CORE_UPDATER_AUTO_EXTRACT_ARCHIVE, PARSE_ONLY_BOOL, false) != -1) count++; if (count == 0) menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_SETTINGS_FOUND), msg_hash_to_str(MENU_ENUM_LABEL_NO_SETTINGS_FOUND), MENU_ENUM_LABEL_NO_SETTINGS_FOUND, 0, 0, 0); } info->need_refresh = true; info->need_push = true; break; case DISPLAYLIST_WIFI_SETTINGS_LIST: if (string_is_equal(settings->wifi.driver, "null")) menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_NETWORKS_FOUND), msg_hash_to_str(MENU_ENUM_LABEL_NO_NETWORKS_FOUND), MENU_ENUM_LABEL_NO_NETWORKS_FOUND, 0, 0, 0); #ifdef HAVE_NETWORKING else { struct string_list *ssid_list = string_list_new(); driver_wifi_get_ssids(ssid_list); if (ssid_list->size == 0) { task_push_wifi_scan(); menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_NETWORKS_FOUND), msg_hash_to_str(MENU_ENUM_LABEL_NO_NETWORKS_FOUND), MENU_ENUM_LABEL_NO_NETWORKS_FOUND, 0, 0, 0); } else { unsigned i; for (i = 0; i < ssid_list->size; i++) { const char *ssid = ssid_list->elems[i].data; menu_entries_append_enum(info->list, ssid, msg_hash_to_str(MENU_ENUM_LABEL_CONNECT_WIFI), MENU_ENUM_LABEL_CONNECT_WIFI, MENU_WIFI, 0, 0); } } } #else menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_NETWORKS_FOUND), msg_hash_to_str(MENU_ENUM_LABEL_NO_NETWORKS_FOUND), MENU_ENUM_LABEL_NO_NETWORKS_FOUND, 0, 0, 0); #endif info->need_refresh = true; info->need_push = true; break; case DISPLAYLIST_NETWORK_SETTINGS_LIST: { unsigned user; unsigned count = 0; if (menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_NETPLAY_IP_ADDRESS, PARSE_ONLY_STRING, false) != -1) count++; if (menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_NETPLAY_TCP_UDP_PORT, PARSE_ONLY_UINT, false) != -1) count++; if (menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_NETPLAY_PASSWORD, PARSE_ONLY_STRING, false) != -1) count++; if (menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_NETPLAY_SPECTATE_PASSWORD, PARSE_ONLY_STRING, false) != -1) count++; if (menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_NETPLAY_STATELESS_MODE, PARSE_ONLY_BOOL, false) != -1) count++; if (menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_NETPLAY_CHECK_FRAMES, PARSE_ONLY_INT, false) != -1) count++; if (menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_NETPLAY_INPUT_LATENCY_FRAMES_MIN, PARSE_ONLY_INT, false) != -1) count++; if (menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_NETPLAY_INPUT_LATENCY_FRAMES_RANGE, PARSE_ONLY_INT, false) != -1) count++; if (menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_NETPLAY_NAT_TRAVERSAL, PARSE_ONLY_BOOL, false) != -1) count++; if (menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_NETPLAY_CLIENT_SWAP_INPUT, PARSE_ONLY_BOOL, false) != -1) count++; if (menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_NETWORK_CMD_ENABLE, PARSE_ONLY_BOOL, false) != -1) count++; if (menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_NETWORK_CMD_PORT, PARSE_ONLY_UINT, false) != -1) count++; if (menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_NETWORK_REMOTE_ENABLE, PARSE_ONLY_BOOL, false) != -1) count++; if (menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_NETWORK_REMOTE_PORT, PARSE_ONLY_UINT, false) != -1) count++; for(user = 0; user < settings->input.max_users; user++) { if (menu_displaylist_parse_settings_enum(menu, info, (enum msg_hash_enums)(MENU_ENUM_LABEL_NETWORK_REMOTE_USER_1_ENABLE + user), PARSE_ONLY_BOOL, false) != -1) count++; } if (menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_STDIN_CMD_ENABLE, PARSE_ONLY_BOOL, false) != -1) count++; if (menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_UPDATER_SETTINGS, PARSE_ACTION, false) != -1) count++; if (count == 0) menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_SETTINGS_FOUND), msg_hash_to_str(MENU_ENUM_LABEL_NO_SETTINGS_FOUND), MENU_ENUM_LABEL_NO_SETTINGS_FOUND, 0, 0, 0); } info->need_refresh = true; info->need_push = true; break; case DISPLAYLIST_NETPLAY_LAN_SCAN_SETTINGS_LIST: #ifdef HAVE_NETWORKING { struct netplay_host_list *hosts; if (!netplay_discovery_driver_ctl(RARCH_NETPLAY_DISCOVERY_CTL_LAN_GET_RESPONSES, &hosts)) hosts = NULL; if (!hosts || hosts->size == 0) { if (!hosts) task_push_netplay_lan_scan(); menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_NETPLAY_HOSTS_FOUND), msg_hash_to_str(MENU_ENUM_LABEL_NO_NETPLAY_HOSTS_FOUND), MENU_ENUM_LABEL_NO_NETPLAY_HOSTS_FOUND, 0, 0, 0); } else { size_t i; for (i = 0; i < hosts->size; i++) { struct netplay_host *host = &hosts->hosts[i]; menu_entries_append_enum(info->list, host->nick, msg_hash_to_str(MENU_ENUM_LABEL_CONNECT_NETPLAY_LAN), MENU_ENUM_LABEL_CONNECT_NETPLAY_LAN, MENU_NETPLAY_LAN_SCAN, 0, 0); } } } #else menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_NETPLAY_HOSTS_FOUND), msg_hash_to_str(MENU_ENUM_LABEL_NO_NETPLAY_HOSTS_FOUND), MENU_ENUM_LABEL_NO_NETPLAY_HOSTS_FOUND, 0, 0, 0); #endif info->need_refresh = true; info->need_push = true; break; case DISPLAYLIST_LAKKA_SERVICES_LIST: menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_SSH_ENABLE, PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_SAMBA_ENABLE, PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_BLUETOOTH_ENABLE, PARSE_ONLY_BOOL, false); info->need_refresh = true; info->need_push = true; break; case DISPLAYLIST_USER_SETTINGS_LIST: menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_ACCOUNTS_LIST, PARSE_ACTION, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_NETPLAY_NICKNAME, PARSE_ONLY_STRING, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_USER_LANGUAGE, PARSE_ONLY_UINT, false); info->need_refresh = true; info->need_push = true; break; case DISPLAYLIST_DIRECTORY_SETTINGS_LIST: menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_SYSTEM_DIRECTORY, PARSE_ONLY_DIR, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_CORE_ASSETS_DIRECTORY, PARSE_ONLY_DIR, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_ASSETS_DIRECTORY, PARSE_ONLY_DIR, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_DYNAMIC_WALLPAPERS_DIRECTORY, PARSE_ONLY_DIR, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_THUMBNAILS_DIRECTORY, PARSE_ONLY_DIR, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_RGUI_BROWSER_DIRECTORY, PARSE_ONLY_DIR, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_RGUI_CONFIG_DIRECTORY, PARSE_ONLY_DIR, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_LIBRETRO_DIR_PATH, PARSE_ONLY_DIR, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_LIBRETRO_INFO_PATH, PARSE_ONLY_DIR, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_CONTENT_DATABASE_DIRECTORY, PARSE_ONLY_DIR, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_CURSOR_DIRECTORY, PARSE_ONLY_DIR, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_CHEAT_DATABASE_PATH, PARSE_ONLY_DIR, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_VIDEO_FILTER_DIR, PARSE_ONLY_DIR, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_AUDIO_FILTER_DIR, PARSE_ONLY_DIR, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_VIDEO_SHADER_DIR, PARSE_ONLY_DIR, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_RECORDING_OUTPUT_DIRECTORY, PARSE_ONLY_DIR, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_RECORDING_CONFIG_DIRECTORY, PARSE_ONLY_DIR, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_OVERLAY_DIRECTORY, PARSE_ONLY_DIR, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_SCREENSHOT_DIRECTORY, PARSE_ONLY_DIR, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_JOYPAD_AUTOCONFIG_DIR, PARSE_ONLY_DIR, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_INPUT_REMAPPING_DIRECTORY, PARSE_ONLY_DIR, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_PLAYLIST_DIRECTORY, PARSE_ONLY_DIR, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_SAVEFILE_DIRECTORY, PARSE_ONLY_DIR, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_SAVESTATE_DIRECTORY, PARSE_ONLY_DIR, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_CACHE_DIRECTORY, PARSE_ONLY_DIR, false); info->need_refresh = true; info->need_push = true; break; case DISPLAYLIST_PRIVACY_SETTINGS_LIST: { bool available = false; if (menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_CAMERA_ALLOW, PARSE_ONLY_BOOL, false) == 0) available = true; if (menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_LOCATION_ALLOW, PARSE_ONLY_BOOL, true) == 0) available = true; if (!available) menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_SETTINGS_FOUND), msg_hash_to_str(MENU_ENUM_LABEL_NO_SETTINGS_FOUND), MENU_ENUM_LABEL_NO_SETTINGS_FOUND, 0, 0, 0); info->need_refresh = true; info->need_push = true; } break; case DISPLAYLIST_VIDEO_SETTINGS_LIST: menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_SUSPEND_SCREENSAVER_ENABLE, PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_FPS_SHOW, PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_SCREEN_RESOLUTION, PARSE_ACTION, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_PAL60_ENABLE, PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_VIDEO_GAMMA, PARSE_ONLY_UINT, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_VIDEO_SOFT_FILTER, PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_VIDEO_FILTER_FLICKER, PARSE_ONLY_UINT, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_VIDEO_MONITOR_INDEX, PARSE_ONLY_UINT, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_VIDEO_FULLSCREEN, PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_VIDEO_WINDOWED_FULLSCREEN, PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_VIDEO_REFRESH_RATE, PARSE_ONLY_FLOAT, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_VIDEO_REFRESH_RATE_AUTO, PARSE_ONLY_FLOAT, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_VIDEO_FORCE_SRGB_DISABLE, PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_VIDEO_ASPECT_RATIO_INDEX, PARSE_ONLY_UINT, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_VIDEO_VIEWPORT_CUSTOM_X, PARSE_ONLY_INT, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_VIDEO_VIEWPORT_CUSTOM_Y, PARSE_ONLY_INT, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_VIDEO_VIEWPORT_CUSTOM_WIDTH, PARSE_ONLY_UINT, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_VIDEO_VIEWPORT_CUSTOM_HEIGHT, PARSE_ONLY_UINT, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_VIDEO_SCALE, PARSE_ONLY_FLOAT, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_VIDEO_WINDOW_WIDTH, PARSE_ONLY_UINT, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_VIDEO_WINDOW_HEIGHT, PARSE_ONLY_UINT, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_VIDEO_SCALE_INTEGER, PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_VIDEO_VI_WIDTH, PARSE_ONLY_UINT, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_VIDEO_VFILTER, PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_VIDEO_ROTATION, PARSE_ONLY_UINT, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_VIDEO_THREADED, PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_VIDEO_VSYNC, PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_VIDEO_SWAP_INTERVAL, PARSE_ONLY_UINT, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_VIDEO_MAX_SWAPCHAIN_IMAGES, PARSE_ONLY_UINT, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_VIDEO_HARD_SYNC, PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_VIDEO_HARD_SYNC_FRAMES, PARSE_ONLY_UINT, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_VIDEO_FRAME_DELAY, PARSE_ONLY_UINT, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_VIDEO_BLACK_FRAME_INSERTION, PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_VIDEO_GPU_SCREENSHOT, PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_VIDEO_CROP_OVERSCAN, PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_VIDEO_SMOOTH, PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_VIDEO_FILTER, PARSE_ONLY_PATH, false); info->need_refresh = true; info->need_push = true; break; case DISPLAYLIST_CORE_SETTINGS_LIST: menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_VIDEO_SHARED_CONTEXT, PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_DUMMY_ON_CORE_SHUTDOWN, PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_CHECK_FOR_MISSING_FIRMWARE, PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_VIDEO_ALLOW_ROTATE, PARSE_ONLY_BOOL, false); info->need_refresh = true; info->need_push = true; break; case DISPLAYLIST_AUDIO_SETTINGS_LIST: menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_AUDIO_ENABLE, PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_AUDIO_MUTE, PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_AUDIO_VOLUME, PARSE_ONLY_FLOAT, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_SYSTEM_BGM_ENABLE, PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_AUDIO_SYNC, PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_AUDIO_LATENCY, PARSE_ONLY_UINT, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_AUDIO_RATE_CONTROL_DELTA, PARSE_ONLY_FLOAT, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_AUDIO_MAX_TIMING_SKEW, PARSE_ONLY_FLOAT, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_AUDIO_BLOCK_FRAMES, PARSE_ONLY_UINT, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_AUDIO_DEVICE, PARSE_ONLY_STRING, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_AUDIO_OUTPUT_RATE, PARSE_ONLY_UINT, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_AUDIO_DSP_PLUGIN, PARSE_ONLY_PATH, false); info->need_refresh = true; info->need_push = true; break; case DISPLAYLIST_INPUT_SETTINGS_LIST: ret = menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_INPUT_MAX_USERS, PARSE_ONLY_UINT, false); #if TARGET_OS_IPHONE ret = menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_INPUT_SMALL_KEYBOARD_ENABLE, PARSE_ONLY_BOOL, false); #endif ret = menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_INPUT_UNIFIED_MENU_CONTROLS, PARSE_ONLY_BOOL, false); ret = menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_INPUT_POLL_TYPE_BEHAVIOR, PARSE_ONLY_UINT, false); ret = menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_INPUT_ICADE_ENABLE, PARSE_ONLY_BOOL, false); ret = menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, PARSE_ONLY_UINT, false); #ifdef VITA ret = menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_INPUT_TOUCH_ENABLE, PARSE_ONLY_BOOL, false); ret = menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_INPUT_PREFER_FRONT_TOUCH, PARSE_ONLY_BOOL, false); #endif ret = menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_INPUT_MENU_ENUM_TOGGLE_GAMEPAD_COMBO, PARSE_ONLY_UINT, false); ret = menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_MENU_INPUT_SWAP_OK_CANCEL, PARSE_ONLY_BOOL, false); ret = menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_INPUT_ALL_USERS_CONTROL_MENU, PARSE_ONLY_BOOL, false); ret = menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_INPUT_REMAP_BINDS_ENABLE, PARSE_ONLY_BOOL, false); ret = menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_INPUT_AUTODETECT_ENABLE, PARSE_ONLY_BOOL, false); ret = menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_INPUT_DESCRIPTOR_LABEL_SHOW, PARSE_ONLY_BOOL, false); ret = menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_INPUT_DESCRIPTOR_HIDE_UNBOUND, PARSE_ONLY_BOOL, false); ret = menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_INPUT_AXIS_THRESHOLD, PARSE_ONLY_FLOAT, false); ret = menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_INPUT_BIND_TIMEOUT, PARSE_ONLY_UINT, false); ret = menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_INPUT_TURBO_PERIOD, PARSE_ONLY_UINT, false); ret = menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_INPUT_DUTY_CYCLE, PARSE_ONLY_UINT, false); ret = menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_INPUT_BIND_MODE, PARSE_ONLY_UINT, false); ret = menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_INPUT_HOTKEY_BINDS, PARSE_ACTION, false); { unsigned user; for (user = 0; user < settings->input.max_users; user++) { menu_displaylist_parse_settings_enum(menu, info, (enum msg_hash_enums)(MENU_ENUM_LABEL_INPUT_USER_1_BINDS + user), PARSE_ACTION, false); } } info->need_refresh = true; info->need_push = true; break; case DISPLAYLIST_SETTINGS_ALL: ret = menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_DRIVER_SETTINGS, PARSE_ACTION, false); ret = menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_VIDEO_SETTINGS, PARSE_ACTION, false); ret = menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_AUDIO_SETTINGS, PARSE_ACTION, false); ret = menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_INPUT_SETTINGS, PARSE_ACTION, false); ret = menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_CORE_SETTINGS, PARSE_ACTION, false); ret = menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_CONFIGURATION_SETTINGS, PARSE_ACTION, false); ret = menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_SAVING_SETTINGS, PARSE_ACTION, false); ret = menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_LOGGING_SETTINGS, PARSE_ACTION, false); ret = menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_FRAME_THROTTLE_SETTINGS, PARSE_ACTION, false); if (!string_is_equal(settings->record.driver, "null")) ret = menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_RECORDING_SETTINGS, PARSE_ACTION, false); ret = menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_ONSCREEN_DISPLAY_SETTINGS, PARSE_ACTION, false); ret = menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_USER_INTERFACE_SETTINGS, PARSE_ACTION, false); #ifdef HAVE_CHEEVOS ret = menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_RETRO_ACHIEVEMENTS_SETTINGS, PARSE_ACTION, false); #endif ret = menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_WIFI_SETTINGS, PARSE_ACTION, false); ret = menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_NETWORK_SETTINGS, PARSE_ACTION, false); ret = menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_NETPLAY_LAN_SCAN_SETTINGS, PARSE_ACTION, false); ret = menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_LAKKA_SERVICES, PARSE_ACTION, false); ret = menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_PLAYLIST_SETTINGS, PARSE_ACTION, false); ret = menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_USER_SETTINGS, PARSE_ACTION, false); ret = menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_DIRECTORY_SETTINGS, PARSE_ACTION, false); ret = menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_PRIVACY_SETTINGS, PARSE_ACTION, false); info->need_push = true; break; case DISPLAYLIST_HORIZONTAL: ret = menu_displaylist_parse_horizontal_list(info); info->need_sort = true; info->need_refresh = true; info->need_push = true; break; case DISPLAYLIST_HORIZONTAL_CONTENT_ACTIONS: ret = menu_displaylist_parse_horizontal_content_actions(info); info->need_refresh = true; info->need_push = true; break; case DISPLAYLIST_CONTENT_SETTINGS: ret = menu_displaylist_parse_load_content_settings(info); info->need_refresh = true; info->need_push = true; break; case DISPLAYLIST_INFORMATION_LIST: ret = menu_displaylist_parse_information_list(info); info->need_push = true; info->need_refresh = true; break; case DISPLAYLIST_ADD_CONTENT_LIST: ret = menu_displaylist_parse_add_content_list(info); info->need_push = true; info->need_refresh = true; break; case DISPLAYLIST_CONFIGURATIONS_LIST: ret = menu_displaylist_parse_configurations_list(info); info->need_push = true; info->need_refresh = true; break; case DISPLAYLIST_SCAN_DIRECTORY_LIST: ret = menu_displaylist_parse_scan_directory_list(info); info->need_push = true; info->need_refresh = true; break; case DISPLAYLIST_NETPLAY_ROOM_LIST: ret = menu_displaylist_parse_netplay_room_list(info); info->need_push = true; info->need_refresh = true; break; case DISPLAYLIST_LOAD_CONTENT_LIST: if (!string_is_empty(settings->directory.menu_content)) menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_FAVORITES), msg_hash_to_str(MENU_ENUM_LABEL_FAVORITES), MENU_ENUM_LABEL_FAVORITES, MENU_SETTING_ACTION, 0, 0); if (core_info_list_num_info_files(list)) { menu_entries_append_enum(info->list, msg_hash_to_str( MENU_ENUM_LABEL_VALUE_DOWNLOADED_FILE_DETECT_CORE_LIST), msg_hash_to_str( MENU_ENUM_LABEL_DOWNLOADED_FILE_DETECT_CORE_LIST), MENU_ENUM_LABEL_DOWNLOADED_FILE_DETECT_CORE_LIST, MENU_SETTING_ACTION, 0, 0); } #ifdef HAVE_LIBRETRODB menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CONTENT_COLLECTION_LIST), msg_hash_to_str(MENU_ENUM_LABEL_CONTENT_COLLECTION_LIST), MENU_ENUM_LABEL_CONTENT_COLLECTION_LIST, MENU_SETTING_ACTION, 0, 0); #endif if (frontend_driver_parse_drive_list(info->list) != 0) menu_entries_append_enum(info->list, "/", msg_hash_to_str(MENU_ENUM_LABEL_FILE_DETECT_CORE_LIST_PUSH_DIR), MENU_ENUM_LABEL_FILE_DETECT_CORE_LIST_PUSH_DIR, MENU_SETTING_ACTION, 0, 0); #if 0 menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_BROWSE_URL_LIST), msg_hash_to_str(MENU_ENUM_LABEL_BROWSE_URL_LIST), MENU_ENUM_LABEL_BROWSE_URL_LIST, MENU_SETTING_ACTION, 0, 0); #endif menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_MENU_FILE_BROWSER_SETTINGS), msg_hash_to_str(MENU_ENUM_LABEL_MENU_FILE_BROWSER_SETTINGS), MENU_ENUM_LABEL_MENU_FILE_BROWSER_SETTINGS, MENU_SETTING_ACTION, 0, 0); info->need_push = true; info->need_refresh = true; break; case DISPLAYLIST_OPTIONS: ret = menu_displaylist_parse_options(info); info->need_push = true; break; case DISPLAYLIST_OPTIONS_CHEATS: ret = menu_displaylist_parse_options_cheats(info); info->need_push = true; break; case DISPLAYLIST_OPTIONS_REMAPPINGS: ret = menu_displaylist_parse_options_remappings(info); info->need_push = true; break; case DISPLAYLIST_SHADER_PARAMETERS: case DISPLAYLIST_SHADER_PARAMETERS_PRESET: #ifdef HAVE_SHADER_MANAGER video_shader_driver_get_current_shader(&shader_info); if (shader_info.data) ret = deferred_push_video_shader_parameters_common( info, shader_info.data, (type == DISPLAYLIST_SHADER_PARAMETERS) ? MENU_SETTINGS_SHADER_PARAMETER_0 : MENU_SETTINGS_SHADER_PRESET_PARAMETER_0 ); else { menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_SHADER_PARAMETERS), msg_hash_to_str(MENU_ENUM_LABEL_NO_SHADER_PARAMETERS), MENU_ENUM_LABEL_NO_SHADER_PARAMETERS, 0, 0, 0); ret = 0; } info->need_push = true; #endif break; case DISPLAYLIST_PERFCOUNTERS_CORE: case DISPLAYLIST_PERFCOUNTERS_FRONTEND: menu_displaylist_push_perfcounter(info, (type == DISPLAYLIST_PERFCOUNTERS_CORE) ? retro_get_perf_counter_libretro() : retro_get_perf_counter_rarch(), (type == DISPLAYLIST_PERFCOUNTERS_CORE) ? retro_get_perf_count_libretro() : retro_get_perf_count_rarch(), (type == DISPLAYLIST_PERFCOUNTERS_CORE) ? MENU_SETTINGS_LIBRETRO_PERF_COUNTERS_BEGIN : MENU_SETTINGS_PERF_COUNTERS_BEGIN); ret = 0; info->need_refresh = false; info->need_push = true; break; case DISPLAYLIST_DATABASE_ENTRY: { struct string_list *str_list = string_split(info->label, "|"); if (!str_list) goto error; strlcpy(info->path_b, str_list->elems[1].data, sizeof(info->path_b)); strlcpy(info->label, str_list->elems[0].data, sizeof(info->label)); string_list_free(str_list); } #ifdef HAVE_LIBRETRODB ret = menu_displaylist_parse_database_entry(info); #else ret = 0; #endif info->need_push = true; break; case DISPLAYLIST_DATABASE_QUERY: #ifdef HAVE_LIBRETRODB ret = menu_database_parse_query(info->list, info->path, string_is_empty(info->path_c) ? NULL : info->path_c); #else ret = 0; #endif strlcpy(info->path, info->path_b, sizeof(info->path)); info->need_sort = true; info->need_refresh = true; info->need_push = true; break; case DISPLAYLIST_OPTIONS_SHADERS: ret = menu_displaylist_parse_shader_options(info); info->need_push = true; break; case DISPLAYLIST_NETPLAY: #ifdef HAVE_NETWORKING ret = menu_displaylist_parse_netplay(info); #else menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_ITEMS), msg_hash_to_str(MENU_ENUM_LABEL_NO_ITEMS), MENU_ENUM_LABEL_NO_ITEMS, MENU_SETTING_NO_ITEM, 0, 0); ret = 0; #endif info->need_push = true; break; case DISPLAYLIST_CORE_CONTENT: #ifdef HAVE_NETWORKING print_buf_lines(info->list, core_buf, "", core_len, FILE_TYPE_DOWNLOAD_CORE_CONTENT, true, false); info->need_push = true; info->need_refresh = true; #endif break; case DISPLAYLIST_CORE_CONTENT_DIRS_SUBDIR: { #ifdef HAVE_NETWORKING char new_label[PATH_MAX_LENGTH]; struct string_list *str_list = string_split(info->path, ";"); new_label[0] = '\0'; if (str_list->elems[0].data) strlcpy(new_label, str_list->elems[0].data, sizeof(new_label)); if (str_list->elems[1].data) strlcpy(core_buf, str_list->elems[1].data, core_len); print_buf_lines(info->list, core_buf, new_label, core_len, FILE_TYPE_DOWNLOAD_URL, false, false); info->need_push = true; info->need_refresh = true; info->need_clear = true; string_list_free(str_list); #endif } break; case DISPLAYLIST_CORE_CONTENT_DIRS: { #ifdef HAVE_NETWORKING char new_label[PATH_MAX_LENGTH]; new_label[0] = '\0'; fill_pathname_join(new_label, settings->network.buildbot_assets_url, "cores", sizeof(new_label)); print_buf_lines(info->list, core_buf, new_label, core_len, FILE_TYPE_DOWNLOAD_URL, true, false); info->need_push = true; info->need_refresh = true; #endif } break; case DISPLAYLIST_CORES_UPDATER: #ifdef HAVE_NETWORKING print_buf_lines(info->list, core_buf, "", core_len, FILE_TYPE_DOWNLOAD_CORE, true, true); info->need_push = true; info->need_refresh = true; info->need_clear = true; #endif break; case DISPLAYLIST_THUMBNAILS_UPDATER: #ifdef HAVE_NETWORKING print_buf_lines(info->list, core_buf, "", core_len, FILE_TYPE_DOWNLOAD_THUMBNAIL_CONTENT, true, false); info->need_push = true; info->need_refresh = true; info->need_clear = true; #endif break; case DISPLAYLIST_LAKKA: #ifdef HAVE_NETWORKING print_buf_lines(info->list, core_buf, "", core_len, FILE_TYPE_DOWNLOAD_LAKKA, true, false); info->need_push = true; info->need_refresh = true; info->need_clear = true; #endif break; case DISPLAYLIST_PLAYLIST_COLLECTION: if (string_is_equal(info->path, file_path_str(FILE_PATH_CONTENT_HISTORY))) { if (menu_displaylist_ctl(DISPLAYLIST_HISTORY, info)) return menu_displaylist_push_list_process(info); goto error; } else { char path_playlist[PATH_MAX_LENGTH]; playlist_t *playlist = NULL; path_playlist[0] = '\0'; menu_driver_ctl(RARCH_MENU_CTL_PLAYLIST_FREE, NULL); fill_pathname_join( path_playlist, settings->directory.playlist, info->path, sizeof(path_playlist)); menu_driver_ctl(RARCH_MENU_CTL_PLAYLIST_INIT, (void*)path_playlist); strlcpy(menu->db_playlist_file, path_playlist, sizeof(menu->db_playlist_file)); strlcpy(path_playlist, msg_hash_to_str(MENU_ENUM_LABEL_COLLECTION), sizeof(path_playlist)); menu_driver_ctl(RARCH_MENU_CTL_PLAYLIST_GET, &playlist); playlist_qsort(playlist); ret = menu_displaylist_parse_playlist(info, playlist, path_playlist, false); if (ret == 0) { info->need_sort = true; info->need_refresh = true; info->need_push = true; } } break; case DISPLAYLIST_HISTORY: if (settings->history_list_enable) menu_displaylist_parse_playlist_history(menu, info, g_defaults.content_history, "history", settings->path.content_history, &ret); else { menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_HISTORY_AVAILABLE), msg_hash_to_str(MENU_ENUM_LABEL_NO_HISTORY_AVAILABLE), MENU_ENUM_LABEL_NO_HISTORY_AVAILABLE, MENU_INFO_MESSAGE, 0, 0); ret = 0; } if (ret == 0) { info->need_refresh = true; info->need_push = true; } break; case DISPLAYLIST_IMAGES_HISTORY: #ifdef HAVE_IMAGEVIEWER if (settings->history_list_enable) menu_displaylist_parse_playlist_history(menu, info, g_defaults.image_history, "images_history", settings->path.content_image_history, &ret); else { menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_HISTORY_AVAILABLE), msg_hash_to_str(MENU_ENUM_LABEL_NO_HISTORY_AVAILABLE), MENU_ENUM_LABEL_NO_HISTORY_AVAILABLE, MENU_INFO_MESSAGE, 0, 0); ret = 0; } if (ret == 0) { info->need_refresh = true; info->need_push = true; } #endif break; case DISPLAYLIST_MUSIC_HISTORY: #ifdef HAVE_FFMPEG if (settings->history_list_enable) menu_displaylist_parse_playlist_history(menu, info, g_defaults.music_history, "music_history", settings->path.content_music_history, &ret); else { menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_HISTORY_AVAILABLE), msg_hash_to_str(MENU_ENUM_LABEL_NO_HISTORY_AVAILABLE), MENU_ENUM_LABEL_NO_HISTORY_AVAILABLE, MENU_INFO_MESSAGE, 0, 0); ret = 0; } if (ret == 0) { info->need_refresh = true; info->need_push = true; } #endif break; case DISPLAYLIST_VIDEO_HISTORY: #ifdef HAVE_FFMPEG if (settings->history_list_enable) menu_displaylist_parse_playlist_history(menu, info, g_defaults.video_history, "video_history", settings->path.content_video_history, &ret); else { menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_HISTORY_AVAILABLE), msg_hash_to_str(MENU_ENUM_LABEL_NO_HISTORY_AVAILABLE), MENU_ENUM_LABEL_NO_HISTORY_AVAILABLE, MENU_INFO_MESSAGE, 0, 0); ret = 0; } if (ret == 0) { info->need_refresh = true; info->need_push = true; } #endif break; case DISPLAYLIST_OPTIONS_DISK: menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_DISK_INDEX), msg_hash_to_str(MENU_ENUM_LABEL_DISK_INDEX), MENU_ENUM_LABEL_DISK_INDEX, MENU_SETTINGS_CORE_DISK_OPTIONS_DISK_INDEX, 0, 0); menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_DISK_CYCLE_TRAY_STATUS), msg_hash_to_str(MENU_ENUM_LABEL_DISK_CYCLE_TRAY_STATUS), MENU_ENUM_LABEL_DISK_CYCLE_TRAY_STATUS, MENU_SETTINGS_CORE_DISK_OPTIONS_DISK_CYCLE_TRAY_STATUS, 0, 0); menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_DISK_IMAGE_APPEND), msg_hash_to_str(MENU_ENUM_LABEL_DISK_IMAGE_APPEND), MENU_ENUM_LABEL_DISK_IMAGE_APPEND, MENU_SETTINGS_CORE_DISK_OPTIONS_DISK_IMAGE_APPEND, 0, 0); info->need_push = true; break; case DISPLAYLIST_NETWORK_INFO: #ifdef HAVE_NETWORKING #ifndef HAVE_SOCKET_LEGACY menu_displaylist_parse_network_info(info); #endif #endif info->need_push = true; info->need_refresh = true; break; case DISPLAYLIST_SYSTEM_INFO: menu_displaylist_parse_system_info(info); info->need_push = true; info->need_refresh = true; break; #ifdef HAVE_CHEEVOS case DISPLAYLIST_ACHIEVEMENT_LIST: cheevos_populate_menu(info, false); info->need_push = true; info->need_refresh = true; break; case DISPLAYLIST_ACHIEVEMENT_LIST_HARDCORE: cheevos_populate_menu(info, true); info->need_push = true; info->need_refresh = true; break; #endif case DISPLAYLIST_CORES_SUPPORTED: info->need_sort = true; info->need_refresh = true; info->need_push = true; { unsigned cores_names_len = 0; unsigned cores_paths_len = 0; size_t cores_paths_size = 0; size_t cores_names_size = 0; struct string_list *cores_names = string_list_new_special(STRING_LIST_SUPPORTED_CORES_NAMES, (void*)menu->deferred_path, &cores_names_len, &cores_names_size); if (cores_names_size == 0) { if (!path_is_empty(RARCH_PATH_CORE)) { menu_entries_append_enum(info->list, path_get(RARCH_PATH_CORE), path_get(RARCH_PATH_CORE), MENU_ENUM_LABEL_DETECT_CORE_LIST_OK_CURRENT_CORE, FILE_TYPE_DIRECT_LOAD, 0, 0); { const char *core_name = NULL; struct retro_system_info *system = NULL; menu_driver_ctl(RARCH_MENU_CTL_SYSTEM_INFO_GET, &system); if (system) core_name = system->library_name; if (!string_is_empty(core_name)) menu_entries_set_alt_at_offset(info->list, 0, core_name); } } else { #ifndef HAVE_DYNAMIC const char *core_name = NULL; struct retro_system_info *system = NULL; menu_driver_ctl(RARCH_MENU_CTL_SYSTEM_INFO_GET, &system); if (system) { core_name = system->library_name; menu_entries_append_enum(info->list, core_name, core_name, MENU_ENUM_LABEL_DETECT_CORE_LIST_OK_CURRENT_CORE, FILE_TYPE_DIRECT_LOAD, 0, 0); } else #endif { menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_CORES_AVAILABLE), msg_hash_to_str(MENU_ENUM_LABEL_NO_CORES_AVAILABLE), MENU_ENUM_LABEL_NO_CORES_AVAILABLE, 0, 0, 0); info->download_core = true; } } } if (cores_names_size != 0) { unsigned j = 0; struct string_list *cores_paths = string_list_new_special(STRING_LIST_SUPPORTED_CORES_PATHS, (void*)menu->deferred_path, &cores_paths_len, &cores_paths_size); for (i = 0; i < cores_names_size; i++) { const char *core_path = cores_paths->elems[i].data; const char *core_name = cores_names->elems[i].data; if ( !path_is_empty(RARCH_PATH_CORE) && string_is_equal(core_path, path_get(RARCH_PATH_CORE))) { strlcpy(new_path_entry, core_path, sizeof(new_path_entry)); snprintf(new_entry, sizeof(new_entry), "Current core (%s)", core_name); if (type == DISPLAYLIST_CORES_COLLECTION_SUPPORTED) { new_lbl_entry[0] = '\0'; new_type = MENU_ENUM_LABEL_FILE_BROWSER_CORE_SELECT_FROM_COLLECTION_CURRENT_CORE; } else { strlcpy(new_lbl_entry, core_path, sizeof(new_lbl_entry)); new_type = MENU_ENUM_LABEL_DETECT_CORE_LIST_OK_CURRENT_CORE; } } else if (core_path) { switch (type) { case DISPLAYLIST_CORES_COLLECTION_SUPPORTED: menu_entries_append_enum(info->list, core_path, "", MENU_ENUM_LABEL_FILE_BROWSER_CORE_SELECT_FROM_COLLECTION, FILE_TYPE_CORE, 0, 0); break; default: menu_entries_append_enum(info->list, core_path, msg_hash_to_str(MENU_ENUM_LABEL_DETECT_CORE_LIST_OK), MENU_ENUM_LABEL_DETECT_CORE_LIST_OK, FILE_TYPE_CORE, 0, 0); break; } menu_entries_set_alt_at_offset(info->list, j, core_name); j++; } } string_list_free(cores_paths); } string_list_free(cores_names); } break; case DISPLAYLIST_CORES_COLLECTION_SUPPORTED: info->need_sort = true; info->need_refresh = true; info->need_push = true; { unsigned cores_names_len = 0; unsigned cores_paths_len = 0; size_t cores_paths_size = 0; size_t cores_names_size = 0; struct string_list *cores_names = string_list_new_special(STRING_LIST_SUPPORTED_CORES_NAMES, (void*)menu->deferred_path, &cores_names_len, &cores_names_size); if (cores_names_size == 0) { if (!path_is_empty(RARCH_PATH_CORE)) { menu_entries_append_enum(info->list, path_get(RARCH_PATH_CORE), path_get(RARCH_PATH_CORE), MENU_ENUM_LABEL_DETECT_CORE_LIST_OK, FILE_TYPE_DIRECT_LOAD, 0, 0); { const char *core_name = NULL; struct retro_system_info *system = NULL; menu_driver_ctl(RARCH_MENU_CTL_SYSTEM_INFO_GET, &system); if (system) core_name = system->library_name; if (!string_is_empty(core_name)) menu_entries_set_alt_at_offset(info->list, 0, core_name); } } else { menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_CORES_AVAILABLE), msg_hash_to_str(MENU_ENUM_LABEL_NO_CORES_AVAILABLE), MENU_ENUM_LABEL_NO_CORES_AVAILABLE, 0, 0, 0); info->download_core = true; } } if (cores_names_size != 0) { unsigned j = 0; struct string_list *cores_paths = string_list_new_special(STRING_LIST_SUPPORTED_CORES_PATHS, (void*)menu->deferred_path, &cores_paths_len, &cores_paths_size); for (i = 0; i < cores_names_size; i++) { const char *core_path = cores_paths->elems[i].data; const char *core_name = cores_names->elems[i].data; if ( !path_is_empty(RARCH_PATH_CORE) && string_is_equal(core_path, path_get(RARCH_PATH_CORE))) { strlcpy(new_path_entry, core_path, sizeof(new_path_entry)); snprintf(new_entry, sizeof(new_entry), "Current core (%s)", core_name); if (type == DISPLAYLIST_CORES_COLLECTION_SUPPORTED) { new_lbl_entry[0] = '\0'; new_type = MENU_ENUM_LABEL_FILE_BROWSER_CORE_SELECT_FROM_COLLECTION_CURRENT_CORE; } else { strlcpy(new_lbl_entry, core_path, sizeof(new_lbl_entry)); new_type = MENU_ENUM_LABEL_DETECT_CORE_LIST_OK_CURRENT_CORE; } } else if (core_path) { switch (type) { case DISPLAYLIST_CORES_COLLECTION_SUPPORTED: menu_entries_append_enum(info->list, core_path, "", MENU_ENUM_LABEL_FILE_BROWSER_CORE_SELECT_FROM_COLLECTION, FILE_TYPE_CORE, 0, 0); break; default: menu_entries_append_enum(info->list, core_path, msg_hash_to_str(MENU_ENUM_LABEL_DETECT_CORE_LIST_OK), MENU_ENUM_LABEL_DETECT_CORE_LIST_OK, FILE_TYPE_CORE, 0, 0); break; } menu_entries_set_alt_at_offset(info->list, j, core_name); j++; } } string_list_free(cores_paths); } string_list_free(cores_names); } break; case DISPLAYLIST_CORE_INFO: menu_displaylist_parse_core_info(info); info->need_push = true; break; case DISPLAYLIST_CORE_OPTIONS: if (runloop_ctl(RUNLOOP_CTL_HAS_CORE_OPTIONS, NULL)) { size_t opts = 0; runloop_ctl(RUNLOOP_CTL_GET_CORE_OPTION_SIZE, &opts); if (settings->game_specific_options) { if (!runloop_ctl(RUNLOOP_CTL_IS_GAME_OPTIONS_ACTIVE, NULL)) menu_entries_append_enum(info->list, msg_hash_to_str( MENU_ENUM_LABEL_VALUE_GAME_SPECIFIC_OPTIONS_CREATE), msg_hash_to_str( MENU_ENUM_LABEL_GAME_SPECIFIC_OPTIONS_CREATE), MENU_ENUM_LABEL_GAME_SPECIFIC_OPTIONS_CREATE, MENU_SETTINGS_CORE_OPTION_CREATE, 0, 0); else menu_entries_append_enum(info->list, msg_hash_to_str( MENU_ENUM_LABEL_VALUE_GAME_SPECIFIC_OPTIONS_IN_USE), msg_hash_to_str( MENU_ENUM_LABEL_GAME_SPECIFIC_OPTIONS_IN_USE), MENU_ENUM_LABEL_GAME_SPECIFIC_OPTIONS_IN_USE, MENU_SETTINGS_CORE_OPTION_CREATE, 0, 0); } if (opts == 0) { menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_CORE_OPTIONS_AVAILABLE), msg_hash_to_str(MENU_ENUM_LABEL_NO_CORE_OPTIONS_AVAILABLE), MENU_ENUM_LABEL_NO_CORE_OPTIONS_AVAILABLE, MENU_SETTINGS_CORE_OPTION_NONE, 0, 0); } else { core_option_manager_t *coreopts = NULL; runloop_ctl(RUNLOOP_CTL_CORE_OPTIONS_LIST_GET, &coreopts); for (i = 0; i < opts; i++) menu_entries_append_enum(info->list, core_option_manager_get_desc(coreopts, i), "", MENU_ENUM_LABEL_CORE_OPTION_ENTRY, MENU_SETTINGS_CORE_OPTION_START + i, 0, 0); } } else menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_CORE_OPTIONS_AVAILABLE), msg_hash_to_str(MENU_ENUM_LABEL_NO_CORE_OPTIONS_AVAILABLE), MENU_ENUM_LABEL_NO_CORE_OPTIONS_AVAILABLE, MENU_SETTINGS_CORE_OPTION_NONE, 0, 0); info->need_push = true; break; case DISPLAYLIST_DATABASES: filebrowser_clear_type(); info->type_default = FILE_TYPE_RDB; strlcpy(info->exts, file_path_str(FILE_PATH_RDB_EXTENSION), sizeof(info->exts)); info->enum_idx = MENU_ENUM_LABEL_CONTENT_COLLECTION_LIST; strlcpy(info->path, settings->path.content_database, sizeof(info->path)); break; case DISPLAYLIST_ARCHIVE_ACTION: #ifdef HAVE_COMPRESSION menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OPEN_ARCHIVE), msg_hash_to_str(MENU_ENUM_LABEL_OPEN_ARCHIVE), MENU_ENUM_LABEL_OPEN_ARCHIVE, 0, 0, 0); #endif menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LOAD_ARCHIVE), msg_hash_to_str(MENU_ENUM_LABEL_LOAD_ARCHIVE), MENU_ENUM_LABEL_LOAD_ARCHIVE, 0, 0, 0); info->need_push = true; break; case DISPLAYLIST_ARCHIVE_ACTION_DETECT_CORE: #ifdef HAVE_COMPRESSION menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OPEN_ARCHIVE), msg_hash_to_str(MENU_ENUM_LABEL_OPEN_ARCHIVE_DETECT_CORE), MENU_ENUM_LABEL_OPEN_ARCHIVE_DETECT_CORE, 0, 0, 0); #endif menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LOAD_ARCHIVE), msg_hash_to_str(MENU_ENUM_LABEL_LOAD_ARCHIVE_DETECT_CORE), MENU_ENUM_LABEL_LOAD_ARCHIVE_DETECT_CORE, 0, 0, 0); info->need_push = true; break; case DISPLAYLIST_DATABASE_CURSORS: filebrowser_clear_type(); info->type_default = FILE_TYPE_CURSOR; strlcpy(info->exts, "dbc", sizeof(info->exts)); strlcpy(info->path, settings->directory.cursor, sizeof(info->path)); break; case DISPLAYLIST_CORES: { char ext_name[PATH_MAX_LENGTH]; ext_name[0] = '\0'; filebrowser_clear_type(); info->type_default = FILE_TYPE_PLAIN; if (frontend_driver_get_core_extension(ext_name, sizeof(ext_name))) strlcpy(info->exts, ext_name, sizeof(info->exts)); } break; case DISPLAYLIST_CONFIG_FILES: filebrowser_clear_type(); info->type_default = FILE_TYPE_CONFIG; strlcpy(info->exts, "cfg", sizeof(info->exts)); break; case DISPLAYLIST_SHADER_PRESET: { struct string_list *str_list; #if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_VULKAN) union string_list_elem_attr attr; attr.i = 0; #endif str_list = string_list_new(); filebrowser_clear_type(); info->type_default = FILE_TYPE_SHADER_PRESET; #ifdef HAVE_CG string_list_append(str_list, "cgp", attr); #endif #ifdef HAVE_GLSL string_list_append(str_list, "glslp", attr); #endif #ifdef HAVE_VULKAN string_list_append(str_list, "slangp", attr); #endif string_list_join_concat(info->exts, sizeof(info->exts), str_list, "|"); string_list_free(str_list); } break; case DISPLAYLIST_SHADER_PASS: { struct string_list *str_list; #if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_VULKAN) union string_list_elem_attr attr; attr.i = 0; #endif str_list = string_list_new(); filebrowser_clear_type(); info->type_default = FILE_TYPE_SHADER; #ifdef HAVE_CG string_list_append(str_list, "cg", attr); #endif #ifdef HAVE_GLSL string_list_append(str_list, "glsl", attr); #endif #ifdef HAVE_VULKAN string_list_append(str_list, "slang", attr); #endif string_list_join_concat(info->exts, sizeof(info->exts), str_list, "|"); string_list_free(str_list); } break; case DISPLAYLIST_VIDEO_FILTERS: filebrowser_clear_type(); info->type_default = FILE_TYPE_VIDEOFILTER; strlcpy(info->exts, "filt", sizeof(info->exts)); break; case DISPLAYLIST_IMAGES: if (filebrowser_get_type() != FILEBROWSER_SELECT_FILE) filebrowser_clear_type(); info->type_default = FILE_TYPE_IMAGE; { union string_list_elem_attr attr; struct string_list *str_list = string_list_new(); attr.i = 0; #ifdef HAVE_RBMP string_list_append(str_list, "bmp", attr); #endif #ifdef HAVE_RPNG string_list_append(str_list, "png", attr); #endif #ifdef HAVE_RJPEG string_list_append(str_list, "jpeg", attr); string_list_append(str_list, "jpg", attr); #endif #ifdef HAVE_RTGA string_list_append(str_list, "tga", attr); #endif string_list_join_concat(info->exts, sizeof(info->exts), str_list, "|"); string_list_free(str_list); } break; case DISPLAYLIST_AUDIO_FILTERS: filebrowser_clear_type(); info->type_default = FILE_TYPE_AUDIOFILTER; strlcpy(info->exts, "dsp", sizeof(info->exts)); break; case DISPLAYLIST_CHEAT_FILES: filebrowser_clear_type(); info->type_default = FILE_TYPE_CHEAT; strlcpy(info->exts, "cht", sizeof(info->exts)); break; case DISPLAYLIST_CONTENT_HISTORY: filebrowser_clear_type(); info->type_default = FILE_TYPE_PLAIN; strlcpy(info->exts, "lpl", sizeof(info->exts)); break; case DISPLAYLIST_FONTS: filebrowser_clear_type(); info->type_default = FILE_TYPE_FONT; strlcpy(info->exts, "ttf", sizeof(info->exts)); break; case DISPLAYLIST_OVERLAYS: filebrowser_clear_type(); info->type_default = FILE_TYPE_OVERLAY; strlcpy(info->exts, "cfg", sizeof(info->exts)); break; case DISPLAYLIST_RECORD_CONFIG_FILES: filebrowser_clear_type(); info->type_default = FILE_TYPE_RECORD_CONFIG; strlcpy(info->exts, "cfg", sizeof(info->exts)); break; case DISPLAYLIST_REMAP_FILES: filebrowser_clear_type(); info->type_default = FILE_TYPE_REMAP; strlcpy(info->exts, "rmp", sizeof(info->exts)); break; default: break; } switch (type) { case DISPLAYLIST_DATABASE_PLAYLISTS_HORIZONTAL: if (menu_displaylist_parse_playlists(info, true) == 0) { info->need_refresh = true; info->need_push = true; } break; case DISPLAYLIST_DATABASE_PLAYLISTS: if (menu_displaylist_parse_playlists(info, false) == 0) { info->need_refresh = true; info->need_push = true; } break; case DISPLAYLIST_CORES: if (menu_displaylist_parse_cores(menu, info, type) == 0) { info->need_refresh = true; info->need_push = true; } info->push_builtin_cores = true; break; case DISPLAYLIST_DATABASES: case DISPLAYLIST_SHADER_PASS: case DISPLAYLIST_SHADER_PRESET: case DISPLAYLIST_DATABASE_CURSORS: case DISPLAYLIST_VIDEO_FILTERS: case DISPLAYLIST_AUDIO_FILTERS: case DISPLAYLIST_IMAGES: case DISPLAYLIST_OVERLAYS: case DISPLAYLIST_FONTS: case DISPLAYLIST_CHEAT_FILES: case DISPLAYLIST_REMAP_FILES: case DISPLAYLIST_RECORD_CONFIG_FILES: case DISPLAYLIST_CONFIG_FILES: case DISPLAYLIST_DEFAULT: case DISPLAYLIST_CORES_DETECTED: case DISPLAYLIST_CONTENT_HISTORY: if (string_is_empty(info->path)) { if (frontend_driver_parse_drive_list(info->list) != 0) menu_entries_append_enum(info->list, "/", "", MSG_UNKNOWN, FILE_TYPE_DIRECTORY, 0, 0); info->need_refresh = true; info->need_push = true; } else { filebrowser_parse(info, type); info->need_refresh = true; info->need_push = true; } break; default: break; } if (ret != 0) goto error; return true; error: return false; } pkg/msvc/RetroArch-360/RetroArch-360.vcxproj000664 001750 001750 00000072136 13044721241 021455 0ustar00sergiosergio000000 000000  CodeAnalysis Xbox 360 Debug Xbox 360 Profile Xbox 360 Profile_FastCap Xbox 360 Release Xbox 360 Release_LTCG Xbox 360 {9CE8EEF7-CC1C-4A04-BB5C-62411CB5BADE} Xbox360Proj RetroArch-360 Application MultiByte Application MultiByte Application MultiByte Application MultiByte Application MultiByte true Application true MultiByte true $(OutDir)CORE.xex true false $(OutDir)CORE.xex false $(OutDir)CORE.xex false $(OutDir)CORE.xex false $(OutDir)CORE.xex NotUsing Level3 ProgramDatabase Disabled false true false MultiThreadedDebug _DEBUG;_XBOX;HAVE_XINPUT2;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;RARCH_CONSOLE;HAVE_XUI;HAVE_MENU;HAVE_NETWORKING;HAVE_NETWORKING;HAVE_SOCKET_LEGACY;HAVE_ZLIB;HAVE_RARCH_EXEC;D3DCOMPILE_USEVOIDS;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_HLSL;HAVE_CC_RESAMPLER;HAVE_D3D9;HAVE_D3D;RARCH_INTERNAL;MSB_FIRST;_XBOX360;WANT_ZLIB;SINC_LOWER_QUALITY;HAVE_XAUDIO;HAVE_RPNG;HAVE_RJPEG;HAVE_THREADS;HAVE_FILTERS_BUILTIN Callcap $(SolutionDir)\..\..\deps\zlib;$(SolutionDir)\..\..\libretro-common\include;$(SolutionDir)\..\..\;%(AdditionalIncludeDirectories) true $(OutDir)$(ProjectName).pdb xapilibd.lib;d3d9d.lib;d3dx9d.lib;xgraphicsd.lib;xboxkrnl.lib;xnetd.lib;xaudiod2.lib;xactd3.lib;x3daudiod.lib;xmcored.lib;xbdm.lib;vcompd.lib;xuirund.lib;xuirenderd.lib;$(TargetDir)libretro_xdk360.lib;%(AdditionalDependencies) 524288 CopyToHardDrive $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\media=$(OutDir)media true /privilege=6 %(AdditionalOptions) true NotUsing Level4 ProgramDatabase Disabled false true AnalyzeOnly false MultiThreadedDebug _DEBUG;_XBOX;%(PreprocessorDefinitions);HAVE_XINPUT2;_CRT_SECURE_NO_WARNINGS;RARCH_CONSOLE;HAVE_XUI;HAVE_MENU;HAVE_ZLIB;HAVE_RARCH_EXEC;D3DCOMPILE_USEVOIDS;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_HLSL;HAVE_CC_RESAMPLER;HAVE_D3D9;HAVE_D3D;RARCH_INTERNAL;MSB_FIRST;_XBOX360;WANT_ZLIB;SINC_LOWER_QUALITY;HAVE_RPNG;HAVE_RJPEG;HAVE_THREADS;HAVE_FILTERS_BUILTIN Callcap $(SolutionDir)\..\..\deps\zlib;$(SolutionDir)\..\..\libretro-common\include;$(SolutionDir)\..\..\;%(AdditionalIncludeDirectories) true $(OutDir)$(ProjectName).pdb xapilibd.lib;d3d9d.lib;d3dx9d.lib;xgraphicsd.lib;xboxkrnl.lib;xnetd.lib;xaudiod2.lib;xactd3.lib;x3daudiod.lib;xmcored.lib;xbdm.lib;vcompd.lib;%(AdditionalDependencies) 524288 $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\media=$(OutDir)media true CopyToHardDrive /privilege=6 %(AdditionalOptions) true Level3 NotUsing Full true false true ProgramDatabase Size false MultiThreaded NDEBUG;_XBOX;PROFILE;%(PreprocessorDefinitions);HAVE_XINPUT2;_CRT_SECURE_NO_WARNINGS;RARCH_CONSOLE;HAVE_XUI;HAVE_MENU;HAVE_ZLIB;HAVE_RARCH_EXEC;D3DCOMPILE_USEVOIDS;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_HLSL;HAVE_CC_RESAMPLER;HAVE_D3D9;HAVE_D3D;RARCH_INTERNAL;MSB_FIRST;_XBOX360;WANT_ZLIB;SINC_LOWER_QUALITY;HAVE_XAUDIO;HAVE_RPNG;HAVE_RJPEG;HAVE_THREADS;HAVE_FILTERS_BUILTIN Callcap $(SolutionDir)\..\..\deps\zlib;$(SolutionDir)\..\..\libretro-common\include;$(SolutionDir)\..\..\;%(AdditionalIncludeDirectories) true false xapilib.lib;%(IgnoreSpecificDefaultLibraries) true $(OutDir)$(ProjectName).pdb true xapilibi.lib;d3d9i.lib;d3dx9.lib;xgraphics.lib;xboxkrnl.lib;xnet.lib;xaudio2.lib;xact3i.lib;x3daudioi.lib;xmcorei.lib;xbdm.lib;vcomp.lib;$(TargetDir)libretro_xdk360.lib;%(AdditionalDependencies) 524288 $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\media=$(OutDir)media true CopyToHardDrive /privilege=6 %(AdditionalOptions) true Level3 NotUsing Full true false true ProgramDatabase Fastcap Size false MultiThreaded NDEBUG;_XBOX;PROFILE;FASTCAP;%(PreprocessorDefinitions);HAVE_XINPUT2;_CRT_SECURE_NO_WARNINGS;HAVE_ZLIB;HAVE_RARCH_EXEC;D3DCOMPILE_USEVOIDS;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_HLSL;HAVE_CC_RESAMPLER;HAVE_D3D9;HAVE_D3D;RARCH_INTERNAL;MSB_FIRST;_XBOX360;WANT_ZLIB;SINC_LOWER_QUALITY;HAVE_XUI;HAVE_MENU;HAVE_XAUDIO;HAVE_RPNG;HAVE_RJPEG;HAVE_THREADS;HAVE_FILTERS_BUILTIN $(SolutionDir)\..\..\deps\zlib;$(SolutionDir)\..\..\libretro-common\include;$(SolutionDir)\..\..\;%(AdditionalIncludeDirectories) true false true $(OutDir)$(ProjectName).pdb true xapilib.lib;d3d9.lib;d3dx9.lib;xgraphics.lib;xboxkrnl.lib;xnet.lib;xaudio2.lib;xact3.lib;x3daudio.lib;xmcore.lib;vcomp.lib;xbdm.lib;%(AdditionalDependencies) 524288 $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\media=$(OutDir)media true CopyToHardDrive /privilege=6 %(AdditionalOptions) true Level3 NotUsing Full true true ProgramDatabase Size false false MultiThreaded NDEBUG;_XBOX;%(PreprocessorDefinitions);HAVE_XINPUT2;_CRT_SECURE_NO_WARNINGS;RARCH_CONSOLE=1;HAVE_NETWORKING;HAVE_SOCKET_LEGACY;HAVE_ZLIB;HAVE_RARCH_EXEC;D3DCOMPILE_USEVOIDS;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_HLSL;HAVE_CC_RESAMPLER;HAVE_D3D9;HAVE_D3D;RARCH_INTERNAL;MSB_FIRST;_XBOX360;WANT_ZLIB;SINC_LOWER_QUALITY;HAVE_XUI;HAVE_MENU;HAVE_XAUDIO;HAVE_RPNG;HAVE_RJPEG;HAVE_THREADS;HAVE_FILTERS_BUILTIN $(SolutionDir)\..\..\deps\zlib;$(SolutionDir)\..\..\libretro-common\include;$(SolutionDir)\..\..\;%(AdditionalIncludeDirectories) true true true $(OutDir)$(ProjectName).pdb true xapilib.lib;d3d9.lib;d3dx9.lib;xgraphics.lib;xboxkrnl.lib;xnet.lib;xaudio2.lib;xact3.lib;x3daudio.lib;xmcore.lib;vcomp.lib;xbdm.lib;xuirun.lib;xuirender.lib;$(TargetDir)libretro_xdk360.lib;%(AdditionalDependencies) 524288 CopyToHardDrive $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\media=$(OutDir)media true /privilege=6 %(AdditionalOptions) true Level3 NotUsing Full true true ProgramDatabase Size false false MultiThreaded NDEBUG;_XBOX;LTCG;%(PreprocessorDefinitions);HAVE_XINPUT2;_CRT_SECURE_NO_WARNINGS;RARCH_CONSOLE;HAVE_XUI;HAVE_MENU;HAVE_NETWORKING;HAVE_SOCKET_LEGACY;HAVE_ZLIB;HAVE_RARCH_EXEC;D3DCOMPILE_USEVOIDS;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_HLSL;HAVE_CC_RESAMPLER;HAVE_D3D9;HAVE_D3D;RARCH_INTERNAL;MSB_FIRST;_XBOX360;WANT_ZLIB;SINC_LOWER_QUALITY;HAVE_XAUDIO;HAVE_RPNG;HAVE_RJPEG;HAVE_THREADS;HAVE_FILTERS_BUILTIN $(SolutionDir)\..\..\deps\zlib;$(SolutionDir)\..\..\libretro-common\include;$(SolutionDir)\..\..\;%(AdditionalIncludeDirectories) true true true $(OutDir)$(ProjectName).pdb true xapilib.lib;d3d9ltcg.lib;d3dx9.lib;xgraphics.lib;xboxkrnl.lib;xnet.lib;xaudio2.lib;xact3ltcg.lib;x3daudioltcg.lib;xmcoreltcg.lib;vcomp.lib;xuirun.lib;xuirender.lib;$(TargetDir)libretro_xdk360.lib;%(AdditionalDependencies) 524288 true $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\media=$(OutDir)media CopyToHardDrive true /privilege=6 %(AdditionalOptions) true Document copy %(FullPath) $(OutDir)media\rarch.ttf $(OutDir)media\rarch.ttf;%(Outputs) $(OutDir)media\rarch.ttf;%(Outputs) copy %(FullPath) $(OutDir)media\rarch.ttf Document xui2bin /D /NOLOGO "%(RelativeDir)rarch_scene_skin.xui" "$(OutDir)media\rarch_scene_skin.xur" xui2bin /D /NOLOGO "%(RelativeDir)rarch_scene_skin.xui" "$(OutDir)media\rarch_scene_skin.xur" xui2bin /D /NOLOGO "%(RelativeDir)rarch_scene_skin.xui" "$(OutDir)media\rarch_scene_skin.xur" xui2bin /D /NOLOGO "%(RelativeDir)rarch_scene_skin.xui" "$(OutDir)media\rarch_scene_skin.xur" xui2bin /D /NOLOGO "%(RelativeDir)rarch_scene_skin.xui" "$(OutDir)media\rarch_scene_skin.xur" xui2bin /D /NOLOGO "%(RelativeDir)rarch_scene_skin.xui" "$(OutDir)media\rarch_scene_skin.xur" $(OutDir)media\rarch_scene_skin.xur; $(OutDir)media\rarch_scene_skin.xur; $(OutDir)media\rarch_scene_skin.xur; $(OutDir)media\rarch_scene_skin.xur; $(OutDir)media\rarch_scene_skin.xur; $(OutDir)media\rarch_scene_skin.xur; Document $(OutDir)media\sd\rarch_main.xur; $(OutDir)media\sd\rarch_main.xur; $(OutDir)media\sd\rarch_main.xur; $(OutDir)media\sd\rarch_main.xur; $(OutDir)media\sd\rarch_main.xur; $(OutDir)media\sd\rarch_main.xur; xui2bin /D /NOLOGO "%(RelativeDir)rarch_main.xui" "$(OutDir)media\sd\rarch_main.xur" xui2bin /D /NOLOGO "%(RelativeDir)rarch_main.xui" "$(OutDir)media\sd\rarch_main.xur" xui2bin /D /NOLOGO "%(RelativeDir)rarch_main.xui" "$(OutDir)media\sd\rarch_main.xur" xui2bin /D /NOLOGO "%(RelativeDir)rarch_main.xui" "$(OutDir)media\sd\rarch_main.xur" xui2bin /D /NOLOGO "%(RelativeDir)rarch_main.xui" "$(OutDir)media\sd\rarch_main.xur" xui2bin /D /NOLOGO "%(RelativeDir)rarch_main.xui" "$(OutDir)media\sd\rarch_main.xur" Document Bundler %(FullPath) /o $(OutDir)media\Arial_12.xpr Bundler %(FullPath) /o $(OutDir)media\Arial_12.xpr Bundler %(FullPath) /o $(OutDir)media\Arial_12.xpr Bundler %(FullPath) /o $(OutDir)media\Arial_12.xpr Bundler %(FullPath) /o $(OutDir)media\Arial_12.xpr Bundler %(FullPath) /o $(OutDir)media\Arial_12.xpr $(OutDir)media\Arial_12.xpr;%(Outputs) $(OutDir)media\Arial_12.xpr;%(Outputs) $(OutDir)media\Arial_12.xpr;%(Outputs) $(OutDir)media\Arial_12.xpr;%(Outputs) $(OutDir)media\Arial_12.xpr;%(Outputs) $(OutDir)media\Arial_12.xpr;%(Outputs) Document $(OutDir)media\hd\rarch_main.xur; $(OutDir)media\hd\rarch_main.xur; $(OutDir)media\hd\rarch_main.xur; $(OutDir)media\hd\rarch_main.xur; $(OutDir)media\hd\rarch_main.xur; $(OutDir)media\hd\rarch_main.xur; xui2bin /D /NOLOGO "%(RelativeDir)rarch_main.xui" "$(OutDir)media\hd\rarch_main.xur" xui2bin /D /NOLOGO "%(RelativeDir)rarch_main.xui" "$(OutDir)media\hd\rarch_main.xur" xui2bin /D /NOLOGO "%(RelativeDir)rarch_main.xui" "$(OutDir)media\hd\rarch_main.xur" xui2bin /D /NOLOGO "%(RelativeDir)rarch_main.xui" "$(OutDir)media\hd\rarch_main.xur" xui2bin /D /NOLOGO "%(RelativeDir)rarch_main.xui" "$(OutDir)media\hd\rarch_main.xur" xui2bin /D /NOLOGO "%(RelativeDir)rarch_main.xui" "$(OutDir)media\hd\rarch_main.xur" menu/cbs/menu_cbs_up.c000664 001750 001750 00000003100 13044721241 016050 0ustar00sergiosergio000000 000000 /* RetroArch - A frontend for libretro. * Copyright (C) 2011-2017 - Daniel De Matteis * * 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- * ation, either version 3 of the License, or (at your option) any later version. * * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with RetroArch. * If not, see . */ #include "../menu_driver.h" #include "../menu_cbs.h" #include "../menu_navigation.h" #ifndef BIND_ACTION_UP #define BIND_ACTION_UP(cbs, name) \ cbs->action_up = name; \ cbs->action_up_ident = #name; #endif static int action_bind_up_generic(unsigned type, const char *label) { size_t scroll_accel = 0; unsigned scroll_speed = 0; if (!menu_navigation_ctl(MENU_NAVIGATION_CTL_GET_SCROLL_ACCEL, &scroll_accel)) return -1; scroll_speed = (MAX(scroll_accel, 2) - 2) / 4 + 1; if (menu_entries_get_size() <= 0) return 0; menu_navigation_ctl(MENU_NAVIGATION_CTL_DECREMENT, &scroll_speed); return 0; } int menu_cbs_init_bind_up(menu_file_list_cbs_t *cbs, const char *path, const char *label, unsigned type, size_t idx) { if (!cbs) return -1; BIND_ACTION_UP(cbs, action_bind_up_generic); return -1; } pkg/apple/RetroArch_iOS9-Info.plist000664 001750 001750 00000003734 13044721241 020273 0ustar00sergiosergio000000 000000 CFBundleDevelopmentRegion en CFBundleDisplayName RetroArch CFBundleDocumentTypes CFBundleTypeName All Files LSItemContentTypes public.data public.content CFBundleExecutable RetroArch CFBundleIcons CFBundleIcons~ipad CFBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName RetroArch CFBundlePackageType APPL CFBundleShortVersionString 1.3.6 CFBundleSignature ???? CFBundleVersion 1.3.6 LSRequiresIPhoneOS UIApplicationExitsOnSuspend UIFileSharingEnabled UIRequiredDeviceCapabilities armv7 UIStatusBarHidden UISupportedInterfaceOrientations UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortraitUpsideDown UISupportedInterfaceOrientations~ipad UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIViewControllerBasedStatusBarAppearance libretro-common/file/nbio/000775 001750 001750 00000000000 13044721241 016656 5ustar00sergiosergio000000 000000 network/net_http_special.h000664 001750 001750 00000002107 13044721241 017067 0ustar00sergiosergio000000 000000 /* RetroArch - A frontend for libretro. * Copyright (C) 2011-2017 - Daniel De Matteis * Copyright (C) 2015-2017 - Andre Leiradella * * 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- * ation, either version 3 of the License, or (at your option) any later version. * * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with RetroArch. * If not, see . */ #ifndef __NET_HTTP_SPECIAL_H #define __NET_HTTP_SPECIAL_H #include enum { NET_HTTP_GET_OK = 0, NET_HTTP_GET_MALFORMED_URL, NET_HTTP_GET_CONNECT_ERROR, NET_HTTP_GET_TIMEOUT }; int net_http_get(const char **result, size_t *size, const char *url, retro_time_t *timeout); #endif qb/config.comp.sh000664 001750 001750 00000000216 13044721241 015037 0ustar00sergiosergio000000 000000 USE_LANG_C="yes" # C++ compiler is optional in other platforms supported by ./configure if [ "$OS" = 'Win32' ]; then USE_LANG_CXX="yes" fi ctr/assets/dosbox_banner.png000664 001750 001750 00000057624 13044721241 017341 0ustar00sergiosergio000000 000000 PNG  IHDR䵷 sBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATxw]U>m3LI&" "Q, ,4 Ho(DJ IL~sg&a9sOsZzkAe ,@"74CB&ܢ &5 %6sL(LueM &{=aK[Ґw'Cl+?61Rs&##,1z#'͂@sh h _tۢ)~ 78o;gBV$bϰ\`^zHW)ٯ bҐw+J}\Mc !b+B@ i AHyĀZ4k1U0􆄙cnc: \oKTW5Xz<|) }宷! ٘d u|Y"8PF F1$j$ZƊ sv0&s5`n,*~.I(Z@kB*>n /xJ/a5L(*P{*XCވsS. "cP`^ y@x~! F## rl`@F hEŠmXd0VYImzw@@>'XaW Dm_k(J _`Q%&2;#, 3!>:' oHu{8n`82"&ȘϢ(# 0 "@ UD@㶄>;T-2A@ Q|&F / hkت2#Fހ ݝ87H%@ؘ< "1Gޟ!("Bi!$FFh@P@ *>@ &΄!jP1_ a?@ @h>Yxo>3P5 8I=z׆4$QU:4P! '0]1FT`5AJܢ#G5|@N2䜸Ck6G]>sBEDFd@ d .4E(5Ŋ΄b_GYC2RR1e!Ō]d K ! G 2RQH(K( ](WgqF ŸeU޵W@9p!S*?iYbgC^'4d=Ey!? `p 6biPso AYiCf!t!6%-  -@s!HBQM l(5v96~# -PbT(}EcRr̢BPRTAk$1DhHCޅxv&FP6y`?"m8 C@S 4J$mB7:$נj@S7\ʯdBqe,@sʼw@ȢBpm~v Q~pj! p Qb:d٤\?ISأ/[ A)2@چ!J0hcĆ(0E+9u]¶1_wqYİS~a!MM &7?v 0,o0@]GhG3dh2e "C@t@!g -4B˽P Yi_Sdxد\c\6q#՞_l(B. ,YI/$ns?7 2ဩMhc#(`~fBXdz&S@l.kM(A dFхL13NBN,TD3Wz^ߑ~"K׵ZFFZ@#t{ـ}Q iȰӬ.0ehd`D@ I=F@fŢFV d\(`SX(TFa@PIŸzZ#F@&~d%Kh&h!_ ;܀ y$k>+7}it 1j56  "@9Ѐ^*&Z`4d<1`?G9)hw޿dc,F!SoY&,7@UA@hP3  ߐH\ryJRWС@@f #14Aeh!Td'GEM5-/s$`oZ_&vwC'y}@@$Z5$Iji B 4!K'N*?`"Km^YI phD 062Ɓ2,@!Xe\];.>k9.)ٓm^0}m p1v)6A10%X#,hHM!= Rce Đ*?4$#i(K,>U{R5 jP!2*3aYC/б?y|{_Xv>^Ɗmڅ64pH@y}aCa 7h`'D4dy|Ug=J/{Hhh! 74iþǔ`1HT6 2 RQbbZѮ %{6 O \?*#|m8%H Z"JA 0Y~Mv܀8.12!S+ H)>i@2,|@Vc6(7?2 g(7$0א-JF Ƃ8ˇ>+v}F) h--{ 1,!!^@AD!Q.=("h!=%&`}F#X87u.Ѐ4ZEfp+)` gPʤK`dQ6찺 %Kf%#( Xc0tN ;Rt(~+q|C:mQX! ,?@8P$-?h OH2|gu["u9BZBrak0.JK@h{ e%QCF@F{lGr%w5^QCl\_0?ń1zmO ugB6kF&( ם,xL -g R5d(7B#aC&2fmW D)DD3$ c,3Uk<>' R\bsaA$ DdDpE@c$$uTڐ)@j"H )m!(A(:h2`3B6dh=o Sg3yu ~J]8ж-!@4R)}TX5&)3wPETڮMgzXI<5E&\J-6 DhS4ì`6 e aGmS0aYS4@:foĥ`j ,d` &gP\ ,@<~DE@ IkyYgvu8\Kޘ6}=`-K._|}A$y}KQq( wbKu@Y,ҫZԽo5<HM<Can-[N))&2_Q=jK95&'qͿcKBFBG†9ر7KpyJ 40̧!h="FjU]?}~w}1ðbӦw-fo]Dxއ= qr5BC.cy#Mi QB` f <@J:6?:$$6SGm5iG876x{W63 2\|@E~^@@ke,]X%8ft)=jt:HjvkAG~o9|{!z;IK)qg3/҉',fmRB)+3||W_~%`҇6;&5eȦBU:0 D#h: I4kr1)PABaߏL@T0zdvg)>Bh,2B@[%CE Wiz?;S[ mc;џD4]L:ֵA&+;[JqY}?goHinWJIS2ħsw}wNH%aʸYGsuٷ :KPYB=`c:|)WY{dkځA+u͓x?9$Y2|@D65~^V\ lxMVF5yp7΍сO 2sv)|r\X>yBe*nn~߯w)<̳Go2M2ɵťM! kL3&耴\ KHMmO }0}Jx@feO;rХs[  gm8\AP,@J#%}RW'57ߚ>k߂-'޷.T:C[MS=) ;T!7}Ufnnꗿ?qLIˎs_{?/rMMڦǔ??pUN')lKI1 1[t0(0a XL(+665Hp'R~K]/)h # !Hfd87\? PWrR:wkQr븉)H3BSǤ,-~G=?*م?R;)V;k^w/hqm7 =,;ު#>nk/XtY6{!j 2NL!a@CJH:0 P]5 Yҁ {Rǡ"[ =kb*\HMF ~%N6I1! QPVa l9~l'\%5/^u [ƌ y(Jgdn̄(|xOƹMrO+wuZjMH„ڎqiN[] i&Ue&Us)ic@qlE[%V,!'Uژg4~8pJo*7!_6 KNfru|2E65սD>Jx]d Ʃ?&A+ hH阏) 6f0#@ZV\L()Sb=ހ…&o ¨e8"EH "o.x}CTlMXF(Ȓ?8Id< 1#"RAWrͳw,I!F8?Y7Iqjb9Eʢu -PAdzڲBLqSجY1J >P K0yÄ`10?WM)jMSe8`)R "aw OϼԁL끭w9ݯѯ/o n ;!2_Y؟bvF YϮOF.ϮSC4y}TYx"9.57@ p`5IH& @$׏ۄ WAl22 orm0T~Lp_+i=wߩ}I 0׳ .該a{h*Gp%/,`" \GqRG% {j IDAT!i  &5BY` 7ȈRwbpT alxc v"Zl(ϟXƫF?͕M'~d}"iSu9`w젝Nj_ X`B;L_ L:g 0`% Xƕ{QEAF V`WI(O?%8 6y!@Uja&X_O`jz ~sž~4uя.P9(d ҹfq~ ʥo9]yHKXdٽ  $iCq_{>@P˃"PzƷB}4~_x x W4)nWoŘlˈeg*{T.Y>Ѻ ŤBRwęgΫ 6R?8f͜Yu<8lr,(ʀU)Tza)y[Ы*Jy`Dϵ?֪Pp1`O3 dDXk,2B`#H"`LɡjzXO?t>h:;甅Ҩ׾:ϥ,]M{(:u.UꮘFgi CYQ[o +q{O _0nD$"y}cل+ѮO$!_:;W'^z1k9s-b 2B &{lcR@6kSLPq{}6s mݤC];|=ܮRIj1kX&7SU'U"?}p,xÎ pDZf)90h`v95nPvtH}Uӂ'm+L)Wn\ͯ?''IgDzׇ-=ދ:li5![oeNsjTȥ+7 8 ""Je7Zv-.yDV.xs[2Yg?l"Ơ`H-PE10{Jѹp-Z}zg#۹pS:6*slZh?V/WBߚK|tӷA|HͱO:ԊK,;r$-vڥfL:yt[kÌjݑ@ =G;$[ItŝM?;"n'0%n=fbn~ۓ6mˇbg\ǿC|W{smJ*ݽ4]>;Zt$rsS9u Ԙ{Э5z_. d"TJ2_t{m\\|9T!qP/퉫fګigtf%O%e=hFZ>yGyM+֮r ٻ-[m#'?gQ,;Xx1PB%&ScǝHRx7S.W48.^& NN9m"2gQF?i u2}݌xᑀqcyS|L2D B-V.OKc{:iHcwwm߱:@yUaLU7ol{q&w%{?W\~~d՝׿>Jֆfu=Dz~-yf;dtWѷ&lz6@Kg;~ pAӌ+>ɔ0-Y^/NOГd@k?}l3wKo_]ִ;%ccY[nvHk!3on 7Ͽ)oS~/*?;p^սN+. yh?I٣0e#3AJ濬O퐸iS_BN5PvŽ*oV"%6r?cٺgi͉pz8T2;tҌV- 2փÔЫe'rĩz'w* FL^ӗ|͚^:3UECOr xݵޒG̓%KgX%TtJ5ߩ AFZ*-# R!sҚĭӫn"t/P֝m_/WASׯȥ]9sֆ#Z3@X.cwĭw܎o~ G>/! $/hfLxNoۿn.Ha M`+ HJJ@boJXdA8ȻnI?<_|ӟ?"K!+\7\.W\K7zeq}/ή/ҕƛ/=Sy GۻG<3O;7zKey饗puēN]e_i;&~;t6-|1$fz g-P3ZK|me߼T Գy$|s٪D=Z7PN֬Z] `uε{ֻ'[S>]I@rmDw}ϼ*jyo/~{5` ؔd`ac{_jtX*9l 'nthӑ*!s#㥗]vX>{ pqVln*Ws~?;buEֹJ  ^y-Yo OI%x>$z 3%Ggo-o &f<._|땙•Mt0/MOؕJɯ'o$?^~*+.Oq!w?W& . ttP*}vNәZ8_[͗%e3V/?fERDZ:w􇈡ybhc &skϗ PXq_3O9ר1Nl5ĸPaMqtu=;r՚G[9[^|3\)d9ixβlRe%еZ> vpU+lwq5j^}Ÿ\'f5\3fu.ӷquZ"0s|!ү/_wM"g^k&}N WFH @Bh4``x8E pUwgLb[׽Ҕjߞ}O7[bPGV]-ȮwE='@JnI>!Xa=/[ql^uqO\D$ySKOi ѵ],SI–5'/>Uº1IŮ ʟ(ٖѴ;knbQ^-O_gmM,;C 0 ^#)b2yH"}5%FBYa< -_, H[x[Yha]Ocgmұe5]v]]wwTolX*Ogz&1Gχ0.̴ά[1dGON=zߖ?YUJAú gjE]~U\1GY[mCW_-5ֲ⤳.{zzpg%p ;^:|>'-X%- [>!̉_dpjMItDLM>Lᓯy봍Sn-Vwm74M?k{yUz'^.R9!`ؚH/[+x,Ltz8xH_|O"D?K\*-vߐ[wT'M I=8v4x-XD݉J'׵=wgW50m޼y{pw{˵`g%6=w su-zFIS蝥1~-e:ۄ'uXs 2fZۢ[Lr_w-o>'?.k `2+WX!W'tbfL췆+W/taphjz&x{}BDcG+rL[+Է1*O]8,g?+VuQ(QwH<ƹ!@dsT`,T#nDـ= F#bPv!0fvߔk1ʖ6Yh3i4@ ΅^s$Ʋ .CewyWk[Bf0X$۳x/1曮T,גHAg\y_g!`) wN῏"% /Ʉ@422`?;%i0k5 ㊒0b# mn ~DR˻z% f>l (Lz濽Hg\7ۙ!{ $7 iȦ#0sE`>ۼof5t R00,`RN .Jg?'N=sŏ]w݅kLVѵ{1Rj8. $FnqSeYjYdA눑>P"?"6P-%dIWCXO h }f!ejS `v4J_9@e!eC6E6I>Z!W^7MìBog37T ?e?\:BD58Q$x+OHU"(r !`mCSja?Is0^yl8S뼾38`?z~nM_ 0#[l6~w[̌[iq嗳Ҧ= 4Edʫ<Nj[Pw ,B;Wa+{($/LkʀP`8&a$c&iu沦( 6( `zh[k%+ %HX%%3u 9Y TUZC#EІW\no|vjGawOuL*GEZޫ/+Ñ f=q`Iܤ(2ct&bT?p9kEJN" W,-:X9X?͌MQ~eԖp۳Pƃ2](r`oCQl2BiZk/^#FTXkzR CK31*TPT_. [GvH{Ok,3^>`\m1:z%FyR`Wꈄ=y8JC* ]5 eSx{(^#A3!XAyO6v>Q4acԖ"zE3s# t:>H~ع0KO:$nʤ_Lx7f@N+ E qN]f-IDAT9ndE`!{h(b.: mUWRN|r:B~^^h?ַ7CI ,,@!3EAv&T5M_HL0B8p x _/3 Qy|2*Us))+gE^+}}R1?@Z $W.(&ɒ傴E!`[.2ot2o &FڱV%a!K rG[A۸ б'H+v];w"` m #R$(=8KȤr Fva{=\+b9OsEo/T_=+mՋ{‘Ҧ%_`jI `^FzaC ?g}(`oҀ&VY 0kh,miAqւ! 2`2wEh`SBI@^ӷ^}s^[ݛmOĩɽw޾`3Y +T&3wn!N=LٵzUx5@o_]u|/yʞl$C@څFΘP=K@-^ ΕUCꇕN=h̶0jN3DByO" @Z{L`WXl4 (bҀ RMĽ-1W+,[jMҩTx_Ѓ-9 PrixX h35-9T\ D_: 'zzߟP3s[搱%Ig |=t@ QPK)ku$#k…%/PDl ,A!)"/cQh C0[8170)?n,BmCFQm0WexhŪTKVッ%u5\Cw޹VїL^YrdE.)iF?L @~**SAG5Ue4.Y- mQ4@lO h2i?nSf )HX`=fH 'w7 "09(egrMMby{u 1m.jegA7|38 }igPK% eP5ղLu'EZ긘 AW'8ʀ1jCB0Y\`!SWFQ}" }ĦZTC&J`h3c (p`npI2RY^5^=+dͺ}DyXv5m`;kS[TkIu}k-J͚1)"g6^֑)ζq֌h* ʿ5G JNBQdd_H&&gk(k"P'*=d*{mOAM6B[F :o 䑁 tdHƔʙ;W\W1Iة31whլ?WWܔJG{Z4]:[ ;կhbf$b$- `P0#?7,@;%[YM Y `(;P[BPx5PPypY[opx3g9>~3׿|c9Z鬼uU]qGl6i+Lkv.hԤ )Olp*|q!$e^me2qF M)2WئHl њ lp~Ii 6K`=5юLN(n 'x}H}}KWf\v._>uQn_x5~|xJϿ276Uwugw9E?Eӏs(b R|jgbV\$`@q9 /fC hPHXBk=Hs\,aHkKCvo4 l-"ҏ X.}E %#x4W/&vQG~2sZʫBB^qY wWxGbYB4{|N~c8f×6ے"eP}55F eP}Kd 8`QRL+0KhJa F%s,c S`a C 6@4qK[T$LC&/_7S=\J@ pG_minʥ2YQͤ1}>Yko93|/+~qO4Fd!{dNsM\۝?_xwdzzz6蹳=@R{aIOf0:HG){7ZyaRvEhkY  c8f*5$N>q甗d4U*ؠ!RH3i1񬅉++<7 ˡw~8V:SϜ3*ŋ5'_r7._y"}|R;wKs֞K3';%ĥ <p8m;)K<أeS4h|i+&<"g1]Yd[:B2ɯT~w"rf$`)l^b?]֏srwdOmҝWq!|^w=cY%*;Mrt~Ҕ?07~Ӊ VdڣIw9{YN.}f54ItoELJNԒYy}@"Q [/:K@+.;]erEu!4@![C x&VGR'CjG;߳vT<X ۤ>O/{>lW-U|aۏ/{}|gǦw`߼cAGA랍,)4]%DZhEV?ܝp%o][b*v%_*`[Ihtf=Yd졍P -lP%V$o?>/?>UaA2{ҖM?e>OOGzZZuVɲ].*CzD_x_{BT#3=N'r ]^ɁN$`k`խ=ȅbzV2'd^mq`u$6⻏rn D;SES+>aU4-վHe+4 2iy}_U9/KШnHDh4^?GZ—>z9}/sG?;ڔ8ԇjn]vs^s/qxypV)x]εG_f"-u:Đ]a^# [au\5_E`E,80_)Y~HEL䌗TFJ|H.H9he돒@ !}ȯ> `?ǿ9z/ /~|1\xlK6_;WsGjfzBTW{F,ևZ)yى½x۟$ӐJBL=Ϣ,6weQҁ}]k1ߝZrD?Fn#?%<pzXPR!oWT9ʕ5L+,BseM=ڞ[7T Q_(UU!kkvP(}¨F!L{;E`KsrkݳU@#{{1KFk9Yo@2[Sˡ(9_eW4S+7_Sv. 3+^R&EvN=/ޮVbU b6'IvVALBES8̈ qRUT䗆X,ؠe#2ϪIK2l̾\-w²vY;I€X20Z+/.ERJ޼ޢ+G}TU?4AeD`j@1$c]Uz5P{PoGkѾ@j#I2WNm<|$m.}_b$;MRɿy1S+g/eh 0Se JʜLBA:@ʶIQo0Dz϶9UXDP uk" p^ %‚F{06TD !d4X:bmd~bWh 2$uQ&'Ss2GŒEm5|@%7m&B=@2C#b]I)3T*$ɬ%@tk\Ak-=J5wR(EۨF{6TCBȢkeCXO@>I%3soc!BVL_2p9^PQ16[i3!g&\@&x@kpAX!@[ :J{ף`l؎Dg=V@?o~)g#7w/s⫿ xVnB}uL*̓2*@-K? D8SGy|zPc[RX~iUh bHPzЋZQ*GH|uo񿺷o_ch@/E;WsA]Un<#Pُۃ swgW>rŇPUZwE?@!,;ܟIF;b~J3ˊ@7/$`']iԸʞ3sWGl%%mkvudBDE`SW&8= @80< ?7Z  8dxd"6؊Ue_k._u;=򨿼GTV2CUf)3ϰ$Q-N U9]dT|!侵!8ׅwh-}PBc˯Ay̷h#4/]zNJk!\AUb66¹!N氵`s,)X!]85 ʄDj5"PoiضQ0ܮ;5P::rJ;Œ _?I&?HqIa/*`'b2˜S29dH0U>\ DcmTt ?M// 宀"|Gɪ~Mvl_[4haHCp d *t XU`V;61/HaGiR^9"'@[ցBNY#7S```V^)G~hX o~r< ?2gx0 T7gڑ@T斎?JQyNhRʉ(UйES5.l[*ډ MmYKEv$`4פX/T۴Y:eV>?P!"w.$Pĥ@)?!S!P"UqXZv3!L_?.J 8L~T^k AA3펰a 9B#ji/ ~ Žr~8GA[~<1LXaR?cJ:vc1~4L\O J&âw5)KzE f;Mx/Î% * s&"`2c] vVߎ!h*(~t؀%jU 2 .gk~i欯_Fj}_ٔ,sWS(7g葽V8ރ-}H@MF@d8QKПs;m=kDphB!SvC\?$bO 5?;IXHB<+~}TO {706N*ea±rKaVٔ_oԒ`5M_o>H`~ʩͣA&5k7m o>i A^+ u톽M1DW1IENDB`libretro-common/include/retro_miscellaneous.h000664 001750 001750 00000014162 13044721241 022666 0ustar00sergiosergio000000 000000 /* Copyright (C) 2010-2017 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (retro_miscellaneous.h). * --------------------------------------------------------------------------------------- * * Permission is hereby granted, free of charge, * to any person obtaining a copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation the rights to * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef __RARCH_MISCELLANEOUS_H #define __RARCH_MISCELLANEOUS_H #include #include #if defined(__CELLOS_LV2__) && !defined(__PSL1GHT__) #include #elif defined(XENON) #include