From 647bb750c298bbee618aa4448a30dcf9adf23602 Mon Sep 17 00:00:00 2001 From: Hannes Domani Date: Mon, 18 Mar 2019 14:25:59 +0000 Subject: [PATCH] Fix scrolling right in the TUI 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 * tui/tui-source.c (copy_source_line): Fix handling of 'column'. Handle tabs. --- gdb/ChangeLog | 5 +++++ gdb/tui/tui-source.c | 30 ++++++++++++++++++++---------- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 10e39bb67e6..75d82dbd3f2 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2019-03-18 Hannes Domani + + * tui/tui-source.c (copy_source_line): Fix handling of 'column'. + Handle tabs. + 2019-03-18 Tom Tromey * ada-lang.c (empty_array): Add "high" parameter. diff --git a/gdb/tui/tui-source.c b/gdb/tui/tui-source.c index 7cc3c00069c..1fa0e986e03 100644 --- a/gdb/tui/tui-source.c +++ b/gdb/tui/tui-source.c @@ -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); } -- 2.30.2