From 56b5d026df06fb60ca0144d5abc3f1ac024e582d Mon Sep 17 00:00:00 2001 From: WerWolv Date: Mon, 25 Aug 2025 21:45:20 +0200 Subject: [PATCH] fix: Patterns only starting to execute when pattern editor was visible --- .../content/views/view_pattern_editor.cpp | 126 +++++++++--------- 1 file changed, 64 insertions(+), 62 deletions(-) diff --git a/plugins/builtin/source/content/views/view_pattern_editor.cpp b/plugins/builtin/source/content/views/view_pattern_editor.cpp index e6433d3dc..3bd7849eb 100644 --- a/plugins/builtin/source/content/views/view_pattern_editor.cpp +++ b/plugins/builtin/source/content/views/view_pattern_editor.cpp @@ -659,68 +659,6 @@ namespace hex::plugin::builtin { } } } - - if (m_textEditor.get(provider).isBreakpointsChanged()) { - m_breakpoints = m_textEditor.get(provider).getBreakpoints(); - m_textEditor.get(provider).clearBreakpointsChanged(); - const auto &runtime = ContentRegistry::PatternLanguage::getRuntime(); - auto &evaluator = runtime.getInternals().evaluator; - if (evaluator) { - evaluator->setBreakpoints(m_breakpoints); - } - } - - if (m_textEditor.get(provider).isTextChanged()) { - m_textEditor.get(provider).setTextChanged(false); - if (!m_hasUnevaluatedChanges.get(provider) ) { - m_hasUnevaluatedChanges.get(provider) = true; - m_changesWereParsed = false; - } - m_lastEditorChangeTime = std::chrono::steady_clock::now(); - ImHexApi::Provider::markDirty(); - markPatternFileDirty(provider); - } - - if (m_hasUnevaluatedChanges.get(provider) && m_runningEvaluators == 0 && m_runningParsers == 0 && - (std::chrono::steady_clock::now() - m_lastEditorChangeTime) > std::chrono::seconds(1ll)) { - - auto code = m_textEditor.get(provider).getText(); - EventPatternEditorChanged::post(code); - - TaskManager::createBackgroundTask("hex.builtin.task.parsing_pattern", [this, code = std::move(code), provider](auto &){ - this->parsePattern(code, provider); - - if (m_runAutomatically) - m_triggerAutoEvaluate = true; - }); - m_hasUnevaluatedChanges.get(provider) = false; - } - - if (m_triggerAutoEvaluate.exchange(false)) { - this->evaluatePattern(m_textEditor.get(provider).getText(), provider); - } - if (m_textHighlighter.m_needsToUpdateColors && m_changesWereParsed && (m_runningParsers + m_runningEvaluators == 0)) { - TaskHolder taskHolder; - if (m_textHighlighter.getRunningColorizers() == 0) { - m_textHighlighter.m_needsToUpdateColors = false; - m_changesWereParsed = false; - taskHolder = TaskManager::createBackgroundTask("HighlightSourceCode", [this](auto &) { m_textHighlighter.highlightSourceCode(); }); - } else { - m_textHighlighter.interrupt(); - } - } - } - - if (m_dangerousFunctionCalled && !ImGui::IsPopupOpen(ImGuiID(0), ImGuiPopupFlags_AnyPopup)) { - ui::PopupQuestion::open("hex.builtin.view.pattern_editor.dangerous_function.desc"_lang, - [this] { - m_dangerousFunctionsAllowed = DangerousFunctionPerms::Allow; - }, [this] { - m_dangerousFunctionsAllowed = DangerousFunctionPerms::Deny; - } - ); - - m_dangerousFunctionCalled = false; } View::discardNavigationRequests(); @@ -1509,6 +1447,70 @@ namespace hex::plugin::builtin { } }); } + + { + if (m_textEditor.get(provider).isBreakpointsChanged()) { + m_breakpoints = m_textEditor.get(provider).getBreakpoints(); + m_textEditor.get(provider).clearBreakpointsChanged(); + const auto &runtime = ContentRegistry::PatternLanguage::getRuntime(); + auto &evaluator = runtime.getInternals().evaluator; + if (evaluator) { + evaluator->setBreakpoints(m_breakpoints); + } + } + + if (m_textEditor.get(provider).isTextChanged()) { + m_textEditor.get(provider).setTextChanged(false); + if (!m_hasUnevaluatedChanges.get(provider) ) { + m_hasUnevaluatedChanges.get(provider) = true; + m_changesWereParsed = false; + } + m_lastEditorChangeTime = std::chrono::steady_clock::now(); + ImHexApi::Provider::markDirty(); + markPatternFileDirty(provider); + } + + if (m_hasUnevaluatedChanges.get(provider) && m_runningEvaluators == 0 && m_runningParsers == 0 && + (std::chrono::steady_clock::now() - m_lastEditorChangeTime) > std::chrono::seconds(1ll)) { + + auto code = m_textEditor.get(provider).getText(); + EventPatternEditorChanged::post(code); + + TaskManager::createBackgroundTask("hex.builtin.task.parsing_pattern", [this, code = std::move(code), provider](auto &){ + this->parsePattern(code, provider); + + if (m_runAutomatically) + m_triggerAutoEvaluate = true; + }); + m_hasUnevaluatedChanges.get(provider) = false; + } + + if (m_triggerAutoEvaluate.exchange(false)) { + this->evaluatePattern(m_textEditor.get(provider).getText(), provider); + } + + if (m_textHighlighter.m_needsToUpdateColors && m_changesWereParsed && (m_runningParsers + m_runningEvaluators == 0)) { + if (m_textHighlighter.getRunningColorizers() == 0) { + m_textHighlighter.m_needsToUpdateColors = false; + m_changesWereParsed = false; + TaskManager::createBackgroundTask("HighlightSourceCode", [this](auto &) { m_textHighlighter.highlightSourceCode(); }); + } else { + m_textHighlighter.interrupt(); + } + } + + if (m_dangerousFunctionCalled && !ImGui::IsPopupOpen(ImGuiID(0), ImGuiPopupFlags_AnyPopup)) { + ui::PopupQuestion::open("hex.builtin.view.pattern_editor.dangerous_function.desc"_lang, + [this] { + m_dangerousFunctionsAllowed = DangerousFunctionPerms::Allow; + }, [this] { + m_dangerousFunctionsAllowed = DangerousFunctionPerms::Deny; + } + ); + + m_dangerousFunctionCalled = false; + } + } }