summaryrefslogtreecommitdiff
path: root/python/examples
diff options
context:
space:
mode:
authorGlenn Smith <glenn@vector35.com>2025-03-20 21:43:04 -0400
committerXusheng <xusheng@vector35.com>2025-03-21 23:44:09 +0800
commit8c8888c3f9a377d4e3306ec067b8c3d5fbed7ddd (patch)
tree568677ca18c6cb96a18c94eb059cd514af3a538f /python/examples
parentf9b8762d49ef16bf2dd7b814d6f1ef06594b2951 (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.py39
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))