diff --git a/es-app/src/Screensaver.cpp b/es-app/src/Screensaver.cpp
index 85cc301b7..f40567b2e 100644
--- a/es-app/src/Screensaver.cpp
+++ b/es-app/src/Screensaver.cpp
@@ -464,8 +464,14 @@ void Screensaver::generateVideoList()
 
 void Screensaver::generateCustomImageList()
 {
-    std::string imageDir = Utils::FileSystem::expandHomePath(
-        Settings::getInstance()->getString("ScreensaverSlideshowImageDir"));
+    std::string imageDir {Utils::FileSystem::expandHomePath(
+        Settings::getInstance()->getString("ScreensaverSlideshowImageDir"))};
+
+    if (imageDir.empty())
+        imageDir = Utils::FileSystem::getAppDataDirectory()
+                       .append("screensavers")
+                       .append("custom_slideshow")
+                       .string();
 
     // This makes it possible to set the custom image directory relative to the ES-DE binary
     // directory or the ROM directory.
@@ -473,19 +479,23 @@ void Screensaver::generateCustomImageList()
     imageDir = Utils::String::replace(imageDir, "%ROMPATH%", FileData::getROMDirectory());
 
     if (imageDir != "" && Utils::FileSystem::isDirectory(imageDir)) {
-        std::string imageFilter {".jpg, .JPG, .png, .PNG"};
-        Utils::FileSystem::StringList dirContent = Utils::FileSystem::getDirContent(
-            imageDir, Settings::getInstance()->getBool("ScreensaverSlideshowRecurse"));
+        const std::vector<std::string> extList {".jpg", ".JPG",  ".png",  ".PNG", ".gif",
+                                                ".GIF", ".webp", ".WEBP", ".svg", ".SVG"};
+
+        Utils::FileSystem::StringList dirContent {Utils::FileSystem::getDirContent(
+            imageDir, Settings::getInstance()->getBool("ScreensaverSlideshowRecurse"))};
 
         for (auto it = dirContent.begin(); it != dirContent.end(); ++it) {
             if (Utils::FileSystem::isRegularFile(*it)) {
-                if (imageFilter.find(Utils::FileSystem::getExtension(*it)) != std::string::npos)
+                if (std::find(extList.cbegin(), extList.cend(),
+                              Utils::FileSystem::getExtension(*it)) != extList.cend())
                     mImageCustomFiles.push_back(*it);
             }
         }
     }
     else {
-        LOG(LogWarning) << "Custom screensaver image directory '" << imageDir << "' does not exist";
+        LOG(LogWarning) << "Custom screensaver image directory \"" << imageDir
+                        << "\" does not exist";
     }
 
     mCustomFilesInventory.insert(mCustomFilesInventory.begin(), mImageCustomFiles.begin(),
diff --git a/es-app/src/guis/GuiScreensaverOptions.cpp b/es-app/src/guis/GuiScreensaverOptions.cpp
index ae061db14..ac2e30f7c 100644
--- a/es-app/src/guis/GuiScreensaverOptions.cpp
+++ b/es-app/src/guis/GuiScreensaverOptions.cpp
@@ -15,6 +15,8 @@
 #include "components/SliderComponent.h"
 #include "components/SwitchComponent.h"
 #include "guis/GuiMsgBox.h"
+#include "guis/GuiTextEditKeyboardPopup.h"
+#include "guis/GuiTextEditPopup.h"
 
 GuiScreensaverOptions::GuiScreensaverOptions(const std::string& title)
     : GuiSettings {title}
@@ -196,20 +198,48 @@ void GuiScreensaverOptions::openSlideshowScreensaverOptions()
     });
 
     // Custom image directory.
