diff --git a/lib/external/libwolv b/lib/external/libwolv index 4eeaba844c493..6c36d9db34ece 160000 --- a/lib/external/libwolv +++ b/lib/external/libwolv @@ -1 +1 @@ -Subproject commit 4eeaba844c4931f69fb9867ed5e3e090640e9fb4 +Subproject commit 6c36d9db34ece138dabdebb08974bd1b5a8c3774 diff --git a/plugins/builtin/include/content/providers/file_provider.hpp b/plugins/builtin/include/content/providers/file_provider.hpp index b8d0610335079..9dd4db8af6f24 100644 --- a/plugins/builtin/include/content/providers/file_provider.hpp +++ b/plugins/builtin/include/content/providers/file_provider.hpp @@ -63,6 +63,7 @@ namespace hex::plugin::builtin { void convertToDirectAccess(); private: + void fileChangedCallback(); void handleFileChange(); bool open(bool memoryMapped); diff --git a/plugins/builtin/include/content/views/view_pattern_editor.hpp b/plugins/builtin/include/content/views/view_pattern_editor.hpp index 044ebc6f47530..793ce055f4d11 100644 --- a/plugins/builtin/include/content/views/view_pattern_editor.hpp +++ b/plugins/builtin/include/content/views/view_pattern_editor.hpp @@ -233,7 +233,8 @@ namespace hex::plugin::builtin { void registerMenuItems(); void registerHandlers(); - void handleFileChange(prv::Provider *provider); + void fileChangedCallback(prv::Provider *provider, const std::fs::path &path); + void handleFileChange(prv::Provider *provider, const std::fs::path &path); void openPatternFile(bool trackFile); void savePatternToCurrentFile(bool trackFile); diff --git a/plugins/builtin/source/content/providers/file_provider.cpp b/plugins/builtin/source/content/providers/file_provider.cpp index ff8104edcedb8..2ac7fe2a4337a 100644 --- a/plugins/builtin/source/content/providers/file_provider.cpp +++ b/plugins/builtin/source/content/providers/file_provider.cpp @@ -272,7 +272,7 @@ namespace hex::plugin::builtin { m_data = m_file.readVectorAtomic(0x00, m_fileSize); if (!m_data.empty()) { m_changeTracker = wolv::io::ChangeTracker(m_file); - m_changeTracker.startTracking([this]{ this->handleFileChange(); }); + m_changeTracker.startTracking([this]{ this->fileChangedCallback(); }); m_file.close(); m_loadedIntoMemory = true; } @@ -359,6 +359,14 @@ namespace hex::plugin::builtin { this->open(true); } + // WARNING: this function is called from the context of a worker thread! + void FileProvider::fileChangedCallback() { + // Arrange for a call from the UI thread + TaskManager::doLater( + [this]{this->handleFileChange();} + ); + } + void FileProvider::handleFileChange() { if (m_ignoreNextChangeEvent) { m_ignoreNextChangeEvent = false; diff --git a/plugins/builtin/source/content/views/view_pattern_editor.cpp b/plugins/builtin/source/content/views/view_pattern_editor.cpp index d21ffc721d937..b21c15781b107 100644 --- a/plugins/builtin/source/content/views/view_pattern_editor.cpp +++ b/plugins/builtin/source/content/views/view_pattern_editor.cpp @@ -1593,7 +1593,7 @@ namespace hex::plugin::builtin { m_sourceCode.get(provider) = code; if (trackFile) { m_changeTracker.get(provider) = wolv::io::ChangeTracker(file); - m_changeTracker.get(provider).startTracking([this, provider]{ this->handleFileChange(provider); }); + m_changeTracker.get(provider).startTracking([this, provider, path]{ this->fileChangedCallback(provider, path); }); } m_textHighlighter.m_needsToUpdateColors = false; TaskManager::createBackgroundTask("hex.builtin.task.parsing_pattern", [this, code, provider](auto&) { this->parsePattern(code, provider); }); @@ -2510,7 +2510,15 @@ namespace hex::plugin::builtin { }); } - void ViewPatternEditor::handleFileChange(prv::Provider *provider) { + // WARNING: this function is called from the context of a worker thread! + void ViewPatternEditor::fileChangedCallback(prv::Provider *provider, const std::fs::path &path) { + // Arrange for a call from the UI thread + TaskManager::doLater( + [this, provider, path]{this->handleFileChange(provider, path);} + ); + } + + void ViewPatternEditor::handleFileChange(prv::Provider *provider, const std::fs::path &path) { if (m_ignoreNextChangeEvent.get(provider)) { m_ignoreNextChangeEvent.get(provider) = false; return; @@ -2521,9 +2529,10 @@ namespace hex::plugin::builtin { } m_changeEventAcknowledgementPending.get(provider) = true; - hex::ui::BannerButton::open(ICON_VS_INFO, "hex.builtin.provider.file.reload_changes", ImColor(66, 104, 135), "hex.builtin.provider.file.reload_changes.reload", [this, provider] { - m_changeEventAcknowledgementPending.get(provider) = false; + hex::ui::BannerButton::open(ICON_VS_INFO, "hex.builtin.provider.file.reload_changes", ImColor(66, 104, 135), "hex.builtin.provider.file.reload_changes.reload", [this, provider, path] { + loadPatternFile(path, provider, true); }); + m_changeEventAcknowledgementPending.get(provider) = false; } void ViewPatternEditor::openPatternFile(bool trackFile) { @@ -2593,7 +2602,7 @@ namespace hex::plugin::builtin { if (trackFile) { m_changeTracker.get(provider) = wolv::io::ChangeTracker(file); - m_changeTracker.get(provider).startTracking([this, provider]{ this->handleFileChange(provider); }); + m_changeTracker.get(provider).startTracking([this, provider, path]{ this->fileChangedCallback(provider, path); }); m_ignoreNextChangeEvent.get(provider) = true; } }