summaryrefslogtreecommitdiff
path: root/plugin.cpp
diff options
context:
space:
mode:
authorMason Reed <mason@vector35.com>2026-02-22 22:42:35 -0800
committerMason Reed <35282038+emesare@users.noreply.github.com>2026-02-23 00:09:44 -0800
commitd0eec62d6df0edbbb76dfeac58879797e90a8594 (patch)
tree03cf8d04eb7d33ac0785f2eede92ecbd552a48b0 /plugin.cpp
parentf3e0bf4ab35d50b11b2dbde41a699ab7497208d1 (diff)
Add global plugin command type
Register plugins which are available outside the context of a binary view
Diffstat (limited to 'plugin.cpp')
-rw-r--r--plugin.cpp38
1 files changed, 38 insertions, 0 deletions
diff --git a/plugin.cpp b/plugin.cpp
index 28c2b466..81a280c4 100644
--- a/plugin.cpp
+++ b/plugin.cpp
@@ -68,6 +68,13 @@ PluginCommand& PluginCommand::operator=(const PluginCommand& cmd)
}
+void PluginCommand::GlobalPluginCommandActionCallback(void* ctxt)
+{
+ RegisteredGlobalCommand* cmd = (RegisteredGlobalCommand*)ctxt;
+ cmd->action();
+}
+
+
void PluginCommand::DefaultPluginCommandActionCallback(void* ctxt, BNBinaryView* view)
{
RegisteredDefaultCommand* cmd = (RegisteredDefaultCommand*)ctxt;
@@ -172,6 +179,13 @@ void PluginCommand::ProjectPluginCommandActionCallback(void *ctxt, BNProject* pr
}
+bool PluginCommand::GlobalPluginCommandIsValidCallback(void* ctxt)
+{
+ RegisteredGlobalCommand* cmd = (RegisteredGlobalCommand*)ctxt;
+ return cmd->isValid();
+}
+
+
bool PluginCommand::DefaultPluginCommandIsValidCallback(void* ctxt, BNBinaryView* view)
{
RegisteredDefaultCommand* cmd = (RegisteredDefaultCommand*)ctxt;
@@ -276,6 +290,23 @@ bool PluginCommand::ProjectPluginCommandIsValidCallback(void* ctxt, BNProject* p
}
+void PluginCommand::RegisterGlobal(const string& name, const string& description, const function<void()>& action)
+{
+ RegisterGlobal(name, description, action, []() { return true; });
+}
+
+
+void PluginCommand::RegisterGlobal(const string& name, const string& description,
+ const function<void()>& action, const function<bool()>& isValid)
+{
+ RegisteredGlobalCommand* cmd = new RegisteredGlobalCommand;
+ cmd->action = action;
+ cmd->isValid = isValid;
+ BNRegisterPluginCommandGlobal(name.c_str(), description.c_str(), GlobalPluginCommandActionCallback,
+ GlobalPluginCommandIsValidCallback, cmd);
+}
+
+
void PluginCommand::Register(
const string& name, const string& description, const function<void(BinaryView* view)>& action)
{
@@ -515,6 +546,10 @@ bool PluginCommand::IsValid(const PluginCommandContext& ctxt) const
{
switch (m_command.type)
{
+ case GlobalPluginCommand:
+ if (!m_command.globalIsValid)
+ return true;
+ return m_command.globalIsValid(m_command.context);
case DefaultPluginCommand:
if (!ctxt.binaryView)
return false;
@@ -606,6 +641,9 @@ void PluginCommand::Execute(const PluginCommandContext& ctxt) const
switch (m_command.type)
{
+ case GlobalPluginCommand:
+ m_command.globalCommand(m_command.context);
+ break;
case DefaultPluginCommand:
m_command.defaultCommand(m_command.context, ctxt.binaryView->GetObject());
break;