+    ComponentListRow rowCustomImageDir;
     auto screensaverSlideshowImageDir = std::make_shared<TextComponent>(
-        "", Font::get(FONT_SIZE_SMALL), mMenuColorPrimary, ALIGN_RIGHT);
-    s->addEditableTextComponent(
-        "CUSTOM IMAGE DIRECTORY", screensaverSlideshowImageDir,
-        Settings::getInstance()->getString("ScreensaverSlideshowImageDir"),
-        Settings::getInstance()->getDefaultString("ScreensaverSlideshowImageDir"));
-    s->addSaveFunc([screensaverSlideshowImageDir, s] {
-        if (screensaverSlideshowImageDir->getValue() !=
-            Settings::getInstance()->getString("ScreensaverSlideshowImageDir")) {
-            Settings::getInstance()->setString("ScreensaverSlideshowImageDir",
-                                               screensaverSlideshowImageDir->getValue());
-            s->setNeedsSaving();
-        }
-    });
+        "CUSTOM IMAGE DIRECTORY", Font::get(FONT_SIZE_MEDIUM), mMenuColorPrimary);
+    auto bracketCustomImageDir = std::make_shared<ImageComponent>();
+    bracketCustomImageDir->setResize(
+        glm::vec2 {0.0f, Font::get(FONT_SIZE_MEDIUM)->getLetterHeight()});
+    bracketCustomImageDir->setImage(":/graphics/arrow.svg");
+    bracketCustomImageDir->setColorShift(mMenuColorPrimary);
+    rowCustomImageDir.addElement(screensaverSlideshowImageDir, true);
+    rowCustomImageDir.addElement(bracketCustomImageDir, false);
+    const std::string titleCustomImageDir {"CUSTOM IMAGE DIRECTORY"};
+    const std::string defaultImageDirStaticText {"Default directory:"};
+    const std::string defaultImageDirText {Utils::FileSystem::getAppDataDirectory()
+                                               .append("screensavers")
+                                               .append("custom_slideshow")
+                                               .string()};
+    const std::string initValueMediaDir {
+        Settings::getInstance()->getString("ScreensaverSlideshowImageDir")};
+    const bool multiLineMediaDir {false};
+    auto updateValMediaDir = [this, s](const std::string& newVal) {
+        Settings::getInstance()->setString("ScreensaverSlideshowImageDir", newVal);
+        s->setNeedsSaving();
+    };
+    rowCustomImageDir.makeAcceptInputHandler(
+        [this, s, titleCustomImageDir, defaultImageDirStaticText, defaultImageDirText,
+         initValueMediaDir, updateValMediaDir, multiLineMediaDir] {
+            if (Settings::getInstance()->getBool("VirtualKeyboard")) {
+                mWindow->pushGui(new GuiTextEditKeyboardPopup(
+                    getHelpStyle(), s->getMenu().getPosition().y, titleCustomImageDir,
+                    Settings::getInstance()->getString("ScreensaverSlideshowImageDir"),
+                    updateValMediaDir, multiLineMediaDir, "SAVE", "SAVE CHANGES?",
+                    defaultImageDirStaticText, defaultImageDirText, "load default directory"));
+            }
+            else {
+                mWindow->pushGui(new GuiTextEditPopup(
+                    getHelpStyle(), titleCustomImageDir,
+                    Settings::getInstance()->getString("ScreensaverSlideshowImageDir"),
+                    updateValMediaDir, multiLineMediaDir, "SAVE", "SAVE CHANGES?",
+                    defaultImageDirStaticText, defaultImageDirText, "load default directory"));
+            }
+        });
+    s->addRow(rowCustomImageDir);
 
     s->setSize(mSize);
     mWindow->pushGui(s);
diff --git a/es-core/src/Settings.cpp b/es-core/src/Settings.cpp
index 853468a24..5f1f0e2c2 100644
--- a/es-core/src/Settings.cpp
+++ b/es-core/src/Settings.cpp
@@ -202,8 +202,7 @@ void Settings::setDefaults()
     mBoolMap["ScreensaverSlideshowScanlines"] = {false, false};
     mBoolMap["ScreensaverSlideshowCustomImages"] = {false, false};
     mBoolMap["ScreensaverSlideshowRecurse"] = {false, false};
-    mStringMap["ScreensaverSlideshowImageDir"] = {"~/.emulationstation/slideshow/custom_images",
-                                                  "~/.emulationstation/slideshow/custom_images"};
+    mStringMap["ScreensaverSlideshowImageDir"] = {"", ""};
 
     // UI settings -> screensaver settings -> video screensaver settings.
     mIntMap["ScreensaverSwapVideoTimeout"] = {0, 0};