diff --git a/src/scriptable/scriptable.cpp b/src/scriptable/scriptable.cpp index 149c618cc4c219e08644f5f2259534bac87b116d..e07325e0aa745bb7a3b0e1e561966c84f7f67fa9 100644 --- a/src/scriptable/scriptable.cpp +++ b/src/scriptable/scriptable.cpp @@ -2624,27 +2624,40 @@ void Scriptable::runMenuCommandFilters() const QString menuItemProperty = QLatin1String("menuItem"); const QString enabledProperty = QLatin1String("enabled"); + bool running = false; + bool restart = false; connect(&timer, &QTimer::timeout, &loop, [&]() { if ( bytes.isEmpty() ) return; - const int currentRun = bytes.toInt(); + if (running) { + restart = true; + return; + } + running = true; - getActionData(actionId); - const QStringList matchCommands = - m_data.value(COPYQ_MIME_PREFIX "match-commands").toStringList(); + do { + restart = false; + const int currentRun = bytes.toInt(); - PerformanceLogger logger( QLatin1String("Menu item filters") ); + getActionData(actionId); + const QStringList matchCommands = + m_data.value(COPYQ_MIME_PREFIX "match-commands").toStringList(); - for (int i = 0; i < matchCommands.length(); ++i) { - const auto obj = m_engine->newObject(); - m_engine->globalObject().setProperty(menuItemProperty, obj); - const bool enabled = canExecuteCommandFilter(matchCommands[i]); - QVariantMap menuItem = toDataMap(obj); - menuItem[enabledProperty] = enabled && menuItem.value(enabledProperty, true).toBool(); - if ( !m_proxy->enableMenuItem(actionId, currentRun, i, menuItem) ) - break; - } + PerformanceLogger logger( QLatin1String("Menu item filters") ); + + for (int i = 0; i < matchCommands.length(); ++i) { + const auto obj = m_engine->newObject(); + m_engine->globalObject().setProperty(menuItemProperty, obj); + const bool enabled = canExecuteCommandFilter(matchCommands[i]); + QVariantMap menuItem = toDataMap(obj); + menuItem[enabledProperty] = enabled && menuItem.value(enabledProperty, true).toBool(); + if ( restart || !m_proxy->enableMenuItem(actionId, currentRun, i, menuItem) ) + break; + } + } while (restart); + + running = false; }); emit receiveData();