From d08f0f1234db8f27e1ca82effefe526dd89b91a2 Mon Sep 17 00:00:00 2001
From: twinaphex <libretro@gmail.com>
Date: Sat, 28 Jul 2018 23:18:44 +0200
Subject: [PATCH 01/10] CXX_BUILD cleanups

---
 input/drivers_joypad/dinput_joypad.c | 100 ++++++++++++++++-----------
 setting_list.c                       |   4 +-
 2 files changed, 61 insertions(+), 43 deletions(-)

diff --git a/input/drivers_joypad/dinput_joypad.c b/input/drivers_joypad/dinput_joypad.c
index de6f8f1d4c..b5e3d31d22 100644
--- a/input/drivers_joypad/dinput_joypad.c
+++ b/input/drivers_joypad/dinput_joypad.c
@@ -132,59 +132,60 @@ static void dinput_joypad_destroy(void)
 
 static void dinput_create_rumble_effects(struct dinput_joypad *pad)
 {
-   LONG direction = 0;
-   DWORD axis     = DIJOFS_X;
-   DICONSTANTFORCE dicf;
    DIENVELOPE dienv;
-   HRESULT hr;
+   DICONSTANTFORCE dicf;
+   LONG direction                            = 0;
+   DWORD axis                                = DIJOFS_X;
 
-   dicf.lMagnitude = 0;
+   dicf.lMagnitude                           = 0;
 
-   dienv.dwSize = sizeof(DIENVELOPE);
-   dienv.dwAttackLevel = 5000;
-   dienv.dwAttackTime = 250000;
-   dienv.dwFadeLevel = 0;
-   dienv.dwFadeTime = 250000;
+   dienv.dwSize                              = sizeof(DIENVELOPE);
+   dienv.dwAttackLevel                       = 5000;
+   dienv.dwAttackTime                        = 250000;
+   dienv.dwFadeLevel                         = 0;
+   dienv.dwFadeTime                          = 250000;
 
-   pad->rumble_props.cAxes = 1;
-   pad->rumble_props.dwTriggerButton = DIEB_NOTRIGGER;
+   pad->rumble_props.cAxes                   = 1;
+   pad->rumble_props.dwTriggerButton         = DIEB_NOTRIGGER;
    pad->rumble_props.dwTriggerRepeatInterval = 0;
-   pad->rumble_props.cbTypeSpecificParams = sizeof(DICONSTANTFORCE);
-   pad->rumble_props.dwDuration = INFINITE;
-   pad->rumble_props.dwFlags = DIEFF_CARTESIAN | DIEFF_OBJECTOFFSETS;
-   pad->rumble_props.dwGain = 0;
-   pad->rumble_props.dwSize = sizeof(DIEFFECT);
-   pad->rumble_props.dwStartDelay = 0;
-   pad->rumble_props.lpEnvelope = &dienv;
-   pad->rumble_props.lpvTypeSpecificParams = &dicf;
-   pad->rumble_props.rgdwAxes = &axis;
-   pad->rumble_props.rglDirection = &direction;
+   pad->rumble_props.cbTypeSpecificParams    = sizeof(DICONSTANTFORCE);
+   pad->rumble_props.dwDuration              = INFINITE;
+   pad->rumble_props.dwFlags                 = DIEFF_CARTESIAN | 
+      DIEFF_OBJECTOFFSETS;
+   pad->rumble_props.dwGain                  = 0;
+   pad->rumble_props.dwSize                  = sizeof(DIEFFECT);
+   pad->rumble_props.dwStartDelay            = 0;
+   pad->rumble_props.lpEnvelope              = &dienv;
+   pad->rumble_props.lpvTypeSpecificParams   = &dicf;
+   pad->rumble_props.rgdwAxes                = &axis;
+   pad->rumble_props.rglDirection            = &direction;
 
-   hr = IDirectInputDevice8_CreateEffect(pad->joypad, &GUID_ConstantForce,
-         &pad->rumble_props, &pad->rumble_iface[0], NULL);
-   if (hr != DI_OK)
+   if (IDirectInputDevice8_CreateEffect(pad->joypad, &GUID_ConstantForce,
+         &pad->rumble_props, &pad->rumble_iface[0], NULL) != DI_OK)
       RARCH_WARN("[DINPUT]: Strong rumble unavailable.\n");
 
    axis = DIJOFS_Y;
 
-   hr = IDirectInputDevice8_CreateEffect(pad->joypad, &GUID_ConstantForce,
-         &pad->rumble_props, &pad->rumble_iface[1], NULL);
-   if (hr != DI_OK)
+   if (IDirectInputDevice8_CreateEffect(pad->joypad, &GUID_ConstantForce,
+         &pad->rumble_props, &pad->rumble_iface[1], NULL) != DI_OK)
       RARCH_WARN("[DINPUT]: Weak rumble unavailable.\n");
 }
 
-static BOOL CALLBACK enum_axes_cb(const DIDEVICEOBJECTINSTANCE *inst, void *p)
+static BOOL CALLBACK enum_axes_cb(
+      const DIDEVICEOBJECTINSTANCE *inst, void *p)
 {
    DIPROPRANGE range;
    LPDIRECTINPUTDEVICE8 joypad = (LPDIRECTINPUTDEVICE8)p;
 
    memset(&range, 0, sizeof(range));
-   range.diph.dwSize = sizeof(DIPROPRANGE);
+
+   range.diph.dwSize       = sizeof(DIPROPRANGE);
    range.diph.dwHeaderSize = sizeof(DIPROPHEADER);
-   range.diph.dwHow = DIPH_BYID;
-   range.diph.dwObj = inst->dwType;
-   range.lMin = -0x7fff;
-   range.lMax = 0x7fff;
+   range.diph.dwHow        = DIPH_BYID;
+   range.diph.dwObj        = inst->dwType;
+   range.lMin              = -0x7fff;
+   range.lMax              = 0x7fff;
+
    IDirectInputDevice8_SetProperty(joypad, DIPROP_RANGE, &range.diph);
 
    return DIENUM_CONTINUE;
@@ -206,7 +207,8 @@ static bool guid_is_xinput_device(const GUID* product_guid)
 
    for (i = 0; i < ARRAY_SIZE(common_xinput_guids); ++i)
    {
-      if (string_is_equal_fast(product_guid, &common_xinput_guids[i], sizeof(GUID)))
+      if (string_is_equal_fast(product_guid,
+               &common_xinput_guids[i], sizeof(GUID)))
          return true;
    }
 
@@ -241,8 +243,10 @@ static bool guid_is_xinput_device(const GUID* product_guid)
       rdi.cbSize = sizeof (rdi);
 
       if ((raw_devs[i].dwType == RIM_TYPEHID) &&
-          (GetRawInputDeviceInfoA(raw_devs[i].hDevice, RIDI_DEVICEINFO, &rdi, &rdiSize) != ((UINT)-1)) &&
-          (MAKELONG(rdi.hid.dwVendorId, rdi.hid.dwProductId) == ((LONG)product_guid->Data1)) &&
+          (GetRawInputDeviceInfoA(raw_devs[i].hDevice,
+                                  RIDI_DEVICEINFO, &rdi, &rdiSize) != ((UINT)-1)) &&
+          (MAKELONG(rdi.hid.dwVendorId, rdi.hid.dwProductId) 
+           == ((LONG)product_guid->Data1)) &&
           (GetRawInputDeviceInfoA(raw_devs[i].hDevice, RIDI_DEVICENAME, devName, &nameSize) != ((UINT)-1)) &&
           (strstr(devName, "IG_") != NULL) )
       {
@@ -313,15 +317,26 @@ static BOOL CALLBACK enum_joypad_cb(const DIDEVICEINSTANCE *inst, void *p)
    /* there may be more useful info in the GUID so leave this here for a while */
 #if 0
    printf("Guid = {%08lX-%04hX-%04hX-%02hhX%02hhX-%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX}\n",
-   inst->guidProduct.Data1, inst->guidProduct.Data2, inst->guidProduct.Data3,
-   inst->guidProduct.Data4[0], inst->guidProduct.Data4[1], inst->guidProduct.Data4[2], inst->guidProduct.Data4[3],
-   inst->guidProduct.Data4[4], inst->guidProduct.Data4[5], inst->guidProduct.Data4[6], inst->guidProduct.Data4[7]);
+   inst->guidProduct.Data1,
+   inst->guidProduct.Data2,
+   inst->guidProduct.Data3,
+   inst->guidProduct.Data4[0],
+   inst->guidProduct.Data4[1],
+   inst->guidProduct.Data4[2],
+   inst->guidProduct.Data4[3],
+   inst->guidProduct.Data4[4],
+   inst->guidProduct.Data4[5],
+   inst->guidProduct.Data4[6],
+   inst->guidProduct.Data4[7]);
 #endif
 
    g_pads[g_joypad_cnt].vid = inst->guidProduct.Data1 % 0x10000;
    g_pads[g_joypad_cnt].pid = inst->guidProduct.Data1 / 0x10000;
 
-   RARCH_LOG("[DINPUT]: Device #%u PID: {%04lX} VID:{%04lX}\n", g_joypad_cnt, g_pads[g_joypad_cnt].pid, g_pads[g_joypad_cnt].vid);
+   RARCH_LOG("[DINPUT]: Device #%u PID: {%04lX} VID:{%04lX}\n",
+         g_joypad_cnt,
+         g_pads[g_joypad_cnt].pid,
+         g_pads[g_joypad_cnt].vid);
 
 #ifdef HAVE_XINPUT
    is_xinput_pad = g_xinput_block_pads
@@ -336,7 +351,8 @@ static BOOL CALLBACK enum_joypad_cb(const DIDEVICEINSTANCE *inst, void *p)
 #endif
 
    IDirectInputDevice8_SetDataFormat(*pad, &c_dfDIJoystick2);
-   IDirectInputDevice8_SetCooperativeLevel(*pad, (HWND)video_driver_window_get(),
+   IDirectInputDevice8_SetCooperativeLevel(*pad,
+         (HWND)video_driver_window_get(),
          DISCL_EXCLUSIVE | DISCL_BACKGROUND);
 
    IDirectInputDevice8_EnumObjects(*pad, enum_axes_cb,
diff --git a/setting_list.c b/setting_list.c
index 8448c53f9d..115d9af857 100644
--- a/setting_list.c
+++ b/setting_list.c
@@ -189,7 +189,9 @@ void setting_get_string_representation_uint_as_enum(void *data,
    rarch_setting_t *setting = (rarch_setting_t*)data;
    if (setting)
       snprintf(s, len, "%s",
-            msg_hash_to_str(setting->index_offset+(*setting->value.target.unsigned_integer)));
+            msg_hash_to_str((enum msg_hash_enums)(
+               setting->index_offset+(
+                  *setting->value.target.unsigned_integer))));
 }
 
 static float recalc_step_based_on_length_of_action(rarch_setting_t *setting)

From 978edc7acfb9f66fa225e698360f70eb4034152c Mon Sep 17 00:00:00 2001
From: Brad Parker <cbparker@gmail.com>
Date: Sat, 28 Jul 2018 18:46:51 -0400
Subject: [PATCH 02/10] Qt: always set the current tab on startup

---
 ui/drivers/ui_qt.cpp | 13 +++++--------
 1 file changed, 5 insertions(+), 8 deletions(-)

diff --git a/ui/drivers/ui_qt.cpp b/ui/drivers/ui_qt.cpp
index e3fde1f24b..150ad432ec 100644
--- a/ui/drivers/ui_qt.cpp
+++ b/ui/drivers/ui_qt.cpp
@@ -535,15 +535,12 @@ static void* ui_companion_qt_init(void)
    /* setting the last tab must come after setting the view type */
    if (qsettings->contains("save_last_tab"))
    {
-      if (qsettings->contains("last_tab"))
-      {
-         int lastTabIndex = qsettings->value("last_tab", 0).toInt();
+      int lastTabIndex = qsettings->value("last_tab", 0).toInt();
 
-         if (lastTabIndex >= 0 && browserAndPlaylistTabWidget->count() > lastTabIndex)
-         {
-            browserAndPlaylistTabWidget->setCurrentIndex(lastTabIndex);
-            mainwindow->onTabWidgetIndexChanged(lastTabIndex);
-         }
+      if (lastTabIndex >= 0 && browserAndPlaylistTabWidget->count() > lastTabIndex)
+      {
+         browserAndPlaylistTabWidget->setCurrentIndex(lastTabIndex);
+         mainwindow->onTabWidgetIndexChanged(lastTabIndex);
       }
    }
    else

From fea09f73821b4244c74e0018c68f285f8edd9dfc Mon Sep 17 00:00:00 2001
From: Brad Parker <cbparker@gmail.com>
Date: Sat, 28 Jul 2018 22:34:00 -0400
Subject: [PATCH 03/10] Qt: add right-click menu to delete playlist items

---
 intl/msg_hash_ja.h             |  2 +
 intl/msg_hash_us.h             |  2 +
 msg_hash.h                     |  1 +
 ui/drivers/qt/ui_qt_window.cpp | 74 ++++++++++++++++++++++++++--------
 ui/drivers/ui_qt.cpp           |  2 +
 ui/drivers/ui_qt.h             |  3 ++
 6 files changed, 67 insertions(+), 17 deletions(-)

diff --git a/intl/msg_hash_ja.h b/intl/msg_hash_ja.h
index 258976db24..db13fada11 100644
--- a/intl/msg_hash_ja.h
+++ b/intl/msg_hash_ja.h
@@ -3666,3 +3666,5 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_CONFIRM_DELETE_PLAYLIST_ITEM,
       "「%1」というアイテムを削除しますか?")
 MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_CANNOT_ADD_TO_ALL_PLAYLISTS,
       "まずひとつのプレイリストを選択してください。")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_DELETE,
+      "削除")
diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h
index 09d0cb4ebe..0cb7e9c4e6 100644
--- a/intl/msg_hash_us.h
+++ b/intl/msg_hash_us.h
@@ -4176,3 +4176,5 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_CONFIRM_DELETE_PLAYLIST_ITEM,
       "Are you sure you want to delete the item \"%1\"?")
 MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_CANNOT_ADD_TO_ALL_PLAYLISTS,
       "Please choose a single playlist first.")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_DELETE,
