aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--idatui/app.py4
-rw-r--r--tests/test_scenarios.py10
2 files changed, 14 insertions, 0 deletions
diff --git a/idatui/app.py b/idatui/app.py
index 5a50683..f098b71 100644
--- a/idatui/app.py
+++ b/idatui/app.py
@@ -4365,6 +4365,10 @@ class IdaTui(App):
dec.loading = True # gray out + 'decompiling…' overlay
self._load_decomp(self._cur.ea, self._cur.name)
else:
+ # Already showing this function: clear any overlay raised by the
+ # F5-from-listing path (no re-decompile happens here, so nothing
+ # else would).
+ dec.loading = False
self._status_for_cur("pseudocode")
# -- hex view ---------------------------------------------------------- #
diff --git a/tests/test_scenarios.py b/tests/test_scenarios.py
index e21226c..39f8d86 100644
--- a/tests/test_scenarios.py
+++ b/tests/test_scenarios.py
@@ -631,6 +631,16 @@ async def s_view_toggle(c: Ctx):
and dec._cover_widget is None, 25)
c.check("overlay clears when the decompile finishes",
not dec.loading and dec._cover_widget is None)
+ # F5 on an ALREADY-loaded function must still clear the overlay (regression:
+ # the F5-raised overlay had nothing to clear it in the 'already loaded' branch
+ # -> spinner stuck forever).
+ await c.press("tab") # -> listing
+ await c.wait(lambda: app._active == "listing", 10)
+ app.action_toggle_view() # F5 the same, cached function again
+ cleared = await c.wait(lambda: app._active == "decomp" and not dec.loading
+ and dec._cover_widget is None, 15)
+ c.check("re-decompiling an already-loaded function clears the overlay", cleared,
+ f"loading={dec.loading} cover={dec._cover_widget!r}")
# line-number gutter
dec.scroll_to(0, 0, animate=False)
await c.pause(0.025)