From: Tom de Vries Date: Tue, 2 Apr 2024 14:09:10 +0000 (+0200) Subject: [gdb/tui] Fix centering and highlighting of current line X-Git-Tag: gdb-15-branchpoint~544 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b35013e29f3bcf9028aa22291f378010420322fe;p=thirdparty%2Fbinutils-gdb.git [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 ee1e9bbb513 ("[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 Approved-By: Tom Tromey PR tui/31522 Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31522 --- diff --git a/gdb/testsuite/gdb.tui/main-2.exp b/gdb/testsuite/gdb.tui/main-2.exp new file mode 100644 index 00000000000..1dcb3cfc6d4 --- /dev/null +++ b/gdb/testsuite/gdb.tui/main-2.exp @@ -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 . + +# 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 $line" $screen_line] } \ + "highlighted line in middle of source window" diff --git a/gdb/tui/tui-winsource.c b/gdb/tui/tui-winsource.c index 4dbbe922256..61c8e00589d 100644 --- a/gdb/tui/tui-winsource.c +++ b/gdb/tui/tui-winsource.c @@ -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 diff --git a/gdb/tui/tui.c b/gdb/tui/tui.c index 19f09609a2f..eaee85f82b4 100644 --- a/gdb/tui/tui.c +++ b/gdb/tui/tui.c @@ -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);