From e7a919f113e7001b83076a1ed7f58bb75caa75a8 Mon Sep 17 00:00:00 2001 From: blasty Date: Sat, 25 Jul 2026 20:51:25 +0200 Subject: split: don't overwrite "decompiling…" with the idle status MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- idatui/app.py | 14 +++++++++++--- 1 file 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") -- cgit v1.3.1-sl0p