1
0
Fork 0
mirror of https://github.com/luanti-org/luanti.git synced 2025-06-27 16:36:03 +00:00

Reload font manager in main thread to avoid a crash (#15900)

This commit is contained in:
Deve 2025-03-16 17:55:39 +01:00 committed by GitHub
parent 4b85062caf
commit c07499ccfc
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 24 additions and 4 deletions

View file

@ -18,10 +18,9 @@
/** reference to access font engine, has to be initialized by main */
FontEngine *g_fontengine = nullptr;
/** callback to be used on change of font size setting */
static void font_setting_changed(const std::string &name, void *userdata)
void FontEngine::fontSettingChanged(const std::string &name, void *userdata)
{
static_cast<FontEngine *>(userdata)->readSettings();
((FontEngine *)userdata)->m_needs_reload = true;
}
static const char *settings[] = {
@ -49,7 +48,7 @@ FontEngine::FontEngine(gui::IGUIEnvironment* env) :
readSettings();
for (auto name : settings)
g_settings->registerChangedCallback(name, font_setting_changed, this);
g_settings->registerChangedCallback(name, fontSettingChanged, this);
}
FontEngine::~FontEngine()
@ -162,6 +161,15 @@ void FontEngine::readSettings()
refresh();
}
void FontEngine::handleReload()
{
if (!m_needs_reload)
return;
m_needs_reload = false;
readSettings();
}
void FontEngine::updateSkin()
{
gui::IGUIFont *font = getFont();

View file

@ -121,6 +121,9 @@ public:
/** update internal parameters from settings */
void readSettings();
/** reload fonts if settings were changed */
void handleReload();
void setMediaFont(const std::string &name, const std::string &data);
void clearMediaFonts();
@ -142,6 +145,9 @@ private:
/** refresh after fonts have been changed */
void refresh();
/** callback to be used on change of font size setting */
static void fontSettingChanged(const std::string &name, void *userdata);
/** pointer to irrlicht gui environment */
gui::IGUIEnvironment* m_env = nullptr;
@ -164,6 +170,8 @@ private:
/** default font engine mode (fixed) */
static const FontMode m_currentMode = FM_Standard;
bool m_needs_reload = false;
DISABLE_CLASS_COPY(FontEngine);
};

View file

@ -970,6 +970,8 @@ void Game::run()
framemarker.start();
g_fontengine->handleReload();
const auto current_dynamic_info = ClientDynamicInfo::getCurrent();
if (!current_dynamic_info.equal(client_display_info)) {
client_display_info = current_dynamic_info;

View file

@ -337,6 +337,8 @@ void GUIEngine::run()
fps_control.limit(device, &dtime);
framemarker.start();
g_fontengine->handleReload();
if (device->isWindowVisible()) {
// check if we need to update the "upper left corner"-text
if (text_height != g_fontengine->getTextHeight()) {