+      "Delete")
diff --git a/msg_hash.h b/msg_hash.h
index d0ba76205e..e947239b99 100644
--- a/msg_hash.h
+++ b/msg_hash.h
@@ -1949,6 +1949,7 @@ enum msg_hash_enums
    MENU_ENUM_LABEL_VALUE_QT_PLAYLIST_ENTRY_DATABASE,
    MENU_ENUM_LABEL_VALUE_QT_FOR_THUMBNAILS,
    MENU_ENUM_LABEL_VALUE_QT_CANNOT_ADD_TO_ALL_PLAYLISTS,
+   MENU_ENUM_LABEL_VALUE_QT_DELETE,
 
    MENU_LABEL(MIDI_INPUT),
    MENU_LABEL(MIDI_OUTPUT),
diff --git a/ui/drivers/qt/ui_qt_window.cpp b/ui/drivers/qt/ui_qt_window.cpp
index af33cb03aa..c35ef80bbf 100644
--- a/ui/drivers/qt/ui_qt_window.cpp
+++ b/ui/drivers/qt/ui_qt_window.cpp
@@ -991,6 +991,7 @@ MainWindow::MainWindow(QWidget *parent) :
 
    m_dirTree->setContextMenuPolicy(Qt::CustomContextMenu);
    m_listWidget->setContextMenuPolicy(Qt::CustomContextMenu);
+   m_gridLayoutWidget->setContextMenuPolicy(Qt::CustomContextMenu);
 
    connect(m_searchLineEdit, SIGNAL(returnPressed()), this, SLOT(onSearchEnterPressed()));
    connect(m_searchLineEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onSearchLineEditEdited(const QString&)));
@@ -1014,6 +1015,7 @@ MainWindow::MainWindow(QWidget *parent) :
    connect(viewTypeIconsAction, SIGNAL(triggered()), this, SLOT(onIconViewClicked()));
    connect(viewTypeListAction, SIGNAL(triggered()), this, SLOT(onListViewClicked()));
    connect(m_gridLayoutWidget, SIGNAL(filesDropped(QStringList)), this, SLOT(onPlaylistFilesDropped(QStringList)));
+   connect(m_gridLayoutWidget, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(onFileDropWidgetContextMenuRequested(const QPoint&)));
 
    /* make sure these use an auto connection so it will be queued if called from a different thread (some facilities in RA log messages from other threads) */
    connect(this, SIGNAL(gotLogMessage(const QString&)), this, SLOT(onGotLogMessage(const QString&)), Qt::AutoConnection);
@@ -1444,6 +1446,30 @@ bool MainWindow::showMessageBox(QString msg, MessageBoxType msgType, Qt::WindowM
    return true;
 }
 
+void MainWindow::onFileDropWidgetContextMenuRequested(const QPoint &pos)
+{
+   QScopedPointer<QMenu> menu;
+   QScopedPointer<QAction> deleteAction;
+   QPointer<QAction> selectedAction;
+   QPoint cursorPos = QCursor::pos();
+
+   menu.reset(new QMenu(this));
+
+   deleteAction.reset(new QAction(QString(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_DELETE)), this));
+
+   menu->addAction(deleteAction.data());
+
+   selectedAction = menu->exec(cursorPos);
+
+   if (!selectedAction)
+      return;
+
+   if (selectedAction == deleteAction.data())
+   {
+      deleteCurrentPlaylistItem();
+   }
+}
+
 void MainWindow::onPlaylistWidgetContextMenuRequested(const QPoint&)
 {
    settings_t *settings = config_get_ptr();
@@ -2408,37 +2434,51 @@ void MainWindow::onTableWidgetDeletePressed()
    deleteCurrentPlaylistItem();
 }
 
