diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp index 5ecf1442b7723..12d7931f40082 100644 --- a/src/defaultsettings.cpp +++ b/src/defaultsettings.cpp @@ -501,15 +501,15 @@ void set_default_settings() #endif } +void set_keyboard_defaults(Settings *settings, bool force_keycode) +{ #define USEKEY(name, value) settings->setIfMissing(name, value) #if USE_SDL2 -#define USEKEY2(name, value, _) USEKEY(name, value) +#define USEKEY2(name, value, legacy) USEKEY(name, (force_keycode) ? (legacy) : (value)) #else #define USEKEY2(name, _, value) USEKEY(name, value) #endif -void set_keyboard_defaults(Settings *settings) -{ auto has_touch = detect_touch(); USEKEY2("save_keys_as_scancodes", "true", "false"); @@ -611,6 +611,6 @@ void set_keyboard_defaults(Settings *settings) USEKEY("keymap_quicktune_dec", ""); USEKEY("keymap_quicktune_inc", ""); #endif -} #undef USEKEY #undef USEKEY2 +} diff --git a/src/defaultsettings.h b/src/defaultsettings.h index 7c0ab44ae34ff..78bca1f1641ab 100644 --- a/src/defaultsettings.h +++ b/src/defaultsettings.h @@ -15,5 +15,6 @@ void set_default_settings(); /** * Use default preset for settings * @param settings pointer to settings + * @param force_keycode whether to unconditionally use keycode-based settings */ -void set_keyboard_defaults(Settings *settings); +void set_keyboard_defaults(Settings *settings, bool force_keycode = false); diff --git a/src/migratesettings.h b/src/migratesettings.h index 5f639691486e9..083a3196f2386 100644 --- a/src/migratesettings.h +++ b/src/migratesettings.h @@ -1,7 +1,7 @@ // Minetest // SPDX-License-Identifier: LGPL-2.1-or-later -#include "settings.h" +#include "defaultsettings.h" #include "server.h" void migrate_settings() @@ -28,4 +28,17 @@ void migrate_settings() } g_settings->remove("disable_anticheat"); } + + // Use keycodes for keybindings for missing keys + // if the keymap was changed in an earlier version +#if USE_SDL2 + if (!g_settings->existsLocal("use_scancodes_for_keybindings")) + for (const auto &name: g_settings->getNames()) + if (auto value = g_settings->get(name); + str_starts_with(name, "keymap_") && value.size() > 1 && value.front() != '<') { + g_settings->setBool("use_scancodes_for_keybindings", false); + set_keyboard_defaults(g_settings, true); + break; + } +#endif }