Don't draw register sub windows outside the visible area
authorHannes Domani <ssbssa@yahoo.de>
Tue, 5 Jan 2021 16:29:02 +0000 (17:29 +0100)
committerHannes Domani <ssbssa@yahoo.de>
Sun, 7 Feb 2021 18:13:45 +0000 (19:13 +0100)
If the regs window is not big enough to show all registers, the
registers whose values changed are always drawn, even if they are not
in the currently visible area.

So this marks the invisible register sub windows with y=0, and skips
their rerender call in check_register_values.

gdb/ChangeLog:

2021-02-07  Hannes Domani  <ssbssa@yahoo.de>

* tui/tui-regs.c (tui_data_window::display_registers_from):
Mark invisible register sub windows.
(tui_data_window::check_register_values): Ignore invisible
register sub windows.

gdb/ChangeLog
gdb/tui/tui-regs.c

index 20f3541a6344c462b1fce97579085e436af8c583..669aa2d08fc750b0364f958e27573954f147cbe8 100644 (file)
@@ -1,3 +1,10 @@
+2021-02-07  Hannes Domani  <ssbssa@yahoo.de>
+
+       * tui/tui-regs.c (tui_data_window::display_registers_from):
+       Mark invisible register sub windows.
+       (tui_data_window::check_register_values): Ignore invisible
+       register sub windows.
+
 2021-02-07  Hannes Domani  <ssbssa@yahoo.de>
 
        * tui/tui-regs.c (tui_data_item_window::rerender): Don't call
index 5caff7195efa776f238b3d390c30d72c31863308..a9387368bbedf7776273aabeb106764358e0b947 100644 (file)
@@ -281,7 +281,11 @@ tui_data_window::display_registers_from (int start_element_no)
        max_len = len;
     }
   m_item_width = max_len + 1;
-  int i = start_element_no;
+
+  int i;
+  /* Mark register windows above the visible area.  */
+  for (i = 0; i < start_element_no; i++)
+    m_regs_content[i].y = 0;
 
   m_regs_column_count = (width - 2) / m_item_width;
   if (m_regs_column_count == 0)
@@ -307,6 +311,10 @@ tui_data_window::display_registers_from (int start_element_no)
       cur_y++;         /* Next row.  */
     }
 
+  /* Mark register windows below the visible area.  */
+  for (; i < m_regs_content.size (); i++)
+    m_regs_content[i].y = 0;
+
   refresh_window ();
 }
 
@@ -470,7 +478,9 @@ tui_data_window::check_register_values (struct frame_info *frame)
                            data_item_win.regno,
                            &data_item_win.highlight);
 
-         if (data_item_win.highlight || was_hilighted)
+         /* Register windows whose y == 0 are outside the visible area.  */
+         if ((data_item_win.highlight || was_hilighted)
+             && data_item_win.y > 0)
            data_item_win.rerender (handle.get (), m_item_width);
        }
     }