-void MainWindow::deleteCurrentPlaylistItem()
+QString MainWindow::getCurrentPlaylistPath()
+{
+   QListWidgetItem *playlistItem = m_listWidget->currentItem();
+   QHash<QString, QString> contentHash;
+   QString playlistPath;
+
+   if (!playlistItem)
+      return playlistPath;
+
+   playlistPath = playlistItem->data(Qt::UserRole).toString();
+
+   return playlistPath;
+}
+
+QHash<QString, QString> MainWindow::getCurrentContentHash()
 {
    QTableWidgetItem *contentItem = m_tableWidget->currentItem();
    QListWidgetItem *playlistItem = m_listWidget->currentItem();
    QHash<QString, QString> contentHash;
-   QString playlistPath;
-   QByteArray playlistArray;
    ViewType viewType = getCurrentViewType();
-   playlist_t *playlist = NULL;
-   const char *playlistData = NULL;
-   unsigned index = 0;
-   bool ok = false;
-
-   if (!playlistItem)
-      return;
-
-   playlistPath = playlistItem->data(Qt::UserRole).toString();
-
-   if (playlistPath.isEmpty())
-      return;
 
    if (viewType == VIEW_TYPE_LIST)
    {
       if (!contentItem)
-         return;
+         return contentHash;
 
       contentHash = contentItem->data(Qt::UserRole).value<QHash<QString, QString> >();
    }
    else if (viewType == VIEW_TYPE_ICONS)
       contentHash = m_currentGridHash;
-   else
+
+   return contentHash;
+}
+
+void MainWindow::deleteCurrentPlaylistItem()
+{
+   QString playlistPath = getCurrentPlaylistPath();
+   QByteArray playlistArray;
+   QHash<QString, QString> contentHash = getCurrentContentHash();
+   playlist_t *playlist = NULL;
+   const char *playlistData = NULL;
+   unsigned index = 0;
+   bool ok = false;
+
+   if (playlistPath.isEmpty())
       return;
 
    if (contentHash.isEmpty())
diff --git a/ui/drivers/ui_qt.cpp b/ui/drivers/ui_qt.cpp
index 150ad432ec..415e056fca 100644
--- a/ui/drivers/ui_qt.cpp
+++ b/ui/drivers/ui_qt.cpp
@@ -277,9 +277,11 @@ static void* ui_companion_qt_init(void)
 
    widget = new FileDropWidget(mainwindow);
    widget->setObjectName("tableWidget");
+   widget->setContextMenuPolicy(Qt::CustomContextMenu);
 
    QObject::connect(widget, SIGNAL(filesDropped(QStringList)), mainwindow, SLOT(onPlaylistFilesDropped(QStringList)));
    QObject::connect(widget, SIGNAL(deletePressed()), mainwindow, SLOT(deleteCurrentPlaylistItem()));
+   QObject::connect(widget, SIGNAL(customContextMenuRequested(const QPoint&)), mainwindow, SLOT(onFileDropWidgetContextMenuRequested(const QPoint&)));
 
    layout = new QVBoxLayout();
    layout->addWidget(mainwindow->contentTableWidget());
diff --git a/ui/drivers/ui_qt.h b/ui/drivers/ui_qt.h
index 3fcbb8a979..056066ce03 100644
--- a/ui/drivers/ui_qt.h
+++ b/ui/drivers/ui_qt.h
@@ -339,6 +339,8 @@ public:
    void setAllPlaylistsGridMaxCount(int count);
    PlaylistEntryDialog* playlistEntryDialog();
    void addFilesToPlaylist(QStringList files);
+   QString getCurrentPlaylistPath();
+   QHash<QString, QString> getCurrentContentHash();
 
 signals:
    void thumbnailChanged(const QPixmap &pixmap);
@@ -378,6 +380,7 @@ public slots:
    void onListViewClicked();
    void onTabWidgetIndexChanged(int index);
    void deleteCurrentPlaylistItem();
+   void onFileDropWidgetContextMenuRequested(const QPoint &pos);
 
 private slots:
    void onLoadCoreClicked(const QStringList &extensionFilters = QStringList());

From 2faa25017489db67b0ef022f2c609a305c881bd4 Mon Sep 17 00:00:00 2001
From: Brad Parker <cbparker@gmail.com>
Date: Sat, 28 Jul 2018 23:15:00 -0400
Subject: [PATCH 04/10] Qt: throttle status bar messages

---
 ui/drivers/qt/ui_qt_window.cpp | 13 ++++++++++++-
 ui/drivers/ui_qt.h             |  2 ++
 2 files changed, 14 insertions(+), 1 deletion(-)

diff --git a/ui/drivers/qt/ui_qt_window.cpp b/ui/drivers/qt/ui_qt_window.cpp
index c35ef80bbf..27e5b38d81 100644
--- a/ui/drivers/qt/ui_qt_window.cpp
+++ b/ui/drivers/qt/ui_qt_window.cpp
@@ -63,6 +63,7 @@ extern "C" {
 }
 
 #define TIMER_MSEC 1000 /* periodic timer for gathering statistics */
+#define STATUS_MSG_THROTTLE_MSEC 250
 
 #ifndef COLLECTION_SIZE
 #define COLLECTION_SIZE 99999
@@ -805,6 +806,7 @@ MainWindow::MainWindow(QWidget *parent) :
    ,m_allPlaylistsListMaxCount(0)
    ,m_allPlaylistsGridMaxCount(0)
    ,m_playlistEntryDialog(NULL)
+   ,m_statusMessageElapsedTimer()
 {
    settings_t *settings = config_get_ptr();
    QDir playlistDir(settings->paths.directory_playlist);
@@ -1036,6 +1038,8 @@ MainWindow::MainWindow(QWidget *parent) :
    m_searchLineEdit->setFocus();
    m_loadCoreWindow->setWindowModality(Qt::ApplicationModal);
 
+   m_statusMessageElapsedTimer.start();
+
 #if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0))
    resizeDocks(QList<QDockWidget*>() << m_searchDock, QList<int>() << 1, Qt::Vertical);
 #endif
@@ -1784,7 +1788,14 @@ void MainWindow::onGotStatusMessage(QString msg, unsigned priority, unsigned dur
       msecDuration = 1000;
 
    if (status->currentMessage().isEmpty() || flush)
-      status->showMessage(msg, msecDuration);
+   {
+      if (m_statusMessageElapsedTimer.elapsed() >= STATUS_MSG_THROTTLE_MSEC)
+      {
+         qint64 msgDuration = qMax(msecDuration, STATUS_MSG_THROTTLE_MSEC);
+         m_statusMessageElapsedTimer.restart();
+         status->showMessage(msg, msgDuration);
+      }
+   }
 }
 
 void MainWindow::deferReloadPlaylists()
diff --git a/ui/drivers/ui_qt.h b/ui/drivers/ui_qt.h
index 056066ce03..9f1ab5c1c9 100644
--- a/ui/drivers/ui_qt.h
+++ b/ui/drivers/ui_qt.h
@@ -34,6 +34,7 @@
 #include <QImage>
 #include <QPointer>
 #include <QProgressBar>
+#include <QElapsedTimer>
 
 extern "C" {
 #include <retro_assert.h>
@@ -480,6 +481,7 @@ private:
    int m_allPlaylistsListMaxCount;
    int m_allPlaylistsGridMaxCount;
    PlaylistEntryDialog *m_playlistEntryDialog;
+   QElapsedTimer m_statusMessageElapsedTimer;
 
 protected:
    void closeEvent(QCloseEvent *event);

From ef43e171cee0a52a041b1fa8c7b5a41e0c9a9167 Mon Sep 17 00:00:00 2001
From: Sylvain Colinet <scolinet@gmail.com>
Date: Sun, 29 Jul 2018 14:49:31 +0200
Subject: [PATCH 05/10] Network command interface : Fix the READ_CORE_RAM
 command to not crash when asking for size over 78

---
 command.c | 23 ++++++++++++++---------
 1 file changed, 14 insertions(+), 9 deletions(-)

diff --git a/command.c b/command.c
index 62cc725441..f4cca97af7 100644
--- a/command.c
+++ b/command.c
@@ -246,28 +246,31 @@ bool command_set_shader(const char *arg)
 }
 
 #if defined(HAVE_COMMAND) && defined(HAVE_CHEEVOS)
+#define SMY_CMD_STR "READ_CORE_RAM"
 static bool command_read_ram(const char *arg)
 {
    cheevos_var_t var;
    unsigned i;
-   char reply[256]      = {0};
+   char  *reply         = NULL;
    const uint8_t * data = NULL;
    char *reply_at       = NULL;
+   unsigned int nbytes  = 0;
+   unsigned int alloc_size = 0;
+   int          addr    = -1;
 
-   reply[0]             = '\0';
+   if (sscanf(arg, "%x %d", &addr, &nbytes) != 2)
+      return true;
+   alloc_size = 40 + nbytes * 3; //We alloc more than needed, saving 20 bytes is not really relevant
+   reply = (char*) malloc(alloc_size);
+   reply[0] = '\0';
+   reply_at = reply + sprintf(reply, SMY_CMD_STR " %x", addr);
 
-   strlcpy(reply, "READ_CORE_RAM ", sizeof(reply));
-   reply_at = reply + strlen("READ_CORE_RAM ");
-   strlcpy(reply_at, arg, sizeof(reply)-strlen(reply));
-
-   var.value = strtoul(reply_at, (char**)&reply_at, 16);
+   var.value = addr;
    cheevos_var_patch_addr(&var, cheevos_get_console());
    data = cheevos_var_get_memory(&var);
 
    if (data)
    {
-      unsigned nbytes = strtol(reply_at, NULL, 10);
-
       for (i=0;i<nbytes;i++)
          sprintf(reply_at+3*i, " %.2X", data[i]);
       reply_at[3*nbytes] = '\n';
@@ -278,9 +281,11 @@ static bool command_read_ram(const char *arg)
       strlcpy(reply_at, " -1\n", sizeof(reply)-strlen(reply));
       command_reply(reply, reply_at+strlen(" -1\n") - reply);
    }
+   free(reply);
 
    return true;
 }
+#undef SMY_CMD_STR
 
 static bool command_write_ram(const char *arg)
 {

From 011cb61782011df7036348aa9a417bf2bb52920a Mon Sep 17 00:00:00 2001
From: Sylvain Colinet <scolinet@gmail.com>
Date: Sun, 29 Jul 2018 15:15:29 +0200
Subject: [PATCH 06/10] Added a version command

---
 command.c | 15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)

diff --git a/command.c b/command.c
index f4cca97af7..105e7d761e 100644
--- a/command.c
+++ b/command.c
@@ -93,6 +93,7 @@
 #include "retroarch.h"
 #include "configuration.h"
 #include "input/input_remapping.h"
+#include "version.h"
 
 #define DEFAULT_NETWORK_CMD_PORT 55355
 #define STDIN_BUF_SIZE           4096
@@ -130,6 +131,8 @@ struct command
 #endif
 };
 
+static bool command_version(const char *arg);
+
 #if defined(HAVE_COMMAND) && defined(HAVE_CHEEVOS)
 static bool command_read_ram(const char *arg);
 static bool command_write_ram(const char *arg);
@@ -137,6 +140,7 @@ static bool command_write_ram(const char *arg);
 
 static const struct cmd_action_map action_map[] = {
    { "SET_SHADER",      command_set_shader,  "<shader path>" },
+   { "VERSION",         command_version,     "No argument"},
 #if defined(HAVE_COMMAND) && defined(HAVE_CHEEVOS)
    { "READ_CORE_RAM",   command_read_ram,    "<address> <number of bytes>" },
    { "WRITE_CORE_RAM",  command_write_ram,   "<address> <byte1> <byte2> ..." },
@@ -245,6 +249,15 @@ bool command_set_shader(const char *arg)
    return menu_shader_manager_set_preset(shader, type, arg);
 }
 
+static bool command_version(const char* arg)
+{
+      char reply[256] = {0};
+
+      sprintf(reply, "%s\n", PACKAGE_VERSION);
+      command_reply(reply, strlen(reply));
+      return true;
+}
+
 #if defined(HAVE_COMMAND) && defined(HAVE_CHEEVOS)
 #define SMY_CMD_STR "READ_CORE_RAM"
 static bool command_read_ram(const char *arg)
@@ -337,7 +350,7 @@ static bool command_get_arg(const char *tok,
       if (str == tok)
       {
          const char *argument = str + strlen(action_map[i].str);
-         if (*argument != ' ')
+         if (*argument != ' ' && *argument != '\0')
             return false;
 
          if (arg)

From 18646e3af0297434d57440c4276d66bb16e101ec Mon Sep 17 00:00:00 2001
From: Alfredo Monclus <alfredomonclus@gmail.com>
Date: Sun, 29 Jul 2018 10:54:08 -0300
Subject: [PATCH 07/10] Update Spanish

---
 intl/msg_hash_es.h | 922 ++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 838 insertions(+), 84 deletions(-)

diff --git a/intl/msg_hash_es.h b/intl/msg_hash_es.h
index 42832cd482..02d44e9259 100644
--- a/intl/msg_hash_es.h
+++ b/intl/msg_hash_es.h
@@ -1,11 +1,3 @@
-MSG_HASH(
-	MSG_DEVICE_CONFIGURED_IN_PORT,
-	"configurado en puerto"
-	)
-MSG_HASH(
-	MSG_FAILED_TO_SET_DISK,
-	"Fallo al establecer disco"
-	)
 MSG_HASH(
 	MSG_COMPILER,
 	"Compilador"
@@ -40,7 +32,7 @@ MSG_HASH(
 	)
 MSG_HASH(
 	MSG_NO_ARGUMENTS_SUPPLIED_AND_NO_MENU_BUILTIN,
-	"No se pasaron argumentos y no hay menú integrado, Mostrando ayuda.."
+	"No se pasaron argumentos y no hay menú integrado, Mostrando ayuda..."
 	)
 MSG_HASH(
 	MSG_SETTING_DISK_IN_TRAY,
@@ -48,7 +40,7 @@ MSG_HASH(
 	)
 MSG_HASH(
 	MSG_WAITING_FOR_CLIENT,
-	"Esperando al cliente .."
+	"Esperando al cliente..."
 	)
 MSG_HASH(
 	MSG_NETPLAY_YOU_HAVE_LEFT_THE_GAME,
@@ -268,7 +260,7 @@ MSG_HASH(
 	)
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_AUDIO_DRIVER,
-	"Audio driver"
+	"Controlador de Audio"
 	)
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_AUDIO_DSP_PLUGIN,
@@ -450,6 +442,14 @@ MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_CHEAT_APPLY_CHANGES,
 	"Aplicar trucos"
 	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_CHEAT_START_SEARCH,
+	"Iniciar búsqueda de trucos"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_CHEAT_CONTINUE_SEARCH,
+	"Continuar búsqueda"
+	)
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_CHEAT_DATABASE_PATH,
 	"Archivo de trucos"
@@ -460,7 +460,11 @@ MSG_HASH(
 	)
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_CHEAT_FILE_LOAD,
-	"Cargar archivo de trucos"
+	"Cargar archivo de trucos (Reemplazar)"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_CHEAT_FILE_LOAD_APPEND,
+	"Cargar archivo de trucos (Agregar)"
 	)
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_CHEAT_FILE_SAVE_AS,
@@ -748,7 +752,7 @@ MSG_HASH(
 	)
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_DOWNLOAD_CORE,
-	"Descargar núcleo.."
+	"Descargar núcleo"
 	)
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_DOWNLOAD_CORE_CONTENT,
@@ -1014,6 +1018,10 @@ MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_INPUT_BIND_TIMEOUT,
 	"Tiempo limite para asignar"
 	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_INPUT_BIND_HOLD,
+	"Asignar (mantener)"
+	)
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_INPUT_DESCRIPTOR_HIDE_UNBOUND,
 	"Ocultar descripciones de entrada sin asignar de los núcleo"
@@ -1604,7 +1612,7 @@ MSG_HASH(
 	)
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_MORE,
-	".."
+	"..."
 	)
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_MOUSE_ENABLE,
@@ -1982,6 +1990,10 @@ MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_PRIVACY_SETTINGS,
 	"Privacidad"
 	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_MIDI_SETTINGS,
+	"MIDI"
+	)
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_QUIT_RETROARCH,
 	"Cerrar RetroArch"
@@ -2016,15 +2028,15 @@ MSG_HASH(
 	)
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_RDB_ENTRY_EDGE_MAGAZINE_ISSUE,
-	"Edge Magazine Issue"
+	"Edición de la revista Edge"
 	)
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_RDB_ENTRY_EDGE_MAGAZINE_RATING,
-	"Edge Magazine Rating"
+	"Calificación de la revista Edge"
 	)
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_RDB_ENTRY_EDGE_MAGAZINE_REVIEW,
-	"Edge Magazine Review"
+	"Analisis de la revista Edge"
 	)
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_RDB_ENTRY_ELSPA_RATING,
@@ -2040,7 +2052,7 @@ MSG_HASH(
 	)
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_RDB_ENTRY_FAMITSU_MAGAZINE_RATING,
-	"Famitsu Magazine Rating"
+	"Calificación de la revista Famitsu"
 	)
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_RDB_ENTRY_FRANCHISE,
@@ -2122,13 +2134,17 @@ MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_RECORD_DRIVER,
 	"Controlador de grabación"
 	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_MIDI_DRIVER,
+	"Controlador MIDI"
+	)
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_RECORD_ENABLE,
 	"Activar grabación"
 	)
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_RECORD_PATH,
-	"Guardar grabación en..."
+	"Guardar grabación como..."
 	)
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_RECORD_USE_OUTPUT_DIRECTORY,
@@ -2165,7 +2181,7 @@ MSG_HASH(
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_REMAP_FILE_REMOVE_CONTENT_DIR,
 	"Borrar directorio de controles personalizados"
-    )
+	)
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_REQUIRED,
 	"Necesario"
@@ -2210,10 +2226,26 @@ MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_REWIND_GRANULARITY,
 	"Nivel de detalle del rebobinado"
 	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_REWIND_BUFFER_SIZE,
+	"Tamaño del Búfer de rebobinado (MB)"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_REWIND_BUFFER_SIZE_STEP,
+	"Tamaño del intervalo de ajuste del Búfer (MB)"
+	)
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_REWIND_SETTINGS,
 	"Rebobinado"
 	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_CHEAT_DETAILS_SETTINGS,
+	"Detalles del truco"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_CHEAT_SEARCH_SETTINGS,
+	"Iniciar o continuar búsqueda de trucos"
+	)
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_RGUI_BROWSER_DIRECTORY,
 	"Explorador de archivos"
@@ -2241,7 +2273,7 @@ MSG_HASH(
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_RESET_CORE_ASSOCIATION,
 	"Restablecer asociación de núcleo"
-    )
+	)
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_RUN,
 	"Iniciar"
@@ -2389,7 +2421,7 @@ MSG_HASH(
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_RUN_AHEAD_ENABLED,
 	"Reducir latencia emulando anticipadamente (Run-Ahead)"
-    )
+	)
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_RUN_AHEAD_FRAMES,
 	"Número de Frames para adelantarse (to run ahead)"
@@ -2728,7 +2760,11 @@ MSG_HASH(
 	)
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_VULKAN_SUPPORT,
-	"Soporte Vulkan"
+	"Soporte de Vulkan"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_METAL_SUPPORT,
+	"Soporte de Metal"
 	)
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_WAYLAND_SUPPORT,
@@ -2765,7 +2801,7 @@ MSG_HASH(
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_LEFT_THUMBNAILS,
 	"Miniaturas Izquierdas"
-    )
+	)
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_XMB_VERTICAL_THUMBNAILS,
 	"Miniaturas Disposición Vertical"
@@ -2817,7 +2853,7 @@ MSG_HASH(
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_DESKTOP_MENU_ENABLE,
 	"Activar menú de escritorio (reiniciar)"
-    )
+	)
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_UI_MENUBAR_ENABLE,
 	"Barra de menús"
