diff --git a/main/gui/source/window/window.cpp b/main/gui/source/window/window.cpp index fd169c402..838d2e613 100644 --- a/main/gui/source/window/window.cpp +++ b/main/gui/source/window/window.cpp @@ -487,7 +487,7 @@ namespace hex { else createPopup(ImGui::BeginPopup(name, flags)); - if (!ImGui::IsPopupOpen(name) && displayFrameCount < 100) { + if (!ImGui::IsPopupOpen(name) && displayFrameCount < 5) { ImGui::OpenPopup(name); } diff --git a/plugins/builtin/include/content/views/view_pattern_editor.hpp b/plugins/builtin/include/content/views/view_pattern_editor.hpp index ea4fb06c0..ce2b4ae4e 100644 --- a/plugins/builtin/include/content/views/view_pattern_editor.hpp +++ b/plugins/builtin/include/content/views/view_pattern_editor.hpp @@ -81,6 +81,8 @@ namespace hex::plugin::builtin { explicit PopupAcceptPattern(ViewPatternEditor *view) : Popup("hex.builtin.view.pattern_editor.accept_pattern"), m_view(view) {} void drawContent() override { + std::scoped_lock lock(m_view->m_possiblePatternFilesMutex); + auto* provider = ImHexApi::Provider::get(); ImGuiExt::TextFormattedWrapped("{}", static_cast("hex.builtin.view.pattern_editor.accept_pattern.desc"_lang)); @@ -117,13 +119,13 @@ namespace hex::plugin::builtin { ImGui::TextUnformatted("hex.builtin.view.pattern_editor.accept_pattern.question"_lang); ImGuiExt::ConfirmButtons("hex.ui.common.yes"_lang, "hex.ui.common.no"_lang, - [this, provider] { - m_view->loadPatternFile(m_view->m_possiblePatternFiles.get(provider)[m_selectedPatternFile], provider); - this->close(); - }, - [this] { - this->close(); - } + [this, provider] { + m_view->loadPatternFile(m_view->m_possiblePatternFiles.get(provider)[m_selectedPatternFile], provider); + this->close(); + }, + [this] { + this->close(); + } ); if (ImGui::IsKeyPressed(ImGuiKey_Escape)) @@ -174,6 +176,7 @@ namespace hex::plugin::builtin { std::unique_ptr m_editorRuntime; + std::mutex m_possiblePatternFilesMutex; PerProvider> m_possiblePatternFiles; bool m_runAutomatically = false; bool m_triggerEvaluation = false; diff --git a/plugins/builtin/source/content/views/view_pattern_editor.cpp b/plugins/builtin/source/content/views/view_pattern_editor.cpp index bde4ce9cf..46923ebdf 100644 --- a/plugins/builtin/source/content/views/view_pattern_editor.cpp +++ b/plugins/builtin/source/content/views/view_pattern_editor.cpp @@ -1407,6 +1407,7 @@ namespace hex::plugin::builtin { m_possiblePatternFiles.get(provider).clear(); + bool popupOpen = false; std::error_code errorCode; for (const auto &dir : fs::getDefaultPaths(fs::ImHexPath::Patterns)) { for (auto &entry : std::fs::recursive_directory_iterator(dir, errorCode)) { @@ -1423,16 +1424,22 @@ namespace hex::plugin::builtin { log::warn("Failed to preprocess file {} during MIME analysis", entry.path().string()); } - if (foundCorrectType) - m_possiblePatternFiles.get(provider).push_back(entry.path()); + if (foundCorrectType) { + { + std::scoped_lock lock(m_possiblePatternFilesMutex); + + m_possiblePatternFiles.get(provider).push_back(entry.path()); + } + + if (!popupOpen) { + PopupAcceptPattern::open(this); + popupOpen = true; + } + } runtime.reset(); } } - - if (!m_possiblePatternFiles.get(provider).empty()) { - PopupAcceptPattern::open(this); - } }); } }