Re: [RFC 8.3 0/3] Some style fixes

Eli Zaretskii
2019-03-12T16:44:58Z

> From: Tom Tromey <tromey@adacore.com>
> Cc: tromey@adacore.com, gdb-patches@sourceware.org
> Date: Mon, 11 Mar 2019 14:15:36 -0600
>
> Eli> However, the artifacts I saw in the TUI display in the
> Eli> pretest are still there. In particular, the right-hand side of the
> Eli> frame of the source window still gets overwritten when stepping
> Eli> through the inferior's code, and it looks like the newline is not
> Eli> echoed after commands typed in the command window.
>
> I wonder if this is the "nonl" bug.
> You can test that theory by applying the appended.

It fixes the problems in the command window, so I think we should
apply this if no better ideas are brought up.

But the problems in the source window are not solved by this patch,
they have other reasons. I debugged almost all of the problems I'm
aware of, please see the annotated patches below. If they look
reasonable, I will push them.

After these patches, I have only one more problem: horizontal
scrolling of the source window. First, the first press of left-arrow
doesn't have any effect; and second, scrolling draws TAB characters
incorrectly, it treats each TAB as if it took a single column on the
screen, so text after a TAB jumps by 8 columns when you scroll instead
of moving by one column. I hope to have solution for this tomorrow.

Here are the patches for the other problems:

1. The first patch fixes the problem noticed by Pedro: pressing DOWN
arrow in the command window doesn't scroll the source window. This is
because we don't initialize the s->nlines field, and then
tui_vertical_source_scroll thinks we are off the chart. This fixes
that:

--- gdb/source-cache.c~4 2019-03-10 08:34:47.422752400 +0200
+++ gdb/source-cache.c 2019-03-12 11:50:15.094147600 +0200
@@ -194,6 +194,12 @@ source_cache::get_source_lines (struct s
std::ifstream input (fullname);
if (input.is_open ())
{
+ if (s->line_charpos == 0)
+ {
+ scoped_fd desc = open_source_file (s);
+ if (desc.get () >= 0)
+ find_source_lines (s, desc.get ());
+ }
srchilite::SourceHighlight highlighter ("esc.outlang");
highlighter.setStyleFile("esc.style");

2. The fix for avoiding to overwrite the source window frame is
simple: revert 4a3045920. I don't really understand why that change
was made: AFAIU, wclrtoeol clears to the end of the window line, and
cannot be told to clear only part of the line.

--- gdb/tui/tui-winsource.c~4 2019-02-27 06:51:50.000000000 +0200
+++ gdb/tui/tui-winsource.c 2019-03-12 10:57:02.052875200 +0200
@@ -285,7 +285,12 @@ tui_show_source_line (struct tui_win_inf
wattroff (win_info->generic.handle, A_STANDOUT);

/* Clear to end of line but stop before the border. */
- wclrtoeol (win_info->generic.handle);
+ int x = getcurx (win_info->generic.handle);
+ while (x + 1 < win_info->generic.width)
+ {
+ waddch (win_info->generic.handle, ' ');
+ x = getcurx (win_info->generic.handle);
+ }
}

void

3. This patch fixes another problem noticed by Pedro: the first time
you type UP or DOWN arrow in the command window, GDB should scroll the
source window, but instead it displays the line number and the file
name in the command window(?). What happens there is that the first
time we call tui_ui_out::do_field_int, it doesn't initialize m_line,
because m_start_of_line is -1, as set by the constructor; and then the
following call to tui_ui_out::do_field_string falls back to
cli_ui_out::do_field_string because m_line is zero. The fix below is
perhaps somewhat ad-hoc, mainly because I couldn't understand the
semantics of the values of m_start_of_line, especially its
non-positive values; please consider documenting them in the header.
Maybe if someone explains the semantics, I could come up with a more
sound patch (or conclude that the below is TRT). Also, it looks like
the second test for m_line > 0 in tui_ui_out::do_field_string is
redundant?

--- gdb/tui/tui-out.c~4 2019-02-27 06:51:50.000000000 +0200
+++ gdb/tui/tui-out.c 2019-03-12 12:30:23.924230000 +0200
@@ -34,6 +34,9 @@ tui_ui_out::do_field_int (int fldno, int
if (suppress_output ())
return;

+ if (m_start_of_line < 0 && m_line == 0)
+ m_start_of_line = 0;
+
/* Don't print line number, keep it for later. */
if (m_start_of_line == 0 && strcmp (fldname, "line") == 0)
{