gdb/tui: avoid extra refresh_window on horizontal scroll
authorAndrew Burgess <aburgess@redhat.com>
Thu, 5 Jan 2023 12:18:05 +0000 (12:18 +0000)
committerAndrew Burgess <aburgess@redhat.com>
Fri, 27 Jan 2023 16:20:10 +0000 (16:20 +0000)
While working on the previous patches I noticed that in some cases I
was seeing two calls to tui_source_window_base::refresh_window when
scrolling the window horizontally.

The two calls would trigger in for the tui-disasm-long-lines.exp test
when the pad needed to be refilled.  The two called both come from
tui_source_window_base::show_source_content.  The first call is nested
within check_and_display_highlight_if_needed, while the second call is
done directly at the end of show_source_content.

The check_and_display_highlight_if_needed is being used to draw the
window box to the window, this is needed here because
show_source_content is what gets called when the window needs
updating, e.g. after a resize.  We could potentially do the boxing in
refresh_window, but then we'd be doing it each time we scroll, even
though the box doesn't need changing in this case.

However, we can move the check_and_display_highlight_if_needed to be
the last thing done in show_source_content, this means that we can
rely on the refresh_window call within it to be our single refresh
call.

There should be no user visible changes after this commit.

gdb/tui/tui-winsource.c

index 6e22638ec746a572d9e48379b5044341542c3457..50efa80576ff7ab9cd4827a5b9ee3b9e4e754357 100644 (file)
@@ -348,8 +348,6 @@ tui_source_window_base::show_source_content ()
 {
   gdb_assert (!m_content.empty ());
 
-  check_and_display_highlight_if_needed ();
-
   /* The pad should be at least as wide as the window, but ideally, as wide
      as the content, however, for some very wide content this might not be
      possible.  */
@@ -399,7 +397,11 @@ tui_source_window_base::show_source_content ()
   for (int lineno = 0; lineno < m_content.size (); lineno++)
     show_source_line (lineno);
 
-  refresh_window ();
+  /* Calling check_and_display_highlight_if_needed will call refresh_window
+     (so long as the current window can be boxed), which will ensure that
+     the newly loaded window content is copied to the screen.  */
+  gdb_assert (can_box ());
+  check_and_display_highlight_if_needed ();
 }
 
 tui_source_window_base::tui_source_window_base ()