From d0eec62d6df0edbbb76dfeac58879797e90a8594 Mon Sep 17 00:00:00 2001 From: Mason Reed Date: Sun, 22 Feb 2026 22:42:35 -0800 Subject: Add global plugin command type Register plugins which are available outside the context of a binary view --- plugin.cpp | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) (limited to 'plugin.cpp') 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& action) +{ + RegisterGlobal(name, description, action, []() { return true; }); +} + + +void PluginCommand::RegisterGlobal(const string& name, const string& description, + const function& action, const function& 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& 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; -- cgit v1.3.1