1
0
mirror of https://github.com/libretro/RetroArch synced 2024-06-28 22:44:21 +00:00

Compare commits

...

15 Commits

Author SHA1 Message Date
cwyc
c7cc74f5e3
Merge f35f6e7e60 into 1ebe646198 2024-06-25 21:05:47 -07:00
github-actions
1ebe646198 Fetch translations from Crowdin 2024-06-26 00:12:27 +00:00
Jay Paul
8aa5fd2658 ensure that all folders are enabled by default. 2024-06-25 08:25:28 -05:00
Jay Paul
c570a6a20a allow saves and configs to be optionally synced to cloud 2024-06-25 08:25:28 -05:00
zoltanvb
286d65b42e [X11] Support for mouse buttons 4 and 5
Support added for extra mouse buttons. Since these buttons were
not returned by XQueryPointer(), some additional logic was needed
which fit best to scroll wheel handling.
2024-06-25 08:18:51 -05:00
Joseph C. Osborn
00add4bb37 Fix build errors on wiiu, directx 2024-06-25 08:18:39 -05:00
Joseph C. Osborn
2805694378 Refactor viewport handling/aspect ratio scaling.
This mirrors the use of video_viewport_get_scaled_integer for
non-integer scaling at various aspect ratios.  Two variants are
provided, one with implicit device and desired ratios and one with
explicit ratios.

Also added a flag to video_viewport_get_scaled_integer to indicate the
direction of positive y.
2024-06-25 08:18:39 -05:00
Joseph C. Osborn
05faba73e3 Add config values and menu items for viewport bias x/y 2024-06-25 08:18:39 -05:00
schellingb
e7c6d1df84 Fix keyboard events missing RETROKMOD_NUMLOCK or RETROKMOD_SCROLLOCK
- Add missing numlock mod to dinput
- Add missing scrolllock mod to x11
- Add missing capslock, numlock, scrolllock and meta mods to android
- Add missing scrolllock mod to sdl
- Add missing capslock, numlock, scrolllock and meta mods to switch
- Add missing numlock mod to winraw
- Add missing numlock mod to uwp
2024-06-25 08:18:29 -05:00
zoltanvb
cc92ac7577 Fix exclusive fullscreen condition
Spotted in Android compilation:
warning: bitwise or with non-zero value always evaluates to true [-Wtautological-bitwise-compare]
2024-06-25 08:18:07 -05:00
Ash Logan
27f337d5a0 (libretro-common) Use inline assembly for PowerPC libco
This puts the code into the binary's .text section, which is needed
for platforms without the ability to map it as RWX (WiiU). Using
GNU/AT&T syntax for the assembly here.
2024-06-25 08:16:52 -05:00
cwyc
f35f6e7e60 Improvements to migration code
Will be squashed before commit
2024-04-05 10:09:49 -04:00
cwyc
1c18ae47eb Android: Add function to migrate RetroArch folder from sdcard. 2024-03-31 12:46:36 -04:00
cwyc
25d5e2aeb6 Android: Remove External Storage permission 2024-03-30 01:12:29 -04:00
cwyc
3f24782aa8 Android: Improvements to DocumentProvider
Added move and rename methods
Provider notifies viewer to refresh view when files are changed
Bumped up TargetApi annotation for DocumentsContract.buildTreeDocumentUri. Could alternatively use androidx compat class.
2024-03-30 01:12:22 -04:00
89 changed files with 1857 additions and 1040 deletions

View File

@ -69,6 +69,14 @@
#define DEFAULT_ASPECT_RATIO 1.3333f
#endif
#define DEFAULT_VIEWPORT_BIAS_X 0.5
#define DEFAULT_VIEWPORT_BIAS_Y 0.5
#if defined(RARCH_MOBILE)
#define DEFAULT_VIEWPORT_BIAS_PORTRAIT_X 0.5
#define DEFAULT_VIEWPORT_BIAS_PORTRAIT_Y 0.0
#endif
#if defined(GEKKO)
#define DEFAULT_MOUSE_SCALE 1
#endif

View File

