From 297a98bff289ecde90d808f6538c2c5edf804af6 Mon Sep 17 00:00:00 2001 From: 0cyn Date: Tue, 14 Apr 2026 05:03:15 -0400 Subject: Argument Assist Popup --- scriptingprovider.cpp | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) (limited to 'scriptingprovider.cpp') diff --git a/scriptingprovider.cpp b/scriptingprovider.cpp index 4fd40879..95726d6d 100644 --- a/scriptingprovider.cpp +++ b/scriptingprovider.cpp @@ -56,12 +56,13 @@ void ScriptingOutputListener::NotifyInputReadyStateChanged(BNScriptingProviderIn ScriptingInstance::ScriptingInstance(ScriptingProvider* provider) { - BNScriptingInstanceCallbacks cb; + BNScriptingInstanceCallbacks cb = {}; cb.context = this; cb.destroyInstance = DestroyInstanceCallback; cb.externalRefTaken = nullptr; cb.externalRefReleased = nullptr; cb.executeScriptInput = ExecuteScriptInputCallback; + cb.executeScriptInputFromFilename = ExecuteScriptFromFilenameCallback; cb.cancelScriptInput = CancelScriptInputCallback; cb.releaseBinaryView = ReleaseBinaryViewCallback; cb.setCurrentBinaryView = SetCurrentBinaryViewCallback; @@ -71,6 +72,8 @@ ScriptingInstance::ScriptingInstance(ScriptingProvider* provider) cb.setCurrentSelection = SetCurrentSelectionCallback; cb.completeInput = CompleteInputCallback; cb.stop = StopCallback; + cb.canCompleteArguments = CanCompleteArgumentsCallback; + cb.completeArguments = CompleteArgumentsCallback; AddRefForRegistration(); m_object = BNInitScriptingInstance(provider->GetObject(), &cb); } @@ -96,6 +99,13 @@ BNScriptingProviderExecuteResult ScriptingInstance::ExecuteScriptInputCallback(v } +BNScriptingProviderExecuteResult ScriptingInstance::ExecuteScriptFromFilenameCallback(void* ctxt, const char* filename) +{ + CallbackRef instance(ctxt); + return instance->ExecuteScriptInputFromFilename(filename); +} + + void ScriptingInstance::CancelScriptInputCallback(void* ctxt) { CallbackRef instance(ctxt); @@ -162,6 +172,24 @@ char* ScriptingInstance::CompleteInputCallback(void* ctxt, const char* text, uin } +bool ScriptingInstance::CanCompleteArgumentsCallback(void* ctxt, const char* text) +{ + CallbackRef instance(ctxt); + bool result = instance->CanCompleteArguments(text); + return result; +} + + +char* ScriptingInstance::CompleteArgumentsCallback(void* ctx, const char* text, uint64_t* argumentStart) +{ + CallbackRef instance(ctx); + auto result = instance->CompleteArguments(text); + if (argumentStart) + *argumentStart = result.second; + return BNAllocString(result.first.c_str()); +} + + void ScriptingInstance::StopCallback(void* ctxt) { CallbackRef instance(ctxt); @@ -202,6 +230,18 @@ std::string ScriptingInstance::CompleteInput(const std::string&, uint64_t) } +bool ScriptingInstance::CanCompleteArguments(const std::string&) +{ + return false; +} + + +std::pair ScriptingInstance::CompleteArguments(const std::string&) +{ + return {"", 0}; +} + + void ScriptingInstance::Output(const string& text) { BNNotifyOutputForScriptingInstance(m_object, text.c_str()); @@ -326,6 +366,24 @@ std::string CoreScriptingInstance::CompleteInput(const std::string& text, uint64 } +bool CoreScriptingInstance::CanCompleteArguments(const std::string& text) +{ + return BNScriptingInstanceCanCompleteArguments(m_object, text.c_str()); +} + + +std::pair CoreScriptingInstance::CompleteArguments(const std::string& text) +{ + uint64_t argumentStart = 0; + char* result = BNScriptingInstanceCompleteArguments(m_object, text.c_str(), &argumentStart); + if (!result) + return {"", argumentStart}; + std::string ret = result; + BNFreeString(result); + return {ret, argumentStart}; +} + + void CoreScriptingInstance::Stop() { BNStopScriptingInstance(m_object); -- cgit v1.3.1