diff options
| author | blasty <blasty@local> | 2026-07-25 20:51:25 +0200 |
|---|---|---|
| committer | blasty <blasty@local> | 2026-07-25 20:51:25 +0200 |
| commit | e7a919f113e7001b83076a1ed7f58bb75caa75a8 (patch) | |
| tree | bcdd3c2ac7b348d0f7b20df3c8bec0e592f34aa5 | |
| parent | split: keep _active in step with focus, so Enter follows the pane you're in (diff) | |
| download | ida-tui-e7a919f113e7001b83076a1ed7f58bb75caa75a8.tar.gz ida-tui-e7a919f113e7001b83076a1ed7f58bb75caa75a8.tar.xz ida-tui-e7a919f113e7001b83076a1ed7f58bb75caa75a8.zip | |
split: don't overwrite "decompiling…" with the idle status
Travelling the history stack in split mode showed no feedback at all, so Esc
still read as a no-op whenever the target needed decompiling — the exact thing
cc44f5c was supposed to fix. That commit set the message in action_back, but the
split branch of _show_active ends with _status_for_cur("split"), which
unconditionally wrote the idle status straight over it. The spinner overlay was
already being raised correctly; only the words were lost.
The split branch now keeps the in-flight message while it has just kicked off a
decompile, and on_descendant_focus (added in 190e28b, and firing exactly when
focus lands on the restored pane) no longer restatuses while dec.loading.
Caveat on verification: I could not observe this on targets/echo. Going back
always lands on a function the decompiler has already cached, so the busy branch
completes without a visible frame — sampling the status bar every 60ms across the
whole Esc showed no intermediate state. What's verified here is that the busy
branch sets the message and that nothing downstream clobbers it; the visible
effect needs a target slow enough to decompile, i.e. a real binary.
Suite 192/0.
| -rw-r--r-- | idatui/app.py | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/idatui/app.py b/idatui/app.py index 5889a27..4bba7df 100644 --- a/idatui/app.py +++ b/idatui/app.py @@ -3898,7 +3898,8 @@ class IdaTui(App): return self._active = mode self._sync_split(mode) # re-link the band from the new driver - self._status_for_cur("split") + if not self.query_one(DecompView).loading: + self._status_for_cur("split") # never clobber "decompiling…" def action_toggle_view(self) -> None: """Tab: switch the code pane between disassembly and pseudocode (or leave @@ -5353,14 +5354,21 @@ class IdaTui(App): hx.display = False lst.display = dec.display = True self.query_one("#panes").set_class(True, "split") - if self._cur is not None and dec.loaded_ea != self._cur.ea: + busy = self._cur is not None and dec.loaded_ea != self._cur.ea + if busy: dec.loading = True self._load_decomp(self._cur.ea, self._cur.name) else: dec.loading = False if grab: (dec if self._active == "decomp" else lst).focus() - self._status_for_cur("split") + if busy and self._cur is not None: + # Keep the in-flight message: the idle status used to overwrite + # it, so travelling history in split showed nothing at all while + # a decompile ran and Esc looked like a no-op. + self._status(f"{self._cur.name} \u2014 decompiling\u2026") + else: + self._status_for_cur("split") return self._split = False # a single-view target (hex, etc.) leaves split self.query_one("#panes").set_class(False, "split") |
