aboutsummaryrefslogtreecommitdiffstats
path: root/docs/GRAPH_VIEW.md (follow)
Commit message (Collapse)AuthorAgeFilesLines
* Graph: name the interpreter when pytriskel is missingidatui6 days1-1/+11
| | | | | | | | | ./ida-tui runs $IDATUI_PYTHON (default ~/ida-venv), which is not the repo .venv the tests use -- so the graph view can report pytriskel as missing while tests/test_graph.py is exercising both engines. "not installed" on its own sends you to check the wrong python; the status now names sys.executable, and docs/GRAPH_VIEW.md says to install into both.
* Graph: a second layout engine, triskel's SESE decompositionuser6 days1-7/+76
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `e` in graph mode cycles auto -> native -> triskel, and `auto` prefers triskel where it is installed and the function is at most 250 blocks. Why: our layered engine draws wide-and-short pictures with a lot of crossings on anything branchy. Triskel splits the CFG into Single-Entry Single-Exit regions first and lays each out on its own, which on the 128-function corpus means fewer crossings on 12 functions, equal on 9, worse on 3 -- and the wins are the hairballs (sub_5CA0 41 -> 6, sub_2C90 32 -> 7, sub_2C00 12 -> 0). It also routes loop edges around the side of the graph the way IDA does, which was a known gap here. It is not free: ~2x slower at 87 blocks, 10x at 424, hence the cap. The library needed a fork (~/dev/triskel, branch idatui) before it could be used from Python at all -- its get_waypoints() threw on every published version, an empty graph segfaulted the interpreter, and its spacing constants were pixels baked in at compile time. Making those settable is what makes this integration cheap: we hand it CELLS, so its output is integral and two edge lanes can never round onto the same row. The feared quantisation problem measured out backwards -- cells claimed by more than one edge: native 131, triskel 35. Not trusted with degenerate input, all handled before the call: self-loops and disconnected components make it throw, and one corpus edge comes back routed through a block, which we detour and re-verify. A triskel failure is never fatal; it falls back to native. Two things the second engine flushed out of the existing code: - the canvas was sized from boxes alone, which is exact only because native's dummy nodes reserve the space. Triskel routes outside that bounding box and the edges were being clipped. - arrowhead placement read e.back, conflating "this is a loop edge" (style) with "this polyline runs against control flow" (geometry). Now Edge.flipped, which is also a latent fix for residual-cycle edges whose succ/pred were being reported backwards. tests/test_graph.py runs its whole suite once per available engine (943 checks); new graph_engine scenario covers the live toggle.
* docs: drop two stale files, correct the two the README links, cut sharp edgesblasty8 days1-2/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | README: "Known sharp edges" removed. docs/GRAPH_VIEW.md pointed the graph's one backend call at server/patch_server.py, a file the port deleted. It is idatui/codemode_client.py now. This matters because GRAPH_VIEW.md is one of only two docs the README links -- a wrong path in a linked doc is worse than no doc. docs/RPC.md was missing five verbs rpc.py serves: ping/methods/quit (now a Session table) and trace/binaries/switch (with the semantic verbs). The trace verb drives a whole feature the README advertises, so its absence was the real gap. Every verb in rpc.py's METHODS table is now documented, checked mechanically -- the remainder of what looked missing turned out to be values of the "move" verb's dir parameter, not verbs. Deleted: - docs/CODEMODE_PORT.md. Written mid-port, and its Result section claims the port covered "the complete current TUI feature set". It did not: the graph view was dead, the operand-format keys were dead, pseudocode comments never appeared, and bulk rename was broken. Keeping a doc that states the opposite of what we found is worse than having none, and docs/CODEMODE_UPSTREAM.md carries the accurate account of the API limits. - docs/TUI_DRIVING_BLUEPRINT.md. A design sketch for generalizing the drive-a-TUI-over-a-socket pattern to other programs, with gdb as the main example -- which now exists for real in ~/dev/gdb-driver. Superseded by the thing it proposed. Nothing linked either file. Both remain in git history.
* graph: navigate to blocks, not to coordinatesblasty9 days1-3/+8
| | | | | | | | | | | | | | | | | | | Clicking the minimap panned to the exact coordinate under the pointer and moved the cursor only if a block happened to sit there. Since one minimap cell covers many canvas cells, "there" was almost always padding: you got a jump into empty space and the cursor stayed behind, so you had to click a block afterwards to actually go anywhere. Blocks cover a few percent of a laid-out graph -- 4.6% of an 87-block function, 0.8% of a 424-block one -- and the rest is the space that keeps edges apart. So coordinates are the wrong thing to navigate by here. The minimap now snaps to the nearest block and takes the cursor with it, and a drag scrubs from block to block. Distance is measured with the column halved, because cells are twice as tall as they are wide and otherwise "nearest" is not what looks nearest. A drag-pan or ctrl+d/pageup that ends with no block on screen at all now eases to the nearest one too, since an empty screen leaves nothing to navigate back by. It only fires when nothing is visible, so a deliberate pan is never fought.
* graph: the minimap is clickable, and stops swallowing clicksblasty9 days1-0/+8
| | | | | | | | | | | | | | | | Click it to jump the view to that part of the graph, drag to scrub. If the point you clicked is over a block the cursor lands in it, so the keyboard carries on from where you pointed instead of snapping back. This also fixes a real bug rather than only adding a feature. The minimap FLOATS over the canvas -- it is pinned to the viewport, not drawn into the graph -- so a click on it was being translated into canvas coordinates and dropping the cursor into whatever block happened to lie underneath. It has to be hit-tested before the canvas, which is what on_click now does. _minimap_rect() is the one source of truth for where it is: the renderer and the hit-test both take the position from it, so the two-column inset that keeps it clear of the ScrollView's scrollbar can't drift between them.
* graph: docs, and the offline layout toolsblasty9 days1-0/+145
cfg_dump freezes real CFGs to JSON; graph_spike renders one or --stats a whole corpus through the shipping engine; graph_smoke is the end-to-end tool->domain->layout check; graph_shot renders the real view headless at a chosen size, which is the only sane way to judge it (a tiled pane is far too narrow and the minimap sits on top of the graph).