@@ -3072,7 +3108,7 @@ MSG_HASH(
 	)
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_AS,
-	"Guardar preset de shaders como.."
+	"Guardar preset de shaders como..."
 	)
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_CORE,
@@ -3301,7 +3337,7 @@ MSG_HASH(
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_PLAYLISTS,
 	"Mostrar pestañas de Playlists"
-    )
+	)
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_FAVORITES,
 	"Mostrar pestaña favoritos"
@@ -3414,6 +3450,10 @@ MSG_HASH(
 	MENU_ENUM_SUBLABEL_PRIVACY_SETTINGS,
 	"Opciones de privacidad"
 	)
+MSG_HASH(
+	MENU_ENUM_SUBLABEL_MIDI_SETTINGS,
+	"Cambiar opciones MIDI"
+	)
 MSG_HASH(
 	MENU_ENUM_SUBLABEL_DIRECTORY_SETTINGS,
 	"Cambia las carpetas por defecto donde se encuentran los archivos"
@@ -3476,8 +3516,8 @@ MSG_HASH(
 	)
 MSG_HASH(
 	MENU_ENUM_SUBLABEL_LATENCY_SETTINGS,
-	"Cambiar las opciones relacionados con el video, audio y lantencia de entrada."
-    )
+	"Cambiar las opciones relacionados con el video, audio y lantencia de entrada"
+	)
 MSG_HASH(
 	MENU_ENUM_SUBLABEL_LOG_VERBOSITY,
 	"Activar o desactivar registros a la terminal"
@@ -3552,7 +3592,7 @@ MSG_HASH(
 	)
 MSG_HASH(
 	MENU_ENUM_SUBLABEL_VIDEO_REFRESH_RATE_POLLED,
-	"The refresh rate as reported by the display driver."
+	"La tasa de refresco indicada por el controlador de pantalla"
 	)
 MSG_HASH(
 	MENU_ENUM_SUBLABEL_VIDEO_SETTINGS,
@@ -3636,7 +3676,7 @@ MSG_HASH(
 	)
 MSG_HASH(
 	MSG_COMPARING_WITH_KNOWN_MAGIC_NUMBERS,
-	"Comparando con números mágicos conocidos.."
+	"Comparando con números mágicos conocidos..."
 	)
 MSG_HASH(
 	MSG_COMPILED_AGAINST_API,
@@ -3748,11 +3788,11 @@ MSG_HASH(
 	)
 MSG_HASH(
 	MSG_ERROR_LIBRETRO_CORE_REQUIRES_CONTENT,
-	"El núcleo Libretro necesita contenido, pero no se le propicio."
+	"El núcleo Libretro necesita contenido, pero no fue provisto"
 	)
 MSG_HASH(
 	MSG_ERROR_LIBRETRO_CORE_REQUIRES_SPECIAL_CONTENT,
-	"El núcleo Libretro necesita contenido especial, pero no se le propicio."
+	"El núcleo Libretro necesita contenido especial, pero no fue provisto"
 	)
 MSG_HASH(
 	MSG_ERROR_PARSING_ARGUMENTS,
@@ -4240,7 +4280,7 @@ MSG_HASH(
 	)
 MSG_HASH(
 	MSG_SCANNING,
-	"Escaneando"
+	"Escaneando..."
 	)
 MSG_HASH(
 	MSG_SCANNING_OF_DIRECTORY_FINISHED,
@@ -4344,11 +4384,11 @@ MSG_HASH(
 	)
 MSG_HASH(
 	MSG_VALUE_REBOOTING,
-	"Reiniciando.."
+	"Reiniciando..."
 	)
 MSG_HASH(
 	MSG_VALUE_SHUTTING_DOWN,
-	"Apagando.."
+	"Apagando..."
 	)
 MSG_HASH(
 	MSG_VERSION_OF_LIBRETRO_API,
@@ -4356,7 +4396,7 @@ MSG_HASH(
 	)
 MSG_HASH(
 	MSG_VIEWPORT_SIZE_CALCULATION_FAILED,
-	"Fallo el calculo de la ventana! Se continuará usando datos en bruto. Probablemente no funcionará bien .."
+	"Fallo al calcular de la ventana! Se continuará usando datos en bruto. Probablemente no funcionará bien"
 	)
 MSG_HASH(
 	MSG_VIRTUAL_DISK_TRAY,
@@ -4422,6 +4462,10 @@ MSG_HASH(
 	MENU_ENUM_SUBLABEL_INPUT_BIND_TIMEOUT,
 	"Cantidad de segundos a esperar hasta la siguiente asignación"
 	)
+MSG_HASH(
+	MENU_ENUM_SUBLABEL_INPUT_BIND_HOLD,
+	"Cantidad de segundos a mantener una entrada para asignarla"
+	)
 MSG_HASH(
 	MENU_ENUM_SUBLABEL_INPUT_TURBO_PERIOD,
 	"Periodo entre pulsación de los botones turbo (en frames)"
@@ -4540,7 +4584,7 @@ MSG_HASH(
 	)
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_EDGE_MAGAZINE_ISSUE,
-	"Base de datos - Filtro : Numero de la revista Edge"
+	"Base de datos - Filtro : número de la revista Edge"
 	)
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_EDGE_MAGAZINE_RATING,
@@ -4556,7 +4600,7 @@ MSG_HASH(
 	)
 MSG_HASH(
 	MSG_SCANNING_WIRELESS_NETWORKS,
-	"Escaneando redes inalambricas.."
+	"Escaneando redes inalambricas..."
 	)
 MSG_HASH(
 	MSG_NETPLAY_LAN_SCAN_COMPLETE,
@@ -4804,11 +4848,11 @@ MSG_HASH(
 	)
 MSG_HASH(
 	MENU_ENUM_SUBLABEL_RUN_AHEAD_FRAMES,
-	"El numero de frames para ir adelantado, si excedes el numero de frames de lag internos del juego, puede causar intermitencia (jitter)"
-    )
+	"El número de frames para ir adelantado, si excedes el número de frames de lag internos del juego, puede causar tirones (jitter)"
+	)
 MSG_HASH(
 	MENU_ENUM_SUBLABEL_RUN_AHEAD_SECONDARY_INSTANCE,
-	"Usar una segunda instancia del núcleo para adelantarse (RunAhead). Previene problemas de audio causados por las cargas de estado."
+	"Usar una segunda instancia del núcleo para adelantarse (RunAhead). Previene problemas de audio causados por las cargas de estado"
 	)
 MSG_HASH(
 	MENU_ENUM_SUBLABEL_RUN_AHEAD_HIDE_WARNINGS,
@@ -4820,7 +4864,103 @@ MSG_HASH(
 	)
 MSG_HASH(
 	MENU_ENUM_SUBLABEL_REWIND_GRANULARITY,
-	"Rebobinar un determinado numero de frames, al hacerlo varios a la vez, aumentas la velocidad del rebobinado"
+	"Rebobinar un determinado número de frames a la vez, para aumentar la velocidad del rebobinado"
+	)
+MSG_HASH(
+	MENU_ENUM_SUBLABEL_REWIND_BUFFER_SIZE,
+	"La cantidad de memoria (en MB) a reservar para el búfer de rebobinado. Aumentar esto aumentará el largo del historial de rebobinado"
+	)
+MSG_HASH(
+	MENU_ENUM_SUBLABEL_REWIND_BUFFER_SIZE_STEP,
+	"Cada vez que aumentes o disminuyas el tamaño del búfer por medio de está interfaz, cambiará esta cantidad"
+	)
+MSG_HASH(
+	MENU_ENUM_SUBLABEL_CHEAT_IDX,
+	"Posición en el indice de la lista"
+	)
+MSG_HASH(
+	MENU_ENUM_SUBLABEL_CHEAT_ADDRESS_BIT_POSITION,
+	"Bitmask de la dirección cuando el tamaño de la búsqueda de memoria es menor a 8 bits"
+	)
+MSG_HASH(
+	MENU_ENUM_SUBLABEL_CHEAT_MATCH_IDX,
+	"Seleccionar la coincidencia a ver"
+	)
+MSG_HASH(
+	MENU_ENUM_SUBLABEL_CHEAT_START_OR_CONT,
+	""
+	)
+MSG_HASH(
+	MENU_ENUM_SUBLABEL_CHEAT_START_OR_RESTART,
+	"Izquierda/Derecha para cambiar el bit-size"
+	)
+MSG_HASH(
+	MENU_ENUM_SUBLABEL_CHEAT_SEARCH_EXACT,
+	"Izquierda/Derecha para cambiar el valor"
+	)
+MSG_HASH(
+	MENU_ENUM_SUBLABEL_CHEAT_SEARCH_LT,
+	""
+	)
+MSG_HASH(
+	MENU_ENUM_SUBLABEL_CHEAT_SEARCH_GT,
+	""
+	)
+MSG_HASH(
+	MENU_ENUM_SUBLABEL_CHEAT_SEARCH_LTE,
+	""
+	)
+MSG_HASH(
+	MENU_ENUM_SUBLABEL_CHEAT_SEARCH_GTE,
+	""
+	)
+MSG_HASH(
+	MENU_ENUM_SUBLABEL_CHEAT_SEARCH_EQ,
+	""
+	)
+MSG_HASH(
+	MENU_ENUM_SUBLABEL_CHEAT_SEARCH_NEQ,
+	""
+	)
+MSG_HASH(
+	MENU_ENUM_SUBLABEL_CHEAT_SEARCH_EQPLUS,
+	"Izquierda/Derecha para cambiar el valor"
+	)
+MSG_HASH(
+	MENU_ENUM_SUBLABEL_CHEAT_SEARCH_EQMINUS,
+	"Izquierda/Derecha para cambiar el valor"
+	)
+MSG_HASH(
+	MENU_ENUM_SUBLABEL_CHEAT_ADD_MATCHES,
+	""
+	)
+MSG_HASH(
+	MENU_ENUM_SUBLABEL_CHEAT_VIEW_MATCHES,
+	""
+	)
+MSG_HASH(
+	MENU_ENUM_SUBLABEL_CHEAT_CREATE_OPTION,
+	""
+	)
+MSG_HASH(
+	MENU_ENUM_SUBLABEL_CHEAT_DELETE_OPTION,
+	""
+	)
+MSG_HASH(
+	MENU_ENUM_SUBLABEL_CHEAT_ADD_NEW_TOP,
+	""
+	)
+MSG_HASH(
+	MENU_ENUM_SUBLABEL_CHEAT_ADD_NEW_BOTTOM,
+	""
+	)
+MSG_HASH(
+	MENU_ENUM_SUBLABEL_CHEAT_DELETE_ALL,
+	""
+	)
+MSG_HASH(
+	MENU_ENUM_SUBLABEL_CHEAT_BIG_ENDIAN,
+	"Big endian	 : 258 = 0x0102,\nLittle endian : 258 = 0x0201"
 	)
 MSG_HASH(
 	MENU_ENUM_SUBLABEL_LIBRETRO_LOG_LEVEL,
@@ -4898,6 +5038,10 @@ MSG_HASH(
 	MENU_ENUM_SUBLABEL_RECORD_DRIVER,
 	"Controlador de grabación a usar"
 	)
+MSG_HASH(
+	MENU_ENUM_SUBLABEL_MIDI_DRIVER,
+	"Controlador MIDI a usar"
+	)
 MSG_HASH(
 	MENU_ENUM_SUBLABEL_WIFI_DRIVER,
 	"Controlador WiFi a usar"
@@ -4984,7 +5128,7 @@ MSG_HASH(
 	)
 MSG_HASH(
 	MENU_ENUM_SUBLABEL_NETPLAY_NAT_TRAVERSAL,
-	"Cuando se es servidor, intentar escuchar conexiones desde Internet, usando UPnP o tecnologías similares."
+	"Cuando se es servidor, intentar escuchar conexiones desde Internet, usando UPnP o tecnologías similares"
 	)
 MSG_HASH(
 	MENU_ENUM_SUBLABEL_STDIN_CMD_ENABLE,
@@ -5005,7 +5149,7 @@ MSG_HASH(
 MSG_HASH(
 	MENU_ENUM_SUBLABEL_LEFT_THUMBNAILS,
 	"Tipo de miniaturas a mostrar a la izquierda"
-    )
+	)
 MSG_HASH(
 	MENU_ENUM_SUBLABEL_XMB_VERTICAL_THUMBNAILS,
 	"Muestra la miniatura izquierda debajo de la derecha, a la derecha de la pantalla"
@@ -5170,6 +5314,14 @@ MSG_HASH(
 	MENU_ENUM_SUBLABEL_INPUT_META_REWIND,
 	"Administra las opciones de rebobinado"
 	)
+MSG_HASH(
+	MENU_ENUM_SUBLABEL_INPUT_META_CHEAT_DETAILS,
+	"Administra los detalles de los trucos"
+	)
+MSG_HASH(
+	MENU_ENUM_SUBLABEL_INPUT_META_CHEAT_SEARCH,
+	"Iniciar o continuar una búsqueda de trucos"
+	)
 MSG_HASH(
 	MENU_ENUM_SUBLABEL_RESTART_CONTENT,
 	"Reinicia el contenido desde el principio"
@@ -5268,7 +5420,7 @@ MSG_HASH(
 	)
 MSG_HASH(
 	MENU_ENUM_SUBLABEL_XMB_LAYOUT,
-	"Seleccionar una disposición diferente para la interfaz XMB."
+	"Seleccionar una disposición diferente para la interfaz XMB"
 	)
 MSG_HASH(
 	MENU_ENUM_SUBLABEL_XMB_THEME,
@@ -5460,7 +5612,7 @@ MSG_HASH(
 	)
 MSG_HASH(
 	MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET_SAVE_PARENT,
-	"Guardar la configuración actual de shaders para todos los archivos en el directorio de contenido actual."
+	"Guardar la configuración actual de shaders para todos los archivos en el directorio de contenido actual"
 	)
 MSG_HASH(
 	MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET_SAVE_GAME,
@@ -5482,9 +5634,21 @@ MSG_HASH(
 	MENU_ENUM_SUBLABEL_CHEAT_APPLY_CHANGES,
 	"Los cambios en los trucos tendrán efecto inmediatamente"
 	)
+MSG_HASH(
+	MENU_ENUM_SUBLABEL_CHEAT_START_SEARCH,
+	"Inciar búsqueda de un truco nuevo. El número de bits se puede cambiar"
+	)
+MSG_HASH(
+	MENU_ENUM_SUBLABEL_CHEAT_CONTINUE_SEARCH,
+	"Continuar búsqueda de un truco nuevo"
+	)
 MSG_HASH(
 	MENU_ENUM_SUBLABEL_CHEAT_FILE_LOAD,
-	"Cargar archivo de trucos"
+	"Cargar archivo de trucos reemplazando los existentes"
+	)
+MSG_HASH(
+	MENU_ENUM_SUBLABEL_CHEAT_FILE_LOAD_APPEND,
+	"Cargar archivo de trucos agregandolos a los existentes"
 	)
 MSG_HASH(
 	MENU_ENUM_SUBLABEL_CHEAT_FILE_SAVE_AS,
@@ -5764,7 +5928,7 @@ MSG_HASH(
 	)
 MSG_HASH(
 	MENU_ENUM_SUBLABEL_MENU_SHOW_SHUTDOWN,
-	"Show/hide the 'Shutdown' option."
+	"Mostrar/ocultar la opción de 'Apagado'"
 	)
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_QUICK_MENU_VIEWS_SETTINGS,
@@ -5953,7 +6117,7 @@ MSG_HASH(
 MSG_HASH(
 	MSG_RUNAHEAD_FAILED_TO_SAVE_STATE,
 	"Fallo al guardar el estado. RunAhead se ha desactivado"
-    )
+	)
 MSG_HASH(
 	MSG_RUNAHEAD_FAILED_TO_LOAD_STATE,
 	"Fallo al cargar el estado. RunAhead se ha desactivado"
@@ -6004,7 +6168,7 @@ MSG_HASH(
 	)
 MSG_HASH(
 	MENU_ENUM_SUBLABEL_STATISTICS_SHOW,
-	"Mostrar estadísticas técnicas en pantalla."
+	"Mostrar estadísticas técnicas en pantalla"
 	)
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_MENU_RGUI_BORDER_FILLER_ENABLE,
@@ -6020,7 +6184,7 @@ MSG_HASH(
 	)
 MSG_HASH(
 	MENU_ENUM_SUBLABEL_CRT_SWITCH_RESOLUTION,
-	"Para pantallas CRT de 15 kHz. Intenta usar la resolución y refresco exactos del núcleo/juego."
+	"Para pantallas CRT de 15 kHz. Intenta usar la resolución y refresco exactos del núcleo/juego"
 	)
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_CRT_SWITCH_RESOLUTION,
@@ -6040,11 +6204,11 @@ MSG_HASH(
 	)
 MSG_HASH(
 	MENU_ENUM_SUBLABEL_CONTENT_SHOW_REWIND,
-	"Muestra/oculta las opciones de rebobinado."
+	"Muestra/oculta las opciones de rebobinado"
 	)
 MSG_HASH(
 	MENU_ENUM_SUBLABEL_CONTENT_SHOW_LATENCY,
-	"Muestra/oculta las opciones de latencia."
+	"Muestra/oculta las opciones de latencia"
 	)
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_LATENCY,
@@ -6052,7 +6216,7 @@ MSG_HASH(
 	)
 MSG_HASH(
 	MENU_ENUM_SUBLABEL_CONTENT_SHOW_OVERLAYS,
-	"Muestra/oculta las opciones de overlays."
+	"Muestra/oculta las opciones de overlays"
 	)
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_OVERLAYS,
@@ -6064,7 +6228,7 @@ MSG_HASH(
 	)
 MSG_HASH(
 	MENU_ENUM_SUBLABEL_AUDIO_ENABLE_MENU,
-	"Activa o desactiva el menu de sonido."
+	"Activa o desactiva el menu de sonido"
 	)
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_AUDIO_MIXER_SETTINGS,
@@ -6072,7 +6236,7 @@ MSG_HASH(
 	)
 MSG_HASH(
 	MENU_ENUM_SUBLABEL_AUDIO_MIXER_SETTINGS,
-	"Ver o modificar las opciones del mezclador de audio."
+	"Ver o modificar las opciones del mezclador de audio"
 	)
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_QT_INFO,
@@ -6201,7 +6365,7 @@ MSG_HASH(
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_QT_ALL_PLAYLISTS,
 	"Todas las Playlists"
-    )
+	)
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_QT_CORE,
 	"Núcleo"
@@ -6242,7 +6406,7 @@ MSG_HASH(
 	"<li>tener los \"Archivos de información de núcleos\" actualizados</li>\n"
 	"<li>tener las \"Bases de datos\" actualizadas</li>\n"
 	"<li>reiniciar RetroArch si actualizaste algo con el \"Actualizador en línea\"</li></ul>\n"
-	"Por último, el contenido debe coincidir las bases de datos existente de <a href=\"https://docs.libretro.com/guides/roms-playlists-thumbnails/#sources\">aquí</a>. Si aún no funciona, considere <a href=\"https://www.github.com/libretro/RetroArch/issues\">enviar un reporte de error.</a>."
+	"Por último, el contenido debe coincidir las bases de datos existente de <a href=\"https://docs.libretro.com/guides/roms-playlists-thumbnails/#sources\">aquí</a>. Si aún no funciona, considere <a href=\"https://www.github.com/libretro/RetroArch/issues\">enviar un reporte de error.</a>"
 	)
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_QT_DONT_SHOW_AGAIN,
@@ -6304,45 +6468,61 @@ MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_SUGGEST_LOADED_CORE_FIRST,
 	"Sugerir el núcleo cargado primero"
 	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_QT_ZOOM,
+	"Zoom"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_QT_VIEW,
+	"Vista"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_QT_VIEW_TYPE_ICONS,
+	"Iconos"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_QT_VIEW_TYPE_LIST,
+	"Lista"
+	)
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_QUICK_MENU_OVERRIDE_OPTIONS,
 	"Anulaciones"
 	)
 MSG_HASH(
 	MENU_ENUM_SUBLABEL_QUICK_MENU_OVERRIDE_OPTIONS,
-	"Opciones para anular las configuraciones globales."
+	"Opciones para anular las configuraciones globales"
 	)
 MSG_HASH(
 	MENU_ENUM_SUBLABEL_MIXER_ACTION_PLAY,
-	"Comenzara la reproducción de audio. Al finalizar, será quitado de la memoria."
+	"Comenzara la reproducción de audio. Al finalizar, será quitado de la memoria"
 	)
 MSG_HASH(
 	MENU_ENUM_SUBLABEL_MIXER_ACTION_PLAY_LOOPED,
-	"Comenzara la reproducción de audio. Al finalizar, será reproducido nuevamente."
+	"Comenzara la reproducción de audio. Al finalizar, será reproducido nuevamente"
 	)
 MSG_HASH(
 	MENU_ENUM_SUBLABEL_MIXER_ACTION_PLAY_SEQUENTIAL,
-	"Comenzara la reproducción de audio. Al finalizar, continuará con el siguiente, útil para albums."
+	"Comenzara la reproducción de audio. Al finalizar, continuará con el siguiente, útil para albums"
 	)
 MSG_HASH(
 	MENU_ENUM_SUBLABEL_MIXER_ACTION_STOP,
-	"Detener la reproducción, no lo quitará de la memoria. Puedes continuar la reproducción."
+	"Detener la reproducción, no lo quitará de la memoria. Puedes continuar la reproducción"
 	)
 MSG_HASH(
 	MENU_ENUM_SUBLABEL_MIXER_ACTION_REMOVE,
-	"Detener la reproducción y quitarlo de la memoria."
+	"Detener la reproducción y quitarlo de la memoria"
 	)
 MSG_HASH(
 	MENU_ENUM_SUBLABEL_MIXER_ACTION_VOLUME,
-	"Ajusta el volumen del audio."
+	"Ajusta el volumen del audio"
 	)
 MSG_HASH(
 	MENU_ENUM_SUBLABEL_ADD_TO_MIXER,
-	"Agrega esta pista de audio a una casilla, si no hay disponibles, se ignorará."
+	"Agrega esta pista de audio a una casilla, si no hay disponibles, se ignorará"
 	)
 MSG_HASH(
 	MENU_ENUM_SUBLABEL_ADD_TO_MIXER_AND_PLAY,
-	"Agrega esta pista de audio a una casilla, y la reproduce, si no hay disponibles, se ignorará."
+	"Agrega esta pista de audio a una casilla, y la reproduce, si no hay disponibles, se ignorará"
 	)
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_MIXER_ACTION_PLAY,
@@ -6384,21 +6564,595 @@ MSG_HASH(
 	MENU_ENUM_SUBLABEL_ACHIEVEMENT_RESUME,
 	"Continuar los logros para esta sesión (Esto desactivará los archivos de guardado, cámara lenta, trucos, rebobinado y pausa)"
 	)
-MSG_HASH(MENU_ENUM_LABEL_VALUE_DISCORD_IN_MENU,
-      "In-Menu")
 MSG_HASH(
-      MENU_ENUM_LABEL_VALUE_DISCORD_ALLOW,
-      "Enable Discord"
-      )
+	MENU_ENUM_LABEL_VALUE_DISCORD_IN_MENU,
+	"En-Menú"
+	)
 MSG_HASH(
-      MENU_ENUM_SUBLABEL_DISCORD_ALLOW,
-      "Enable or disable Discord support. Will not work with the browser version, only native desktop client."
-      )
-MSG_HASH(MENU_ENUM_LABEL_VALUE_POWER_MANAGEMENT_SETTINGS,
-      "Power Management")
-MSG_HASH(MENU_ENUM_SUBLABEL_POWER_MANAGEMENT_SETTINGS,
-      "Change power management settings.")
-MSG_HASH(MENU_ENUM_LABEL_VALUE_SUSTAINED_PERFORMANCE_MODE,
-      "Sustained Performance Mode")
-MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_MPV_SUPPORT,
-      "mpv support")
+	MENU_ENUM_LABEL_VALUE_DISCORD_ALLOW,
+	"Activar Discord"
+	)
+MSG_HASH(
+	MENU_ENUM_SUBLABEL_DISCORD_ALLOW,
+	"Activar o desactivar soporte de Discord. No funcionará en la versión web de RetroArch, solo en el cliente de escritorio"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_MIDI_INPUT,
+	"Entrada"
+	)
+MSG_HASH(
+	MENU_ENUM_SUBLABEL_MIDI_INPUT,
+	"Seleccionar dispositivo de entrada"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_MIDI_OUTPUT,
+	"Salida"
+	)
+MSG_HASH(
+	MENU_ENUM_SUBLABEL_MIDI_OUTPUT,
+	"Seleccionar dispositivo de salida"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_MIDI_VOLUME,
+	"Volumen"
+	)
+MSG_HASH(
+	MENU_ENUM_SUBLABEL_MIDI_VOLUME,
+	"Establecer volumen de salida (%)"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_POWER_MANAGEMENT_SETTINGS,
+	"Energía"
+	)
+MSG_HASH(
+	MENU_ENUM_SUBLABEL_POWER_MANAGEMENT_SETTINGS,
+	"Cambiar opciones de energía"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_SUSTAINED_PERFORMANCE_MODE,
+	"Modo de rendimiento sostenido"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_MPV_SUPPORT,
+	"Soporte de mpv"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_CHEAT_IDX,
+	"Indice"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_CHEAT_MATCH_IDX,
+	"Ver coincidencia #"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_CHEAT_MATCH,
+	"Coindidir dirección: %08X Máscara: %02X"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_CHEAT_COPY_MATCH,
+	"Crear truco de coincidencia #"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_CHEAT_DELETE_MATCH,
+	"Borrar coincidencia #"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_CHEAT_DESC,
+	"Descripción"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_CHEAT_STATE,
+	"Activado"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_CHEAT_CODE,
+	"Truco"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_CHEAT_HANDLER,
+	"Manipulador"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_CHEAT_MEMORY_SEARCH_SIZE,
+	"Tamaño de la memoria de búsqueda"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_CHEAT_TYPE,
+	"Tipo"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_CHEAT_VALUE,
+	"Valor"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_CHEAT_ADDRESS,
+	"Dirección de memoria"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_CHEAT_ADDRESS_BIT_POSITION,
+	"Máscara de la dirección de memoria"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_CHEAT_RUMBLE_TYPE,
+	"Vibrar cuando memoria"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_CHEAT_RUMBLE_VALUE,
+	"Valor de vibración"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_CHEAT_RUMBLE_PORT,
+	"Puerto de vibración"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_CHEAT_RUMBLE_PRIMARY_STRENGTH,
+	"Fuerza primaria de vibración"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_CHEAT_RUMBLE_PRIMARY_DURATION,
+	"Duración (ms) de la vibración primaria"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_CHEAT_RUMBLE_SECONDARY_STRENGTH,
+	"Fuerza secundaria de vibración"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_CHEAT_RUMBLE_SECONDARY_DURATION,
+	"Duración (ms) de la vibración secundaria"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_CHEAT_ADD_NEW_AFTER,
+	"Agregar nuevo truco después de este"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_CHEAT_ADD_NEW_BEFORE,
+	"Agregar nuevo truco antes de este"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_CHEAT_COPY_AFTER,
+	"Copiar este truco después"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_CHEAT_COPY_BEFORE,
+	"Copiar este truco antes"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_CHEAT_DELETE,
+	"Borrar este truco"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_CHEAT_HANDLER_TYPE_EMU,
+	"Emulador"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_CHEAT_HANDLER_TYPE_RETRO,
+	"RetroArch"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_CHEAT_TYPE_DISABLED,
+	"<Desactivado>"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_CHEAT_TYPE_SET_TO_VALUE,
+	"Establecer valor"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_CHEAT_TYPE_INCREASE_VALUE,
+	"Aumentar por valor"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_CHEAT_TYPE_DECREASE_VALUE,
+	"Disminuir por valor"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_CHEAT_TYPE_RUN_NEXT_IF_EQ,
+	"Ejecutar siguiente truco si el valor es igual a la memoria"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_CHEAT_TYPE_RUN_NEXT_IF_NEQ,
+	"Ejecutar siguiente truco si el valor es distinto a la memoria"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_CHEAT_TYPE_RUN_NEXT_IF_LT,
+	"Ejecutar el siguiente truco si el valor es menor a la memoria"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_CHEAT_TYPE_RUN_NEXT_IF_GT,
+	"Ejecutar el siguiente truco si el valor es mayor a la memoria"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_RUMBLE_TYPE_DISABLED,
+	"<Desactivado>"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_RUMBLE_TYPE_CHANGES,
+	"Cambios"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_RUMBLE_TYPE_DOES_NOT_CHANGE,
+	"No cambia"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_RUMBLE_TYPE_INCREASE,
+	"Aumenta"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_RUMBLE_TYPE_DECREASE,
+	"Disminuye"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_RUMBLE_TYPE_EQ_VALUE,
+	"Igual al valor de vibración"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_RUMBLE_TYPE_NEQ_VALUE,
+	"Distinto al valor de vibración"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_RUMBLE_TYPE_LT_VALUE,
+	"Menor al valor de vibración"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_RUMBLE_TYPE_GT_VALUE,
+	"Mayor al valor de vibración"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_CHEAT_MEMORY_SIZE_1,
+	"1-bit, valor máx. = 0x01"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_CHEAT_MEMORY_SIZE_2,
+	"2-bit, valor máx. = 0x03"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_CHEAT_MEMORY_SIZE_4,
+	"4-bit, valor máx. = 0x0F"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_CHEAT_MEMORY_SIZE_8,
+	"8-bit, valor máx. = 0xFF"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_CHEAT_MEMORY_SIZE_16,
+	"16-bit, valor máx. = 0xFFFF"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_CHEAT_MEMORY_SIZE_32,
+	"32-bit, valor máx. = 0xFFFFFFFF"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_RUMBLE_PORT_0,
+	"1"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_RUMBLE_PORT_1,
+	"2"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_RUMBLE_PORT_2,
+	"3"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_RUMBLE_PORT_3,
+	"4"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_RUMBLE_PORT_4,
+	"5"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_RUMBLE_PORT_5,
+	"6"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_RUMBLE_PORT_6,
+	"7"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_RUMBLE_PORT_7,
+	"8"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_RUMBLE_PORT_8,
+	"9"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_RUMBLE_PORT_9,
+	"10"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_RUMBLE_PORT_10,
+	"11"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_RUMBLE_PORT_11,
+	"12"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_RUMBLE_PORT_12,
+	"13"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_RUMBLE_PORT_13,
+	"14"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_RUMBLE_PORT_14,
+	"15"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_RUMBLE_PORT_15,
+	"16"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_RUMBLE_PORT_16,
+	"All"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_CHEAT_START_OR_CONT,
+	"Inciar o continuar búsqueda de trucos"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_CHEAT_START_OR_RESTART,
+	"Inciar o reiniciar búsqueda de trucos"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_CHEAT_SEARCH_EXACT,
+	"Buscar valores de memoria"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_CHEAT_SEARCH_LT,
+	"Buscar valores de memoria"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_CHEAT_SEARCH_GT,
+	"Buscar valores de memoria"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_CHEAT_SEARCH_EQ,
+	"Buscar valores de memoria"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_CHEAT_SEARCH_GTE,
+	"Buscar valores de memoria"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_CHEAT_SEARCH_LTE,
+	"Buscar valores de memoria"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_CHEAT_SEARCH_NEQ,
+	"Buscar valores de memoria"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_CHEAT_SEARCH_EQPLUS,
+	"Buscar valores de memoria"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_CHEAT_SEARCH_EQMINUS,
+	"Buscar valores de memoria"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_CHEAT_ADD_MATCHES,
+	"Agregar las %u coincidencias a tu lista"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_CHEAT_VIEW_MATCHES,
+	"Ver lista de %u coincidencias"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_CHEAT_CREATE_OPTION,
+	"Crear truco de esta coincidencia"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_CHEAT_DELETE_OPTION,
+	"Borrar esta coincidencia"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_CHEAT_ADD_NEW_TOP,
+	"Agregar nuevo truco al principio"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_CHEAT_ADD_NEW_BOTTOM,
+	"Agregar nuevo truco al final"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_CHEAT_DELETE_ALL,
+	"Borrar todos los trucos"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_CHEAT_SEARCH_EXACT_VAL,
+	"Igual a %u (%X)"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_CHEAT_SEARCH_LT_VAL,
+	"Menos que antes"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_CHEAT_SEARCH_GT_VAL,
+	"Más que antes"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_CHEAT_SEARCH_LTE_VAL,
+	"Menos o igual que antes"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_CHEAT_SEARCH_GTE_VAL,
+	"Más o igual que antes"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_CHEAT_SEARCH_EQ_VAL,
+	"Igual que antes"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_CHEAT_SEARCH_NEQ_VAL,
+	"Distinto que antes"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_CHEAT_SEARCH_EQPLUS_VAL,
+	"Igual que antes+%u (%X)"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_CHEAT_SEARCH_EQMINUS_VAL,
+	"Igual que antes-%u (%X)"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_CHEAT_SEARCH_SETTINGS,
+	"Iniciar o continuar búsqueda de trucos"
+	)
+MSG_HASH(
+	MSG_CHEAT_INIT_SUCCESS,
+	"Búsqueda de trucos iniciada correctamente"
+	)
+MSG_HASH(
+	MSG_CHEAT_INIT_FAIL,
+	"Fallo al iniciar búsqueda de trucos"
+	)
+MSG_HASH(
+	MSG_CHEAT_SEARCH_NOT_INITIALIZED,
+	"La búsqueda no ha sido iniciada"
+	)
+MSG_HASH(
+	MSG_CHEAT_SEARCH_FOUND_MATCHES,
+	"Número de coincidencias = %u"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_CHEAT_BIG_ENDIAN,
+	"Big Endian"
+	)
+MSG_HASH(
+	MSG_CHEAT_SEARCH_ADDED_MATCHES_SUCCESS,
+	"Agregadas %u coincidencias"
+	)
+MSG_HASH(
+	MSG_CHEAT_SEARCH_ADDED_MATCHES_FAIL,
+	"Fallo al agregar coincidencias"
+	)
+MSG_HASH(
+	MSG_CHEAT_SEARCH_ADD_MATCH_SUCCESS,
+	"Truco creado desde coincidencia"
+	)
+MSG_HASH(
+	MSG_CHEAT_SEARCH_ADD_MATCH_FAIL,
+	"Fallo al crear truco"
+	)
+MSG_HASH(
+	MSG_CHEAT_SEARCH_DELETE_MATCH_SUCCESS,
+	"Borrar coincidencia"
+	)
+MSG_HASH(
+	MSG_CHEAT_SEARCH_ADDED_MATCHES_TOO_MANY,
+	"No hay suficiente espacio. El máximo es 100 trucos"
+	)
+MSG_HASH(
+	MSG_CHEAT_ADD_TOP_SUCCESS,
+	"Nuevo truco agregado al inicio de la lista"
+	)
+MSG_HASH(
+	MSG_CHEAT_ADD_BOTTOM_SUCCESS,
+	"Nuevo truco agregado al final de la lista"
+	)
+MSG_HASH(
+	MSG_CHEAT_DELETE_ALL_INSTRUCTIONS,
+	"Presiona derecha cinco veces para borrar todos los trucos"
+	)
+MSG_HASH(
+	MSG_CHEAT_DELETE_ALL_SUCCESS,
+	"Todos los trucos fueron borrados"
+	)
+MSG_HASH(
+	MSG_CHEAT_ADD_BEFORE_SUCCESS,
+	"Nuevo truco agregado antes de este"
+	)
+MSG_HASH(
+	MSG_CHEAT_ADD_AFTER_SUCCESS,
+	"Nuevo truco agregado después de este"
+	)
+MSG_HASH(
+	MSG_CHEAT_COPY_BEFORE_SUCCESS,
+	"Truco copiado antes de este"
+	)
+MSG_HASH(
+	MSG_CHEAT_COPY_AFTER_SUCCESS,
+	"Truco copiado después de este"
+	)
+MSG_HASH(
+	MSG_CHEAT_DELETE_SUCCESS,
+	"Truco borrado"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_QT_PROGRESS,
+	"Progreso:"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_ALL_PLAYLISTS_LIST_MAX_COUNT,
+	"\"Todas la Playlists\" máximo de entradas en lista:"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_ALL_PLAYLISTS_GRID_MAX_COUNT,
+	"\"Todas la Playlists\" máximo de entradas en grilla:"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_SHOW_HIDDEN_FILES,
+	"Mostrar elementos ocultos"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_QT_NEW_PLAYLIST,
+	"Nueva Playlist"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_QT_ENTER_NEW_PLAYLIST_NAME,
+	"Por favor ingrese el nombre de la nueva Playlist:"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_QT_DELETE_PLAYLIST,
+	"Borrar Playlist"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_QT_CONFIRM_DELETE_PLAYLIST,
+	"¿Está seguro que desea borrar la playlist \"%1\"?"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_QT_QUESTION,
+	"Pregunta"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_QT_COULD_NOT_DELETE_FILE,
+	"No se pudo borrar el archivo"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_QT_GATHERING_LIST_OF_FILES,
+	"Cargando lista de archivos..."
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_QT_ADDING_FILES_TO_PLAYLIST,
+	"Agregando archivos a la Playlist..."
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_QT_PLAYLIST_ENTRY,
+	"Entrada de la Playlist"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_QT_PLAYLIST_ENTRY_CORE,
+	"Núcleo:"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_QT_PLAYLIST_ENTRY_DATABASE,
+	"Base de datos:"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_QT_FOR_THUMBNAILS,
+	"(usado pata buscar miniaturas)"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_QT_CONFIRM_DELETE_PLAYLIST_ITEM,
+	"¿Está seguro que desea borrar \"%1\"?"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_QT_CANNOT_ADD_TO_ALL_PLAYLISTS,
+	"Por favor primero elija solo una Playlist"
+	)
+MSG_HASH(
+	MENU_ENUM_LABEL_VALUE_QT_DELETE,
+	"Borrar"
+	)
\ No newline at end of file

From 7131b969d887fc61d510b28eeb273486cdedf210 Mon Sep 17 00:00:00 2001
From: twinaphex <libretro@gmail.com>
Date: Sun, 29 Jul 2018 19:04:53 +0200
Subject: [PATCH 08/10] (Android) Buildfixes

---
 command.c                 |  6 +++---
 managers/cheat_manager.c  |  4 ++--
 menu/cbs/menu_cbs_ok.c    | 31 ++++++++++++++++++-------------
 menu/cbs/menu_cbs_right.c |  6 ++++--
 menu/menu_setting.c       | 30 ++++++------------------------
 5 files changed, 33 insertions(+), 44 deletions(-)

diff --git a/command.c b/command.c
index 105e7d761e..46a3e51a9c 100644
--- a/command.c
+++ b/command.c
@@ -198,8 +198,7 @@ static struct sockaddr_storage lastcmd_net_source;
 static socklen_t lastcmd_net_source_len;
 #endif
 
-#ifdef HAVE_CHEEVOS
-#if defined(HAVE_STDIN_CMD) || defined(HAVE_NETWORK_CMD) && defined(HAVE_NETWORKING)
+#if defined(HAVE_CHEEVOS) && (defined(HAVE_STDIN_CMD) || defined(HAVE_NETWORK_CMD) && defined(HAVE_NETWORKING))
 static bool command_reply(const char * data, size_t len)
 {
    switch (lastcmd_source)
@@ -226,7 +225,6 @@ static bool command_reply(const char * data, size_t len)
    return false;
 }
 #endif
-#endif
 
 bool command_set_shader(const char *arg)
 {
@@ -254,7 +252,9 @@ static bool command_version(const char* arg)
       char reply[256] = {0};
 
       sprintf(reply, "%s\n", PACKAGE_VERSION);
+#if defined(HAVE_CHEEVOS) && (defined(HAVE_STDIN_CMD) || defined(HAVE_NETWORK_CMD) && defined(HAVE_NETWORKING))
       command_reply(reply, strlen(reply));
+#endif
       return true;
 }
 
diff --git a/managers/cheat_manager.c b/managers/cheat_manager.c
index bfe544e5dc..fb4d0de824 100644
--- a/managers/cheat_manager.c
+++ b/managers/cheat_manager.c
@@ -1317,8 +1317,8 @@ void cheat_manager_match_action(enum cheat_match_action_type match_action, unsig
    unsigned char *prev = cheat_manager_state.prev_memory_buf ;
    unsigned int curr_match_idx = 0;
 
-   if ( target_match_idx < 0 || target_match_idx > cheat_manager_state.num_matches-1)
-      return ;
+   if ( target_match_idx > cheat_manager_state.num_matches-1)
+      return;
 
    cheat_manager_setup_search_meta(cheat_manager_state.search_bit_size, &bytes_per_item, &mask, &bits);
 
diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c
index ad7957c2d0..6cce7b8028 100644
--- a/menu/cbs/menu_cbs_ok.c
+++ b/menu/cbs/menu_cbs_ok.c
@@ -2674,13 +2674,14 @@ static int action_ok_cheat_add_top(const char *path,
 
    for (i = cheat_manager_state.size-2 ; i >=0 ; i--)
    {
-      memcpy(&cheat_manager_state.cheats[i+1], &cheat_manager_state.cheats[i], sizeof(struct item_cheat )) ;
+      memcpy(&cheat_manager_state.cheats[i+1],
+            &cheat_manager_state.cheats[i], sizeof(struct item_cheat )) ;
       cheat_manager_state.cheats[i+1].idx++ ;
    }
 
    memcpy(&cheat_manager_state.cheats[0], &tmp, sizeof(struct item_cheat )) ;
 
-   snprintf(msg, sizeof(msg), msg_hash_to_str(MSG_CHEAT_ADD_TOP_SUCCESS)) ;
+   strlcpy(msg, msg_hash_to_str(MSG_CHEAT_ADD_TOP_SUCCESS), sizeof(msg));
    msg[sizeof(msg) - 1] = 0;
 
    runloop_msg_queue_push(msg, 1, 180, true);
@@ -2691,15 +2692,17 @@ static int action_ok_cheat_add_top(const char *path,
 static int action_ok_cheat_add_bottom(const char *path,
       const char *label, unsigned type, size_t idx, size_t entry_idx)
 {
-   char msg[256] ;
+   char msg[256];
    bool refresh = false ;
-
    unsigned int new_size = cheat_manager_get_size() + 1;
+
    menu_entries_ctl(MENU_ENTRIES_CTL_SET_REFRESH, &refresh);
    menu_driver_ctl(RARCH_MENU_CTL_SET_PREVENT_POPULATE, NULL);
    cheat_manager_realloc(new_size, CHEAT_HANDLER_TYPE_RETRO);
 
-   snprintf(msg, sizeof(msg), msg_hash_to_str(MSG_CHEAT_ADD_BOTTOM_SUCCESS)) ;
+   msg[0] = '\0';
+   strlcpy(msg, 
+         msg_hash_to_str(MSG_CHEAT_ADD_BOTTOM_SUCCESS), sizeof(msg));
    msg[sizeof(msg) - 1] = 0;
 
    runloop_msg_queue_push(msg, 1, 180, true);
@@ -2711,7 +2714,7 @@ static int action_ok_cheat_delete_all(const char *path,
       const char *label, unsigned type, size_t idx, size_t entry_idx)
 {
    char msg[256] ;
-   snprintf(msg, sizeof(msg), msg_hash_to_str(MSG_CHEAT_DELETE_ALL_INSTRUCTIONS)) ;
+   strlcpy(msg, msg_hash_to_str(MSG_CHEAT_DELETE_ALL_INSTRUCTIONS), sizeof(msg));
    msg[sizeof(msg) - 1] = 0;
 
    runloop_msg_queue_push(msg, 1, 240, true);
@@ -2743,7 +2746,7 @@ static int action_ok_cheat_add_new_after(const char *path,
    menu_entries_ctl(MENU_ENTRIES_CTL_SET_REFRESH, &refresh);
    menu_driver_ctl(RARCH_MENU_CTL_SET_PREVENT_POPULATE, NULL);
 
-   snprintf(msg, sizeof(msg), msg_hash_to_str(MSG_CHEAT_ADD_AFTER_SUCCESS)) ;
+   strlcpy(msg, msg_hash_to_str(MSG_CHEAT_ADD_AFTER_SUCCESS), sizeof(msg));
    msg[sizeof(msg) - 1] = 0;
 
    runloop_msg_queue_push(msg, 1, 180, true);
@@ -2771,13 +2774,15 @@ static int action_ok_cheat_add_new_before(const char *path,
       cheat_manager_state.cheats[i+1].idx++ ;
    }
 
-   memcpy(&cheat_manager_state.cheats[tmp.idx], &tmp, sizeof(struct item_cheat )) ;
-   memcpy(&cheat_manager_state.working_cheat, &tmp, sizeof(struct item_cheat )) ;
+   memcpy(&cheat_manager_state.cheats[tmp.idx],
+         &tmp, sizeof(struct item_cheat )) ;
+   memcpy(&cheat_manager_state.working_cheat,
+         &tmp, sizeof(struct item_cheat )) ;
 
    menu_entries_ctl(MENU_ENTRIES_CTL_SET_REFRESH, &refresh);
    menu_driver_ctl(RARCH_MENU_CTL_SET_PREVENT_POPULATE, NULL);
 
-   snprintf(msg, sizeof(msg), msg_hash_to_str(MSG_CHEAT_ADD_BEFORE_SUCCESS)) ;
+   strlcpy(msg, msg_hash_to_str(MSG_CHEAT_ADD_BEFORE_SUCCESS), sizeof(msg));
    msg[sizeof(msg) - 1] = 0;
 
    runloop_msg_queue_push(msg, 1, 180, true);
@@ -2810,7 +2815,7 @@ static int action_ok_cheat_copy_before(const char *path,
    menu_entries_ctl(MENU_ENTRIES_CTL_SET_REFRESH, &refresh);
    menu_driver_ctl(RARCH_MENU_CTL_SET_PREVENT_POPULATE, NULL);
 
-   snprintf(msg, sizeof(msg), msg_hash_to_str(MSG_CHEAT_COPY_BEFORE_SUCCESS)) ;
+   strlcpy(msg, msg_hash_to_str(MSG_CHEAT_COPY_BEFORE_SUCCESS), sizeof(msg));
    msg[sizeof(msg) - 1] = 0;
 
    runloop_msg_queue_push(msg, 1, 180, true);
@@ -2844,7 +2849,7 @@ static int action_ok_cheat_copy_after(const char *path,
    menu_entries_ctl(MENU_ENTRIES_CTL_SET_REFRESH, &refresh);
    menu_driver_ctl(RARCH_MENU_CTL_SET_PREVENT_POPULATE, NULL);
 
-   snprintf(msg, sizeof(msg), msg_hash_to_str(MSG_CHEAT_COPY_AFTER_SUCCESS)) ;
+   strlcpy(msg, msg_hash_to_str(MSG_CHEAT_COPY_AFTER_SUCCESS), sizeof(msg));
    msg[sizeof(msg) - 1] = 0;
 
    runloop_msg_queue_push(msg, 1, 180, true);
@@ -2872,7 +2877,7 @@ static int action_ok_cheat_delete(const char *path,
 
    cheat_manager_realloc(new_size, CHEAT_HANDLER_TYPE_RETRO);
 
-   snprintf(msg, sizeof(msg), msg_hash_to_str(MSG_CHEAT_DELETE_SUCCESS)) ;
+   strlcpy(msg, msg_hash_to_str(MSG_CHEAT_DELETE_SUCCESS), sizeof(msg));
    msg[sizeof(msg) - 1] = 0;
 
    runloop_msg_queue_push(msg, 1, 180, true);
diff --git a/menu/cbs/menu_cbs_right.c b/menu/cbs/menu_cbs_right.c
index 2bf06e79b3..47c168775e 100644
--- a/menu/cbs/menu_cbs_right.c
+++ b/menu/cbs/menu_cbs_right.c
@@ -276,16 +276,18 @@ static int action_right_cheat_delete_all(unsigned type, const char *label,
       bool wraparound)
 {
    bool refresh = false ;
-   char msg[256] ;
+   char msg[256];
 
    if ( ++cheat_manager_state.delete_state >= 5 )
    {
+      msg[0] = '\0';
       cheat_manager_state.delete_state = 0 ;
       cheat_manager_realloc(0, CHEAT_HANDLER_TYPE_EMU) ;
       menu_entries_ctl(MENU_ENTRIES_CTL_SET_REFRESH, &refresh);
       menu_driver_ctl(RARCH_MENU_CTL_SET_PREVENT_POPULATE, NULL);
 
-      snprintf(msg, sizeof(msg), msg_hash_to_str(MSG_CHEAT_DELETE_ALL_SUCCESS)) ;
+      strlcpy(msg,
+            msg_hash_to_str(MSG_CHEAT_DELETE_ALL_SUCCESS), sizeof(msg));
       msg[sizeof(msg) - 1] = 0;
 
       runloop_msg_queue_push(msg, 1, 180, true);
diff --git a/menu/menu_setting.c b/menu/menu_setting.c
index 73560174f2..20730ce7ba 100644
--- a/menu/menu_setting.c
+++ b/menu/menu_setting.c
@@ -443,10 +443,8 @@ static void setting_get_string_representation_uint_cheat_exact(void *data,
 {
    rarch_setting_t *setting = (rarch_setting_t*)data;
    if (setting)
-   {
       snprintf(s, len, msg_hash_to_str(MENU_ENUM_LABEL_CHEAT_SEARCH_EXACT_VAL),
             *setting->value.target.unsigned_integer, *setting->value.target.unsigned_integer);
-   }
 }
 
 static void setting_get_string_representation_uint_cheat_lt(void *data,
@@ -454,9 +452,7 @@ static void setting_get_string_representation_uint_cheat_lt(void *data,
 {
    rarch_setting_t *setting = (rarch_setting_t*)data;
    if (setting)
-   {
-      snprintf(s, len, msg_hash_to_str(MENU_ENUM_LABEL_CHEAT_SEARCH_LT_VAL));
-   }
+      strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_CHEAT_SEARCH_LT_VAL), len);
 }
 
 static void setting_get_string_representation_uint_cheat_gt(void *data,
@@ -464,9 +460,7 @@ static void setting_get_string_representation_uint_cheat_gt(void *data,
 {
    rarch_setting_t *setting = (rarch_setting_t*)data;
    if (setting)
-   {
-      snprintf(s, len, msg_hash_to_str(MENU_ENUM_LABEL_CHEAT_SEARCH_GT_VAL));
-   }
+      strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_CHEAT_SEARCH_GT_VAL), len);
 }
 
 static void setting_get_string_representation_uint_cheat_lte(void *data,
@@ -474,9 +468,7 @@ static void setting_get_string_representation_uint_cheat_lte(void *data,
 {
    rarch_setting_t *setting = (rarch_setting_t*)data;
    if (setting)
-   {
-      snprintf(s, len, msg_hash_to_str(MENU_ENUM_LABEL_CHEAT_SEARCH_LTE_VAL));
-   }
+      strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_CHEAT_SEARCH_LTE_VAL), len);
 }
 
 static void setting_get_string_representation_uint_cheat_gte(void *data,
@@ -484,9 +476,7 @@ static void setting_get_string_representation_uint_cheat_gte(void *data,
 {
    rarch_setting_t *setting = (rarch_setting_t*)data;
    if (setting)
-   {
-      snprintf(s, len, msg_hash_to_str(MENU_ENUM_LABEL_CHEAT_SEARCH_GTE_VAL));
-   }
+      strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_CHEAT_SEARCH_GTE_VAL), len);
 }
 
 static void setting_get_string_representation_uint_cheat_eq(void *data,
@@ -494,9 +484,7 @@ static void setting_get_string_representation_uint_cheat_eq(void *data,
 {
    rarch_setting_t *setting = (rarch_setting_t*)data;
    if (setting)
-   {
-      snprintf(s, len, msg_hash_to_str(MENU_ENUM_LABEL_CHEAT_SEARCH_EQ_VAL));
-   }
+      strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_CHEAT_SEARCH_EQ_VAL), len);
 }
 
 static void setting_get_string_representation_uint_cheat_neq(void *data,
@@ -504,9 +492,7 @@ static void setting_get_string_representation_uint_cheat_neq(void *data,
 {
    rarch_setting_t *setting = (rarch_setting_t*)data;
    if (setting)
-   {
-      snprintf(s, len, msg_hash_to_str(MENU_ENUM_LABEL_CHEAT_SEARCH_NEQ_VAL));
-   }
+      strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_CHEAT_SEARCH_NEQ_VAL), len);
 }
 
 static void setting_get_string_representation_uint_cheat_eqplus(void *data,
@@ -514,10 +500,8 @@ static void setting_get_string_representation_uint_cheat_eqplus(void *data,
 {
    rarch_setting_t *setting = (rarch_setting_t*)data;
    if (setting)
-   {
       snprintf(s, len, msg_hash_to_str(MENU_ENUM_LABEL_CHEAT_SEARCH_EQPLUS_VAL),
             *setting->value.target.unsigned_integer, *setting->value.target.unsigned_integer);
-   }
 }
 
 static void setting_get_string_representation_uint_cheat_eqminus(void *data,
@@ -525,10 +509,8 @@ static void setting_get_string_representation_uint_cheat_eqminus(void *data,
 {
    rarch_setting_t *setting = (rarch_setting_t*)data;
    if (setting)
-   {
       snprintf(s, len, msg_hash_to_str(MENU_ENUM_LABEL_CHEAT_SEARCH_EQMINUS_VAL),
             *setting->value.target.unsigned_integer, *setting->value.target.unsigned_integer);
-   }
 }
 
 static void setting_get_string_representation_uint_video_rotation(void *data,

From 2516b7ad1e8c03e19932624da32dacd4a7505690 Mon Sep 17 00:00:00 2001
From: Alfredo Monclus <alfredomonclus@gmail.com>
Date: Sun, 29 Jul 2018 14:06:08 -0300
Subject: [PATCH 09/10] =?UTF-8?q?Ranura=20a=20Posici=C3=B3n?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 intl/msg_hash_es.h | 22 +++++++++++-----------
 1 file changed, 11 insertions(+), 11 deletions(-)

diff --git a/intl/msg_hash_es.h b/intl/msg_hash_es.h
index 02d44e9259..3fdf3a71b8 100644
--- a/intl/msg_hash_es.h
+++ b/intl/msg_hash_es.h
@@ -1300,11 +1300,11 @@ MSG_HASH(
 	)
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_MINUS,
-	"Ranura de guardado -"
+	"Posición de guardado -"
 	)
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_PLUS,
-	"Ranura de guardado +"
+	"Posición de guardado +"
 	)
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_DOWN,
@@ -2476,7 +2476,7 @@ MSG_HASH(
 	)
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_STATE_SLOT,
-	"Ranura de guardado"
+	"Posición de guardado"
 	)
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_STATUS,
@@ -3996,7 +3996,7 @@ MSG_HASH(
 	)
 MSG_HASH(
 	MSG_FOUND_LAST_STATE_SLOT,
-	"Encontrada la ultima ranura de guardado"
+	"Encontrada la ultima posición de guardado"
 	)
 MSG_HASH(
 	MSG_FOUND_SHADER,
@@ -4088,11 +4088,11 @@ MSG_HASH(
 	)
 MSG_HASH(
 	MSG_LOADED_STATE_FROM_SLOT,
-	"Cargado guardado de la ranura #%d"
+	"Cargado guardado de la posición #%d"
 	)
 MSG_HASH(
 	MSG_LOADED_STATE_FROM_SLOT_AUTO,
-	"Cargado guardado de la ranura #-1 (auto)"
+	"Cargado guardado de la posición #-1 (auto)"
 	)
 MSG_HASH(
 	MSG_LOADING,
@@ -4260,7 +4260,7 @@ MSG_HASH(
 	)
 MSG_HASH(
 	MSG_SAVED_STATE_TO_SLOT,
-	"Guardado a la ranura #%d"
+	"Guardado a la posición #%d"
 	)
 MSG_HASH(
 	MSG_SAVED_STATE_TO_SLOT_AUTO,
@@ -4336,7 +4336,7 @@ MSG_HASH(
 	)
 MSG_HASH(
 	MSG_STATE_SLOT,
-	"Ranura de guardado"
+	"Posición de guardado"
 	)
 MSG_HASH(
 	MSG_TAKING_SCREENSHOT,
@@ -5276,11 +5276,11 @@ MSG_HASH(
 	)
 MSG_HASH(
 	MENU_ENUM_SUBLABEL_LOAD_STATE,
-	"Carga un guardado rápido desde la ranura seleccionada"
+	"Carga un guardado rápido desde la posición seleccionada"
 	)
 MSG_HASH(
 	MENU_ENUM_SUBLABEL_SAVE_STATE,
-	"Guarda en la ranura seleccionada"
+	"Guarda en la posición seleccionada"
 	)
 MSG_HASH(
 	MENU_ENUM_SUBLABEL_RESUME,
@@ -5292,7 +5292,7 @@ MSG_HASH(
 	)
 MSG_HASH(
 	MENU_ENUM_SUBLABEL_STATE_SLOT,
-	"Cambia la ranura de guardado actual"
+	"Cambia la posición de guardado actual"
 	)
 MSG_HASH(
 	MENU_ENUM_SUBLABEL_UNDO_LOAD_STATE,

From 7426701b2fae139cc1623275e4dbb26e0d86ab8a Mon Sep 17 00:00:00 2001
From: Alfredo Monclus <alfredomonclus@gmail.com>
Date: Sun, 29 Jul 2018 15:06:01 -0300
Subject: [PATCH 10/10] Anulaciones a Personalizaciones

---
 intl/msg_hash_es.h | 28 ++++++++++++++--------------
 1 file changed, 14 insertions(+), 14 deletions(-)

diff --git a/intl/msg_hash_es.h b/intl/msg_hash_es.h
index 3fdf3a71b8..337c4f2058 100644
--- a/intl/msg_hash_es.h
+++ b/intl/msg_hash_es.h
@@ -332,7 +332,7 @@ MSG_HASH(
 	)
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_AUTO_OVERRIDES_ENABLE,
-	"Cargar autom. archivos de anulación"
+	"Cargar autom. archivos de personalización"
 	)
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_AUTO_REMAPS_ENABLE,
@@ -2316,15 +2316,15 @@ MSG_HASH(
 	)
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_SAVE_CURRENT_CONFIG_OVERRIDE_CORE,
-	"Guardar anulaciones del núcleo"
+	"Guardar personalizaciones del núcleo"
 	)
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_SAVE_CURRENT_CONFIG_OVERRIDE_CONTENT_DIR,
-	"Lugar donde guardar anulaciones del juego"
+	"Lugar donde guardar personalizaciones del juego"
 	)
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_SAVE_CURRENT_CONFIG_OVERRIDE_GAME,
-	"Guardar anulaciones del juego"
+	"Guardar personalizaciones del juego"
 	)
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_SAVE_NEW_CONFIG,
@@ -4152,11 +4152,11 @@ MSG_HASH(
 	)
 MSG_HASH(
 	MSG_OVERRIDES_ERROR_SAVING,
-	"Error guardando anulaciones"
+	"Error guardando personalizaciones"
 	)
 MSG_HASH(
 	MSG_OVERRIDES_SAVED_SUCCESSFULLY,
-	"Anulaciones guardadas exitosamente"
+	"Personalizaciones guardadas exitosamente"
 	)
 MSG_HASH(
 	MSG_PAUSED,
@@ -5328,7 +5328,7 @@ MSG_HASH(
 	)
 MSG_HASH(
 	MENU_ENUM_SUBLABEL_SAVE_CURRENT_CONFIG_OVERRIDE_CORE,
-	"Guarda un archivo de anulación que se aplicará a todo el contenido cargado con este núcleo. Tomará precedencia sobre la configuración principal"
+	"Guarda un archivo de personalización que se aplicará a todo el contenido cargado con este núcleo. Tomará precedencia sobre la configuración principal"
 	)
 MSG_HASH(
 	MENU_ENUM_SUBLABEL_SAVE_CURRENT_CONFIG_OVERRIDE_CONTENT_DIR,
@@ -5336,7 +5336,7 @@ MSG_HASH(
 	)
 MSG_HASH(
 	MENU_ENUM_SUBLABEL_SAVE_CURRENT_CONFIG_OVERRIDE_GAME,
-	"Guarda un archivo de anulación que se aplicará solo a este contenido cargado. Tomará precedencia sobre la configuración principal"
+	"Guarda un archivo de personalización que se aplicará solo a este contenido cargado. Tomará precedencia sobre la configuración principal"
 	)
 MSG_HASH(
 	MENU_ENUM_SUBLABEL_CORE_CHEAT_OPTIONS,
@@ -6004,19 +6004,19 @@ MSG_HASH(
 	)
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_SAVE_CORE_OVERRIDES,
-	"Mostrar anulaciones de núcleo"
+	"Mostrar personalizaciones de núcleo"
 	)
 MSG_HASH(
 	MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_SAVE_CORE_OVERRIDES,
-	"Mostrar/ocultar la opción de 'Guardar anulaciones de núcleo'"
+	"Mostrar/ocultar la opción de 'Guardar personalizaciones de núcleo'"
 	)
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_SAVE_GAME_OVERRIDES,
-	"Mostrar anulaciones de juego"
+	"Mostrar personalizaciones de juego"
 	)
 MSG_HASH(
 	MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_SAVE_GAME_OVERRIDES,
-	"Mostrar/ocultar la opción de 'Guardar anulaciones de juego'"
+	"Mostrar/ocultar la opción de 'Guardar personalizaciones de juego'"
 	)
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_INFORMATION,
@@ -6100,7 +6100,7 @@ MSG_HASH(
 	)
 MSG_HASH(
 	MSG_CONFIG_OVERRIDE_LOADED,
-	"Anulaciones de configuraciones cargadas"
+	"Personalizar configuraciones cargadas"
 	)
 MSG_HASH(
 	MSG_GAME_REMAP_FILE_LOADED,
@@ -6486,7 +6486,7 @@ MSG_HASH(
 	)
 MSG_HASH(
 	MENU_ENUM_LABEL_VALUE_QUICK_MENU_OVERRIDE_OPTIONS,
-	"Anulaciones"
+	"Personalizaciones"
 	)
 MSG_HASH(
 	MENU_ENUM_SUBLABEL_QUICK_MENU_OVERRIDE_OPTIONS,