[gdb/tui] Fix centering and highlighting of current line

After starting TUI like this with a hello world a.out:
...
$ gdb -q a.out -ex start -ex "tui enable"
...
we get:
...
┌─hello.c──────────────────────────────┐
│        5 {                           │
│        6   printf ("hello\n");       │
│        7                             │
│        8   return 0;                 │
│        9 }                           │
│                                      │
└──────────────────────────────────────┘
...

This is a regression since commit ee1e9bbb51 ("[gdb/tui] Fix displaying main
after resizing"), before which we had instead:
...
┌─hello.c──────────────────────────────┐
│        4 main (void)                 │
│        5 {                           │
│  >     6   printf ("hello\n");       │
│        7                             │
│        8   return 0;                 │
│        9 }                           │
└──────────────────────────────────────┘
...

In other words, the problems are:
- the active line (source line 6) is no longer highlighted, and
- the active line is not vertically centered (screen line 2 out 6 instead of
  screen line 3 out of 6).

Fix these problems respectively by:
- in tui_enable, instead of "tui_show_frame_info (0)" using
  'tui_show_frame_info (deprecated_safe_get_selected_frame ())", and
- in tui_source_window_base::rerender, adding centering functionality.

Tested on aarch64-linux.

Co-Authored-By: Tom Tromey <tom@tromey.com>
Approved-By: Tom Tromey <tom@tromey.com>

PR tui/31522
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31522
This commit is contained in:
Tom de Vries
2024-04-02 16:09:10 +02:00
parent 33c58f4844
commit b35013e29f
3 changed files with 58 additions and 1 deletions

View File

@@ -0,0 +1,47 @@
# Copyright 2024 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
# Test that enabling tui while having a current frame results in
# centering and highlighting the associated line.
require allow_tui_tests
tuiterm_env
standard_testfile tui-layout.c
if { [build_executable "failed to prepare" $testfile $srcfile ] == -1} {
return -1
}
Term::clean_restart 24 80 $binfile
if {![runto_main]} {
perror "test suppressed"
return
}
if {![Term::enter_tui]} {
unsupported "TUI not supported"
return
}
set line " return 0;"
set nr [gdb_get_line_number $line]
set screen_line [Term::get_line_with_attrs 6]
verbose -log "screen line 6: '$screen_line'"
gdb_assert { [regexp "$nr <reverse:1>$line<reverse:0>" $screen_line] } \
"highlighted line in middle of source window"

View File

@@ -467,6 +467,16 @@ tui_source_window_base::rerender ()
struct symtab *s = find_pc_line_symtab (get_frame_pc (frame));
if (this != TUI_SRC_WIN)
find_line_pc (s, cursal.line, &cursal.pc);
/* This centering code is copied from tui_source_window::maybe_update.
It would be nice to do centering more often, and do it in just one
location. But since this is a regression fix, handle this
conservatively for now. */
int start_line = (cursal.line - ((height - box_size ()) / 2)) + 1;
if (start_line <= 0)
start_line = 1;
cursal.line = start_line;
update_source_window (gdbarch, cursal);
}
else

View File

@@ -466,7 +466,7 @@ tui_enable (void)
tui_set_term_width_to (COLS);
def_prog_mode ();
tui_show_frame_info (0);
tui_show_frame_info (deprecated_safe_get_selected_frame ());
tui_set_initial_layout ();
tui_set_win_focus_to (TUI_SRC_WIN);
keypad (TUI_CMD_WIN->handle.get (), TRUE);