diff options
Diffstat (limited to 'tools/demo.py')
| -rw-r--r-- | tools/demo.py | 76 |
1 files changed, 38 insertions, 38 deletions
diff --git a/tools/demo.py b/tools/demo.py index 4508c40..fa82a98 100644 --- a/tools/demo.py +++ b/tools/demo.py @@ -41,9 +41,9 @@ from idatui.rpcclient import RpcClient # noqa: E402 REPO = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) DEFAULT_TARGET = os.path.join(REPO, "targets", "bash") -#: Typing speed for the prompts, ms per character. The app's own default is 35; -#: a little slower reads better on video without dragging. -TYPE_MS = 45 +#: Typing speed for the prompts, ms per character. Fast enough to read as +#: typing, not so slow that a viewer is waiting on it. +TYPE_MS = 18 class Demo: @@ -85,28 +85,28 @@ class Demo: if ((st.get("function") or {}).get("name")) != "main": self.say("goto main") self.do("goto", target="main", delay_ms=TYPE_MS) - self.beat(1.5) + self.beat(0.68) else: self.say("already landed on main") - self.beat(0.4) + self.beat(0.25) self.say("scroll the listing") self.do("move", dir="down", n=12) - self.beat(0.8) + self.beat(0.36) self.do("move", dir="pagedown") - self.beat(1.0) + self.beat(0.45) self.do("move", dir="top") - self.beat(0.8) + self.beat(0.36) def scene_pseudocode(self): """Hex-Rays, and back.""" self.say("F5 -> pseudocode") self.do("toggle_view") - self.beat(2.0) + self.beat(0.9) self.do("move", dir="down", n=8) - self.beat(1.2) + self.beat(0.54) self.say("back to the listing") self.do("toggle_view") - self.beat(1.0) + self.beat(0.45) def scene_opfmt(self): """The literal-format ring, IDA's `o`.""" @@ -116,54 +116,54 @@ class Demo: return for fmt in ("dec", "hex", "bin", "default"): self.do("opfmt", mode=fmt) - self.beat(0.9) + self.beat(0.41) def scene_follow(self): """Follow a call and come back.""" self.say("follow a call, then Escape back") self.do("follow") - self.beat(1.8) + self.beat(0.81) self.do("back") - self.beat(1.0) + self.beat(0.45) def scene_graph(self): """The CFG: zoom, minimap, walking edges.""" self.say("space -> control-flow graph") self.do("graph", action="open") - self.beat(2.2) + self.beat(0.99) self.say("zoom levels") for _ in range(2): self.do("keys", keys=["z"]) - self.beat(1.1) + self.beat(0.5) self.say("minimap") self.do("keys", keys=["m"]) - self.beat(1.2) + self.beat(0.54) self.say("walk the edges") for _ in range(3): self.do("keys", keys=["J"]) - self.beat(0.7) + self.beat(0.32) self.do("keys", keys=["m"]) self.do("graph", action="close") - self.beat(1.0) + self.beat(0.45) def scene_split(self): """Listing and pseudocode, cursor-synced.""" self.say("s -> split view, cursor-synced") self.do("keys", keys=["s"]) - self.beat(2.2) + self.beat(0.99) for _ in range(6): self.do("move", dir="down", n=2) - self.beat(0.5) + self.beat(0.25) self.do("keys", keys=["s"]) - self.beat(1.0) + self.beat(0.45) def scene_xrefs(self): """Who calls this.""" self.say("x -> xrefs") self.do("xrefs") - self.beat(2.0) + self.beat(0.9) self.do("close") - self.beat(0.8) + self.beat(0.36) def scene_edit(self): """Rename and comment -- typed into the real prompts, then reverted.""" @@ -175,48 +175,48 @@ class Demo: name, ea = target.get("name"), target.get("ea") self.say(f"rename {name} -> demo_dispatch") self.do("goto", target=name, delay_ms=TYPE_MS) - self.beat(0.8) + self.beat(0.36) self.do("rename", name="demo_dispatch", delay_ms=TYPE_MS) self.undo.append(("rename", {"addr": ea, "name": name})) - self.beat(1.8) + self.beat(0.81) self.say("comment the line") self.do("comment", text="reached from the command dispatcher") self.undo.append(("comment", {})) - self.beat(2.0) + self.beat(0.9) def scene_browsers(self): """Strings, symbols, structs, hex.""" self.say('" -> strings') self.do("keys", keys=["quotation_mark"]) - self.beat(2.0) + self.beat(0.9) self.do("close") - self.beat(0.6) + self.beat(0.27) self.say("ctrl+n -> symbol palette") self.do("symbols", query="exec") - self.beat(2.0) + self.beat(0.9) self.do("close") - self.beat(0.6) + self.beat(0.27) self.say("ctrl+t -> structs") self.do("structs") - self.beat(2.0) + self.beat(0.9) self.do("close") - self.beat(0.6) + self.beat(0.27) self.say("\\ -> hex view") self.do("hex") - self.beat(2.0) + self.beat(0.9) self.do("hex") - self.beat(0.8) + self.beat(0.36) def scene_search(self): """Incremental search in the code view.""" self.say("/ -> search") self.do("search", term="call") - self.beat(1.8) + self.beat(0.81) self.do("close") - self.beat(0.8) + self.beat(0.36) # -- cleanup ----------------------------------------------------------- # def revert(self): @@ -308,7 +308,7 @@ def main(argv=None) -> int: ap.add_argument("--target", default=DEFAULT_TARGET, help="binary for --here/--spawn") ap.add_argument("--speed", type=float, default=1.0, - help="pause multiplier; 0.5 = twice as fast (default 1.0)") + help="pause multiplier: <1 snappier, >1 slower (default 1.0)") ap.add_argument("--only", help="comma-separated scene names") ap.add_argument("--list", action="store_true", help="list scenes and exit") ap.add_argument("--no-revert", action="store_true", |
