Fix scrolling right in the TUI
authorHannes Domani <ssbssa@yahoo.de>
Mon, 18 Mar 2019 14:25:59 +0000 (14:25 +0000)
committerPedro Alves <palves@redhat.com>
Mon, 18 Mar 2019 14:25:59 +0000 (14:25 +0000)
This commit fixes two issues in scrolling right in the TUI:

#1 - Scrolling right with the arrow keys, the first keypress doesn't
do anything.  The problem is that copy_source_line() checks if
(column < first_col), and because of the ++column directly before, it
basically starts with 1 instead of 0.

#2 - Scrolling right handles TABS and escaped characters as single
characters, which just looks weird.  The problem is that there's a
spot that misses handling TABS.

gdb/ChangeLog:
2019-03-18  Hannes Domani  <ssbssa@yahoo.de>

* tui/tui-source.c (copy_source_line): Fix handling of 'column'.
Handle tabs.

gdb/ChangeLog
gdb/tui/tui-source.c

index 10e39bb67e6e036f6e9b3197c2db420af6735e11..75d82dbd3f25b2f4f55b45bdc5e74f718c3b7789 100644 (file)
@@ -1,3 +1,8 @@
+2019-03-18  Hannes Domani  <ssbssa@yahoo.de>
+
+       * tui/tui-source.c (copy_source_line): Fix handling of 'column'.
+       Handle tabs.
+
 2019-03-18  Tom Tromey  <tromey@adacore.com>
 
        * ada-lang.c (empty_array): Add "high" parameter.
index 7cc3c00069c661972008038591d2995851b1e241..1fa0e986e0392a6c0b4a4e15dcad774de7697a1e 100644 (file)
@@ -71,10 +71,27 @@ copy_source_line (const char **ptr, int line_no, int first_col,
 
       ++lineptr;
       ++column;
+
+      auto process_tab = [&] ()
+       {
+         int max_tab_len = tui_tab_width;
+
+         --column;
+         for (int j = column % max_tab_len;
+              j < max_tab_len && column < first_col + line_width;
+              column++, j++)
+           if (column >= first_col)
+             result.push_back (' ');
+       };
+
       /* We have to process all the text in order to pick up all the
         escapes.  */
-      if (column < first_col || column > first_col + line_width)
-       continue;
+      if (column <= first_col || column > first_col + line_width)
+       {
+         if (c == '\t')
+           process_tab ();
+         continue;
+       }
 
       if (c == '\n' || c == '\r' || c == '\0')
        {
@@ -91,14 +108,7 @@ copy_source_line (const char **ptr, int line_no, int first_col,
          result.push_back ('?');
        }
       else if (c == '\t')
-       {
-         int j, max_tab_len = tui_tab_width;
-
-         for (j = column - ((column / max_tab_len) * max_tab_len);
-              j < max_tab_len && column < first_col + line_width;
-              column++, j++)
-           result.push_back (' ');
-       }
+       process_tab ();
       else
        result.push_back (c);
     }