@ -1769,6 +1769,8 @@ static struct config_bool_setting *populate_settings_bool(
SETTING_BOOL("location_allow", &settings->bools.location_allow, true, false, false);
SETTING_BOOL("cloud_sync_enable", &settings->bools.cloud_sync_enable, true, false, false);
SETTING_BOOL("cloud_sync_destructive", &settings->bools.cloud_sync_destructive, true, false, false);
SETTING_BOOL("cloud_sync_sync_saves", &settings->bools.cloud_sync_sync_saves, true, true, false);
SETTING_BOOL("cloud_sync_sync_configs", &settings->bools.cloud_sync_sync_configs, true, true, false);
SETTING_BOOL("discord_allow", &settings->bools.discord_enable, true, false, false);
#ifdef HAVE_MIST
SETTING_BOOL("steam_rich_presence_enable", &settings->bools.steam_rich_presence_enable, true, false, false);
@ -2255,6 +2257,12 @@ static struct config_float_setting *populate_settings_float(
#endif
SETTING_FLOAT("video_aspect_ratio", &settings->floats.video_aspect_ratio, true, DEFAULT_ASPECT_RATIO, false);
SETTING_FLOAT("video_viewport_bias_x", &settings->floats.video_viewport_bias_x, true, DEFAULT_VIEWPORT_BIAS_X, false);
SETTING_FLOAT("video_viewport_bias_y", &settings->floats.video_viewport_bias_y, true, DEFAULT_VIEWPORT_BIAS_Y, false);
#if defined(RARCH_MOBILE)
SETTING_FLOAT("video_viewport_bias_portrait_x", &settings->floats.video_viewport_bias_portrait_x, true, DEFAULT_VIEWPORT_BIAS_PORTRAIT_X, false);
SETTING_FLOAT("video_viewport_bias_portrait_y", &settings->floats.video_viewport_bias_portrait_y, true, DEFAULT_VIEWPORT_BIAS_PORTRAIT_Y, false);
#endif
SETTING_FLOAT("video_refresh_rate", &settings->floats.video_refresh_rate, true, DEFAULT_REFRESH_RATE, false);
SETTING_FLOAT("video_autoswitch_pal_threshold", &settings->floats.video_autoswitch_pal_threshold, true, DEFAULT_AUTOSWITCH_PAL_THRESHOLD, false);
SETTING_FLOAT("crt_video_refresh_rate", &settings->floats.crt_video_refresh_rate, true, DEFAULT_CRT_REFRESH_RATE, false);

View File

@ -375,6 +375,12 @@ typedef struct settings
{
float placeholder;
float video_aspect_ratio;
float video_viewport_bias_x;
float video_viewport_bias_y;
#if defined(RARCH_MOBILE)
float video_viewport_bias_portrait_x;
float video_viewport_bias_portrait_y;
#endif
float video_refresh_rate;
float video_autoswitch_pal_threshold;
float crt_video_refresh_rate;
@ -954,6 +960,8 @@ typedef struct settings
/* Cloud Sync */
bool cloud_sync_enable;
bool cloud_sync_destructive;
bool cloud_sync_sync_saves;
bool cloud_sync_sync_configs;
/* Misc. */
bool discord_enable;

View File

@ -1316,74 +1316,35 @@ void d3d9_calculate_rect(d3d9_video_t *d3d,
{
float device_aspect = (float)*width / *height;
settings_t *settings = config_get_ptr();
bool scale_integer = settings->bools.video_scale_integer;
bool video_scale_integer = settings->bools.video_scale_integer;
struct video_viewport vp;
video_driver_get_size(width, height);
*x = 0;
*y = 0;
vp.x = 0;
vp.y = 0;
vp.width = *width;
vp.height = *height;
vp.full_width = *width;
vp.full_height = *height;
if (scale_integer && !force_full)
if (video_scale_integer && !force_full)
{
struct video_viewport vp;
vp.x = 0;
vp.y = 0;
vp.width = 0;
vp.height = 0;
vp.full_width = 0;
vp.full_height = 0;
video_viewport_get_scaled_integer(&vp,
*width,
*height,
video_driver_get_aspect_ratio(),
d3d->keep_aspect);
*x = vp.x;
*y = vp.y;
*width = vp.width;
*height = vp.height;
d3d->keep_aspect,
true);
}
else if (d3d->keep_aspect && !force_full)
{
float desired_aspect = video_driver_get_aspect_ratio();
#if defined(HAVE_MENU)
if (settings->uints.video_aspect_ratio_idx == ASPECT_RATIO_CUSTOM)
{
video_viewport_t *custom_vp = &settings->video_viewport_custom;
*x = custom_vp->x;
*y = custom_vp->y;
*width = custom_vp->width;
*height = custom_vp->height;
}
else
#endif
{
float delta;
if (fabsf(device_aspect - desired_aspect) < 0.0001f)
{
/* If the aspect ratios of screen and desired aspect
* ratio are sufficiently equal (floating point stuff),
* assume they are actually equal.
*/
}
else if (device_aspect > desired_aspect)
{
delta = (desired_aspect / device_aspect - 1.0f) / 2.0f + 0.5f;
*x = (int)(roundf(*width * (0.5f - delta)));
*width = (unsigned)(roundf(2.0f * (*width) * delta));
}
else
{
delta = (device_aspect / desired_aspect - 1.0f) / 2.0f + 0.5f;
*y = (int)(roundf(*height * (0.5f - delta)));
*height = (unsigned)(roundf(2.0f * (*height) * delta));
}
}
video_viewport_get_scaled_aspect(&vp, *width, *height, true);
}
*x = vp.x;
*y = vp.y;
*width = vp.width;
*height = vp.height;
}
void d3d9_set_rotation(void *data, unsigned rot)

View File

@ -987,6 +987,8 @@ static LRESULT CALLBACK wnd_proc_common(
mod |= RETROKMOD_CAPSLOCK;
if (GetKeyState(VK_SCROLL) & 0x81)
mod |= RETROKMOD_SCROLLOCK;
if (GetKeyState(VK_NUMLOCK) & 0x81)
mod |= RETROKMOD_NUMLOCK;
if ((GetKeyState(VK_LWIN) | GetKeyState(VK_RWIN)) & 0x80)
mod |= RETROKMOD_META;
@ -1111,6 +1113,8 @@ static LRESULT CALLBACK wnd_proc_common_internal(HWND hwnd,
mod |= RETROKMOD_CAPSLOCK;
if (GetKeyState(VK_SCROLL) & 0x81)
mod |= RETROKMOD_SCROLLOCK;
if (GetKeyState(VK_NUMLOCK) & 0x81)
mod |= RETROKMOD_NUMLOCK;
if ((GetKeyState(VK_LWIN) | GetKeyState(VK_RWIN)) & 0x80)
mod |= RETROKMOD_META;
@ -1369,6 +1373,8 @@ static LRESULT CALLBACK wnd_proc_common_dinput_internal(HWND hwnd,
mod |= RETROKMOD_CAPSLOCK;
if (GetKeyState(VK_SCROLL) & 0x81)
mod |= RETROKMOD_SCROLLOCK;
if (GetKeyState(VK_NUMLOCK) & 0x81)
mod |= RETROKMOD_NUMLOCK;
if ((GetKeyState(VK_LWIN) | GetKeyState(VK_RWIN)) & 0x80)
mod |= RETROKMOD_META;

View File

@ -595,6 +595,8 @@ static void x11_handle_key_event(unsigned keycode, XEvent *event,
mod |= RETROKMOD_ALT;
if (state & Mod2Mask)
mod |= RETROKMOD_NUMLOCK;
if (state & Mod3Mask)
mod |= RETROKMOD_SCROLLOCK;
if (state & Mod4Mask)
mod |= RETROKMOD_META;
@ -669,6 +671,8 @@ bool x11_alive(void *data)
case 5: /* Scroll down */
case 6: /* Scroll wheel left */
case 7: /* Scroll wheel right */
case 8: /* Mouse button 4 */
case 9: /* Mouse button 5 */
x_input_poll_wheel(&event.xbutton, true);
break;
}
@ -683,6 +687,13 @@ bool x11_alive(void *data)
break;
case ButtonRelease:
switch (event.xbutton.button)
{
case 8: /* Mouse button 4 - not handled as click */
case 9: /* Mouse button 5 - not handled as click */
x_input_poll_wheel(&event.xbutton, true);
break;
}
break;
case KeyRelease:

View File

@ -762,52 +762,14 @@ static void ctr_update_viewport(
if (video_scale_integer)
{
/* TODO: does CTR use top-left or bottom-left coordinates? assuming top-left. */
video_viewport_get_scaled_integer(&ctr->vp, ctr->vp.full_width,
ctr->vp.full_height, desired_aspect, ctr->keep_aspect);
ctr->vp.full_height, desired_aspect, ctr->keep_aspect,
true);
}
else if (ctr->keep_aspect)
{
#if defined(HAVE_MENU)
if (aspect_ratio_idx == ASPECT_RATIO_CUSTOM)
{
x = custom_vp_x;
y = custom_vp_y;
width = custom_vp_width;
height = custom_vp_height;
}
else
#endif
{
float delta;
float device_aspect = ((float)ctr->vp.full_width) / ctr->vp.full_height;
if (fabsf(device_aspect - desired_aspect) < 0.0001f)
{
/* If the aspect ratios of screen and desired aspect
* ratio are sufficiently equal (floating point stuff),
* assume they are actually equal.
*/
}
else if (device_aspect > desired_aspect)
{
delta = (desired_aspect / device_aspect - 1.0f)
/ 2.0f + 0.5f;
x = (int)roundf(width * (0.5f - delta));
width = (unsigned)roundf(2.0f * width * delta);
}
else
{
delta = (device_aspect / desired_aspect - 1.0f)
/ 2.0f + 0.5f;
y = (int)roundf(height * (0.5f - delta));
height = (unsigned)roundf(2.0f * height * delta);
}
}
ctr->vp.x = x;
ctr->vp.y = y;
ctr->vp.width = width;
ctr->vp.height = height;
video_viewport_get_scaled_aspect(&ctr->vp, width, height, true);
}
else
{

View File

@ -1164,74 +1164,34 @@ static void d3d8_calculate_rect(void *data,
settings_t *settings = config_get_ptr();
bool video_scale_integer = settings->bools.video_scale_integer;
unsigned aspect_ratio_idx = settings->uints.video_aspect_ratio_idx;
struct video_viewport vp;
video_driver_get_size(width, height);
*x = 0;
*y = 0;
vp.x = 0;
vp.y = 0;
vp.width = width;
vp.height = height;
vp.full_width = width;
vp.full_height = height;
if (video_scale_integer && !force_full)
{
struct video_viewport vp;
vp.x = 0;
vp.y = 0;
vp.width = 0;
vp.height = 0;
vp.full_width = 0;
vp.full_height = 0;
video_viewport_get_scaled_integer(&vp,
*width,
*height,
video_driver_get_aspect_ratio(),
d3d->keep_aspect);
*x = vp.x;
*y = vp.y;
*width = vp.width;
*height = vp.height;
d3d->keep_aspect,
true);
}
else if (d3d->keep_aspect && !force_full)
{
float desired_aspect = video_driver_get_aspect_ratio();
#if defined(HAVE_MENU)
if (aspect_ratio_idx == ASPECT_RATIO_CUSTOM)
{
video_viewport_t *custom_vp = &settings->video_viewport_custom;
*x = custom_vp->x;
*y = custom_vp->y;
*width = custom_vp->width;
*height = custom_vp->height;
}
else
#endif
{
float delta;
if (fabsf(device_aspect - desired_aspect) < 0.0001f)
{
/* If the aspect ratios of screen and desired aspect
* ratio are sufficiently equal (floating point stuff),
* assume they are actually equal.
*/
}
else if (device_aspect > desired_aspect)
{
delta = (desired_aspect / device_aspect - 1.0f) / 2.0f + 0.5f;
*x = (int)(roundf(*width * (0.5f - delta)));
*width = (unsigned)(roundf(2.0f * (*width) * delta));
}
else
{
delta = (device_aspect / desired_aspect - 1.0f) / 2.0f + 0.5f;
*y = (int)(roundf(*height * (0.5f - delta)));
*height = (unsigned)(roundf(2.0f * (*height) * delta));
}
}
video_viewport_get_scaled_aspect(vp, viewport_width, viewport_height, true);
}
*x = vp.x;
*y = vp.y;
*width = vp.width;
*height = vp.height;
}
static void d3d8_set_viewport(void *data,

View File

@ -1227,54 +1227,16 @@ static void gl1_set_viewport(gl1_t *gl1,
video_viewport_get_scaled_integer(&gl1->vp,
viewport_width, viewport_height,
video_driver_get_aspect_ratio(),
gl1->flags & GL1_FLAG_KEEP_ASPECT);
gl1->flags & GL1_FLAG_KEEP_ASPECT, false);
viewport_width = gl1->vp.width;
viewport_height = gl1->vp.height;
}
else if ((gl1->flags & GL1_FLAG_KEEP_ASPECT) && !force_full)
{
float desired_aspect = video_driver_get_aspect_ratio();
#if defined(HAVE_MENU)
if (settings->uints.video_aspect_ratio_idx == ASPECT_RATIO_CUSTOM)
{
video_viewport_t *custom_vp = &settings->video_viewport_custom;
/* OpenGL has bottom-left origin viewport. */
x = custom_vp->x;
y = height - custom_vp->y - custom_vp->height;
viewport_width = custom_vp->width;
viewport_height = custom_vp->height;
}
else
#endif
{
float delta;
if (fabsf(device_aspect - desired_aspect) < 0.0001f)
{
/* If the aspect ratios of screen and desired aspect
* ratio are sufficiently equal (floating point stuff),
* assume they are actually equal.
*/
}
else if (device_aspect > desired_aspect)
{
delta = (desired_aspect / device_aspect - 1.0f) / 2.0f + 0.5f;
x = (int)roundf(viewport_width * (0.5f - delta));
viewport_width = (unsigned)roundf(2.0f * viewport_width * delta);
}
else
{
delta = (device_aspect / desired_aspect - 1.0f) / 2.0f + 0.5f;
y = (int)roundf(viewport_height * (0.5f - delta));
viewport_height = (unsigned)roundf(2.0f * viewport_height * delta);
}
}
gl1->vp.x = x;
gl1->vp.y = y;
gl1->vp.width = viewport_width;
gl1->vp.height = viewport_height;
gl1->vp.full_height = gl1->video_height;
video_viewport_get_scaled_aspect2(&gl1->vp, viewport_width, viewport_height, false, device_aspect, video_driver_get_aspect_ratio());
viewport_width = gl1->vp.width;
viewport_height = gl1->vp.height;
}
else
{
@ -1283,12 +1245,6 @@ static void gl1_set_viewport(gl1_t *gl1,
gl1->vp.height = viewport_height;
}
#if defined(RARCH_MOBILE)
/* In portrait mode, we want viewport to gravitate to top of screen. */
if (device_aspect < 1.0f)
gl1->vp.y *= 2;
#endif
glViewport(gl1->vp.x, gl1->vp.y, gl1->vp.width, gl1->vp.height);
gl1_set_projection(gl1, &gl1_default_ortho, allow_rotate);

View File

@ -1273,11 +1273,8 @@ static void gl2_set_viewport(gl2_t *gl,
bool force_full, bool allow_rotate)
{
settings_t *settings = config_get_ptr();
unsigned height = gl->video_height;
int x = 0;
int y = 0;
float device_aspect = (float)viewport_width / viewport_height;
float device_aspect = (float) viewport_width / (float)viewport_height;
if (gl->ctx_driver->translate_aspect)
device_aspect = gl->ctx_driver->translate_aspect(
gl->ctx_data, viewport_width, viewport_height);
@ -1287,54 +1284,17 @@ static void gl2_set_viewport(gl2_t *gl,
video_viewport_get_scaled_integer(&gl->vp,
viewport_width, viewport_height,
video_driver_get_aspect_ratio(),
(gl->flags & GL2_FLAG_KEEP_ASPECT) ? true : false);
(gl->flags & GL2_FLAG_KEEP_ASPECT) ? true : false,
false);
viewport_width = gl->vp.width;
viewport_height = gl->vp.height;
}
else if ((gl->flags & GL2_FLAG_KEEP_ASPECT) && !force_full)
{
float desired_aspect = video_driver_get_aspect_ratio();
#if defined(HAVE_MENU)
if (settings->uints.video_aspect_ratio_idx == ASPECT_RATIO_CUSTOM)
{
video_viewport_t *custom_vp = &settings->video_viewport_custom;
/* OpenGL has bottom-left origin viewport. */
x = custom_vp->x;
y = height - custom_vp->y - custom_vp->height;
viewport_width = custom_vp->width;
viewport_height = custom_vp->height;
}
else
#endif
{
float delta;
if (fabsf(device_aspect - desired_aspect) < 0.0001f)
{
/* If the aspect ratios of screen and desired aspect
* ratio are sufficiently equal (floating point stuff),
* assume they are actually equal.
*/
}
else if (device_aspect > desired_aspect)
{
delta = (desired_aspect / device_aspect - 1.0f) / 2.0f + 0.5f;
x = (int)roundf(viewport_width * (0.5f - delta));
viewport_width = (unsigned)roundf(2.0f * viewport_width * delta);
}
else
{
delta = (device_aspect / desired_aspect - 1.0f) / 2.0f + 0.5f;
y = (int)roundf(viewport_height * (0.5f - delta));
viewport_height = (unsigned)roundf(2.0f * viewport_height * delta);
}
}
gl->vp.x = x;
gl->vp.y = y;
gl->vp.width = viewport_width;
gl->vp.height = viewport_height;
gl->vp.full_height = gl->video_height;
video_viewport_get_scaled_aspect2(&gl->vp, viewport_width, viewport_height, false, device_aspect, video_driver_get_aspect_ratio());
viewport_width = gl->vp.width;
viewport_height = gl->vp.height;
}
else
{
@ -1343,12 +1303,6 @@ static void gl2_set_viewport(gl2_t *gl,
gl->vp.height = viewport_height;
}
#if defined(RARCH_MOBILE)
/* In portrait mode, we want viewport to gravitate to top of screen. */
if (device_aspect < 1.0f)
gl->vp.y *= 2;
#endif
glViewport(gl->vp.x, gl->vp.y, gl->vp.width, gl->vp.height);
gl2_set_projection(gl, &default_ortho, allow_rotate);

View File

@ -1385,7 +1385,6 @@ static void gl3_set_viewport(gl3_t *gl,
settings_t *settings = config_get_ptr();
float device_aspect = (float)viewport_width / viewport_height;
bool video_scale_integer = settings->bools.video_scale_integer;
unsigned video_aspect_ratio_idx = settings->uints.video_aspect_ratio_idx;
if (gl->ctx_driver->translate_aspect)
device_aspect = gl->ctx_driver->translate_aspect(
@ -1396,54 +1395,17 @@ static void gl3_set_viewport(gl3_t *gl,
video_viewport_get_scaled_integer(&gl->vp,
viewport_width, viewport_height,
video_driver_get_aspect_ratio(),
(gl->flags & GL3_FLAG_KEEP_ASPECT) ? true : false);
(gl->flags & GL3_FLAG_KEEP_ASPECT) ? true : false,
false);
viewport_width = gl->vp.width;
viewport_height = gl->vp.height;
}
else if ((gl->flags & GL3_FLAG_KEEP_ASPECT) && !force_full)
{
float desired_aspect = video_driver_get_aspect_ratio();
#if defined(HAVE_MENU)
if (video_aspect_ratio_idx == ASPECT_RATIO_CUSTOM)
{
video_viewport_t *custom_vp = &settings->video_viewport_custom;
/* OpenGL has bottom-left origin viewport. */
x = custom_vp->x;
y = height - custom_vp->y - custom_vp->height;
viewport_width = custom_vp->width;
viewport_height = custom_vp->height;
}
else
#endif
{
float delta;
if (fabsf(device_aspect - desired_aspect) < 0.0001f)
{
/* If the aspect ratios of screen and desired aspect
* ratio are sufficiently equal (floating point stuff),
* assume they are actually equal.
*/
}
else if (device_aspect > desired_aspect)
{
delta = (desired_aspect / device_aspect - 1.0f) / 2.0f + 0.5f;
x = (int)roundf(viewport_width * (0.5f - delta));
viewport_width = (unsigned)roundf(2.0f * viewport_width * delta);
}
else
{
delta = (device_aspect / desired_aspect - 1.0f) / 2.0f + 0.5f;
y = (int)roundf(viewport_height * (0.5f - delta));
viewport_height = (unsigned)roundf(2.0f * viewport_height * delta);
}
}
gl->vp.x = x;
gl->vp.y = y;
gl->vp.width = viewport_width;
gl->vp.height = viewport_height;
gl->vp.full_height = gl->video_height;
video_viewport_get_scaled_aspect2(&gl->vp, viewport_width, viewport_height, false, device_aspect, video_driver_get_aspect_ratio());
viewport_width = gl->vp.width;
viewport_height = gl->vp.height;
}
else
{
@ -1452,12 +1414,6 @@ static void gl3_set_viewport(gl3_t *gl,
gl->vp.height = viewport_height;
}
#if defined(RARCH_MOBILE)
/* In portrait mode, we want viewport to gravitate to top of screen. */
if (device_aspect < 1.0f)
gl->vp.y *= 2;
#endif
glViewport(gl->vp.x, gl->vp.y, gl->vp.width, gl->vp.height);
gl3_set_projection(gl, &gl3_default_ortho, allow_rotate);

View File

@ -923,69 +923,22 @@ static void gx2_set_projection(wiiu_video_t *wiiu)
static void gx2_update_viewport(wiiu_video_t *wiiu)
{
int x = 0;
int y = 0;
unsigned viewport_width = wiiu->color_buffer.surface.width;
unsigned viewport_height = wiiu->color_buffer.surface.height;
float device_aspect = (float)viewport_width / viewport_height;
settings_t *settings = config_get_ptr();
bool video_scale_integer = settings->bools.video_scale_integer;
unsigned video_aspect_ratio_idx = settings->uints.video_aspect_ratio_idx;
if (video_scale_integer)
{
video_viewport_get_scaled_integer(&wiiu->vp,
viewport_width, viewport_height,
video_driver_get_aspect_ratio(), wiiu->keep_aspect);
video_driver_get_aspect_ratio(), wiiu->keep_aspect, true);
viewport_width = wiiu->vp.width;
viewport_height = wiiu->vp.height;
}
else if (wiiu->keep_aspect)
{
float desired_aspect = video_driver_get_aspect_ratio();
#if defined(HAVE_MENU)
if (video_aspect_ratio_idx == ASPECT_RATIO_CUSTOM)
{
video_viewport_t *custom_vp = &settings->video_viewport_custom;
/* GX2 has top-left origin viewport. */
x = custom_vp->x;
y = custom_vp->y;
viewport_width = custom_vp->width;
viewport_height = custom_vp->height;
}
else
#endif
{
float delta;
if (fabsf(device_aspect - desired_aspect) < 0.0001f)
{
/* If the aspect ratios of screen and desired aspect
* ratio are sufficiently equal (floating point stuff),
* assume they are actually equal.
*/
}
else if (device_aspect > desired_aspect)
{
delta = (desired_aspect / device_aspect - 1.0f)
/ 2.0f + 0.5f;
x = (int)roundf(viewport_width * (0.5f - delta));
viewport_width = (unsigned)roundf(2.0f * viewport_width * delta);
}
else
{
delta = (device_aspect / desired_aspect - 1.0f)
/ 2.0f + 0.5f;
y = (int)roundf(viewport_height * (0.5f - delta));
viewport_height = (unsigned)roundf(2.0f * viewport_height * delta);
}
}
wiiu->vp.x = x;
wiiu->vp.y = y;
wiiu->vp.width = viewport_width;
wiiu->vp.height = viewport_height;
video_viewport_get_scaled_aspect(&wiiu->vp, viewport_width, viewport_height, true);
}
else
{

View File

@ -1011,58 +1011,23 @@ static void gx_resize(gx_video_t *gx,
/* Ignore this for custom resolutions */
if (gx->keep_aspect && gx_mode.efbHeight >= 192)
{
#ifdef HW_RVL
float device_aspect = CONF_GetAspectRatio() == CONF_ASPECT_4_3 ?
4.0 / 3.0 : 16.0 / 9.0;
#else
float device_aspect = 4.0 / 3.0;
#endif
float desired_aspect = video_driver_get_aspect_ratio();
if (desired_aspect == 0.0)
desired_aspect = 1.0;
if ( (gx->orientation == ORIENTATION_VERTICAL)
|| (gx->orientation == ORIENTATION_FLIPPED_ROTATED))
desired_aspect = 1.0 / desired_aspect;
if (aspect_ratio_idx == ASPECT_RATIO_CUSTOM)
{
video_viewport_t *custom_vp = &settings->video_viewport_custom;
if (!custom_vp->width || !custom_vp->height)
{
custom_vp->x = 0;
custom_vp->y = 0;
custom_vp->width = gx->vp.full_width;
custom_vp->height = gx->vp.full_height;
}
x = custom_vp->x;
y = custom_vp->y;
width = custom_vp->width;
height = custom_vp->height;
}
else
{
float delta;
#ifdef HW_RVL
float device_aspect = CONF_GetAspectRatio() == CONF_ASPECT_4_3 ?
4.0 / 3.0 : 16.0 / 9.0;
#else
float device_aspect = 4.0 / 3.0;
#endif
if (fabs(device_aspect - desired_aspect) < 0.0001)
{
/* If the aspect ratios of screen and desired aspect ratio
* are sufficiently equal (floating point stuff),
* assume they are actually equal. */
}
else if (device_aspect > desired_aspect)
{
delta = (desired_aspect / device_aspect - 1.0) / 2.0 + 0.5;
x = (unsigned)(width * (0.5 - delta));
width = (unsigned)(2.0 * width * delta);
}
else
{
delta = (device_aspect / desired_aspect - 1.0) / 2.0 + 0.5;
y = (unsigned)(height * (0.5 - delta));
height = (unsigned)(2.0 * height * delta);
}
}
video_viewport_get_scaled_aspect2(&gx->vp, width, height, true, device_aspect, desired_aspect);
x = gx->vp.x;
y = gx->vp.y;
width = gx->vp.width;
height = gx->vp.height;
}
/* Overscan correction */

View File

@ -257,54 +257,15 @@ static void psp_update_viewport(psp1_video_t* psp,
if (video_scale_integer)
{
video_viewport_get_scaled_integer(&psp->vp, SCEGU_SCR_WIDTH,
SCEGU_SCR_HEIGHT, video_driver_get_aspect_ratio(), psp->keep_aspect);
SCEGU_SCR_HEIGHT, video_driver_get_aspect_ratio(), psp->keep_aspect, true);
width = psp->vp.width;
height = psp->vp.height;
}
else if (psp->keep_aspect)
{
#if defined(HAVE_MENU)
if (aspect_ratio_idx == ASPECT_RATIO_CUSTOM)
{
x = video_info->custom_vp_x;
y = video_info->custom_vp_y;
width = video_info->custom_vp_width;
height = video_info->custom_vp_height;
}
else
#endif
{
float delta;
float desired_aspect = video_driver_get_aspect_ratio();
if ( (fabsf(device_aspect - desired_aspect) < 0.0001f)
|| (fabsf((16.0/9.0) - desired_aspect) < 0.02f))
{
/* If the aspect ratios of screen and desired aspect
* ratio are sufficiently equal (floating point stuff),
* assume they are actually equal.
*/
}
else if (device_aspect > desired_aspect)
{
delta = (desired_aspect / device_aspect - 1.0f)
/ 2.0f + 0.5f;
x = (int)roundf(width * (0.5f - delta));
width = (unsigned)roundf(2.0f * width * delta);
}
else
{
delta = (device_aspect / desired_aspect - 1.0f)
/ 2.0f + 0.5f;
y = (int)roundf(height * (0.5f - delta));
height = (unsigned)roundf(2.0f * height * delta);
}
}
psp->vp.x = x;
psp->vp.y = y;
psp->vp.width = width;
psp->vp.height = height;
video_viewport_get_scaled_aspect(&psp->vp, width, height, true);
width = psp->vp.width;
height = psp->vp.height;
}
else
{

View File

@ -996,55 +996,16 @@ static void rsx_set_viewport(void *data, unsigned viewport_width,
{
video_viewport_get_scaled_integer(&rsx->vp,
viewport_width, viewport_height,
video_driver_get_aspect_ratio(), rsx->keep_aspect);
viewport_width = rsx->vp.width;
viewport_height = rsx->vp.height;
video_driver_get_aspect_ratio(), rsx->keep_aspect,
true);
viewport_width = rsx->vp.width;
viewport_height = rsx->vp.height;
}
else if (rsx->keep_aspect && !force_full)
{
float desired_aspect = video_driver_get_aspect_ratio();
#if defined(HAVE_MENU)
if (aspect_ratio_idx == ASPECT_RATIO_CUSTOM)
{
video_viewport_t *custom_vp = &settings->video_viewport_custom;
/* RSX/libgcm has top-left origin viewport. */
x = custom_vp->x;
y = custom_vp->y;
viewport_width = custom_vp->width;
viewport_height = custom_vp->height;
}
else
#endif
{
float delta;
if (fabsf(device_aspect - desired_aspect) < 0.0001f)
{
/* If the aspect ratios of screen and desired aspect
* ratio are sufficiently equal (floating point stuff),
* assume they are actually equal.
*/
}
else if (device_aspect > desired_aspect)
{
delta = (desired_aspect / device_aspect - 1.0f)
/ 2.0f + 0.5f;
x = (int)roundf(viewport_width * (0.5f - delta));
viewport_width = (unsigned)roundf(2.0f * viewport_width * delta);
}
else
{
delta = (device_aspect / desired_aspect - 1.0f)
/ 2.0f + 0.5f;
y = (int)roundf(viewport_height * (0.5f - delta));
viewport_height = (unsigned)roundf(2.0f * viewport_height * delta);
}
}
rsx->vp.x = x;
rsx->vp.y = y;
rsx->vp.width = viewport_width;
rsx->vp.height = viewport_height;
video_viewport_get_scaled_aspect(&rsx->vp, viewport_width, viewport_height, true);
viewport_width = rsx->vp.width;
viewport_height = rsx->vp.height;
}
else
{
@ -1493,7 +1454,8 @@ static void rsx_update_viewport(rsx_t* rsx)
if (video_scale_integer)
{
video_viewport_get_scaled_integer(&rsx->vp, viewport_width,
viewport_height, video_driver_get_aspect_ratio(), rsx->keep_aspect);
viewport_height, video_driver_get_aspect_ratio(), rsx->keep_aspect,
true);
viewport_width = rsx->vp.width;
viewport_height = rsx->vp.height;
}
@ -1525,16 +1487,18 @@ static void rsx_update_viewport(rsx_t* rsx)
}
else if (device_aspect > desired_aspect)
{
float viewport_bias = settings->floats.video_viewport_bias_x;
delta = (desired_aspect / device_aspect - 1.0f)
/ 2.0f + 0.5f;
x = (int)roundf(viewport_width * (0.5f - delta));
x = (int)roundf(viewport_width * ((0.5f - delta) * (viewport_bias * 2.0f)));
viewport_width = (unsigned)roundf(2.0f * viewport_width * delta);
}
else
{
float viewport_bias = 1.0 - settings->floats.video_viewport_bias_y;
delta = (device_aspect / desired_aspect - 1.0f)
/ 2.0f + 0.5f;
y = (int)roundf(viewport_height * (0.5f - delta));
y = (int)roundf(viewport_height * ((0.5f - delta) * (viewport_bias * 2.0f)));
viewport_height = (unsigned)roundf(2.0f * viewport_height * delta);
}
}

View File

@ -229,7 +229,6 @@ static void sdl_refresh_viewport(sdl2_video_t *vid)
int win_w, win_h;
settings_t *settings = config_get_ptr();
bool video_scale_integer = settings->bools.video_scale_integer;
unsigned aspect_ratio_idx = settings->uints.video_aspect_ratio_idx;
SDL_GetWindowSize(vid->window, &win_w, &win_h);
@ -243,39 +242,10 @@ static void sdl_refresh_viewport(sdl2_video_t *vid)
if (video_scale_integer)
video_viewport_get_scaled_integer(&vid->vp,
win_w, win_h, video_driver_get_aspect_ratio(),
vid->video.force_aspect);
else if (aspect_ratio_idx == ASPECT_RATIO_CUSTOM)
{
video_viewport_t *custom_vp = &settings->video_viewport_custom;
vid->vp.x = custom_vp->x;
vid->vp.y = custom_vp->y;
vid->vp.width = custom_vp->width;
vid->vp.height = custom_vp->height;
}
vid->video.force_aspect, true);
else if (vid->video.force_aspect)
{
float delta;
float device_aspect = (float)win_w / win_h;
float desired_aspect = video_driver_get_aspect_ratio();
if (fabsf(device_aspect - desired_aspect) < 0.0001f)
{
/* If the aspect ratios of screen and desired aspect ratio are
* sufficiently equal (floating point stuff), assume they are
* actually equal. */
}
else if (device_aspect > desired_aspect)
{
delta = (desired_aspect / device_aspect - 1.0f) / 2.0f + 0.5f;
vid->vp.x = (int)roundf(win_w * (0.5f - delta));
vid->vp.width = (unsigned)roundf(2.0f * win_w * delta);
}
else
{
delta = (device_aspect / desired_aspect - 1.0f) / 2.0f + 0.5f;
vid->vp.y = (int)roundf(win_h * (0.5f - delta));
vid->vp.height = (unsigned)roundf(2.0f * win_h * delta);
}
video_viewport_get_scaled_aspect(&vid->vp, win_w, win_h, true);
}
vid->flags &= ~SDL2_FLAG_SHOULD_RESIZE;

View File

@ -572,50 +572,12 @@ static void switch_update_viewport(switch_video_t *sw,
if (settings->bools.video_scale_integer)
{
video_viewport_get_scaled_integer(&sw->vp, sw->vp.full_width, sw->vp.full_height, desired_aspect, sw->keep_aspect);
/* TODO: Does nx use top-left or bottom-left origin? I'm assuming top left. */
video_viewport_get_scaled_integer(&sw->vp, sw->vp.full_width, sw->vp.full_height, desired_aspect, sw->keep_aspect, true);
}
else if (sw->keep_aspect)
{
#if defined(HAVE_MENU)
if (settings->uints.video_aspect_ratio_idx == ASPECT_RATIO_CUSTOM)
{
sw->vp.x = sw->vp.y = 0;
sw->vp.width = width;
sw->vp.height = height;
}
else
#endif
{
float delta;
float device_aspect = ((float)sw->vp.full_width) / sw->vp.full_height;
if (fabsf(device_aspect - desired_aspect) < 0.0001f)
{
/*
* If the aspect ratios of screen and desired aspect
* ratio are sufficiently equal (floating point stuff),
* assume they are actually equal.
*/
}
else if (device_aspect > desired_aspect)
{
delta = (desired_aspect / device_aspect - 1.0f) / 2.0f + 0.5f;
x = (int)roundf(width * (0.5f - delta));
width = (unsigned)roundf(2.0f * width * delta);
}
else
{
delta = (device_aspect / desired_aspect - 1.0f) / 2.0f + 0.5f;
y = (int)roundf(height * (0.5f - delta));
height = (unsigned)roundf(2.0f * height * delta);
}
}
sw->vp.x = x;
sw->vp.y = y;
sw->vp.width = width;
sw->vp.height = height;
video_viewport_get_scaled_aspect(&sw->vp, width, height, true);
}
else
{

View File

@ -318,45 +318,39 @@ static void vg_free(void *data)
static void vg_calculate_quad(vg_t *vg,
unsigned width, unsigned height)
{
/* set viewport for aspect ratio, taken from the OpenGL driver. */
if (vg->keep_aspect)
{
float desired_aspect = video_driver_get_aspect_ratio();
settings_t *settings = config_get_ptr();
bool video_scale_integer = settings->bools.video_scale_integer;
float device_aspect = (float)width / height;
struct video_viewport_t vp;
/* If the aspect ratios of screen and desired aspect ratio
* are sufficiently equal (floating point stuff),
* assume they are actually equal. */
if (fabs(vg->mScreenAspect - desired_aspect) < 0.0001)
{
vg->x1 = 0;
vg->y1 = 0;
vg->x2 = width;
vg->y2 = height;
}
else if (vg->mScreenAspect > desired_aspect)
{
float delta = (desired_aspect / vg->mScreenAspect - 1.0) / 2.0 + 0.5;
vg->x1 = width * (0.5 - delta);
vg->y1 = 0;
vg->x2 = 2.0 * width * delta + vg->x1;
vg->y2 = height + vg->y1;
}
else
{
float delta = (vg->mScreenAspect / desired_aspect - 1.0) / 2.0 + 0.5;
vg->x1 = 0;
vg->y1 = height * (0.5 - delta);
vg->x2 = width + vg->x1;
vg->y2 = 2.0 * height * delta + vg->y1;
}
}
else
vp.x = 0;
vp.y = 0;
vp.width = width;
vp.height = height;
vp.full_width = width;
vp.full_height = height;
if (vg->ctx_driver->translate_aspect)
device_aspect = vg->ctx_driver->translate_aspect(vg->ctx_data, width, height);
vg->mScreenAspect = device_aspect;
/* OpenVG uses a bottom-left origin coordinate system */
if (video_scale_integer)
{
vg->x1 = 0;
vg->y1 = 0;
vg->x2 = width;
vg->y2 = height;
video_viewport_get_scaled_integer(&vp,
width, height,
video_driver_get_aspect_ratio(),
vg->keep_aspect,
false);
}
else if (vg->keep_aspect)
{
video_viewport_get_scaled_aspect(&vp, viewport_width, viewport_height, false);
}
vg->x1 = vp.x;
vg->y1 = vp.y;
vg->x2 = vp.width;
vg->y2 = vp.height;
vg->scissor[0] = vg->x1;
vg->scissor[1] = vg->y1;

View File

@ -861,8 +861,9 @@ static void vita2d_update_viewport(vita_video_t* vita,
if (video_scale_integer)
{
/* TODO: Does Vita use top-left or bottom-left origin? I'm assuming top left. */
video_viewport_get_scaled_integer(&vita->vp, temp_width,
temp_height, video_driver_get_aspect_ratio(), vita->keep_aspect);
temp_height, video_driver_get_aspect_ratio(), vita->keep_aspect, true);
width = vita->vp.width;
height = vita->vp.height;
}
@ -876,54 +877,16 @@ static void vita2d_update_viewport(vita_video_t* vita,
width = temp_height;
height = temp_width;
}
#if defined(HAVE_MENU)
if (aspect_ratio_idx == ASPECT_RATIO_CUSTOM)
video_viewport_get_scaled_aspect(&vita->vp, width, height, true);
if ( (vita->rotation == ORIENTATION_VERTICAL) ||
(vita->rotation == ORIENTATION_FLIPPED_ROTATED)
)
{
x = video_info->custom_vp_x;
y = video_info->custom_vp_y;
width = video_info->custom_vp_width;
height = video_info->custom_vp_height;
// swap x and y
unsigned tmp = vita->vp.x;
vita->vp.x = vita->vp.y;
vita->vp.y = tmp;
}
else
#endif
{
float delta;
if ((fabsf(device_aspect - desired_aspect) < 0.0001f))
{
/* If the aspect ratios of screen and desired aspect
* ratio are sufficiently equal (floating point stuff),
* assume they are actually equal.
*/
}
else if (device_aspect > desired_aspect)
{
delta = (desired_aspect / device_aspect - 1.0f)
/ 2.0f + 0.5f;
x = (int)roundf(width * (0.5f - delta));
width = (unsigned)roundf(2.0f * width * delta);
}
else
{
delta = (device_aspect / desired_aspect - 1.0f)
/ 2.0f + 0.5f;
y = (int)roundf(height * (0.5f - delta));
height = (unsigned)roundf(2.0f * height * delta);
}
if ( (vita->rotation == ORIENTATION_VERTICAL) ||
(vita->rotation == ORIENTATION_FLIPPED_ROTATED)
)
{
x = (temp_width - width) * 0.5f;
y = (temp_height - height) * 0.5f;
}
}
vita->vp.x = x;
vita->vp.y = y;
vita->vp.width = width;
vita->vp.height = height;
}
else
{
@ -954,9 +917,10 @@ static void vita2d_set_viewport_wrapper(void *data, unsigned viewport_width,
if (video_scale_integer && !force_full)
{
/* TODO: Does Vita use top-left or bottom-left origin? I'm assuming top left. */
video_viewport_get_scaled_integer(&vita->vp,
viewport_width, viewport_height,
video_driver_get_aspect_ratio(), vita->keep_aspect);
video_driver_get_aspect_ratio(), vita->keep_aspect, true);
viewport_width = vita->vp.width;
viewport_height = vita->vp.height;
}
@ -986,16 +950,19 @@ static void vita2d_set_viewport_wrapper(void *data, unsigned viewport_width,
}
else if (device_aspect > desired_aspect)
{
float viewport_bias = settings->floats.video_viewport_bias_x;
delta = (desired_aspect / device_aspect - 1.0f)
/ 2.0f + 0.5f;
x = (int)roundf(viewport_width * (0.5f - delta));
x = (int)roundf(viewport_width * ((0.5f - delta) * (viewport_bias * 2.0f)));
viewport_width = (unsigned)roundf(2.0f * viewport_width * delta);
}
else
{
/* TODO: Does Vita use top-left or bottom-left origin? I'm assuming top left. */
float viewport_bias = settings->floats.video_viewport_bias_y;
delta = (device_aspect / desired_aspect - 1.0f)
/ 2.0f + 0.5f;
y = (int)roundf(viewport_height * (0.5f - delta));
y = (int)roundf(viewport_height * ((0.5f - delta) * (viewport_bias * 2.0f)));
viewport_height = (unsigned)roundf(2.0f * viewport_height * delta);
}
}

View File

@ -3814,7 +3814,6 @@ static void vulkan_set_viewport(void *data, unsigned viewport_width,
struct video_ortho ortho = {0, 1, 0, 1, -1, 1};
settings_t *settings = config_get_ptr();
bool video_scale_integer = settings->bools.video_scale_integer;
unsigned aspect_ratio_idx = settings->uints.video_aspect_ratio_idx;
vk_t *vk = (vk_t*)data;
if (vk->ctx_driver->translate_aspect)
@ -3826,55 +3825,18 @@ static void vulkan_set_viewport(void *data, unsigned viewport_width,
video_viewport_get_scaled_integer(&vk->vp,
viewport_width, viewport_height,
video_driver_get_aspect_ratio(),
vk->flags & VK_FLAG_KEEP_ASPECT);
vk->flags & VK_FLAG_KEEP_ASPECT,
true);
vk->vp.x = MAX(vk->vp.x, 0);
vk->vp.y = MAX(vk->vp.y, 0);
viewport_width = vk->vp.width;
viewport_height = vk->vp.height;
}
else if ((vk->flags & VK_FLAG_KEEP_ASPECT) && !force_full)
{
float desired_aspect = video_driver_get_aspect_ratio();
#if defined(HAVE_MENU)
if (aspect_ratio_idx == ASPECT_RATIO_CUSTOM)
{
video_viewport_t *custom_vp = &settings->video_viewport_custom;
/* Vulkan has top-left origin viewport. */
x = custom_vp->x;
y = custom_vp->y;
viewport_width = custom_vp->width;
viewport_height = custom_vp->height;
}
else
#endif
{
float delta;
if (fabsf(device_aspect - desired_aspect) < 0.0001f)
{
/* If the aspect ratios of screen and desired aspect
* ratio are sufficiently equal (floating point stuff),
* assume they are actually equal.
*/
}
else if (device_aspect > desired_aspect)
{
delta = (desired_aspect / device_aspect - 1.0f)
/ 2.0f + 0.5f;
x = (int)roundf(viewport_width * (0.5f - delta));
viewport_width = (unsigned)roundf(2.0f * viewport_width * delta);
}
else
{
delta = (device_aspect / desired_aspect - 1.0f)
/ 2.0f + 0.5f;
y = (int)roundf(viewport_height * (0.5f - delta));
viewport_height = (unsigned)roundf(2.0f * viewport_height * delta);
}
}
vk->vp.x = x;
vk->vp.y = y;
vk->vp.width = viewport_width;
vk->vp.height = viewport_height;
video_viewport_get_scaled_aspect2(&vk->vp, viewport_width, viewport_height, true, device_aspect, video_driver_get_aspect_ratio());
viewport_width = vk->vp.width;
viewport_height = vk->vp.height;
}
else
{
@ -3884,12 +3846,6 @@ static void vulkan_set_viewport(void *data, unsigned viewport_width,
vk->vp.height = viewport_height;
}
#if defined(RARCH_MOBILE)
/* In portrait mode, we want viewport to gravitate to top of screen. */
if (device_aspect < 1.0f)
vk->vp.y = 0;
#endif
vulkan_set_projection(vk, &ortho, allow_rotate);
/* Set last backbuffer viewport. */

View File

@ -599,9 +599,10 @@ static void xv_calc_out_rect(bool keep_aspect,
vp->full_width = vp_width;
vp->full_height = vp_height;
/* TODO: Does xvideo have its origin in top left or bottom-left? Assuming top left. */
if (scale_integer)
video_viewport_get_scaled_integer(vp, vp_width, vp_height,
video_driver_get_aspect_ratio(), keep_aspect);
video_driver_get_aspect_ratio(), keep_aspect, true);
else if (!keep_aspect)
{
vp->x = 0;
@ -611,36 +612,7 @@ static void xv_calc_out_rect(bool keep_aspect,
}
else
{
float desired_aspect = video_driver_get_aspect_ratio();
float device_aspect = (float)vp_width / vp_height;
/* If the aspect ratios of screen and desired aspect ratio
* are sufficiently equal (floating point stuff),
* assume they are actually equal.
*/
if (fabs(device_aspect - desired_aspect) < 0.0001)
{
vp->x = 0;
vp->y = 0;
vp->width = vp_width;
vp->height = vp_height;
}
else if (device_aspect > desired_aspect)
{
float delta = (desired_aspect / device_aspect - 1.0) / 2.0 + 0.5;
vp->x = vp_width * (0.5 - delta);
vp->y = 0;
vp->width = 2.0 * vp_width * delta;
vp->height = vp_height;
}
else
{
float delta = (device_aspect / desired_aspect - 1.0) / 2.0 + 0.5;
vp->x = 0;
vp->y = vp_height * (0.5 - delta);
vp->width = vp_width;
vp->height = 2.0 * vp_height * delta;
}
video_viewport_get_scaled_aspect(vp, vp_width, vp_height, true);
}
}

View File

@ -1248,7 +1248,7 @@ void video_switch_refresh_rate_maybe(
unsigned video_bfi = settings->uints.video_black_frame_insertion;
unsigned shader_subframes = settings->uints.video_shader_subframes;
bool vrr_runloop_enable = settings->bools.vrr_runloop_enable;
bool exclusive_fullscreen = (video_st->flags | VIDEO_FLAG_FORCE_FULLSCREEN) || (
bool exclusive_fullscreen = (video_st->flags & VIDEO_FLAG_FORCE_FULLSCREEN) || (
settings->bools.video_fullscreen && !settings->bools.video_windowed_fullscreen);
bool windowed_fullscreen = settings->bools.video_fullscreen && settings->bools.video_windowed_fullscreen;
bool all_fullscreen = settings->bools.video_fullscreen || settings->bools.video_windowed_fullscreen;
@ -2044,39 +2044,28 @@ void video_driver_set_aspect_ratio(void)
video_st->poke->set_aspect_ratio(video_st->data, aspect_ratio_idx);
}
void video_driver_update_viewport(
struct video_viewport* vp, bool force_full, bool keep_aspect)
void video_viewport_get_scaled_aspect(struct video_viewport *vp, unsigned viewport_width, unsigned viewport_height, bool ydown) {
float device_aspect = (float)viewport_width / viewport_height;
float desired_aspect = video_driver_get_aspect_ratio();
video_viewport_get_scaled_aspect2(vp, viewport_width, viewport_height, ydown, device_aspect, desired_aspect);
}
void video_viewport_get_scaled_aspect2(struct video_viewport *vp, unsigned viewport_width, unsigned viewport_height, bool ydown, float device_aspect, float desired_aspect)
{
float device_aspect = (float)vp->full_width / vp->full_height;
settings_t *settings = config_get_ptr();
bool video_scale_integer = settings->bools.video_scale_integer;
unsigned video_aspect_ratio_idx = settings->uints.video_aspect_ratio_idx;
video_driver_state_t *video_st = &video_driver_st;
float video_driver_aspect_ratio = video_st->aspect_ratio;
vp->x = 0;
vp->y = 0;
vp->width = vp->full_width;
vp->height = vp->full_height;
if (video_scale_integer && !force_full)
video_viewport_get_scaled_integer(
vp,
vp->full_width,
vp->full_height,
video_driver_aspect_ratio, keep_aspect);
else if (keep_aspect && !force_full)
{
float desired_aspect = video_driver_aspect_ratio;
settings_t *settings = config_get_ptr();
int x = 0;
int y = 0;
#if defined(HAVE_MENU)
if (video_aspect_ratio_idx == ASPECT_RATIO_CUSTOM)
if (settings->uints.video_aspect_ratio_idx == ASPECT_RATIO_CUSTOM)
{
const struct video_viewport *custom_vp = &settings->video_viewport_custom;
vp->x = custom_vp->x;
vp->y = custom_vp->y;
vp->width = custom_vp->width;
vp->height = custom_vp->height;
video_viewport_t *custom_vp = &settings->video_viewport_custom;
x = custom_vp->x;
y = custom_vp->y - custom_vp->height;
if (!ydown)
y = vp->full_height - y;
viewport_width = custom_vp->width;
viewport_height = custom_vp->height;
}
else
#endif
@ -2092,30 +2081,58 @@ void video_driver_update_viewport(
}
else if (device_aspect > desired_aspect)
{
delta = (desired_aspect / device_aspect - 1.0f)
/ 2.0f + 0.5f;
vp->x = (int)roundf(vp->full_width * (0.5f - delta));
vp->width = (unsigned)roundf(2.0f * vp->full_width * delta);
vp->y = 0;
vp->height = vp->full_height;
float viewport_bias = settings->floats.video_viewport_bias_x;
#if defined(RARCH_MOBILE)
if (device_aspect < 1.0f)
viewport_bias = settings->floats.video_viewport_bias_portrait_x;
#endif
delta = (desired_aspect / device_aspect - 1.0f) / 2.0f + 0.5f;
x = (int)roundf(viewport_width * ((0.5f - delta) * (viewport_bias * 2.0f)));
viewport_width = (unsigned)roundf(2.0f * viewport_width * delta);
}
else
{
vp->x = 0;
vp->width = vp->full_width;
delta = (device_aspect / desired_aspect - 1.0f)
/ 2.0f + 0.5f;
vp->y = (int)roundf(vp->full_height * (0.5f - delta));
vp->height = (unsigned)roundf(2.0f * vp->full_height * delta);
float viewport_bias = settings->floats.video_viewport_bias_y;
#if defined(RARCH_MOBILE)
if (device_aspect < 1.0f)
viewport_bias = settings->floats.video_viewport_bias_portrait_y;
#endif
if (!ydown)
viewport_bias = 1.0 - viewport_bias;
delta = (device_aspect / desired_aspect - 1.0f) / 2.0f + 0.5f;
y = (int)roundf(viewport_height * ((0.5f - delta) * (viewport_bias * 2.0f)));
viewport_height = (unsigned)roundf(2.0f * viewport_height * delta);
}
}
}
vp->x = x;
vp->y = y;
vp->width = viewport_width;
vp->height = viewport_height;
}
#if defined(RARCH_MOBILE)
/* In portrait mode, we want viewport to gravitate to top of screen. */
if (device_aspect < 1.0f)
vp->y = 0;
#endif
void video_driver_update_viewport(
struct video_viewport* vp, bool force_full, bool keep_aspect)
{
settings_t *settings = config_get_ptr();
bool video_scale_integer = settings->bools.video_scale_integer;
video_driver_state_t *video_st = &video_driver_st;
float video_driver_aspect_ratio = video_st->aspect_ratio;
vp->x = 0;
vp->y = 0;
vp->width = vp->full_width;
vp->height = vp->full_height;
if (video_scale_integer && !force_full)
video_viewport_get_scaled_integer(
vp,
vp->full_width,
vp->full_height,
video_driver_aspect_ratio, keep_aspect, false);
else if (keep_aspect && !force_full)
{
video_viewport_get_scaled_aspect(vp, vp->full_width, vp->full_height, false);
}
}
void video_driver_restore_cached(void *settings_data)
@ -2304,13 +2321,15 @@ bool video_driver_get_viewport_info(struct video_viewport *viewport)
* @height : Height.
* @aspect_ratio : Aspect ratio (in float).
* @keep_aspect : Preserve aspect ratio?
* @ydown : Positive y points down?
*
* Gets viewport scaling dimensions based on
* scaled integer aspect ratio.
**/
void video_viewport_get_scaled_integer(struct video_viewport *vp,
unsigned width, unsigned height,
float aspect_ratio, bool keep_aspect)
float aspect_ratio, bool keep_aspect,
bool ydown)
{
int padding_x = 0;
int padding_y = 0;
@ -2318,7 +2337,6 @@ void video_viewport_get_scaled_integer(struct video_viewport *vp,
video_driver_state_t *video_st = &video_driver_st;
unsigned video_aspect_ratio_idx = settings->uints.video_aspect_ratio_idx;
bool overscale = settings->bools.video_scale_integer_overscale;
if (video_aspect_ratio_idx == ASPECT_RATIO_CUSTOM)
{
struct video_viewport *custom_vp = &settings->video_viewport_custom;
@ -2333,12 +2351,24 @@ void video_viewport_get_scaled_integer(struct video_viewport *vp,
}
else
{
float viewport_bias_x = settings->floats.video_viewport_bias_x;
float viewport_bias_y = settings->floats.video_viewport_bias_y;
unsigned base_width;
/* Use system reported sizes as these define the
* geometry for the "normal" case. */
unsigned base_height =
video_st->av_info.geometry.base_height;
unsigned int rotation = retroarch_get_rotation();
#if defined(RARCH_MOBILE)
if (aspect_ratio < 1.0f)
{
viewport_bias_x = settings->floats.video_viewport_bias_portrait_x;
viewport_bias_y = settings->floats.video_viewport_bias_portrait_y;
}
#endif
if (!ydown)
viewport_bias_y = 1.0 - viewport_bias_y;
if (rotation % 2)
base_height = video_st->av_info.geometry.base_width;
@ -2382,12 +2412,14 @@ void video_viewport_get_scaled_integer(struct video_viewport *vp,
width -= padding_x;
height -= padding_y;
padding_x *= viewport_bias_x;
padding_y *= viewport_bias_y;
}
vp->width = width;
vp->height = height;
vp->x = padding_x / 2;
vp->y = padding_y / 2;
vp->x = padding_x;
vp->y = padding_y;
}
void video_driver_display_type_set(enum rarch_display_type type)

View File

@ -991,18 +991,49 @@ void video_driver_menu_settings(void **list_data, void *list_info_data,
/**
* video_viewport_get_scaled_integer:
* @vp : Viewport handle
* @vp : Viewport handle.
* @width : Width.
* @height : Height.
* @aspect_ratio : Aspect ratio (in float).
* @keep_aspect : Preserve aspect ratio?
* @ydown : Positive y goes "down".
*
* Gets viewport scaling dimensions based on
* scaled integer aspect ratio.
**/
void video_viewport_get_scaled_integer(struct video_viewport *vp,
unsigned width, unsigned height,
float aspect_ratio, bool keep_aspect);
float aspect_ratio, bool keep_aspect,
bool ydown);
/**
* video_viewport_get_scaled_aspect:
* @vp : Viewport handle. Fields x, y, width, height will be written, and full_width or full_height might be read.
* @width : Viewport width.
* @height : Viewport height.
* @ydown : Positive y goes "down".
*
* Gets viewport scaling dimensions based on
* scaled non-integer aspect ratio.
**/
void video_viewport_get_scaled_aspect(struct video_viewport *vp,
unsigned width, unsigned height, bool ydown);
/**
* video_viewport_get_scaled_aspect2:
* @vp : Viewport handle. Fields x, y, width, height will be written, and full_width or full_height might be read.
* @width : Viewport width.
* @height : Viewport height.
* @ydown : Positive y goes "down".
* @device_aspect : Device aspect ratio.
* @desired_aspect: Target aspect ratio.
*
* Gets viewport scaling dimensions based on
* scaled non-integer aspect ratio.
**/
void video_viewport_get_scaled_aspect2(struct video_viewport *vp,
unsigned width, unsigned height, bool ydown,
float device_aspect, float desired_aspect);
/**
* video_monitor_set_refresh_rate:

View File

@ -23,7 +23,9 @@ enum x11_mouse_btn_flags
X11_MOUSE_WU_BTN = (1 << 0),
X11_MOUSE_WD_BTN = (1 << 1),
X11_MOUSE_HWU_BTN = (1 << 2),
X11_MOUSE_HWD_BTN = (1 << 3)
X11_MOUSE_HWD_BTN = (1 << 3),
X11_MOUSE_BTN_4 = (1 << 4),
X11_MOUSE_BTN_5 = (1 << 5)
};
/* TODO/FIXME - static globals */
@ -51,6 +53,13 @@ int16_t x_mouse_state_wheel(unsigned id)
ret = (g_x11_mouse_flags & X11_MOUSE_HWD_BTN);
g_x11_mouse_flags &= ~X11_MOUSE_HWD_BTN;
break;
case RETRO_DEVICE_ID_MOUSE_BUTTON_4:
ret = (g_x11_mouse_flags & X11_MOUSE_BTN_4);
break;
case RETRO_DEVICE_ID_MOUSE_BUTTON_5:
ret = (g_x11_mouse_flags & X11_MOUSE_BTN_5);
break;
}
return ret;
@ -74,5 +83,31 @@ void x_input_poll_wheel(XButtonEvent *event, bool latch)
/* Scroll wheel right == HORIZ_WHEELUP */
g_x11_mouse_flags |= X11_MOUSE_HWU_BTN;
break;
case 8:
/* Extra buttons are regular press-release events,
* while scroll wheels do not stay pressed. */
/* Mouse button 4 */
switch (event->type)
{
case ButtonPress:
g_x11_mouse_flags |= X11_MOUSE_BTN_4;
break;
case ButtonRelease:
g_x11_mouse_flags &= ~X11_MOUSE_BTN_4;
break;
}
break;
case 9:
/* Mouse button 5 */
switch (event->type)
{
case ButtonPress:
g_x11_mouse_flags |= X11_MOUSE_BTN_5;
break;
case ButtonRelease:
g_x11_mouse_flags &= ~X11_MOUSE_BTN_5;
break;
}
break;
}
}

View File

@ -875,6 +875,14 @@ static INLINE void android_input_poll_event_type_keyboard(
mod |= RETROKMOD_CTRL;
if (meta & AMETA_SHIFT_ON)
mod |= RETROKMOD_SHIFT;
if (meta & AMETA_CAPS_LOCK_ON)
mod |= RETROKMOD_CAPSLOCK;
if (meta & AMETA_NUM_LOCK_ON)
mod |= RETROKMOD_NUMLOCK;
if (meta & AMETA_SCROLL_LOCK_ON)
mod |= RETROKMOD_SCROLLOCK;
if (meta & AMETA_META_ON)
mod |= RETROKMOD_META;
input_keyboard_event(keydown, keyboardcode,
keyboardcode, mod, RETRO_DEVICE_KEYBOARD);

View File

@ -199,6 +199,26 @@ static void *dinput_init(const char *joypad_driver)
return di;
}
static uint16_t dinput_get_active_keyboard_mods()
{
uint16_t mod = 0;
if (GetKeyState(VK_SHIFT) & 0x80)
mod |= RETROKMOD_SHIFT;
if (GetKeyState(VK_CONTROL) & 0x80)
mod |= RETROKMOD_CTRL;
if (GetKeyState(VK_MENU) & 0x80)
mod |= RETROKMOD_ALT;
if (GetKeyState(VK_CAPITAL) & 0x81)
mod |= RETROKMOD_CAPSLOCK;
if (GetKeyState(VK_SCROLL) & 0x81)
mod |= RETROKMOD_SCROLLOCK;
if (GetKeyState(VK_NUMLOCK) & 0x81)
mod |= RETROKMOD_NUMLOCK;
if ((GetKeyState(VK_LWIN) | GetKeyState(VK_RWIN)) & 0x80)
mod |= RETROKMOD_META;
return mod;
}
static void dinput_keyboard_mods(struct dinput_input *di, int mod)
{
switch (mod)
@ -212,7 +232,8 @@ static void dinput_keyboard_mods(struct dinput_input *di, int mod)
|| (!vk_shift_l && (di->flags & DINP_FLAG_SHIFT_L)))
{
input_keyboard_event(vk_shift_l, RETROK_LSHIFT,
0, RETROKMOD_SHIFT, RETRO_DEVICE_KEYBOARD);
0, dinput_get_active_keyboard_mods() | RETROKMOD_SHIFT,
RETRO_DEVICE_KEYBOARD);
if (di->flags & DINP_FLAG_SHIFT_L)
di->flags &= ~DINP_FLAG_SHIFT_L;
else
@ -223,7 +244,8 @@ static void dinput_keyboard_mods(struct dinput_input *di, int mod)
|| (!vk_shift_r && (di->flags & DINP_FLAG_SHIFT_R)))
{
input_keyboard_event(vk_shift_r, RETROK_RSHIFT,
0, RETROKMOD_SHIFT, RETRO_DEVICE_KEYBOARD);
0, dinput_get_active_keyboard_mods() | RETROKMOD_SHIFT,
RETRO_DEVICE_KEYBOARD);
if (di->flags & DINP_FLAG_SHIFT_R)
di->flags &= ~DINP_FLAG_SHIFT_R;
else
@ -246,7 +268,8 @@ static void dinput_keyboard_mods(struct dinput_input *di, int mod)
else if (!vk_alt_l && (di->flags & DINP_FLAG_ALT_L))
{
input_keyboard_event(vk_alt_l, RETROK_LALT,
0, RETROKMOD_ALT, RETRO_DEVICE_KEYBOARD);
0, dinput_get_active_keyboard_mods() | RETROKMOD_ALT,
RETRO_DEVICE_KEYBOARD);
if (di->flags & DINP_FLAG_ALT_L)
di->flags &= ~DINP_FLAG_ALT_L;
else

View File

@ -442,6 +442,11 @@ static void sdl_input_poll(void *data)
if (event.key.keysym.mod & KMOD_CAPS)
mod |= RETROKMOD_CAPSLOCK;
/* KMOD_SCROLL was added in SDL 2.0.18, use the raw number
to stay backwards compatible with older versions */
if (event.key.keysym.mod & 0x8000 /*KMOD_SCROLL*/)
mod |= RETROKMOD_SCROLLOCK;
input_keyboard_event(event.type == SDL_KEYDOWN, code, code, mod,
RETRO_DEVICE_KEYBOARD);
}

View File

@ -210,12 +210,20 @@ static void switch_input_poll(void *data)
}
hidGetKeyboardStates(&kbd_state, 1);
if (hidKeyboardStateGetKey(&kbd_state, HidKeyboardKey_LeftAlt) || hidKeyboardStateGetKey(&kbd_state, HidKeyboardKey_RightAlt))
if (kbd_state.modifiers & (HidKeyboardModifier_LeftAlt | HidKeyboardModifier_RightAlt))
mod |= RETROKMOD_ALT;
if (hidKeyboardStateGetKey(&kbd_state, HidKeyboardKey_LeftControl) || hidKeyboardStateGetKey(&kbd_state, HidKeyboardKey_RightControl))
if (kbd_state.modifiers & HidKeyboardModifier_Control)
mod |= RETROKMOD_CTRL;
if (hidKeyboardStateGetKey(&kbd_state, HidKeyboardKey_LeftShift) || hidKeyboardStateGetKey(&kbd_state, HidKeyboardKey_RightShift))
if (kbd_state.modifiers & HidKeyboardModifier_Shift)
mod |= RETROKMOD_SHIFT;
if (kbd_state.modifiers & HidKeyboardModifier_Gui)
mod |= RETROKMOD_META;
if (kbd_state.modifiers & HidKeyboardModifier_CapsLock)
mod |= RETROKMOD_CAPSLOCK;
if (kbd_state.modifiers & HidKeyboardModifier_ScrollLock)
mod |= RETROKMOD_SCROLLOCK;
if (kbd_state.modifiers & HidKeyboardModifier_NumLock)
mod |= RETROKMOD_NUMLOCK;
for (i = 0; i < SWITCH_NUM_SCANCODES; i++)
{

View File

@ -581,6 +581,8 @@ static LRESULT CALLBACK winraw_callback(
mod |= RETROKMOD_CAPSLOCK;
if (GetKeyState(VK_SCROLL) & 0x81)
mod |= RETROKMOD_SCROLLOCK;
if (GetKeyState(VK_NUMLOCK) & 0x81)
mod |= RETROKMOD_NUMLOCK;
if ((GetKeyState(VK_LWIN) | GetKeyState(VK_RWIN)) & 0x80)
mod |= RETROKMOD_META;

View File

@ -86,12 +86,8 @@ static bool x_mouse_button_pressed(
return x11->mouse_r;
case RETRO_DEVICE_ID_MOUSE_MIDDLE:
return x11->mouse_m;
#if 0
case RETRO_DEVICE_ID_MOUSE_BUTTON_4:
return x11->mouse_b4;
case RETRO_DEVICE_ID_MOUSE_BUTTON_5:
return x11->mouse_b5;
#endif
case RETRO_DEVICE_ID_MOUSE_WHEELUP:
case RETRO_DEVICE_ID_MOUSE_WHEELDOWN:
case RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELUP:
@ -266,6 +262,8 @@ static int16_t x_input_state(
case RETRO_DEVICE_ID_MOUSE_WHEELDOWN:
case RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELUP:
case RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELDOWN:
case RETRO_DEVICE_ID_MOUSE_BUTTON_4:
case RETRO_DEVICE_ID_MOUSE_BUTTON_5:
return x_mouse_state_wheel(id);
case RETRO_DEVICE_ID_MOUSE_MIDDLE:
return x11->mouse_m;
@ -489,7 +487,8 @@ static void x_input_poll(void *data)
x11->mouse_l = mask & Button1Mask;
x11->mouse_m = mask & Button2Mask;
x11->mouse_r = mask & Button3Mask;
/* Buttons 4 and 5 are not returned here, so they are handled elsewhere. */
/* > Mouse pointer */
if (!x11->mouse_grabbed)
{

View File

@ -1148,6 +1148,14 @@ MSG_HASH(
MENU_ENUM_SUBLABEL_SAVING_SETTINGS,
"تغيير اعدادات النواة."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SYNC_CONFIGS,
"Sync: Configuration Files"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_CLOUD_SYNC_DESTRUCTIVE,
"When disabled, files are moved to a backup folder before being overwritten or deleted."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_USERNAME,
"اسم المستخدم"
@ -1875,6 +1883,8 @@ MSG_HASH(
MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_Y,
"نسبة الجوانب المخصصة (موضع X)"
)
#if defined(RARCH_MOBILE)
#endif
MSG_HASH(
MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_WIDTH,
"نسبة الجوانب المخصصة (العرض)"

View File

@ -824,6 +824,14 @@ MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_ENABLE,
"Activar la sincronización na nube"
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SYNC_CONFIGS,
"Sync: Configuration Files"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_CLOUD_SYNC_DESTRUCTIVE,
"When disabled, files are moved to a backup folder before being overwritten or deleted."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_USERNAME,
"Nome d'usuariu"
@ -1059,6 +1067,8 @@ MSG_HASH(
"Caltener la proporción del aspeutu"
)
#endif
#if defined(RARCH_MOBILE)
#endif
/* Settings > Video > HDR */

View File

@ -1228,10 +1228,14 @@ MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_DESTRUCTIVE,
"Дэструктыўная воблачная сінхранізацыя"
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SYNC_CONFIGS,
"Sync: Configuration Files"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_CLOUD_SYNC_DESTRUCTIVE,
"Калі адключана, файлы будуць перасунутыя ў тэчку рэзервовай копіі перад іх перазапісам ці выдаленнем."
)
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_DRIVER,
"Бэкенд воблачнай сінхранізацыі"
@ -2475,6 +2479,8 @@ MSG_HASH(
MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_Y,
"Уласныя суадносіны бакоў (пазіцыя Y)"
)
#if defined(RARCH_MOBILE)
#endif
MSG_HASH(
MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_WIDTH,
"Уласныя суадносіны бакоў (шырыня)"

View File

@ -336,6 +336,14 @@ MSG_HASH(
/* Settings */
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SYNC_CONFIGS,
"Sync: Configuration Files"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_CLOUD_SYNC_DESTRUCTIVE,
"When disabled, files are moved to a backup folder before being overwritten or deleted."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_PLAYLIST_SETTINGS,
"Плейлисти"
@ -379,6 +387,8 @@ MSG_HASH(
#if defined(DINGUX)
#endif
#if defined(RARCH_MOBILE)
#endif
/* Settings > Video > HDR */

View File

@ -1132,6 +1132,14 @@ MSG_HASH(
MENU_ENUM_SUBLABEL_SAVING_SETTINGS,
"Canvia les configuracions de desament."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SYNC_CONFIGS,
"Sync: Configuration Files"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_CLOUD_SYNC_DESTRUCTIVE,
"When disabled, files are moved to a backup folder before being overwritten or deleted."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_USERNAME,
"Nom dusuari"
@ -1907,6 +1915,8 @@ MSG_HASH(
MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_Y,
"Òfset de subàrea de visualització personalitzat per definir la posició de l'eix Y de la subàrea de visualització.\nS'ignora si s'activa 'Escalat d'enter'."
)
#if defined(RARCH_MOBILE)
#endif
MSG_HASH(
MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_WIDTH,
"Relació d'aspecte personalitzat (amplada)"

View File

@ -1232,10 +1232,14 @@ MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_DESTRUCTIVE,
"破坏性云同步"
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SYNC_CONFIGS,
"Sync: Configuration Files"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_CLOUD_SYNC_DESTRUCTIVE,
"禁用后,文件会在被覆盖或删除之前移至备份文件夹。"
)
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_DRIVER,
"云同步后端"
@ -2559,6 +2563,8 @@ MSG_HASH(
MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_Y,
"自定义 Y 轴视图偏移量。\n如果启用「整数缩放」则忽略此选项。"
)
#if defined(RARCH_MOBILE)
#endif
MSG_HASH(
MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_WIDTH,
"自定义宽高比宽度"

View File

@ -1188,10 +1188,14 @@ MSG_HASH(
MENU_ENUM_SUBLABEL_CLOUD_SYNC_ENABLE,
"嘗試將雲端設定檔、記憶存檔與狀態同步到雲端儲存供應商。"
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SYNC_CONFIGS,
"Sync: Configuration Files"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_CLOUD_SYNC_DESTRUCTIVE,
"若未啟用,覆蓋或刪除前檔案將會移動到備份資料夾。"
)
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_DRIVER,
"雲端同步後端"
@ -2351,6 +2355,8 @@ MSG_HASH(
MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_Y,
"自訂影像顯示垂直位置, 正數向下移動, 負數向上移動。\n開啟「整數縮放」時此選項被忽略。"
)
#if defined(RARCH_MOBILE)
#endif
MSG_HASH(
MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_WIDTH,
"自訂寬度"

View File

@ -1200,10 +1200,14 @@ MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_DESTRUCTIVE,
"Destruktivní cloudová synchronizace"
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SYNC_CONFIGS,
"Sync: Configuration Files"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_CLOUD_SYNC_DESTRUCTIVE,
"Pokud je tato funkce vypnuta, jsou soubory před přepsáním nebo odstraněním přesunuty do záložní složky."
)
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_DRIVER,
"Backend cloudové synchronizace"
@ -2503,6 +2507,8 @@ MSG_HASH(
MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_Y,
"Vlastní posun zobrazení, který se používá k určení polohy osy Y zobrazení.\nTyto údaje jsou ignorovány, pokud je povoleno 'Celočíselné Škálování'."
)
#if defined(RARCH_MOBILE)
#endif
MSG_HASH(
MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_WIDTH,
"Vlastní poměr stran (na šířku)"

View File

@ -880,6 +880,14 @@ MSG_HASH(
MENU_ENUM_SUBLABEL_SAVING_SETTINGS,
"Newid gosodiadau arbed."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SYNC_CONFIGS,
"Sync: Configuration Files"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_CLOUD_SYNC_DESTRUCTIVE,
"When disabled, files are moved to a backup folder before being overwritten or deleted."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_LOGGING_SETTINGS,
"Logio"
@ -1015,6 +1023,8 @@ MSG_HASH(
#if defined(DINGUX)
#endif
#if defined(RARCH_MOBILE)
#endif
/* Settings > Video > HDR */

View File

@ -752,6 +752,14 @@ MSG_HASH(
MENU_ENUM_SUBLABEL_SAVING_SETTINGS,
"Skift gemmeindstillinger."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SYNC_CONFIGS,
"Sync: Configuration Files"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_CLOUD_SYNC_DESTRUCTIVE,
"When disabled, files are moved to a backup folder before being overwritten or deleted."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_LOGGING_SETTINGS,
"Logning"
@ -971,6 +979,8 @@ MSG_HASH(
#if defined(DINGUX)
#endif
#if defined(RARCH_MOBILE)
#endif
/* Settings > Video > HDR */

View File

@ -1160,10 +1160,14 @@ MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_DESTRUCTIVE,
"Destruktive Cloud-Synchronisation"
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SYNC_CONFIGS,
"Sync: Configuration Files"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_CLOUD_SYNC_DESTRUCTIVE,
"Wenn deaktiviert, werden die Dateien in einen Sicherungsordner verschoben, bevor sie überschrieben oder gelöscht werden."
)
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_DRIVER,
"Cloud-Sync-Backend"
@ -2467,6 +2471,8 @@ MSG_HASH(
MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_Y,
"Benutzerdefinierter Versatz des Ansichtsfensters, welcher die Y-Achsenposition definiert.\nDieser wird ignoriert, wenn \"Ganzzahlige Skalierung\" aktiviert ist."
)
#if defined(RARCH_MOBILE)
#endif
MSG_HASH(
MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_WIDTH,
"Bildbreite"

View File

@ -1148,6 +1148,14 @@ MSG_HASH(
MENU_ENUM_SUBLABEL_SAVING_SETTINGS,
"Αλλαγή ρυθμίσεων αποθήκευσης."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SYNC_CONFIGS,
"Sync: Configuration Files"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_CLOUD_SYNC_DESTRUCTIVE,
"When disabled, files are moved to a backup folder before being overwritten or deleted."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_USERNAME,
"Όνομα Χρήστη"
@ -1611,6 +1619,8 @@ MSG_HASH(
MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_Y,
"Προτιμώμενη Θέση Άξωνα Y Αναλογίας Οθόνης"
)
#if defined(RARCH_MOBILE)
#endif
MSG_HASH(
MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_WIDTH,
"Προτιμώμενο Πλάτος Αναλογίας Οθόνης"

View File

@ -128,6 +128,14 @@ MSG_HASH(
/* Settings */
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SYNC_CONFIGS,
"Sync: Configuration Files"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_CLOUD_SYNC_DESTRUCTIVE,
"When disabled, files are moved to a backup folder before being overwritten or deleted."
)
/* Core option category placeholders for icons */
@ -319,6 +327,8 @@ MSG_HASH(
"Maintain 1:1 pixel aspect ratios when scaling content with the internal IPU. If it's disabled, images will then be stretched to fill the entire display."
)
#endif
#if defined(RARCH_MOBILE)
#endif
MSG_HASH(
MENU_ENUM_SUBLABEL_VIDEO_CROP_OVERSCAN,
"Cut off a few pixels around the edges of the image customarily left blank by developers which sometimes also contain rubbish pixels."

View File

@ -264,6 +264,14 @@ MSG_HASH(
MENU_ENUM_SUBLABEL_SAVING_SETTINGS,
"Change settings for the saving."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SYNC_CONFIGS,
"Sync: Configuration Files"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_CLOUD_SYNC_DESTRUCTIVE,
"When disabled, files are moved to a backup folder before being overwritten or deleted."
)
MSG_HASH(
MENU_ENUM_SUBLABEL_LOGGING_SETTINGS,
"Change settings for the logging."
@ -415,6 +423,8 @@ MSG_HASH(
#if defined(DINGUX)
#endif
#if defined(RARCH_MOBILE)
#endif
/* Settings > Video > HDR */

View File

@ -1220,10 +1220,26 @@ MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_DESTRUCTIVE,
"Sincronización destructiva"
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SYNC_SAVES,
"Sincronizar: datos guardados/guardados rápidos"
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SYNC_CONFIGS,
"Sincronizar: archivos de configuración"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_CLOUD_SYNC_SYNC_SAVES,
"Al activar esta opción se sincronizarán los datos guardados y los guardados rápidos a la nube."
)
MSG_HASH(
MENU_ENUM_SUBLABEL_CLOUD_SYNC_SYNC_CONFIGS,
"Al activar esta opción se sincronizarán los archivos de configuración a la nube."
)
MSG_HASH(
MENU_ENUM_SUBLABEL_CLOUD_SYNC_DESTRUCTIVE,
"Al desactivar esta opción, los archivos serán trasladados a una carpeta de copia de seguridad antes de ser sobrescritos o eliminados."
)
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_DRIVER,
"Motor de sincronización en la nube"
@ -1402,11 +1418,11 @@ MSG_HASH(
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_POWER_MANAGEMENT_SETTINGS,
"Energía"
"Administración de energía"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_POWER_MANAGEMENT_SETTINGS,
"Cambia los ajustes de energía."
"Cambia los ajustes de la administración de energía."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_RETRO_ACHIEVEMENTS_SETTINGS,
@ -2543,6 +2559,56 @@ MSG_HASH(
MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_Y,
"Indica el diferencial de posición respecto al eje Y del área de visualización.\nEste valor se ignorará si la opción «Escalar usando números enteros» está activada."
)
MSG_HASH(
MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_X,
"Compensación del eje X del punto de anclaje del área de visualización"
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_BIAS_X,
"Compensación del eje X del punto de anclaje del área de visualización"
)
MSG_HASH(
MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_Y,
"Compensación del eje Y del punto de anclaje del área de visualización"
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_BIAS_Y,
"Compensación del eje Y del punto de anclaje del área de visualización"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_BIAS_X,
"Compensación personalizada usada para desplazar horizontalmente el área de visualización (si es más ancha que la altura del contenido). 0,0 significa llevar al extremo izquierdo y 1,0 significa llevar al extremo derecho."
)
MSG_HASH(
MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_BIAS_Y,
"Compensación personalizada usada para desplazar verticalmente el área de visualización (si es más alta que la altura del contenido). 0,0 significa llevar al extremo superior y 1,0 significa llevar al extremo inferior."
)
#if defined(RARCH_MOBILE)
MSG_HASH(
MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_PORTRAIT_X,
"Compensación del eje X del punto de anclaje del área de visualización (orientación vertical)"
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_BIAS_PORTRAIT_X,
"Compensación del eje X del punto de anclaje del área de visualización (orientación vertical)"
)
MSG_HASH(
MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_PORTRAIT_Y,
"Compensación del eje Y del punto de anclaje del área de visualización (orientación vertical)"
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_BIAS_PORTRAIT_Y,
"Compensación del eje Y del punto de anclaje del área de visualización (orientación vertical)"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_BIAS_PORTRAIT_X,
"Compensación personalizada usada para desplazar horizontalmente el área de visualización (si es más ancha que la altura del contenido) en una orientación vertical. 0,0 significa llevar al extremo izquierdo y 1,0 significa llevar al extremo derecho."
)
MSG_HASH(
MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_BIAS_PORTRAIT_Y,
"Compensación personalizada usada para desplazar verticalmente el área de visualización (si es más alta que la altura del contenido) en una orientación vertical. 0,0 significa llevar al extremo superior y 1,0 significa llevar al extremo inferior."
)
#endif
MSG_HASH(
MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_WIDTH,
"Relación de aspecto personalizada (ancho)"
@ -4294,7 +4360,7 @@ MSG_HASH(
)
MSG_HASH(
MENU_ENUM_SUBLABEL_RUN_AHEAD_FRAMES,
"Ajusta el número de fotogramas a ejecutar de forma anticipada. Puede haber tirones si el número de fotogramas retrasados supera al valor interno del juego."
"Ajusta el número de fotogramas a ejecutar de forma anticipada. Puede haber distorsiones visuales si el número de fotogramas retrasados supera al valor interno del juego."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_RUN_AHEAD_SECONDARY_INSTANCE,
@ -4334,7 +4400,7 @@ MSG_HASH(
)
MSG_HASH(
MENU_ENUM_SUBLABEL_PREEMPT_FRAMES,
"Ajusta el número de fotogramas preventivos que se ejecutarán. Puede haber tirones si el número de fotogramas retrasados supera al valor interno del juego."
"Ajusta el número de fotogramas preventivos que se ejecutarán. Puede haber distorsiones visuales si el número de fotogramas retrasados supera al valor interno del juego."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_PREEMPT_HIDE_WARNINGS,
@ -5272,19 +5338,19 @@ MSG_HASH(
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_OVERLAY_X_OFFSET_LANDSCAPE,
"Compensación X de superposición (modo horizontal)"
"Desplazamiento X de superposición (modo horizontal)"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_OVERLAY_X_OFFSET_LANDSCAPE,
"Compensa la superposición en el eje horizontal al utilizar una orientación de pantalla horizontal. Los valores positivos desplazarán la superposición hacia la derecha y los negativos hacia la izquierda."
"Desplaza la superposición en el eje horizontal al utilizar una orientación de pantalla horizontal. Los valores positivos desplazarán la superposición hacia la derecha y los negativos hacia la izquierda."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_OVERLAY_Y_OFFSET_LANDSCAPE,
"Compensación Y de superposición (modo horizontal)"
"Desplazamiento Y de superposición (modo horizontal)"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_OVERLAY_Y_OFFSET_LANDSCAPE,
"Compensa la superposición en el eje vertical al utilizar una orientación de pantalla horizontal. Los valores positivos desplazarán la superposición hacia arriba y los negativos hacia abajo."
"Desplaza la superposición en el eje vertical al utilizar una orientación de pantalla horizontal. Los valores positivos desplazarán la superposición hacia arriba y los negativos hacia abajo."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_OVERLAY_SCALE_PORTRAIT,
@ -5320,19 +5386,19 @@ MSG_HASH(
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_OVERLAY_X_OFFSET_PORTRAIT,
"Compensación X de superposición (modo vertical)"
"Desplazamiento X de superposición (modo vertical)"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_OVERLAY_X_OFFSET_PORTRAIT,
"Compensa la superposición en el eje horizontal al utilizar una orientación de pantalla vertical. Los valores positivos desplazarán la superposición hacia la derecha y los negativos hacia la izquierda."
"Desplaza la superposición en el eje horizontal al utilizar una orientación de pantalla vertical. Los valores positivos desplazarán la superposición hacia la derecha y los negativos hacia la izquierda."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_OVERLAY_Y_OFFSET_PORTRAIT,
"Compensación Y de superposición (modo vertical)"
"Desplazamiento Y de superposición (modo vertical)"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_OVERLAY_Y_OFFSET_PORTRAIT,
"Compensa la superposición en el eje vertical al utilizar una orientación de pantalla vertical. Los valores positivos desplazarán la superposición hacia arriba y los negativos hacia abajo."
"Desplaza la superposición en el eje vertical al utilizar una orientación de pantalla vertical. Los valores positivos desplazarán la superposición hacia arriba y los negativos hacia abajo."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_OSK_OVERLAY_SETTINGS,
@ -6759,11 +6825,11 @@ MSG_HASH(
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_SETTINGS_SHOW_POWER_MANAGEMENT,
"Mostrar Energía"
"Mostrar Administración de energía"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_SETTINGS_SHOW_POWER_MANAGEMENT,
"Muestra los ajustes de energía."
"Muestra los ajustes de administración de energía."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_SETTINGS_SHOW_ACHIEVEMENTS,
@ -6819,7 +6885,7 @@ MSG_HASH(
MSG_HASH(
MENU_ENUM_LABEL_VALUE_MENU_SCALE_FACTOR,
"Escala"
"Factor de escala"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_MENU_SCALE_FACTOR,
@ -7415,11 +7481,11 @@ MSG_HASH(
)
MSG_HASH(
MENU_ENUM_SUBLABEL_NETPLAY_INPUT_LATENCY_FRAMES_MIN,
"Indica el número de fotogramas de entrada que se utilizarán para ocultar la latencia durante el juego en red. Reduce los tirones y el uso de la CPU a costa de incrementar la latencia de entrada."
"Indica el número de fotogramas de entrada que se utilizarán para ocultar la latencia durante el juego en red. Reduce las distorsiones visuales y el uso de la CPU a costa de incrementar la latencia de entrada."
)
MSG_HASH(
MENU_ENUM_LABEL_HELP_NETPLAY_INPUT_LATENCY_FRAMES_MIN,
"El número de fotogramas de retraso en la entrada que utilizará el juego en red para ocultar la latencia de red.\nEsta opción retrasa la entrada local en el juego en red para que el fotograma ejecutado sea más próximo a los fotogramas que se reciban a través de la red, reduciendo los tirones y el consumo de la CPU, pero generará un retraso en la entrada visible."
"El número de fotogramas de retraso en la entrada que utilizará el juego en red para ocultar la latencia de red.\nEsta opción retrasa la entrada local en el juego en red para que el fotograma ejecutado sea más próximo a los fotogramas que se reciban a través de la red, reduciendo las distorsiones visuales y el consumo de la CPU, pero generará un retraso en la entrada visible."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_NETPLAY_INPUT_LATENCY_FRAMES_RANGE,
@ -7427,11 +7493,11 @@ MSG_HASH(
)
MSG_HASH(
MENU_ENUM_SUBLABEL_NETPLAY_INPUT_LATENCY_FRAMES_RANGE,
"Indica el rango de fotogramas de entrada que se utilizarán para ocultar la latencia durante el juego en red. Reduce los tirones y el uso de la CPU a costa de incrementar la latencia de entrada."
"Indica el rango de fotogramas de entrada que se utilizarán para ocultar la latencia durante el juego en red. Reduce las distorsiones visuales y el uso de la CPU a costa de incrementar la latencia de entrada."
)
MSG_HASH(
MENU_ENUM_LABEL_HELP_NETPLAY_INPUT_LATENCY_FRAMES_RANGE,
"El rango de fotogramas de retraso de entrada que puede utilizar el juego en red para camuflar la latencia de red.\nSi esta opción está activada, el juego en red ajustará de forma dinámica el número de fotogramas de retraso en la entrada para equilibrar el uso de la CPU; el retraso de entrada y la latencia de red. Reducirá los tirones y el consumo de la CPU, pero generará un retraso impredecible en las entradas/controles."
"El rango de fotogramas de retraso de entrada que puede utilizar el juego en red para camuflar la latencia de red.\nSi esta opción está activada, el juego en red ajustará de forma dinámica el número de fotogramas de retraso en la entrada para equilibrar el uso de la CPU; el retraso de entrada y la latencia de red. Reducirá las distorsiones visuales y el consumo de la CPU, pero generará un retraso impredecible en las entradas/controles."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_NETPLAY_NAT_TRAVERSAL,
@ -11254,7 +11320,7 @@ MSG_HASH(
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_MENU_XMB_THUMBNAIL_SCALE_FACTOR,
"Escala de miniaturas"
"Factor de escala de miniaturas"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_MENU_XMB_THUMBNAIL_SCALE_FACTOR,
@ -11508,7 +11574,7 @@ MSG_HASH(
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_OZONE_THUMBNAIL_SCALE_FACTOR,
"Escala de miniaturas"
"Factor de escala de miniaturas"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_OZONE_THUMBNAIL_SCALE_FACTOR,
@ -12472,7 +12538,7 @@ MSG_HASH(
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_VIDEO_MAX_SWAPCHAIN_IMAGES,
"Máximo de imágenes en «swap chain»"
"Máximo de imágenes en swap chain"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_VIDEO_MAX_SWAPCHAIN_IMAGES,
@ -12480,11 +12546,11 @@ MSG_HASH(
)
MSG_HASH(
MENU_ENUM_LABEL_HELP_VIDEO_MAX_SWAPCHAIN_IMAGES,
"Indica la cantidad máxima de imágenes en «swap chain». Esto indica al controlador de vídeo que utilice un búfer de vídeo concreto.\nBúfer simple: 1\nBúfer doble: 2\nBúfer triple: 3\nSelecciona el búfer más apropiado para mejorar en gran medida la latencia."
"Indica la cantidad máxima de imágenes en swap chain. Esto indica al controlador de vídeo que utilice un búfer de vídeo concreto.\nBúfer simple: 1\nBúfer doble: 2\nBúfer triple: 3\nSelecciona el búfer más apropiado para mejorar en gran medida la latencia."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_VIDEO_WAITABLE_SWAPCHAINS,
"«Swap chains» en espera"
"Swap chains en espera"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_VIDEO_WAITABLE_SWAPCHAINS,
@ -13825,7 +13891,7 @@ MSG_HASH(
)
MSG_HASH(
MSG_HW_RENDERED_MUST_USE_POSTSHADED_RECORDING,
"Este núcleo Libretro se renderiza por hardware. Las grabaciones deben tener shaders aplicados."
"Este núcleo libretro se renderiza por hardware. Las grabaciones deben tener shaders aplicados."
)
MSG_HASH(
MSG_INFLATED_CHECKSUM_DID_NOT_MATCH_CRC32,

View File

@ -1192,6 +1192,14 @@ MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_DESTRUCTIVE,
"همگام‌سازی ابری تخریبی"
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SYNC_CONFIGS,
"Sync: Configuration Files"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_CLOUD_SYNC_DESTRUCTIVE,
"When disabled, files are moved to a backup folder before being overwritten or deleted."
)
MSG_HASH(
MENU_ENUM_SUBLABEL_CLOUD_SYNC_DRIVER,
"شیوه‌نامهٔ شبکهٔ فضای ابری که باید استفاده شود."
@ -1963,6 +1971,8 @@ MSG_HASH(
MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_Y,
"نرخ نسبت سفارشی (موقعیت Y)"
)
#if defined(RARCH_MOBILE)
#endif
MSG_HASH(
MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_WIDTH,
"نرخ نسبت سفارشی (عرض)"

View File

@ -1208,10 +1208,14 @@ MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_DESTRUCTIVE,
"Tuhoava pilvisynkronointi"
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SYNC_CONFIGS,
"Sync: Configuration Files"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_CLOUD_SYNC_DESTRUCTIVE,
"Kun pois käytöstä, tiedostot siirretään varmuuskopio-kansioon, ennen kuin niitä korvataan tai poistetaan."
)
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_DRIVER,
"Pilvisynkronoinnin taustaosa"
@ -2339,6 +2343,8 @@ MSG_HASH(
MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_Y,
"Mukautettu ikkunan siirtymä, jota käytetään ikkunan Y-akselin sijainnin määrittämiseen.\nNämä jätetään huomioimatta, jos 'Skaalaa kokonaisluvuin' on käytössä."
)
#if defined(RARCH_MOBILE)
#endif
MSG_HASH(
MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_WIDTH,
"Mukautettu kuvasuhde (Leveys)"

View File

@ -1196,10 +1196,14 @@ MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_DESTRUCTIVE,
"Synchronisation destructive avec le Cloud"
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SYNC_CONFIGS,
"Sync: Configuration Files"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_CLOUD_SYNC_DESTRUCTIVE,
"Lorsque cette option est désactivée, les fichiers sont déplacés vers un dossier de sauvegarde avant d'être remplacés ou supprimés."
)
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_DRIVER,
"Plateforme de synchronisation avec le Cloud"
@ -2523,6 +2527,8 @@ MSG_HASH(
MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_Y,
"Décalage de la fenêtre d'affichage sur l'axe Y.\nCette option sera ignorée si l'option 'Échelle à l'entier' est activée."
)
#if defined(RARCH_MOBILE)
#endif
MSG_HASH(
MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_WIDTH,
"Largeur de l'affichage (Rapport d'aspect personnalisé)"

View File

@ -46,7 +46,7 @@ MSG_HASH(
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CONTENTLESS_CORES_TAB,
"Núcleos sen Contido"
"Núcleos sen Contidos"
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_ADD_TAB,
@ -61,7 +61,7 @@ MSG_HASH(
)
MSG_HASH(
MENU_ENUM_SUBLABEL_CONTENT_SETTINGS,
"Accede rápido ás configuracións relevantes do xogo."
"Accede rapidamente ás configuracións relevantes da partida."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CORE_LIST,
@ -151,7 +151,7 @@ MSG_HASH(
)
MSG_HASH(
MENU_ENUM_SUBLABEL_ONLINE_UPDATER,
"Descarga módulos de extensión, compoñentes e contido para RetroArch."
"Descargar complementos, compoñentes e contido para RetroArch."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_NETPLAY,
@ -308,7 +308,7 @@ MSG_HASH(
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_GOTO_CONTENTLESS_CORES,
"Núcleos sen Contido"
"Núcleos sen Contidos"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_GOTO_CONTENTLESS_CORES,
@ -1150,7 +1150,7 @@ MSG_HASH(
)
MSG_HASH(
MENU_ENUM_SUBLABEL_VIDEO_SETTINGS,
"Cambia os axustes da saída de video."
"Cambia os axustes da saída de vídeo."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_AUDIO_SETTINGS,
@ -1158,7 +1158,7 @@ MSG_HASH(
)
MSG_HASH(
MENU_ENUM_SUBLABEL_AUDIO_SETTINGS,
"Cambiar a configuración de entrada/saída de audio."
"Cambia a configuración de entrada e saída do son."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_INPUT_SETTINGS,
@ -1220,10 +1220,14 @@ MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_DESTRUCTIVE,
"Sincronización da nube destrutiva"
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SYNC_CONFIGS,
"Sync: Configuration Files"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_CLOUD_SYNC_DESTRUCTIVE,
"Cando está desactivado, os ficheiros móvense a un cartafol de copia de seguranza antes de sobrescribilos ou eliminalos."
)
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_DRIVER,
"Backend de sincronización na nube"
@ -1398,11 +1402,11 @@ MSG_HASH(
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_POWER_MANAGEMENT_SETTINGS,
"Xestión enerxética"
"Xestión da Enerxía"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_POWER_MANAGEMENT_SETTINGS,
"Cambia as configuracións da xestión enerxética."
"Cambia as configuracións da xestión de enerxía."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_RETRO_ACHIEVEMENTS_SETTINGS,
@ -2519,6 +2523,24 @@ MSG_HASH(
MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_Y,
"Desfase personalizado da ventana gráfica que se usa para definir a posición do eixe Y da ventana gráfica.\nIgnoraranse se está activada a \"Escala enteira\"."
)
MSG_HASH(
MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_BIAS_X,
"Desviación personalizada do porto de vista usada para compensar o porto de vista horizontalmente (se for máis ancho que a altura do contido). 0.0 significa moi á esquerda e 1.0 significa moi á dereita."
)
MSG_HASH(
MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_BIAS_Y,
"Desviación personalizada do porto de vista usada para compensar o porto de vista verticalmente (se for máis alto que a altura do contido). 0.0 significa arriba e 1.0 significa abaixo."
)
#if defined(RARCH_MOBILE)
MSG_HASH(
MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_BIAS_PORTRAIT_X,
"Desviación personalizada do porto de vista usada para desprazar o porto de vista horizontalmente (se for máis ancho que a altura do contido). 0.0 significa á esquerda e 1.0 significa á dereita. (Orientación en retrato)"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_BIAS_PORTRAIT_Y,
"Desviación personalizada do porto de vista usada para compensar o porto de vista verticalmente (se for máis alto que a altura do contido). 0.0 significa arriba e 1.0 significa abaixo. (Orientación en retrato)"
)
#endif
MSG_HASH(
MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_WIDTH,
"Relación de aspecto personalizada (ancho)"
@ -2691,7 +2713,7 @@ MSG_HASH(
)
MSG_HASH(
MENU_ENUM_SUBLABEL_MICROPHONE_SETTINGS,
"Cambiar a configuración de entrada de audio."
"Cambiar a configuración de entrada de son."
)
#endif
MSG_HASH(
@ -3939,35 +3961,35 @@ MSG_HASH(
MSG_HASH(
MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_PING_TOGGLE,
"Ping de Netplay (alternar)"
"Ping do Xogo en Rede (alternar)"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_INPUT_META_NETPLAY_PING_TOGGLE,
"Activa/desactiva o contador de ping para a sala de netplay actual."
"Activa/desactiva o contador de ping para a sala de Xogo en Rede actual."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_HOST_TOGGLE,
"Aloxamento de Netplay (alternar)"
"Aloxamento de Xogo en Rede (alternar)"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_INPUT_META_NETPLAY_HOST_TOGGLE,
"Activa/desactiva o hospedaxe de netplay."
"Activa/desactiva o hospedaxe de Xogo en Rede."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_GAME_WATCH,
"Netplay Play/Spectate Mode (alternar)"
"Xogo en Rede Modo Xogador / Espectador (alternar)"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_INPUT_META_NETPLAY_GAME_WATCH,
"Cambia a sesión actual de netplay entre os modos \"xogar\" e \"espectador\"."
"Cambia a sesión actual do xogo en rede entre os modos \"xogar\" e \"espectador\"."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_PLAYER_CHAT,
"Chat de Netplay Player"
"Chat de Xogadores no Xogo en Rede"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_INPUT_META_NETPLAY_PLAYER_CHAT,
"Envía unha mensaxe de chat á sesión actual de netplay."
"Envía unha mensaxe de chat na sesión actual de Xogo en Rede."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_FADE_CHAT_TOGGLE,
@ -4834,11 +4856,11 @@ MSG_HASH(
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_FASTFORWARD_FRAMESKIP,
"Frameskip de avance rápido"
"Salto Rápido de Fotogramas"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_FASTFORWARD_FRAMESKIP,
"Saltar fotogramas segundo a taxa de avance rápido. Isto aforra enerxía e permite o uso da limitación de cadros de terceiros."
"Saltar fotogramas segundo a taxa de avance rápido. Isto conserva enerxía e permite o uso de limitación de fotogramas de terceiros."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_SLOWMOTION_RATIO,
@ -7131,11 +7153,11 @@ MSG_HASH(
MSG_HASH(
MENU_ENUM_LABEL_VALUE_NETPLAY_PUBLIC_ANNOUNCE,
"Anunciar publicamente Netplay"
"Anunciar publicamente o Xogo en Rede"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_NETPLAY_PUBLIC_ANNOUNCE,
"Indica se hai que anunciar xogos de netplay publicamente. Se non se configura, os clientes deben conectarse manualmente en lugar de usar o vestíbulo público."
"Indica se hai que anunciar sesións de xogos en rede publicamente. Se non se configura, os clientes deben conectarse manualmente en lugar de usar o vestíbulo público."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_NETPLAY_USE_MITM_SERVER,
@ -7143,7 +7165,7 @@ MSG_HASH(
)
MSG_HASH(
MENU_ENUM_SUBLABEL_NETPLAY_USE_MITM_SERVER,
"Reenviar conexións de netplay a través dun servidor man-in-the-middle. Útil se o host está detrás dun firewall ou ten problemas con NAT/UPnP."
"Reenviar as conexións de xogo en rede a través dun servidor intermediario (man-in-the-middle). Útil se o servidor está detrás dunha devasa (firewall) ou ten problemas con NAT/UPnP."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_NETPLAY_MITM_SERVER,
@ -7187,15 +7209,15 @@ MSG_HASH(
)
MSG_HASH(
MENU_ENUM_SUBLABEL_NETPLAY_IP_ADDRESS,
"O enderezo do host ao que se conectar."
"O enderezo do servidor ao que se conectar."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_NETPLAY_TCP_UDP_PORT,
"Porto TCP de Netplay"
"Porto TCP do Xogo en Rede"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_NETPLAY_TCP_UDP_PORT,
"O porto do enderezo IP do host. Pode ser un porto TCP ou UDP."
"O porto do enderezo IP do servidor. Pode ser un porto TCP ou UDP."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_NETPLAY_MAX_CONNECTIONS,
@ -7203,15 +7225,15 @@ MSG_HASH(
)
MSG_HASH(
MENU_ENUM_SUBLABEL_NETPLAY_MAX_CONNECTIONS,
"O número máximo de conexións activas que o host aceptará antes de rexeitar outras novas."
"O número máximo de conexións activas co servidor aceptará antes de rexeitar outras novas."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_NETPLAY_MAX_PING,
"Limitador de ping"
"Limitador de Latencia"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_NETPLAY_MAX_PING,
"A latencia de conexión máxima (ping) que aceptará o host. Establéceo en 0 sen límite."
"A latencia máxima de conexión (ping) que o servidor aceptará. Axústao a 0 para non ter límite."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_NETPLAY_PASSWORD,
@ -7223,7 +7245,7 @@ MSG_HASH(
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_NETPLAY_SPECTATE_PASSWORD,
"Spectador do servidor - Só Contrasinal"
"Espectador do Servidor - Só Contrasinal"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_NETPLAY_SPECTATE_PASSWORD,
@ -7231,7 +7253,7 @@ MSG_HASH(
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_NETPLAY_START_AS_SPECTATOR,
"Modo Spectador Netplay"
"Modo Espectador do Xogo en Rede"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_NETPLAY_START_AS_SPECTATOR,
@ -14923,11 +14945,11 @@ MSG_HASH(
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_VIDEO_FRAME_REST,
"Resto de fotogramas"
"Pausa de fotogramas"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_VIDEO_FRAME_REST,
"Tenta reducir o uso da CPU vsync durmindo o máximo posible despois da presentación do cadro. Deseñado principalmente para sincronización de liña de exploración de terceiros."
"Tentar reducir o uso da CPU pola sincronía vertical durmindo o máximo posible tras a presentación do fotograma. Deseñado principalmente para a sincronización de terceiros por scanlines."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_PAL60_ENABLE,

View File

@ -252,6 +252,14 @@ MSG_HASH(
MENU_ENUM_LABEL_VALUE_INPUT_SETTINGS,
"קלט"
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SYNC_CONFIGS,
"Sync: Configuration Files"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_CLOUD_SYNC_DESTRUCTIVE,
"When disabled, files are moved to a backup folder before being overwritten or deleted."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_MENU_FILE_BROWSER_SETTINGS,
"סייר קבצים"
@ -399,6 +407,8 @@ MSG_HASH(
)
#if defined(DINGUX)
#endif
#if defined(RARCH_MOBILE)
#endif
/* Settings > Video > HDR */

View File

@ -784,6 +784,14 @@ MSG_HASH(
MENU_ENUM_LABEL_VALUE_SAVING_SETTINGS,
"Spremanje"
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SYNC_CONFIGS,
"Sync: Configuration Files"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_CLOUD_SYNC_DESTRUCTIVE,
"When disabled, files are moved to a backup folder before being overwritten or deleted."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_USERNAME,
"Korisničko ime"
@ -955,6 +963,8 @@ MSG_HASH(
)
#if defined(DINGUX)
#endif
#if defined(RARCH_MOBILE)
#endif
/* Settings > Video > HDR */

View File

@ -1204,10 +1204,14 @@ MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_DESTRUCTIVE,
"Destruktív szinkronizálás a felhőbe"
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SYNC_CONFIGS,
"Sync: Configuration Files"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_CLOUD_SYNC_DESTRUCTIVE,
"Kikapcsolt állapotban a fájlok egy tartalék könyvtárba kerülnek felülírás vagy törlés előtt."
)
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_DRIVER,
"A felhőszinkronizálás háttértára"
@ -2531,6 +2535,8 @@ MSG_HASH(
MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_Y,
"Az egyedi nézőablak Y irányú eltolása. \nNincs hatása egész-szorzós skálázáskor."
)
#if defined(RARCH_MOBILE)
#endif
MSG_HASH(
MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_WIDTH,
"Egyedi képarány (szélesség)"

View File

@ -1096,6 +1096,14 @@ MSG_HASH(
MENU_ENUM_SUBLABEL_SAVING_SETTINGS,
"Ubah pengaturan penyimpanan."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SYNC_CONFIGS,
"Sync: Configuration Files"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_CLOUD_SYNC_DESTRUCTIVE,
"When disabled, files are moved to a backup folder before being overwritten or deleted."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_LOGGING_SETTINGS,
"Pencatatan Log"
@ -1839,6 +1847,8 @@ MSG_HASH(
MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_Y,
"Offset area pandang khusus yang digunakan untuk menentukan posisi sumbu Y dari area pandang.\n Ini diabaikan jika 'Skala Bilangan Bulat' diaktifkan."
)
#if defined(RARCH_MOBILE)
#endif
MSG_HASH(
MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_WIDTH,
"Rasio Aspek Kustom (Lebar)"

View File

@ -1188,10 +1188,14 @@ MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_DESTRUCTIVE,
"Sincronizzazione Cloud Distruttiva"
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SYNC_CONFIGS,
"Sync: Configuration Files"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_CLOUD_SYNC_DESTRUCTIVE,
"Quando disabilitato, i file vengono spostati in una cartella di backup prima di essere sovrascritti o cancellati."
)
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_DRIVER,
"Backend Sincronizzazione Cloud"
@ -2499,6 +2503,8 @@ MSG_HASH(
MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_Y,
"Scostamento visuale personalizzato usato per definire la posizione dell'asse Y della porta di visualizzazione.\nQuesti vengono ignorati se 'Scala intera' è abilitata."
)
#if defined(RARCH_MOBILE)
#endif
MSG_HASH(
MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_WIDTH,
"Rapporto d'aspetto personalizzato(in Larghezza)"

View File

@ -1228,10 +1228,14 @@ MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_DESTRUCTIVE,
"破壊的なクラウド同期"
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SYNC_CONFIGS,
"Sync: Configuration Files"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_CLOUD_SYNC_DESTRUCTIVE,
"無効にすると、ファイルは上書きまたは削除される前にバックアップフォルダに移動されます。"
)
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_DRIVER,
"クラウド同期のバックエンド"
@ -2543,6 +2547,8 @@ MSG_HASH(
MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_Y,
"表示領域の Y軸位置を定義するために使用されるカスタム表示領域オフセットです。\n[整数倍拡大] が有効の場合は無視されます。"
)
#if defined(RARCH_MOBILE)
#endif
MSG_HASH(
MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_WIDTH,
"カスタムアスペクト比 (幅)"

View File

@ -1232,10 +1232,14 @@ MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_DESTRUCTIVE,
"파괴적 클라우드 동기화"
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SYNC_CONFIGS,
"Sync: Configuration Files"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_CLOUD_SYNC_DESTRUCTIVE,
"비활성화할 경우, 동기화 대상 파일들을 덮어씌우거나 삭제하지 않고 백업 폴더에 저장합니다."
)
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_DRIVER,
"클라우드 동기화 백엔드"
@ -2559,6 +2563,8 @@ MSG_HASH(
MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_Y,
"뷰포트의 Y축 위치를 정의하는 데 사용되는 사용자 뷰포트 오프셋입니다.\n'정수 단위 화면 크기'가 활성화된 경우 무시되고 자동으로 중앙이 됩니다."
)
#if defined(RARCH_MOBILE)
#endif
MSG_HASH(
MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_WIDTH,
"사용자 화면비 폭"

View File

@ -3636,6 +3636,14 @@ MSG_HASH(
MENU_ENUM_LABEL_CLOUD_SYNC_DESTRUCTIVE,
"cloud_sync_destructive"
)
MSG_HASH(
MENU_ENUM_LABEL_CLOUD_SYNC_SYNC_SAVES,
"cloud_sync_sync_saves"
)
MSG_HASH(
MENU_ENUM_LABEL_CLOUD_SYNC_SYNC_CONFIGS,
"cloud_sync_sync_configs"
)
MSG_HASH(
MENU_ENUM_LABEL_CLOUD_SYNC_DRIVER,
"cloud_sync_driver"
@ -4126,6 +4134,24 @@ MSG_HASH(
MENU_ENUM_LABEL_VIDEO_ASPECT_RATIO_INDEX,
"aspect_ratio_index"
)
MSG_HASH(
MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_X,
"video_viewport_bias_x"
)
MSG_HASH(
MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_Y,
"video_viewport_bias_y"
)
#if defined(RARCH_MOBILE)
MSG_HASH(
MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_PORTRAIT_X,
"video_viewport_bias_portrait_x"
)
MSG_HASH(
MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_PORTRAIT_Y,
"video_viewport_bias_portrait_y"
)
#endif
#if defined(DINGUX)
MSG_HASH(
MENU_ENUM_LABEL_VIDEO_DINGUX_IPU_KEEP_ASPECT,

View File

@ -52,6 +52,14 @@
/* Settings */
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SYNC_CONFIGS,
"Sync: Configuration Files"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_CLOUD_SYNC_DESTRUCTIVE,
"When disabled, files are moved to a backup folder before being overwritten or deleted."
)
/* Core option category placeholders for icons */
@ -91,6 +99,8 @@
#if defined(DINGUX)
#endif
#if defined(RARCH_MOBILE)
#endif
/* Settings > Video > HDR */

View File

@ -1088,6 +1088,14 @@ MSG_HASH(
MENU_ENUM_SUBLABEL_SAVING_SETTINGS,
"Instellingen voor opslaan wijzigen."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SYNC_CONFIGS,
"Sync: Configuration Files"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_CLOUD_SYNC_DESTRUCTIVE,
"When disabled, files are moved to a backup folder before being overwritten or deleted."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_USERNAME,
"Gebruikersnaam"
@ -2075,6 +2083,8 @@ MSG_HASH(
MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_Y,
"Aangepaste weergave-offset gebruikt voor het definiëren van de Y-as positie van de weergave.\nDeze worden genegeerd als 'Integer Schaal' is ingeschakeld."
)
#if defined(RARCH_MOBILE)
#endif
MSG_HASH(
MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_WIDTH,
"Aangepaste Beeldverhouding (Breedte)"

View File

@ -1160,10 +1160,14 @@ MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_ENABLE,
"Aktiver Sky-Synkronisering"
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SYNC_CONFIGS,
"Sync: Configuration Files"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_CLOUD_SYNC_DESTRUCTIVE,
"Når deaktivert, flyttes filer til en sikkerhetskopimappe før de overskrives eller slettes."
)
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_URL,
"URL for sky-lagring"
@ -1927,6 +1931,8 @@ MSG_HASH(
MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_Y,
"Tilpasset visningsregion forskyvning bruk for å definere Y-aksen av visningsregionen.\nDisse er ignorert hvis \"heltall skalering\" er aktivert."
)
#if defined(RARCH_MOBILE)
#endif
MSG_HASH(
MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_WIDTH,
"Egendefinert størrelsesforhold (bredde)"

View File

@ -204,6 +204,14 @@ MSG_HASH(
MENU_ENUM_LABEL_VALUE_VIDEO_SETTINGS,
"Vidèo"
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SYNC_CONFIGS,
"Sync: Configuration Files"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_CLOUD_SYNC_DESTRUCTIVE,
"When disabled, files are moved to a backup folder before being overwritten or deleted."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_PLAYLIST_SETTINGS,
"Listas de lectura"
@ -259,6 +267,8 @@ MSG_HASH(
#if defined(DINGUX)
#endif
#if defined(RARCH_MOBILE)
#endif
/* Settings > Video > HDR */

View File

@ -324,6 +324,14 @@ MSG_HASH(
MENU_ENUM_LABEL_VALUE_AUDIO_SETTINGS,
"ଅଡ଼ିଓ"
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SYNC_CONFIGS,
"Sync: Configuration Files"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_CLOUD_SYNC_DESTRUCTIVE,
"When disabled, files are moved to a backup folder before being overwritten or deleted."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_PLAYLIST_SETTINGS,
"ଚାଳନତାଲିକା"
@ -383,6 +391,8 @@ MSG_HASH(
#if defined(DINGUX)
#endif
#if defined(RARCH_MOBILE)
#endif
/* Settings > Video > HDR */

View File

@ -1212,10 +1212,14 @@ MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_DESTRUCTIVE,
"Destrukcyjna synchronizacja w chmurze"
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SYNC_CONFIGS,
"Sync: Configuration Files"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_CLOUD_SYNC_DESTRUCTIVE,
"Gdy wyłączone, pliki są przenoszone do folderu kopii zapasowej przed nadpisaniem lub usunięciem."
)
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_DRIVER,
"Back-end synchronizacji w chmurze"
@ -2503,6 +2507,8 @@ MSG_HASH(
MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_Y,
"Własne przesunięcie widoku używane do zdefiniowania położenia osi Y widoku.\nSą one ignorowane, jeśli włączona jest „skala całkowita”."
)
#if defined(RARCH_MOBILE)
#endif
MSG_HASH(
MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_WIDTH,
"Niestandardowy współczynnik proporcji (szerokość)"

View File

@ -1196,6 +1196,14 @@ MSG_HASH(
MENU_ENUM_SUBLABEL_CLOUD_SYNC_ENABLE,
"Tentativa de sincronizar configurações, sram e salvamentos para um provedor de armazenamento em nuvem."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SYNC_CONFIGS,
"Sync: Configuration Files"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_CLOUD_SYNC_DESTRUCTIVE,
"When disabled, files are moved to a backup folder before being overwritten or deleted."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_URL,
"Link do Armazenamento na Nuvem"
@ -2255,6 +2263,8 @@ MSG_HASH(
MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_Y,
"Deslocamento personalizado no eixo-Y da janela de exibição. \nSerá ignorado caso o \"dimensionamento com valores inteiros\" estiver ativado."
)
#if defined(RARCH_MOBILE)
#endif
MSG_HASH(
MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_WIDTH,
"Largura personalizada da proporção de tela"

View File

@ -1108,6 +1108,14 @@ MSG_HASH(
MENU_ENUM_SUBLABEL_SAVING_SETTINGS,
"Modificar as definições de gravação."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SYNC_CONFIGS,
"Sync: Configuration Files"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_CLOUD_SYNC_DESTRUCTIVE,
"When disabled, files are moved to a backup folder before being overwritten or deleted."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_USERNAME,
"Utilizador"
@ -1923,6 +1931,8 @@ MSG_HASH(
MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_Y,
"Proporção personalizada do ecrã na posição Y"
)
#if defined(RARCH_MOBILE)
#endif
MSG_HASH(
MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_WIDTH,
"Proporção personalizada da largura do ecrã"

View File

@ -52,6 +52,14 @@
/* Settings */
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SYNC_CONFIGS,
"Sync: Configuration Files"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_CLOUD_SYNC_DESTRUCTIVE,
"When disabled, files are moved to a backup folder before being overwritten or deleted."
)
/* Core option category placeholders for icons */
@ -91,6 +99,8 @@
#if defined(DINGUX)
#endif
#if defined(RARCH_MOBILE)
#endif
/* Settings > Video > HDR */

View File

@ -1228,10 +1228,14 @@ MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_DESTRUCTIVE,
"Деструктивная облачная синхронизация"
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SYNC_CONFIGS,
"Sync: Configuration Files"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_CLOUD_SYNC_DESTRUCTIVE,
"Если отключено, перед удалением или перезаписью файлы помещаются в каталог резервирования."
)
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_DRIVER,
"Бэкенд облачной синхронизации"
@ -2559,6 +2563,8 @@ MSG_HASH(
MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_Y,
"Ручная установка смещения области отображения по оси Y.\nНе учитывается, если включено 'Целочисленное масштабирование'."
)
#if defined(RARCH_MOBILE)
#endif
MSG_HASH(
MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_WIDTH,
"Пользовательское соотношение сторон (ширина)"

View File

@ -116,6 +116,14 @@ MSG_HASH(
/* Settings */
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SYNC_CONFIGS,
"Sync: Configuration Files"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_CLOUD_SYNC_DESTRUCTIVE,
"When disabled, files are moved to a backup folder before being overwritten or deleted."
)
/* Core option category placeholders for icons */
@ -155,6 +163,8 @@ MSG_HASH(
#if defined(DINGUX)
#endif
#if defined(RARCH_MOBILE)
#endif
/* Settings > Video > HDR */

View File

@ -1144,6 +1144,14 @@ MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_ENABLE,
"Povoliť cloud synchronizáciu"
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SYNC_CONFIGS,
"Sync: Configuration Files"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_CLOUD_SYNC_DESTRUCTIVE,
"When disabled, files are moved to a backup folder before being overwritten or deleted."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_USERNAME,
"Meno používateľa"
@ -1887,6 +1895,8 @@ MSG_HASH(
MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_Y,
"Vlastný pomer strán (pozícia Y)"
)
#if defined(RARCH_MOBILE)
#endif
MSG_HASH(
MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_WIDTH,
"Vlastný pomer strán (šírka)"

View File

@ -1108,6 +1108,14 @@ MSG_HASH(
MENU_ENUM_SUBLABEL_SAVING_SETTINGS,
"Izmeni podešavanja za usnimavanje."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SYNC_CONFIGS,
"Sync: Configuration Files"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_CLOUD_SYNC_DESTRUCTIVE,
"When disabled, files are moved to a backup folder before being overwritten or deleted."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_LOGGING_SETTINGS,
"Beleženje"
@ -1787,6 +1795,8 @@ MSG_HASH(
MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_Y,
"Postavi ofset za prozor prikaza kada se definiše pozicija prozora prikaza na Y osi.\nOvo se ignoriše ako je 'Celobrojno skaliranje' uključeno."
)
#if defined(RARCH_MOBILE)
#endif
MSG_HASH(
MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_WIDTH,
"Postavi odnos ekrana (širina)"

View File

@ -1144,10 +1144,14 @@ MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_DESTRUCTIVE,
"Destruktiv molnsynkning"
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SYNC_CONFIGS,
"Sync: Configuration Files"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_CLOUD_SYNC_DESTRUCTIVE,
"Inaktiverat flyttas filer till en säkerhetskopia innan de skrivs över eller raderas."
)
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_DRIVER,
"Backend för molnsynk"
@ -2251,6 +2255,8 @@ MSG_HASH(
MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_Y,
"Anpassad visningsportoffset som används för att definiera Y-axelns position för visningsporten.\nDessa ignoreras om 'Heltalsskala' är aktiverat."
)
#if defined(RARCH_MOBILE)
#endif
MSG_HASH(
MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_WIDTH,
"Anpassa bildformat (Bredd)"

View File

@ -1216,10 +1216,14 @@ MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_DESTRUCTIVE,
"Bulut Eşitleme Koruması"
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SYNC_CONFIGS,
"Sync: Configuration Files"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_CLOUD_SYNC_DESTRUCTIVE,
"Devre dışı bırakıldığında, dosyalar üzerine yazılmadan veya silinmeden önce yedek klasörüne taşınır."
)
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_DRIVER,
"Bulut Eşitleyici Arka Uç"
@ -2539,6 +2543,8 @@ MSG_HASH(
MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_Y,
"Görünüm penceresinin Y ekseni konumunu tanımlamak için kullanılan özel görünüm alanı ofseti.\n'Tam sayı Ölçeği' etkinse bunlar yok sayılır."
)
#if defined(RARCH_MOBILE)
#endif
MSG_HASH(
MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_WIDTH,
"Özel En Boy Oranı (Genişlik)"

View File

@ -1228,10 +1228,14 @@ MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_DESTRUCTIVE,
"Деструктивна хмарна синхронізація"
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SYNC_CONFIGS,
"Sync: Configuration Files"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_CLOUD_SYNC_DESTRUCTIVE,
"У вимкненому стані, файли переміщуються до резервного каталогу перед перезаписом чи видаленням."
)
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_DRIVER,
"Бекенд хмарної синхронізації"
@ -2359,6 +2363,8 @@ MSG_HASH(
MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_Y,
"Задати значення зсуву області перегляду по осі Y.\nІгнорується, якщо включено параметр «Цілочисельне масштабування»."
)
#if defined(RARCH_MOBILE)
#endif
MSG_HASH(
MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_WIDTH,
"Довільне співвідношення сторін (ширина)"

View File

@ -1244,10 +1244,26 @@ MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_DESTRUCTIVE,
"Destructive Cloud Sync"
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SYNC_SAVES,
"Sync: Saves/States"
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SYNC_CONFIGS,
"Sync: Configuration Files"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_CLOUD_SYNC_SYNC_SAVES,
"When enabled, saves/states will be synced to cloud."
)
MSG_HASH(
MENU_ENUM_SUBLABEL_CLOUD_SYNC_SYNC_CONFIGS,
"When enabled, configuration files will be synced to cloud."
)
MSG_HASH(
MENU_ENUM_SUBLABEL_CLOUD_SYNC_DESTRUCTIVE,
"When disabled, files are moved to a backup folder before being overwritten or deleted."
)
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_DRIVER,
"Cloud Sync Backend"
@ -2599,6 +2615,56 @@ MSG_HASH(
MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_Y,
"Custom viewport offset used for defining the Y-axis position of the viewport.\nThese are ignored if 'Integer Scale' is enabled."
)
MSG_HASH(
MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_X,
"Viewport Anchor Bias X"
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_BIAS_X,
"Viewport Anchor Bias X"
)
MSG_HASH(
MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_Y,
"Viewport Anchor Bias Y"
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_BIAS_Y,
"Viewport Anchor Bias Y"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_BIAS_X,
"Custom viewport bias used to offset the viewport horizontally (if wider than content height). 0.0 means far left and 1.0 means far right."
)
MSG_HASH(
MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_BIAS_Y,
"Custom viewport bias used to offset the viewport vertically (if taller than content height). 0.0 means top and 1.0 means bottom."
)
#if defined(RARCH_MOBILE)
MSG_HASH(
MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_PORTRAIT_X,
"Viewport Anchor Bias X (Portrait Orientation)"
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_BIAS_PORTRAIT_X,
"Viewport Anchor Bias X (Portrait Orientation)"
)
MSG_HASH(
MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_PORTRAIT_Y,
"Viewport Anchor Bias Y (Portrait Orientation)"
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_BIAS_PORTRAIT_Y,
"Viewport Anchor Bias Y (Portrait Orientation)"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_BIAS_PORTRAIT_X,
"Custom viewport bias used to offset the viewport horizontally (if wider than content height). 0.0 means far left and 1.0 means far right. (Portrait Orientation)"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_BIAS_PORTRAIT_Y,
"Custom viewport bias used to offset the viewport vertically (if taller than content height). 0.0 means top and 1.0 means bottom. (Portrait Orientation)"
)
#endif
MSG_HASH(
MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_WIDTH,
"Custom Aspect Ratio (Width)"

View File

@ -1124,6 +1124,14 @@ MSG_HASH(
MENU_ENUM_SUBLABEL_SAVING_SETTINGS,
"Canvia els ajustos de guardat."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SYNC_CONFIGS,
"Sync: Configuration Files"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_CLOUD_SYNC_DESTRUCTIVE,
"When disabled, files are moved to a backup folder before being overwritten or deleted."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_LOGGING_SETTINGS,
"Registres"
@ -1819,6 +1827,8 @@ MSG_HASH(
MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_Y,
"Indica el diferencial de posició respecte a l'eix Y de l'área de visualització.\nEste valor s'ignorarà si l'opció «Escalar usant nombres sencers» hi és activa."
)
#if defined(RARCH_MOBILE)
#endif
MSG_HASH(
MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_WIDTH,
"Relació d'aspecte personalitzat (amplària)"

View File

@ -1064,6 +1064,14 @@ MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_ENABLE,
"Bật đồng bộ hóa đám mây"
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SYNC_CONFIGS,
"Sync: Configuration Files"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_CLOUD_SYNC_DESTRUCTIVE,
"When disabled, files are moved to a backup folder before being overwritten or deleted."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_USERNAME,
"Tên truy nhập"
@ -1315,6 +1323,8 @@ MSG_HASH(
)
#if defined(DINGUX)
#endif
#if defined(RARCH_MOBILE)
#endif
/* Settings > Video > HDR */

View File

@ -31,7 +31,7 @@
#define LANGUAGE_PROGRESS_DANISH_APPROVED 0
/* German */
#define LANGUAGE_PROGRESS_GERMAN_TRANSLATED 100
#define LANGUAGE_PROGRESS_GERMAN_TRANSLATED 99
#define LANGUAGE_PROGRESS_GERMAN_APPROVED 14
/* Greek */
@ -48,14 +48,14 @@
/* Spanish */
#define LANGUAGE_PROGRESS_SPANISH_TRANSLATED 100
#define LANGUAGE_PROGRESS_SPANISH_APPROVED 90
#define LANGUAGE_PROGRESS_SPANISH_APPROVED 89
/* Persian */
#define LANGUAGE_PROGRESS_PERSIAN_TRANSLATED 12
#define LANGUAGE_PROGRESS_PERSIAN_APPROVED 0
/* Finnish */
#define LANGUAGE_PROGRESS_FINNISH_TRANSLATED 77
#define LANGUAGE_PROGRESS_FINNISH_TRANSLATED 76
#define LANGUAGE_PROGRESS_FINNISH_APPROVED 46
/* French */
@ -75,7 +75,7 @@
#define LANGUAGE_PROGRESS_CROATIAN_APPROVED 0
/* Hungarian */
#define LANGUAGE_PROGRESS_HUNGARIAN_TRANSLATED 100
#define LANGUAGE_PROGRESS_HUNGARIAN_TRANSLATED 99
#define LANGUAGE_PROGRESS_HUNGARIAN_APPROVED 0
/* Indonesian */
@ -91,7 +91,7 @@
#define LANGUAGE_PROGRESS_JAPANESE_APPROVED 0
/* Korean */
#define LANGUAGE_PROGRESS_KOREAN_TRANSLATED 99
#define LANGUAGE_PROGRESS_KOREAN_TRANSLATED 98
#define LANGUAGE_PROGRESS_KOREAN_APPROVED 0
/* Dutch */
@ -135,8 +135,8 @@
#define LANGUAGE_PROGRESS_SWEDISH_APPROVED 48
/* Turkish */
#define LANGUAGE_PROGRESS_TURKISH_TRANSLATED 100
#define LANGUAGE_PROGRESS_TURKISH_APPROVED 100
#define LANGUAGE_PROGRESS_TURKISH_TRANSLATED 99
#define LANGUAGE_PROGRESS_TURKISH_APPROVED 99
/* Ukrainian */
#define LANGUAGE_PROGRESS_UKRAINIAN_TRANSLATED 38
@ -155,6 +155,6 @@
#define LANGUAGE_PROGRESS_CHINESE_SIMPLIFIED_APPROVED 45
/* Chinese Traditional */
#define LANGUAGE_PROGRESS_CHINESE_TRADITIONAL_TRANSLATED 89
#define LANGUAGE_PROGRESS_CHINESE_TRADITIONAL_TRANSLATED 88
#define LANGUAGE_PROGRESS_CHINESE_TRADITIONAL_APPROVED 76

View File

@ -51,6 +51,14 @@ or are directly to function */
#endif
#endif
/* Whether the code should be inline asm stored in .text, or the original
array buffer */
#ifndef LIBCO_STATIC_TEXT
#if defined(WIIU)
#define LIBCO_STATIC_TEXT 1
#endif
#endif
#ifdef LIBCO_PPC_ASM
#ifdef __cplusplus
@ -61,6 +69,225 @@ or are directly to function */
void co_swap_asm(cothread_t, cothread_t);
#define CO_SWAP_ASM(x, y) co_swap_asm(x, y)
#elif LIBCO_STATIC_TEXT
asm(
".globl libco_ppc_code\n"
"libco_ppc_code:\n"
#if LIBCO_PPC64
"mfcr %r8\n"
"std %r1,40(%r4)\n"
"mflr %r9\n"
"std %r14,72(%r4)\n"
"std %r15,80(%r4)\n"
"std %r16,88(%r4)\n"
"std %r17,96(%r4)\n"
"std %r18,104(%r4)\n"
"std %r19,112(%r4)\n"
"std %r20,120(%r4)\n"
"std %r21,128(%r4)\n"
"std %r22,136(%r4)\n"
"std %r23,144(%r4)\n"
"std %r24,152(%r4)\n"
"std %r25,160(%r4)\n"
"std %r26,168(%r4)\n"
"std %r27,176(%r4)\n"
"std %r28,184(%r4)\n"
"std %r29,192(%r4)\n"
"std %r30,200(%r4)\n"
"std %r31,208(%r4)\n"
"std %r9,32(%r4)\n"
"ld %r7,32(%r3)\n"
"ld %r1,40(%r3)\n"
"bl 1f\n"
"trap\n"
"1:stw %r8,48(%r4)\n"
"lwz %r6,48(%r3)\n"
"mtctr %r7\n"
"ld %r14,72(%r3)\n"
"ld %r15,80(%r3)\n"
"ld %r16,88(%r3)\n"
"ld %r17,96(%r3)\n"
"ld %r18,104(%r3)\n"
"ld %r19,112(%r3)\n"
"ld %r20,120(%r3)\n"
"ld %r21,128(%r3)\n"
"ld %r22,136(%r3)\n"
"ld %r23,144(%r3)\n"
"ld %r24,152(%r3)\n"
"ld %r25,160(%r3)\n"
"ld %r26,168(%r3)\n"
"ld %r27,176(%r3)\n"
"ld %r28,184(%r3)\n"
"ld %r29,192(%r3)\n"
"ld %r30,200(%r3)\n"
"ld %r31,208(%r3)\n"
"mtcr %r6\n"
#else
"mfcr %r8\n"
"stw %r1,40(%r4)\n"
"mflr %r9\n"
"stw %r13,60(%r4)\n"
"stw %r14,64(%r4)\n"
"stw %r15,68(%r4)\n"
"stw %r16,72(%r4)\n"
"stw %r17,76(%r4)\n"
"stw %r18,80(%r4)\n"
"stw %r19,84(%r4)\n"
"stw %r20,88(%r4)\n"
"stw %r21,92(%r4)\n"
"stw %r22,96(%r4)\n"
"stw %r23,100(%r4)\n"
"stw %r24,104(%r4)\n"
"stw %r25,108(%r4)\n"
"stw %r26,112(%r4)\n"
"stw %r27,116(%r4)\n"
"stw %r28,120(%r4)\n"
"stw %r29,124(%r4)\n"
"stw %r30,128(%r4)\n"
"stw %r31,132(%r4)\n"
"stw %r9,32(%r4)\n"
"lwz %r7,32(%r3)\n"
"lwz %r1,40(%r3)\n"
"bl 1f\n"
"trap\n"
"1:stw %r8,48(%r4)\n"
"lwz %r6,48(%r3)\n"
"mtctr %r7\n"
"lwz %r13,60(%r3)\n"
"lwz %r14,64(%r3)\n"
"lwz %r15,68(%r3)\n"
"lwz %r16,72(%r3)\n"
"lwz %r17,76(%r3)\n"
"lwz %r18,80(%r3)\n"
"lwz %r19,84(%r3)\n"
"lwz %r20,88(%r3)\n"
"lwz %r21,92(%r3)\n"
"lwz %r22,96(%r3)\n"
"lwz %r23,100(%r3)\n"
"lwz %r24,104(%r3)\n"
"lwz %r25,108(%r3)\n"
"lwz %r26,112(%r3)\n"
"lwz %r27,116(%r3)\n"
"lwz %r28,120(%r3)\n"
"lwz %r29,124(%r3)\n"
"lwz %r30,128(%r3)\n"
"lwz %r31,132(%r3)\n"
"mtcr %r6\n"
#endif
#ifndef LIBCO_PPC_NOFP
"stfd %f14,224(%r4)\n"
"stfd %f15,232(%r4)\n"
"stfd %f16,240(%r4)\n"
"stfd %f17,248(%r4)\n"
"stfd %f18,256(%r4)\n"
"stfd %f19,264(%r4)\n"
"stfd %f20,272(%r4)\n"
"stfd %f21,280(%r4)\n"
"stfd %f22,288(%r4)\n"
"stfd %f23,296(%r4)\n"
"stfd %f24,304(%r4)\n"
"stfd %f25,312(%r4)\n"
"stfd %f26,320(%r4)\n"
"stfd %f27,328(%r4)\n"
"stfd %f28,336(%r4)\n"
"stfd %f29,344(%r4)\n"
"stfd %f30,352(%r4)\n"
"stfd %f31,360(%r4)\n"
"lfd %f14,224(%r3)\n"
"lfd %f15,232(%r3)\n"
"lfd %f16,240(%r3)\n"
"lfd %f17,248(%r3)\n"
"lfd %f18,256(%r3)\n"
"lfd %f19,264(%r3)\n"
"lfd %f20,272(%r3)\n"
"lfd %f21,280(%r3)\n"
"lfd %f22,288(%r3)\n"
"lfd %f23,296(%r3)\n"
"lfd %f24,304(%r3)\n"
"lfd %f25,312(%r3)\n"
"lfd %f26,320(%r3)\n"
"lfd %f27,328(%r3)\n"
"lfd %f28,336(%r3)\n"
"lfd %f29,344(%r3)\n"
"lfd %f30,352(%r3)\n"
"lfd %f31,360(%r3)\n"
#endif
#ifdef __ALTIVEC__
"mfvrsave %r5\n"
"addi %r8,%r4,384\n"
"addi %r9,%r4,400\n"
"andi. %r0,%r5,4095\n"
"stw %r5,52(%r4)\n"
"beq- 2\n"
"stvx %v20,%r0,%r8\n"
"addi %r8,%r8,32\n"
"stvx %v21,%r0,%r9\n"
"addi %r9,%r9,32\n"
"stvx %v22,%r0,%r8\n"
"addi %r8,%r8,32\n"
"stvx %v23,%r0,%r9\n"
"addi %r9,%r9,32\n"
"stvx %v24,%r0,%r8\n"
"addi %r8,%r8,32\n"
"stvx %v25,%r0,%r9\n"
"addi %r9,%r9,32\n"
"stvx %v26,%r0,%r8\n"
"addi %r8,%r8,32\n"
"stvx %v27,%r0,%r9\n"
"addi %r9,%r9,32\n"
"stvx %v28,%r0,%r8\n"
"addi %r8,%r8,32\n"
"stvx %v29,%r0,%r9\n"
"addi %r9,%r9,32\n"
"stvx %v30,%r0,%r8\n"
"stvx %v31,%r0,%r9\n"
"2:lwz %r5,52(%r3)\n"
"addi %r8,%r3,384\n"
"addi %r9,%r3,400\n"
"andi. %r0,%r5,4095\n"
"mtvrsave %r5\n"
"beqctr \n"
"lvx %v20,%r0,%r8\n"
"addi %r8,%r8,32\n"
"lvx %v21,%r0,%r9\n"
"addi %r9,%r9,32\n"
"lvx %v22,%r0,%r8\n"
"addi %r8,%r8,32\n"
"lvx %v23,%r0,%r9\n"
"addi %r9,%r9,32\n"
"lvx %v24,%r0,%r8\n"
"addi %r8,%r8,32\n"
"lvx %v25,%r0,%r9\n"
"addi %r9,%r9,32\n"
"lvx %v26,%r0,%r8\n"
"addi %r8,%r8,32\n"
"lvx %v27,%r0,%r9\n"
"addi %r9,%r9,32\n"
"lvx %v28,%r0,%r8\n"
"addi %r8,%r8,32\n"
"lvx %v29,%r0,%r9\n"
"addi %r9,%r9,32\n"
"lvx %v30,%r0,%r8\n"
"lvx %v31,%r0,%r9\n"
#endif
"bctr"
);
extern void libco_ppc_code(cothread_t, cothread_t);
#if LIBCO_PPCDESC
/* Function call goes through indirect descriptor */
#define CO_SWAP_ASM(x, y) \
((void (*)(cothread_t, cothread_t)) (uintptr_t) x)(x, y)
#else
/* Function call goes directly to code */
#define CO_SWAP_ASM(x, y) \
libco_ppc_code(x, y)
#endif
#else
/* Swap code is here in array. Please leave dieassembly comments,
@ -364,7 +591,7 @@ void co_delete(cothread_t t)
static void co_init_(void)
{
#if LIBCO_MPROTECT
#if LIBCO_MPROTECT && !LIBCO_STATIC_TEXT
/* TODO: pre- and post-pad PPC code so that this doesn't make other
data executable and writable */
long page_size = sysconf(_SC_PAGESIZE);

View File

@ -257,6 +257,8 @@ DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_saving_settings_list, MENU_
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_cloud_sync_settings_list, MENU_ENUM_SUBLABEL_CLOUD_SYNC_SETTINGS)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_cloud_sync_enable, MENU_ENUM_SUBLABEL_CLOUD_SYNC_ENABLE)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_cloud_sync_destructive, MENU_ENUM_SUBLABEL_CLOUD_SYNC_DESTRUCTIVE)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_cloud_sync_sync_saves, MENU_ENUM_SUBLABEL_CLOUD_SYNC_SYNC_SAVES)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_cloud_sync_sync_configs, MENU_ENUM_SUBLABEL_CLOUD_SYNC_SYNC_CONFIGS)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_cloud_sync_driver, MENU_ENUM_SUBLABEL_CLOUD_SYNC_DRIVER)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_cloud_sync_url, MENU_ENUM_SUBLABEL_CLOUD_SYNC_URL)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_cloud_sync_username, MENU_ENUM_SUBLABEL_CLOUD_SYNC_USERNAME)
@ -1251,6 +1253,12 @@ DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_viewport_custom_height,
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_viewport_custom_width, MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_WIDTH)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_viewport_custom_x, MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_X)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_viewport_custom_y, MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_Y)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_viewport_bias_x, MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_BIAS_X)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_viewport_bias_y, MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_BIAS_Y)
#if defined(RARCH_MOBILE)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_viewport_bias_portrait_x, MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_BIAS_PORTRAIT_X)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_viewport_bias_portrait_y, MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_BIAS_PORTRAIT_Y)
#endif
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_netplay_use_mitm_server, MENU_ENUM_SUBLABEL_NETPLAY_USE_MITM_SERVER)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_netplay_mitm_server, MENU_ENUM_SUBLABEL_NETPLAY_MITM_SERVER)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_netplay_custom_mitm_server, MENU_ENUM_SUBLABEL_NETPLAY_CUSTOM_MITM_SERVER)
@ -2570,6 +2578,20 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs,
case MENU_ENUM_LABEL_VIDEO_ASPECT_RATIO:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_video_aspect_ratio);
break;
case MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_X:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_video_viewport_bias_x);
break;
case MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_Y:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_video_viewport_bias_y);
break;
#if defined(RARCH_MOBILE)
case MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_PORTRAIT_X:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_video_viewport_bias_portrait_x);
break;
case MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_PORTRAIT_Y:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_video_viewport_bias_portrait_y);
break;
#endif
case MENU_ENUM_LABEL_VIDEO_ASPECT_RATIO_INDEX:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_video_aspect_ratio_index);
break;
@ -5029,6 +5051,12 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs,
case MENU_ENUM_LABEL_CLOUD_SYNC_DESTRUCTIVE:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_cloud_sync_destructive);
break;
case MENU_ENUM_LABEL_CLOUD_SYNC_SYNC_SAVES:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_cloud_sync_sync_saves);
break;
case MENU_ENUM_LABEL_CLOUD_SYNC_SYNC_CONFIGS:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_cloud_sync_sync_configs);
break;
case MENU_ENUM_LABEL_CLOUD_SYNC_DRIVER:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_cloud_sync_driver);
break;

View File

@ -9801,6 +9801,24 @@ unsigned menu_displaylist_build_list(
MENU_ENUM_LABEL_VIDEO_SCALE_INTEGER_OVERSCALE,
PARSE_ONLY_BOOL, false) == 0)
count++;
if (MENU_DISPLAYLIST_PARSE_SETTINGS_ENUM(list,
MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_X,
PARSE_ONLY_FLOAT, false) == 0)
count++;
if (MENU_DISPLAYLIST_PARSE_SETTINGS_ENUM(list,
MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_Y,
PARSE_ONLY_FLOAT, false) == 0)
count++;
#if defined(RARCH_MOBILE)
if (MENU_DISPLAYLIST_PARSE_SETTINGS_ENUM(list,
MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_PORTRAIT_X,
PARSE_ONLY_FLOAT, false) == 0)
count++;
if (MENU_DISPLAYLIST_PARSE_SETTINGS_ENUM(list,
MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_PORTRAIT_Y,
PARSE_ONLY_FLOAT, false) == 0)
count++;
#endif
if (MENU_DISPLAYLIST_PARSE_SETTINGS_ENUM(list,
MENU_ENUM_LABEL_VIDEO_ASPECT_RATIO_INDEX,
PARSE_ONLY_UINT, false) == 0)
@ -10690,12 +10708,14 @@ unsigned menu_displaylist_build_list(
case DISPLAYLIST_CLOUD_SYNC_SETTINGS_LIST:
{
menu_displaylist_build_info_t build_list[] = {
{MENU_ENUM_LABEL_CLOUD_SYNC_ENABLE, PARSE_ONLY_BOOL },
{MENU_ENUM_LABEL_CLOUD_SYNC_DESTRUCTIVE, PARSE_ONLY_BOOL },
{MENU_ENUM_LABEL_CLOUD_SYNC_DRIVER, PARSE_ONLY_STRING_OPTIONS },
{MENU_ENUM_LABEL_CLOUD_SYNC_URL, PARSE_ONLY_STRING },
{MENU_ENUM_LABEL_CLOUD_SYNC_USERNAME, PARSE_ONLY_STRING },
{MENU_ENUM_LABEL_CLOUD_SYNC_PASSWORD, PARSE_ONLY_STRING },
{MENU_ENUM_LABEL_CLOUD_SYNC_ENABLE, PARSE_ONLY_BOOL },
{MENU_ENUM_LABEL_CLOUD_SYNC_DESTRUCTIVE, PARSE_ONLY_BOOL },
{MENU_ENUM_LABEL_CLOUD_SYNC_SYNC_SAVES, PARSE_ONLY_BOOL },
{MENU_ENUM_LABEL_CLOUD_SYNC_SYNC_CONFIGS, PARSE_ONLY_BOOL },
{MENU_ENUM_LABEL_CLOUD_SYNC_DRIVER, PARSE_ONLY_STRING_OPTIONS },
{MENU_ENUM_LABEL_CLOUD_SYNC_URL, PARSE_ONLY_STRING },
{MENU_ENUM_LABEL_CLOUD_SYNC_USERNAME, PARSE_ONLY_STRING },
{MENU_ENUM_LABEL_CLOUD_SYNC_PASSWORD, PARSE_ONLY_STRING },
};
for (i = 0; i < ARRAY_SIZE(build_list); i++)

View File

@ -11830,6 +11830,36 @@ static bool setting_append_list(
general_read_handler,
SD_FLAG_NONE);
CONFIG_BOOL(
list, list_info,
&settings->bools.cloud_sync_sync_saves,
MENU_ENUM_LABEL_CLOUD_SYNC_SYNC_SAVES,
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SYNC_SAVES,
false,
MENU_ENUM_LABEL_VALUE_OFF,
MENU_ENUM_LABEL_VALUE_ON,
&group_info,
&subgroup_info,
parent_group,
general_write_handler,
general_read_handler,
SD_FLAG_NONE);
CONFIG_BOOL(
list, list_info,
&settings->bools.cloud_sync_sync_configs,
MENU_ENUM_LABEL_CLOUD_SYNC_SYNC_CONFIGS,
MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SYNC_CONFIGS,
false,
MENU_ENUM_LABEL_VALUE_OFF,
MENU_ENUM_LABEL_VALUE_ON,
&group_info,
&subgroup_info,
parent_group,
general_write_handler,
general_read_handler,
SD_FLAG_NONE);
CONFIG_STRING_OPTIONS(
list, list_info,
settings->arrays.cloud_sync_driver,
@ -12929,6 +12959,84 @@ static bool setting_append_list(
END_SUB_GROUP(list, list_info, parent_group);
START_SUB_GROUP(list, list_info, "Aspect", &group_info, &subgroup_info, parent_group);
CONFIG_FLOAT(
list, list_info,
&settings->floats.video_viewport_bias_x,
MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_X,
MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_BIAS_X,
DEFAULT_VIEWPORT_BIAS_X,
"%.2f",
&group_info,
&subgroup_info,
parent_group,
general_write_handler,
general_read_handler);
menu_settings_list_current_add_range(list, list_info, 0.0, 1.0, 0.05, true, true);
(*list)[list_info->index - 1].offset_by = 0;
SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ALLOW_INPUT);
MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info,
CMD_EVENT_VIDEO_APPLY_STATE_CHANGES);
SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
CONFIG_FLOAT(
list, list_info,
&settings->floats.video_viewport_bias_y,
MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_Y,
MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_BIAS_Y,
DEFAULT_VIEWPORT_BIAS_Y,
"%.2f",
&group_info,
&subgroup_info,
parent_group,
general_write_handler,
general_read_handler);
menu_settings_list_current_add_range(list, list_info, 0.0, 1.0, 0.05, true, true);
(*list)[list_info->index - 1].offset_by = 0;
SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ALLOW_INPUT);
MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info,
CMD_EVENT_VIDEO_APPLY_STATE_CHANGES);
SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
#if defined(RARCH_MOBILE)
CONFIG_FLOAT(
list, list_info,
&settings->floats.video_viewport_bias_portrait_x,
MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_PORTRAIT_X,
MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_BIAS_PORTRAIT_X,
DEFAULT_VIEWPORT_BIAS_PORTRAIT_X,
"%.2f",
&group_info,
&subgroup_info,
parent_group,
general_write_handler,
general_read_handler);
menu_settings_list_current_add_range(list, list_info, 0.0, 1.0, 0.05, true, true);
(*list)[list_info->index - 1].offset_by = 0;
SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ALLOW_INPUT);
MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info,
CMD_EVENT_VIDEO_APPLY_STATE_CHANGES);
SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
CONFIG_FLOAT(
list, list_info,
&settings->floats.video_viewport_bias_portrait_y,
MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_PORTRAIT_Y,
MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_BIAS_PORTRAIT_Y,
DEFAULT_VIEWPORT_BIAS_PORTRAIT_Y,
"%.2f",
&group_info,
&subgroup_info,
parent_group,
general_write_handler,
general_read_handler);
menu_settings_list_current_add_range(list, list_info, 0.0, 1.0, 0.05, true, true);
(*list)[list_info->index - 1].offset_by = 0;
SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ALLOW_INPUT);
MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info,
CMD_EVENT_VIDEO_APPLY_STATE_CHANGES);
SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
#endif
CONFIG_UINT(
list, list_info,
&settings->uints.video_aspect_ratio_idx,

View File

@ -3230,6 +3230,8 @@ enum msg_hash_enums
MENU_LABEL(CLOUD_SYNC_SETTINGS),
MENU_LABEL(CLOUD_SYNC_ENABLE),
MENU_LABEL(CLOUD_SYNC_DESTRUCTIVE),
MENU_LABEL(CLOUD_SYNC_SYNC_SAVES),
MENU_LABEL(CLOUD_SYNC_SYNC_CONFIGS),
MENU_LABEL(CLOUD_SYNC_DRIVER),
MENU_LABEL(CLOUD_SYNC_URL),
MENU_LABEL(CLOUD_SYNC_USERNAME),
@ -3385,6 +3387,12 @@ enum msg_hash_enums
MENU_LABEL(VIDEO_OVERSCAN_CORRECTION_TOP),
MENU_LABEL(VIDEO_OVERSCAN_CORRECTION_BOTTOM),
MENU_LABEL(VIDEO_ASPECT_RATIO),
MENU_LABEL(VIDEO_VIEWPORT_BIAS_X),
MENU_LABEL(VIDEO_VIEWPORT_BIAS_Y),
#if defined(RARCH_MOBILE)
MENU_LABEL(VIDEO_VIEWPORT_BIAS_PORTRAIT_X),
MENU_LABEL(VIDEO_VIEWPORT_BIAS_PORTRAIT_Y),
#endif
MENU_LABEL(VIDEO_FORCE_ASPECT),
MENU_LABEL(VIDEO_ASPECT_RATIO_AUTO),
MENU_LABEL(VIDEO_ASPECT_RATIO_INDEX),

View File

@ -10,8 +10,6 @@
<uses-feature android:name="android.hardware.touchscreen" android:required="false"/>
<uses-feature android:name="android.software.leanback" android:required="false" />
<uses-feature android:name="android.hardware.gamepad" android:required="false"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.VIBRATE" />
@ -25,8 +23,10 @@
android:isGame="true"
android:banner="@drawable/banner"
android:extractNativeLibs="true"
android:requestLegacyExternalStorage="true"
tools:ignore="UnusedAttribute">
<activity
android:name=".browser.mainmenu.MigrateRetroarchFolderActivity"
android:exported="false"/>
<activity android:name="com.retroarch.browser.mainmenu.MainMenuActivity" android:exported="true" android:launchMode="singleInstance">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

View File

@ -0,0 +1,31 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="migrate_retroarch_folder_dialog_title">
Migrate RetroArch Folder
</string>
<string name="migrate_retroarch_folder_dialog_message">
Because RetroArch was updated, the location of the RetroArch folder has changed. \n
Would you like to import data from an existing RetroArch folder?
</string>
<string name="migrate_retroarch_folder_dialog_positive">
Yes, select existing RetroArch folder
</string>
<string name="migrate_retroarch_folder_dialog_negative">
No, don\'t ask again
</string>
<string name="migrate_retroarch_folder_dialog_neutral">
No, ask next time
</string>
<string name="migrate_retroarch_folder_inprogress">
Copying RetroArch Files…
</string>
<string name="migrate_retroarch_folder_confirm">
Your RetroArch folder has been migrated. \n
You can find it in the files app under RetroArch > User Data.
</string>
<string name="migrate_retroarch_folder_confirm_witherror">
Your RetroArch folder has been migrated. \n
You can find it in the files app under RetroArch > User Data. \n
There were errors copying some files.
</string>
</resources>

View File

@ -12,106 +12,14 @@ import android.preference.PreferenceActivity;
import android.preference.PreferenceManager;
import android.provider.Settings;
import java.util.List;
import java.util.ArrayList;
import android.content.pm.PackageManager;
import android.Manifest;
import android.content.DialogInterface;
import android.app.AlertDialog;
import android.util.Log;
/**
* {@link PreferenceActivity} subclass that provides all of the
* functionality of the main menu screen.
*/
public final class MainMenuActivity extends PreferenceActivity
{
final private int REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS = 124;
public static String PACKAGE_NAME;
boolean checkPermissions = false;
public void showMessageOKCancel(String message, DialogInterface.OnClickListener onClickListener)
{
new AlertDialog.Builder(this).setMessage(message)
.setPositiveButton("OK", onClickListener).setCancelable(false)
.setNegativeButton("Cancel", null).create().show();
}
private boolean addPermission(List<String> permissionsList, String permission)
{
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M)
{
if (checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED)
{
permissionsList.add(permission);
// Check for Rationale Option
if (!shouldShowRequestPermissionRationale(permission))
return false;
}
}
return true;
}
public void checkRuntimePermissions()
{
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M)
{
// Android 6.0+ needs runtime permission checks
List<String> permissionsNeeded = new ArrayList<String>();
final List<String> permissionsList = new ArrayList<String>();
if (!addPermission(permissionsList, Manifest.permission.READ_EXTERNAL_STORAGE))
permissionsNeeded.add("Read External Storage");
if (!addPermission(permissionsList, Manifest.permission.WRITE_EXTERNAL_STORAGE))
permissionsNeeded.add("Write External Storage");
if (permissionsList.size() > 0)
{
checkPermissions = true;
if (permissionsNeeded.size() > 0)
{
// Need Rationale
Log.i("MainMenuActivity", "Need to request external storage permissions.");
String message = "You need to grant access to " + permissionsNeeded.get(0);
for (int i = 1; i < permissionsNeeded.size(); i++)
message = message + ", " + permissionsNeeded.get(i);
showMessageOKCancel(message,
new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
if (which == AlertDialog.BUTTON_POSITIVE)
{
requestPermissions(permissionsList.toArray(new String[permissionsList.size()]),
REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS);
Log.i("MainMenuActivity", "User accepted request for external storage permissions.");
}
}
});
}
else
{
requestPermissions(permissionsList.toArray(new String[permissionsList.size()]),
REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS);
Log.i("MainMenuActivity", "Requested external storage permissions.");
}
}
}
if (!checkPermissions)
{
finalStartup();
}
}
final int REQUEST_CODE_START = 120;
public void finalStartup()
{
@ -132,33 +40,6 @@ public final class MainMenuActivity extends PreferenceActivity
finish();
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults)
{
switch (requestCode)
{
case REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS:
for (int i = 0; i < permissions.length; i++)
{
if(grantResults[i] == PackageManager.PERMISSION_GRANTED)
{
Log.i("MainMenuActivity", "Permission: " + permissions[i] + " was granted.");
}
else
{
Log.i("MainMenuActivity", "Permission: " + permissions[i] + " was not granted.");
}
}
break;
default:
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
break;
}
finalStartup();
}
public static void startRetroActivity(Intent retro, String contentPath, String corePath,
String configFilePath, String imePath, String dataDirPath, String dataSourcePath)
{
@ -170,11 +51,19 @@ public final class MainMenuActivity extends PreferenceActivity
retro.putExtra("IME", imePath);
retro.putExtra("DATADIR", dataDirPath);
retro.putExtra("APK", dataSourcePath);
retro.putExtra("SDCARD", Environment.getExternalStorageDirectory().getAbsolutePath());
String external = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Android/data/" + PACKAGE_NAME + "/files";
retro.putExtra("SDCARD", external);
retro.putExtra("EXTERNAL", external);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
if(requestCode == REQUEST_CODE_START) {
finalStartup();
}
}
@Override
public void onCreate(Bundle savedInstanceState)
{
@ -187,6 +76,7 @@ public final class MainMenuActivity extends PreferenceActivity
UserPreferences.updateConfigFile(this);
checkRuntimePermissions();
Intent i = new Intent(this, MigrateRetroarchFolderActivity.class);
startActivityForResult(i, REQUEST_CODE_START);
}
}

View File

@ -0,0 +1,306 @@
package com.retroarch.browser.mainmenu;
import android.annotation.TargetApi;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.ContentResolver;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.os.ParcelFileDescriptor;
import android.preference.PreferenceManager;
import android.provider.DocumentsContract;
import android.util.Log;
import android.util.Pair;
import com.retroarch.R;
import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.ArrayList;
import java.util.function.BiPredicate;
import java.util.function.Consumer;
import java.util.stream.Stream;
@TargetApi(26)
public class MigrateRetroarchFolderActivity extends Activity
{
final int REQUEST_CODE_GET_OLD_RETROARCH_FOLDER = 125;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
// Needs v26 for some of the file handling functions below.
// Remove the TargetApi annotation to see which.
// If we don't have it, then just skip migration.
if (android.os.Build.VERSION.SDK_INT < 26) {
finish();
}
if(needToMigrate()){
askToMigrate();
}else{
finish();
}
}
boolean needToMigrate()
{
// As the RetroArch folder has been moved from shared storage to app-specific storage,
// people upgrading from older versions using the old location will need to migrate their data.
// We identify these users by checking that the app has been updated from an older version,
// and that the older version did not use the new location.
final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
boolean isNewInstall;
try{
PackageInfo info = getPackageManager().getPackageInfo(getPackageName(), 0);
isNewInstall = info.firstInstallTime == info.lastUpdateTime;
}catch(PackageManager.NameNotFoundException ex) {
isNewInstall = true;
}
// Avoid asking if new install
if(isNewInstall && !prefs.contains("external_retroarch_folder_needs_migrate")){
SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean("external_retroarch_folder_needs_migrate", false);
editor.apply();
}
return prefs.getBoolean("external_retroarch_folder_needs_migrate", true);
}
void askToMigrate()
{
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setCancelable(false);
builder.setTitle(R.string.migrate_retroarch_folder_dialog_title);
builder.setMessage(R.string.migrate_retroarch_folder_dialog_message);
builder.setNegativeButton(R.string.migrate_retroarch_folder_dialog_negative, new DialogInterface.OnClickListener() {
@Override public void onClick(DialogInterface dialogInterface, int i) {
SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(MigrateRetroarchFolderActivity.this).edit();
editor.putBoolean("external_retroarch_folder_needs_migrate", false);
editor.apply();
MigrateRetroarchFolderActivity.this.finish();
}
});
builder.setNeutralButton(R.string.migrate_retroarch_folder_dialog_neutral, new DialogInterface.OnClickListener() {
@Override public void onClick(DialogInterface dialogInterface, int i) {
SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(MigrateRetroarchFolderActivity.this).edit();
editor.putBoolean("external_retroarch_folder_needs_migrate", true);
editor.apply();
MigrateRetroarchFolderActivity.this.finish();
}
});
builder.setPositiveButton(R.string.migrate_retroarch_folder_dialog_positive, new DialogInterface.OnClickListener() {
@Override public void onClick(DialogInterface dialogInterface, int i) {
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, Uri.fromFile(new File(
Environment.getExternalStorageDirectory().getAbsolutePath() + "/RetroArch"
)));
startActivityForResult(intent, REQUEST_CODE_GET_OLD_RETROARCH_FOLDER);
}
});
AlertDialog dialog = builder.create();
dialog.show();
}
public void onActivityResult(int requestCode, int resultCode, Intent resultData)
{
super.onActivityResult(requestCode, resultCode, resultData);
if(requestCode == REQUEST_CODE_GET_OLD_RETROARCH_FOLDER){
if(resultCode == Activity.RESULT_OK && resultData != null){
copyFiles(resultData.getData());
}else{
//User cancelled or otherwise failed. Go back to the picker screen.
askToMigrate();
}
}
}
void copyFiles(Uri sourceDir)
{
final ProgressDialog pd = new ProgressDialog(this);
pd.setMax(100);
pd.setTitle(R.string.migrate_retroarch_folder_inprogress);
pd.setProgressStyle(ProgressDialog.STYLE_SPINNER);
pd.setCancelable(false);
CopyThread thread = new CopyThread()
{
@Override
protected void onPreExecute(){
super.onPreExecute();
pd.show();
}
@Override
protected void onProgressUpdate(String... params)
{
super.onProgressUpdate(params);
pd.setMessage(params[0]);
}
@Override
protected void onPostExecute(Boolean ok)
{
super.onPostExecute(ok);
pd.dismiss();
postMigrate(ok);
}
};
thread.execute(sourceDir);
}
void postMigrate(boolean ok)
{
SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(this).edit();
editor.putBoolean("external_retroarch_folder_needs_migrate", false);
editor.apply();
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage(ok ?
R.string.migrate_retroarch_folder_confirm :
R.string.migrate_retroarch_folder_confirm_witherror
);
builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override public void onClick(DialogInterface dialogInterface, int i) {
MigrateRetroarchFolderActivity.this.finish();
}
});
builder.create().show();
}
class CopyThread extends AsyncTask<Uri, String, Boolean>
{
ContentResolver resolver;
boolean error;
@Override
protected void onPreExecute()
{
resolver = MigrateRetroarchFolderActivity.this.getContentResolver();
error = false;
}
@Override
protected Boolean doInBackground(Uri... params)
{
Uri source = params[0];
error = false;
String destination = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Android/data/" + MigrateRetroarchFolderActivity.this.getPackageName() + "/files/RetroArch";
copyFolder(source, new File(destination));
patchConfig();
return !error;
}
void copyFolder(Uri sourceUri, File dest)
{
//create destination folder
if(!(dest.isDirectory() || dest.mkdirs())) {
Log.e("MigrateRetroarchFolder", "Couldn't make new destination folder " + dest.getPath());
error = true;
return;
}
Uri sourceChildrenResolver;
try{ //for subfolders
sourceChildrenResolver = DocumentsContract.buildChildDocumentsUriUsingTree(sourceUri, DocumentsContract.getDocumentId(sourceUri));
}catch(IllegalArgumentException ex){ //for root selected by document picker
sourceChildrenResolver = DocumentsContract.buildChildDocumentsUriUsingTree(sourceUri, DocumentsContract.getTreeDocumentId(sourceUri));
}
try(
//list children of directory
Cursor c = resolver.query(sourceChildrenResolver, new String[]{DocumentsContract.Document.COLUMN_DOCUMENT_ID, DocumentsContract.Document.COLUMN_DISPLAY_NAME, DocumentsContract.Document.COLUMN_MIME_TYPE}, null, null, null)
) {
if(c == null) {
Log.e("MigrateRetroarchFolder", "Could not list files in source folder " + sourceUri.toString());
error = true;
return;
}
while(c.moveToNext()){ //loop through children returned
String childFilename = c.getString(1);
Uri childUri = DocumentsContract.buildDocumentUriUsingTree(sourceUri, c.getString(0));
String childDocumentId = DocumentsContract.getDocumentId(childUri);
File destFile = new File(dest, childFilename);
if(c.getString(2).equals(DocumentsContract.Document.MIME_TYPE_DIR)){ //is a folder, recurse
copyFolder(childUri, destFile);
}else{ //is a file, copy it
try(
ParcelFileDescriptor pfd = resolver.openFileDescriptor(childUri, "r");
ParcelFileDescriptor.AutoCloseInputStream sourceStream = new ParcelFileDescriptor.AutoCloseInputStream(pfd);
) {
Files.copy(sourceStream, destFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
}catch(Exception ex){
Log.e("MigrateRetroarchFolder", "Error copying file " + childDocumentId, ex);
error = true;
}
}
publishProgress(destFile.toString());
}
}catch(Exception ex){
Log.e("MigrateRetroarchFolder", "Error while copying", ex);
error = true;
}
}
void patchConfig(){
String appDir = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Android/data/" + MigrateRetroarchFolderActivity.this.getPackageName() + "/files";
String legacyDefaultRetroarchPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/RetroArch";
String migratedRetroarchPath = appDir + "/RetroArch";
final ArrayList<Path> files = new ArrayList<>();
try (
Stream<Path> s = Files.find(Paths.get(appDir), 30, new BiPredicate<Path, BasicFileAttributes>() {
@Override
public boolean test(Path path, BasicFileAttributes basicFileAttributes) {
String p = path.toString();
return p.endsWith(".lpl") || p.endsWith(".cfg");
}
})
){
// yes it's a roudabout way to gather it in a list, but Stream.collect is throwing type errors
s.forEach(new Consumer<Path>() {
@Override
public void accept(Path path) {
files.add(path);
}
});
}catch(IOException ex){
Log.e("MigrateRetroarchFolder", "Error searching for config files", ex);
error = true;
return;
}
for(Path file : files){
try{
//back up before patching
Path backupFile = file.resolveSibling(file.getFileName() + ".old");
Files.copy(file, backupFile, StandardCopyOption.REPLACE_EXISTING);
//replace old retroarch prefix with new path
//assumes default old path, doesn't help if user has relocated it
//not doing any syntactical analysis because the search string is pretty long and unique
String contents = new String(Files.readAllBytes(file));
String replaced = contents.replace(legacyDefaultRetroarchPath, migratedRetroarchPath);
Files.write(file, replaced.getBytes(StandardCharsets.UTF_8));
}catch(IOException ex){
Log.e("MigrateRetroarchFolder", "Error patching file " + file.toAbsolutePath(), ex);
error = true;
return;
}
}
}
}
}

View File

@ -10,7 +10,9 @@ import android.database.MatrixCursor;
import android.graphics.Point;
import android.os.Build;
import android.os.CancellationSignal;
import android.os.Environment;
import android.os.ParcelFileDescriptor;
import android.provider.DocumentsContract;
import android.provider.DocumentsContract.Document;
import android.provider.DocumentsContract.Root;
import android.provider.DocumentsProvider;
@ -35,11 +37,13 @@ import java.util.LinkedList;
* offering two different ways of accessing your stored data. This would be confusing for users."
* - http://developer.android.com/guide/topics/providers/document-provider.html#43
*/
@TargetApi(Build.VERSION_CODES.KITKAT)
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public class RetroDocumentsProvider extends DocumentsProvider {
private static final String ALL_MIME_TYPES = "*/*";
private String DOCUMENTS_AUTHORITY;
// The default columns to return information about a root if no specific
// columns are requested in a query.
private static final String[] DEFAULT_ROOT_PROJECTION = new String[]{
@ -66,19 +70,31 @@ public class RetroDocumentsProvider extends DocumentsProvider {
@Override
public Cursor queryRoots(String[] projection) throws FileNotFoundException {
final File BASE_DIR = new File(getContext().getFilesDir().getParent());
final MatrixCursor result = new MatrixCursor(projection != null ? projection : DEFAULT_ROOT_PROJECTION);
@SuppressWarnings("ConstantConditions") final String applicationName = getContext().getString(R.string.app_name);
final MatrixCursor.RowBuilder row = result.newRow();
row.add(Root.COLUMN_ROOT_ID, getDocIdForFile(BASE_DIR));
row.add(Root.COLUMN_DOCUMENT_ID, getDocIdForFile(BASE_DIR));
row.add(Root.COLUMN_SUMMARY, null);
row.add(Root.COLUMN_FLAGS, Root.FLAG_SUPPORTS_CREATE | Root.FLAG_SUPPORTS_SEARCH | Root.FLAG_SUPPORTS_IS_CHILD);
row.add(Root.COLUMN_TITLE, applicationName);
row.add(Root.COLUMN_MIME_TYPES, ALL_MIME_TYPES);
row.add(Root.COLUMN_AVAILABLE_BYTES, BASE_DIR.getFreeSpace());
row.add(Root.COLUMN_ICON, R.mipmap.ic_launcher);
final File CORE_DIR = new File(getContext().getFilesDir().getParent());
final MatrixCursor.RowBuilder core = result.newRow();
core.add(Root.COLUMN_ROOT_ID, getDocIdForFile(CORE_DIR));
core.add(Root.COLUMN_DOCUMENT_ID, getDocIdForFile(CORE_DIR));
core.add(Root.COLUMN_SUMMARY, "Core Data");
core.add(Root.COLUMN_FLAGS, Root.FLAG_SUPPORTS_CREATE | Root.FLAG_SUPPORTS_SEARCH | Root.FLAG_SUPPORTS_IS_CHILD);
core.add(Root.COLUMN_TITLE, applicationName);
core.add(Root.COLUMN_MIME_TYPES, ALL_MIME_TYPES);
core.add(Root.COLUMN_AVAILABLE_BYTES, CORE_DIR.getFreeSpace());
core.add(Root.COLUMN_ICON, R.mipmap.ic_launcher);
final File USER_DIR = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Android/data/" + getContext().getPackageName() + "/files/RetroArch");
final MatrixCursor.RowBuilder user = result.newRow();
user.add(Root.COLUMN_ROOT_ID, getDocIdForFile(USER_DIR));
user.add(Root.COLUMN_DOCUMENT_ID, getDocIdForFile(USER_DIR));
user.add(Root.COLUMN_SUMMARY, "User Data");
user.add(Root.COLUMN_FLAGS, Root.FLAG_SUPPORTS_CREATE | Root.FLAG_SUPPORTS_SEARCH | Root.FLAG_SUPPORTS_IS_CHILD);
user.add(Root.COLUMN_TITLE, applicationName);
user.add(Root.COLUMN_MIME_TYPES, ALL_MIME_TYPES);
user.add(Root.COLUMN_AVAILABLE_BYTES, USER_DIR.getFreeSpace());
user.add(Root.COLUMN_ICON, R.mipmap.ic_launcher);
return result;
}
@ -89,6 +105,36 @@ public class RetroDocumentsProvider extends DocumentsProvider {
return result;
}
@Override
public String moveDocument(String sourceDocumentId, String sourceParentDocumentId, String targetParentDocumentId) throws FileNotFoundException {
File sourceFile = getFileForDocId(sourceDocumentId);
File targetParentFile = getFileForDocId(targetParentDocumentId);
File destination = new File(targetParentFile, sourceFile.getName());
boolean success = sourceFile.renameTo(destination);
if(!success){
throw new FileNotFoundException("Failed to move file " + sourceDocumentId + " to " + targetParentDocumentId);
}
getContext().getContentResolver().notifyChange(DocumentsContract.buildTreeDocumentUri(DOCUMENTS_AUTHORITY, sourceParentDocumentId), null);
getContext().getContentResolver().notifyChange(DocumentsContract.buildTreeDocumentUri(DOCUMENTS_AUTHORITY, targetParentDocumentId), null);
return getDocIdForFile(destination);
}
@Override
public String renameDocument(String documentId, String displayName) throws FileNotFoundException{
File document = getFileForDocId(documentId);
File destination = new File(document.getParentFile(), displayName);
boolean success = document.renameTo(destination);
if(!success){
throw new FileNotFoundException("Failed to rename file " + documentId + " to " + displayName);
}
getContext().getContentResolver().notifyChange(DocumentsContract.buildTreeDocumentUri(DOCUMENTS_AUTHORITY, getDocIdForFile(document.getParentFile())), null);
return getDocIdForFile(destination);
}
@Override
public Cursor queryChildDocuments(String parentDocumentId, String[] projection, String sortOrder) throws FileNotFoundException {
final MatrixCursor result = new MatrixCursor(projection != null ? projection : DEFAULT_DOCUMENT_PROJECTION);
@ -96,6 +142,7 @@ public class RetroDocumentsProvider extends DocumentsProvider {
for (File file : parent.listFiles()) {
includeFile(result, null, file);
}
result.setNotificationUri(getContext().getContentResolver(), DocumentsContract.buildTreeDocumentUri(DOCUMENTS_AUTHORITY, parentDocumentId));
return result;
}
@ -115,6 +162,7 @@ public class RetroDocumentsProvider extends DocumentsProvider {
@Override
public boolean onCreate() {
DOCUMENTS_AUTHORITY = getContext().getPackageName() + ".documents";
return true;
}
@ -138,14 +186,25 @@ public class RetroDocumentsProvider extends DocumentsProvider {
} catch (IOException e) {
throw new FileNotFoundException("Failed to create document with id " + newFile.getPath());
}
getContext().getContentResolver().notifyChange(DocumentsContract.buildTreeDocumentUri(DOCUMENTS_AUTHORITY, parentDocumentId), null);
return newFile.getPath();
}
@Override
public void deleteDocument(String documentId) throws FileNotFoundException {
File file = getFileForDocId(documentId);
if (!file.delete()) {
throw new FileNotFoundException("Failed to delete document with id " + documentId);
rm_r(file);
getContext().getContentResolver().notifyChange(DocumentsContract.buildTreeDocumentUri(DOCUMENTS_AUTHORITY, getDocIdForFile(file.getParentFile())), null);
}
void rm_r (File file) throws FileNotFoundException{
if(file.isDirectory()){
for(File child : file.listFiles()) {
rm_r(child);
}
}
if(!file.delete()){
throw new FileNotFoundException("Could not delete file " + file.getPath());
}
}
@ -248,11 +307,11 @@ public class RetroDocumentsProvider extends DocumentsProvider {
int flags = 0;
if (file.isDirectory()) {
if (file.canWrite()) flags |= Document.FLAG_DIR_SUPPORTS_CREATE;
} else if (file.canWrite()) {
flags |= Document.FLAG_SUPPORTS_WRITE;
if (file.canWrite()) flags |= Document.FLAG_DIR_SUPPORTS_CREATE | Document.FLAG_SUPPORTS_RENAME;
} else {
if (file.canWrite()) flags |= Document.FLAG_SUPPORTS_WRITE | Document.FLAG_SUPPORTS_RENAME;
}
if (file.getParentFile().canWrite()) flags |= Document.FLAG_SUPPORTS_DELETE;
if (file.getParentFile().canWrite()) flags |= Document.FLAG_SUPPORTS_DELETE | Document.FLAG_SUPPORTS_MOVE;
final String displayName = file.getName();
final String mimeType = getMimeType(file);

View File

@ -302,23 +302,32 @@ static void task_cloud_sync_manifest_append_dir(file_list_t *manifest,
static struct string_list *task_cloud_sync_directory_map(void)
{
static struct string_list *list = NULL;
settings_t *settings = config_get_ptr();
if (!list)
{
union string_list_elem_attr attr = {0};
char dir[PATH_MAX_LENGTH];
list = string_list_new();
string_list_append(list, "config", attr);
fill_pathname_application_special(dir,
sizeof(dir), APPLICATION_SPECIAL_DIRECTORY_CONFIG);
list->elems[list->size - 1].userdata = strdup(dir);
if (settings->bools.cloud_sync_sync_configs)
{
string_list_append(list, "config", attr);
fill_pathname_application_special(dir,
sizeof(dir), APPLICATION_SPECIAL_DIRECTORY_CONFIG);
list->elems[list->size - 1].userdata = strdup(dir);
}
string_list_append(list, "saves", attr);
list->elems[list->size - 1].userdata = strdup(dir_get_ptr(RARCH_DIR_SAVEFILE));
if (settings->bools.cloud_sync_sync_saves)
{
string_list_append(list, "saves", attr);
list->elems[list->size - 1].userdata = strdup(dir_get_ptr(RARCH_DIR_SAVEFILE));
string_list_append(list, "states", attr);
list->elems[list->size - 1].userdata = strdup(dir_get_ptr(RARCH_DIR_SAVESTATE));
string_list_append(list, "states", attr);
list->elems[list->size - 1].userdata = strdup(dir_get_ptr(RARCH_DIR_SAVESTATE));
}
}
return list;
}

View File

@ -636,6 +636,8 @@ void App::OnAcceleratorKey(CoreDispatcher^ sender, AcceleratorKeyEventArgs^ args
mod |= RETROKMOD_CAPSLOCK;
if ((window->GetKeyState(VirtualKey::Scroll) & CoreVirtualKeyStates::Locked) == CoreVirtualKeyStates::Locked)
mod |= RETROKMOD_SCROLLOCK;
if ((window->GetKeyState(VirtualKey::NumberKeyLock) & CoreVirtualKeyStates::Locked) == CoreVirtualKeyStates::Locked)
mod |= RETROKMOD_NUMLOCK;
if ((window->GetKeyState(VirtualKey::LeftWindows) & CoreVirtualKeyStates::Down) == CoreVirtualKeyStates::Down ||
(window->GetKeyState(VirtualKey::RightWindows) & CoreVirtualKeyStates::Down) == CoreVirtualKeyStates::Down)
mod |= RETROKMOD_META;