aboutsummaryrefslogtreecommitdiffstats
path: root/idatui
diff options
context:
space:
mode:
authorblasty <blasty@local>2026-07-09 16:12:28 +0200
committerblasty <blasty@local>2026-07-09 16:12:28 +0200
commit2451641f5edf59b08069fe11fbbb5b8a48fcb168 (patch)
treecd46f6c343128a65a79255b4093f8a4e015831ce /idatui
parentstop piling up idalib workers; raise max-workers headroom (diff)
downloadida-tui-2451641f5edf59b08069fe11fbbb5b8a48fcb168.tar.gz
ida-tui-2451641f5edf59b08069fe11fbbb5b8a48fcb168.tar.xz
ida-tui-2451641f5edf59b08069fe11fbbb5b8a48fcb168.zip
smoother scroll restore on jump-back; non-degenerate test
The restored scroll was correct in the final state but load() zeroed virtual_size (snapping scroll to 0) and only a deferred call_after_refresh jumped to the target -> a visible flash to the top before settling. Now: don't zero virtual_size on load, and apply the target scroll synchronously in _on_primed (plus the deferred call as a fallback for un-sized regions). Also hardened the scroll test to use a MID-viewport cursor (rel>0). The prior test had the cursor at the viewport top (rel=0), where scroll-into-view derives the same scroll -> it would have passed even if scroll restore were broken. pilot suite 52/52.
Diffstat (limited to 'idatui')
-rw-r--r--idatui/app.py8
1 files changed, 5 insertions, 3 deletions
diff --git a/idatui/app.py b/idatui/app.py
index 7dc59b4..a5be0f7 100644
--- a/idatui/app.py
+++ b/idatui/app.py
@@ -561,7 +561,8 @@ class DisasmView(SearchMixin, NavMixin, ColumnCursor, ScrollView, can_focus=True
self.cursor = cursor
self.cursor_x = cursor_x
self._pending_scroll_y = scroll_y
- self.virtual_size = Size(0, 0)
+ # NB: don't zero virtual_size here — that snaps the scroll to 0 and
+ # causes a visible jump before _on_primed restores the target scroll.
self._matches = []
self._ranges = {}
self._search_texts = None
@@ -624,8 +625,9 @@ class DisasmView(SearchMixin, NavMixin, ColumnCursor, ScrollView, can_focus=True
self._clamp_x() # cursor line is now cached; keep the column in range
if self._pending_scroll_y is not None and self._pending_scroll_y >= 0:
target = min(self._pending_scroll_y, max(total - 1, 0))
- # Defer until after layout recomputes max_scroll_y, else scroll_to
- # clamps to 0 (virtual_size was only just set).
+ # Apply now (works when the region is already sized) and again after
+ # refresh (covers the case where max_scroll_y isn't computed yet).
+ self.scroll_to(y=target, animate=False)
self.call_after_refresh(lambda t=target: self.scroll_to(y=t, animate=False))
else:
self._scroll_cursor_into_view()