diff options
| author | Glenn Smith <glenn@vector35.com> | 2025-03-20 21:43:04 -0400 |
|---|---|---|
| committer | Xusheng <xusheng@vector35.com> | 2025-03-21 23:44:09 +0800 |
| commit | 8c8888c3f9a377d4e3306ec067b8c3d5fbed7ddd (patch) | |
| tree | 568677ca18c6cb96a18c94eb059cd514af3a538f /python/examples | |
| parent | f9b8762d49ef16bf2dd7b814d6f1ef06594b2951 (diff) | |
Add API for refreshing UI without needing an analysis update
Diffstat (limited to 'python/examples')
| -rw-r--r-- | python/examples/follow_reg_render_layer.py | 39 |
1 files changed, 23 insertions, 16 deletions
diff --git a/python/examples/follow_reg_render_layer.py b/python/examples/follow_reg_render_layer.py index 36e66576..dd33f6db 100644 --- a/python/examples/follow_reg_render_layer.py +++ b/python/examples/follow_reg_render_layer.py @@ -5,6 +5,7 @@ from binaryninja import DisassemblyTextLine, LowLevelILOperation, DisassemblyTex MediumLevelILOperation, \ RenderLayer, BasicBlock, InstructionTextTokenType, RenderLayerDefaultEnableState, \ PluginCommand, BinaryView, interaction, InstructionTextToken, RegisterValueType +from binaryninjaui import UIContext, UIActionHandler, UIAction, UIActionContext """ @@ -184,26 +185,32 @@ class FollowRegRenderLayer(RenderLayer): return self.apply_to_lines(block, lines) -def set_follow_reg(bv: BinaryView): - if bv.platform is not None: - regs = list(bv.platform.arch.regs.keys()) - idx = interaction.get_large_choice_input("Choose", "Choose Followed Register", regs) +def set_follow_reg(ctx: UIActionContext): + bv = ctx.binaryView + if bv is not None: + if bv.platform is not None: + regs = list(bv.platform.arch.regs.keys()) + idx = interaction.get_large_choice_input("Choose", "Choose Followed Register", regs) + + # Save choice both in QSettings and on the RenderLayer object instance + layer = RenderLayer[FollowRegRenderLayer.name] + if idx is None: + layer.followed_reg = None + QSettings().remove("layer/followed_reg") + else: + layer.followed_reg = regs[idx] + QSettings().setValue("layer/followed_reg", regs[idx]) + + # Trigger view refresh + ctx.context.refreshCurrentViewContents() - # Save choice both in QSettings and on the RenderLayer object instance - layer = RenderLayer[FollowRegRenderLayer.name] - if idx is None: - layer.followed_reg = None - QSettings().remove("layer/followed_reg") - else: - layer.followed_reg = regs[idx] - QSettings().setValue("layer/followed_reg", regs[idx]) - # Trigger view refresh (gross) - for func in bv.get_functions_containing(bv.offset): - func.reanalyze() +def can_set_follow_reg(ctx: UIActionContext) -> bool: + return ctx.binaryView is not None FollowRegRenderLayer.register() # Using a command for this is kinda janky but currently the only option -PluginCommand.register("Set Followed Register", "Choose which register to follow for the Follow Register Render Layer", set_follow_reg) +UIAction.registerAction("Set Followed Register") +UIActionHandler.globalActions().bindAction("Set Followed Register", UIAction(set_follow_reg, can_set_follow_reg)) |
