From e438dd3263c8f69dde8025f147264ef573c8ab98 Mon Sep 17 00:00:00 2001
From: twinaphex <libretro@gmail.com>
Date: Sat, 4 Jul 2015 19:58:43 +0200
Subject: [PATCH] Do wraparound of settings

---
 configuration.c     |  1 +
 configuration.h     |  1 +
 core_info.h         |  2 +-
 menu/menu_setting.c | 49 +++++++++++++++++++++++++++++++++++++++------
 4 files changed, 46 insertions(+), 7 deletions(-)

diff --git a/configuration.c b/configuration.c
index 14a52cbc35..e834fd26da 100644
--- a/configuration.c
+++ b/configuration.c
@@ -570,6 +570,7 @@ static void config_set_defaults(void)
    settings->menu.dpi.override_enable          = menu_dpi_override_enable;
    settings->menu.dpi.override_value           = menu_dpi_override_value;
 
+   settings->menu.navigation.wraparound.setting_enable                  = true;
    settings->menu.navigation.wraparound.horizontal_enable               = true;
    settings->menu.navigation.wraparound.vertical_enable                 = true;
    settings->menu.navigation.browser.filter.supported_extensions_enable = true;
diff --git a/configuration.h b/configuration.h
index 84d355fc4b..072cd86d78 100644
--- a/configuration.h
+++ b/configuration.h
@@ -132,6 +132,7 @@ typedef struct settings
          {
             bool horizontal_enable;
             bool vertical_enable;
+            bool setting_enable;
          } wraparound;
          struct
          {
diff --git a/core_info.h b/core_info.h
index f620836cde..386419c944 100644
--- a/core_info.h
+++ b/core_info.h
@@ -106,7 +106,7 @@ bool core_info_list_get_display_name(core_info_list_t *list,
 
 bool core_info_get_display_name_from_file(const char *path, char *buf, size_t size);
 
-void core_info_get_name(const char *path, char *s, size_t len);
+bool core_info_get_display_name(const char *path, char *s, size_t len);
 
 #ifdef __cplusplus
 }
diff --git a/menu/menu_setting.c b/menu/menu_setting.c
index 86558b17da..1e1d60a5c6 100644
--- a/menu/menu_setting.c
+++ b/menu/menu_setting.c
@@ -508,7 +508,14 @@ int setting_set_with_string_representation(rarch_setting_t* setting,
             if (setting->enforce_minrange && *setting->value.integer < setting->min)
                *setting->value.integer = setting->min;
             if (setting->enforce_maxrange && *setting->value.integer > setting->max)
-               *setting->value.integer = setting->max;
+            {
+               settings_t *settings = config_get_ptr();
+
+               if (settings && settings->menu.navigation.wraparound.setting_enable)
+                  *setting->value.integer = setting->min;
+               else
+                  *setting->value.integer = setting->max;
+            }
          }
          break;
       case ST_UINT:
@@ -518,7 +525,14 @@ int setting_set_with_string_representation(rarch_setting_t* setting,
             if (setting->enforce_minrange && *setting->value.unsigned_integer < setting->min)
                *setting->value.unsigned_integer = setting->min;
             if (setting->enforce_maxrange && *setting->value.unsigned_integer > setting->max)
-               *setting->value.unsigned_integer = setting->max;
+            {
+               settings_t *settings = config_get_ptr();
+
+               if (settings && settings->menu.navigation.wraparound.setting_enable)
+                  *setting->value.unsigned_integer = setting->min;
+               else
+                  *setting->value.unsigned_integer = setting->max;
+            }
          }
          break;      
       case ST_FLOAT:
@@ -528,7 +542,14 @@ int setting_set_with_string_representation(rarch_setting_t* setting,
             if (setting->enforce_minrange && *setting->value.fraction < setting->min)
                *setting->value.fraction = setting->min;
             if (setting->enforce_maxrange && *setting->value.fraction > setting->max)
-               *setting->value.fraction = setting->max;
+            {
+               settings_t *settings = config_get_ptr();
+
+               if (settings && settings->menu.navigation.wraparound.setting_enable)
+                  *setting->value.fraction = setting->min;
+               else
+                  *setting->value.fraction = setting->max;
+            }
          }
          break;
       case ST_PATH:
@@ -975,7 +996,14 @@ static int setting_uint_action_right_default(void *data, bool wraparound)
    if (setting->enforce_maxrange)
    {
       if (*setting->value.unsigned_integer > setting->max)
-         *setting->value.unsigned_integer = setting->max;
+      {
+         settings_t *settings = config_get_ptr();
+
+         if (settings && settings->menu.navigation.wraparound.setting_enable)
+            *setting->value.unsigned_integer = setting->min;
+         else
+            *setting->value.unsigned_integer = setting->max;
+      }
    }
 
    return 0;
@@ -1015,7 +1043,14 @@ static int setting_fraction_action_right_default(
    if (setting->enforce_maxrange)
    {
       if (*setting->value.fraction > setting->max)
-         *setting->value.fraction = setting->max;
+      {
+         settings_t *settings = config_get_ptr();
+
+         if (settings && settings->menu.navigation.wraparound.setting_enable)
+            *setting->value.fraction = setting->min;
+         else
+            *setting->value.fraction = setting->max;
+      }
    }
 
    return 0;
@@ -1050,7 +1085,9 @@ static int setting_string_action_right_driver(void *data,
 
    if (!find_next_driver(setting->name, setting->value.string, setting->size))
    {
-      if (wraparound)
+      settings_t *settings = config_get_ptr();
+
+      if (settings && settings->menu.navigation.wraparound.setting_enable)
          find_first_driver(setting->name, setting->value.string, setting->size);
    }