From patchwork Tue May 30 10:53:22 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom de Vries X-Patchwork-Id: 70307 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 45A0B385609B for ; Tue, 30 May 2023 10:53:51 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 45A0B385609B DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1685444031; bh=LkzjzhnLPnNLx9RpZNs2v153/lNbrflm3hosFI6yu8U=; h=To:Cc:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From:Reply-To:From; b=FnO8WzkROxWKDL064376rU0yNQpm/bhqyhAY3C5dUn4IECSDeTueWp4w3Ij4ogU0G U+nMrQdJf80W9OnDJ0jayqxxvAmlT+QEA3lwAeUL3NA60FZMQxuDazDfHoXhs6Azp6 j5TaMUde3gbwf/Fc57yqGMs6eJWEx76CCwkcXaco= X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from smtp-out2.suse.de (smtp-out2.suse.de [IPv6:2001:67c:2178:6::1d]) by sourceware.org (Postfix) with ESMTPS id 1A4C93858D28 for ; Tue, 30 May 2023 10:53:27 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 1A4C93858D28 Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id 4C3B51F8B9; Tue, 30 May 2023 10:53:26 +0000 (UTC) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id 3531B13478; Tue, 30 May 2023 10:53:26 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id sJj7C6bVdWTNZgAAMHmgww (envelope-from ); Tue, 30 May 2023 10:53:26 +0000 To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [PATCH 1/3] [gdb/tui] Keep inferior output in cmd window with ^L Date: Tue, 30 May 2023 12:53:22 +0200 Message-Id: <20230530105324.23089-2-tdevries@suse.de> X-Mailer: git-send-email 2.35.3 In-Reply-To: <20230530105324.23089-1-tdevries@suse.de> References: <20230530105324.23089-1-tdevries@suse.de> MIME-Version: 1.0 X-Spam-Status: No, score=-12.3 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Tom de Vries via Gdb-patches From: Tom de Vries Reply-To: Tom de Vries Errors-To: gdb-patches-bounces+patchwork=sourceware.org@sourceware.org Sender: "Gdb-patches" Consider a hello world compiled with -g into an a.out: ... int main (void) { printf ("hello\n"); return 0; } ... After starting TUI like this: ... $ gdb -q a.out -ex start -ex "tui enable" ... we do "echo \n" and type enter until the prompt is at the bottom of the screen. After doing next to execute the printf, we have: ... (gdb) next hello (gdb) ... but the entire screen scrolled, so: - the src window is missing the top border, and - the updates in the src and status window are misaligned with the current screen. We can fix this by doing ^L, but that removes the "hello", giving us just: ... (gdb) next (gdb) ... The ^L key-combo (and likewise the command refresh) calls tui_refresh_all_win, which works by: - clearing the screen, and then - refreshing all visible windows. Since curses has no notion of the inferior output, this overwrites the "hello". Fix this by excluding the command window from ^L. Tested on x86_64-linux. Reviewed-By: Bruno Larsen --- gdb/testsuite/gdb.tui/hello.c | 25 +++++++++++++++ gdb/testsuite/gdb.tui/hello.exp | 57 +++++++++++++++++++++++++++++++++ gdb/tui/tui-io.c | 2 +- gdb/tui/tui-win.c | 18 ++++++++--- gdb/tui/tui-win.h | 2 +- gdb/tui/tui-wingeneral.c | 5 ++- gdb/tui/tui-wingeneral.h | 2 +- 7 files changed, 103 insertions(+), 8 deletions(-) create mode 100644 gdb/testsuite/gdb.tui/hello.c create mode 100644 gdb/testsuite/gdb.tui/hello.exp diff --git a/gdb/testsuite/gdb.tui/hello.c b/gdb/testsuite/gdb.tui/hello.c new file mode 100644 index 00000000000..c3f5c6ea2cb --- /dev/null +++ b/gdb/testsuite/gdb.tui/hello.c @@ -0,0 +1,25 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2023 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 . */ + +#include + +int +main (void) +{ + printf ("hello\n"); + return 0; +} diff --git a/gdb/testsuite/gdb.tui/hello.exp b/gdb/testsuite/gdb.tui/hello.exp new file mode 100644 index 00000000000..9634d9d8059 --- /dev/null +++ b/gdb/testsuite/gdb.tui/hello.exp @@ -0,0 +1,57 @@ +# Copyright 2023 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 . + +# Check that a print by an inferior doesn't mess up the screen. + +tuiterm_env + +standard_testfile hello.c + +if {[build_executable "failed to prepare" ${testfile} ${srcfile}] == -1} { + return -1 +} + +Term::clean_restart 24 80 $testfile + +if {![runto_main]} { + perror "test suppressed" + return +} + +if {![Term::enter_tui]} { + unsupported "TUI not supported" + return +} + +# Make sure the prompt is at the last line. +Term::command "echo \\n" +Term::command "echo \\n" +Term::command "echo \\n" +Term::command "echo \\n" + +# Check the source box. +Term::check_box "before next: source box" 0 0 80 15 + +# Make the inferior print "hello". +Term::command "next" + +# Refresh to redraw the screen. +Term::command "refresh" + +# Check the source box again. +Term::check_box "after next: source box" 0 0 80 15 + +# Check that we can still see the printed "hello". +Term::check_contents "hello" "\nhello" diff --git a/gdb/tui/tui-io.c b/gdb/tui/tui-io.c index a1eadcd937d..6ae7948b786 100644 --- a/gdb/tui/tui-io.c +++ b/gdb/tui/tui-io.c @@ -1219,7 +1219,7 @@ tui_getc_1 (FILE *fp) /* Handle the CTRL-L refresh for each window. */ if (ch == '\f') { - tui_refresh_all_win (); + tui_refresh_all_win (false); return ch; } diff --git a/gdb/tui/tui-win.c b/gdb/tui/tui-win.c index 7abd1e225b9..3b41b59cdd3 100644 --- a/gdb/tui/tui-win.c +++ b/gdb/tui/tui-win.c @@ -508,10 +508,20 @@ tui_win_info::right_scroll (int num_to_scroll) void -tui_refresh_all_win (void) +tui_refresh_all_win (bool cmd_window) { - clearok (curscr, TRUE); - tui_refresh_all (); + if (cmd_window) + clearok (curscr, TRUE); + else + for (tui_win_info *wi : all_tui_windows ()) + { + if (wi == TUI_CMD_WIN) + continue; + + redrawwin (wi->handle.get ()); + } + + tui_refresh_all (cmd_window); } void @@ -827,7 +837,7 @@ tui_refresh_all_command (const char *arg, int from_tty) /* Make sure the curses mode is enabled. */ tui_enable (); - tui_refresh_all_win (); + tui_refresh_all_win (false); } #define DEFAULT_TAB_LEN 8 diff --git a/gdb/tui/tui-win.h b/gdb/tui/tui-win.h index 3d35f1dfb7f..41408a0af3d 100644 --- a/gdb/tui/tui-win.h +++ b/gdb/tui/tui-win.h @@ -26,7 +26,7 @@ extern void tui_set_win_focus_to (struct tui_win_info *); extern void tui_resize_all (void); -extern void tui_refresh_all_win (void); +extern void tui_refresh_all_win (bool cmd_win = true); extern void tui_rehighlight_all (void); extern chtype tui_border_ulcorner; diff --git a/gdb/tui/tui-wingeneral.c b/gdb/tui/tui-wingeneral.c index 82a023d09fe..73c047a8ac4 100644 --- a/gdb/tui/tui-wingeneral.c +++ b/gdb/tui/tui-wingeneral.c @@ -198,10 +198,13 @@ tui_win_info::make_visible (bool visible) /* Function to refresh all the windows currently displayed. */ void -tui_refresh_all () +tui_refresh_all (bool cmd_window) { for (tui_win_info *win_info : all_tui_windows ()) { + if (!cmd_window && win_info == tui_win_list[CMD_WIN]) + continue; + if (win_info->is_visible ()) win_info->refresh_window (); } diff --git a/gdb/tui/tui-wingeneral.h b/gdb/tui/tui-wingeneral.h index 5b82fcd6b21..051dbf3b5ca 100644 --- a/gdb/tui/tui-wingeneral.h +++ b/gdb/tui/tui-wingeneral.h @@ -28,7 +28,7 @@ struct tui_win_info; extern void tui_unhighlight_win (struct tui_win_info *); extern void tui_highlight_win (struct tui_win_info *); -extern void tui_refresh_all (); +extern void tui_refresh_all (bool cmd_window = true); /* An RAII class that suppresses output on construction (calling wnoutrefresh on the existing windows), and then flushes the output From patchwork Tue May 30 10:53:23 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom de Vries X-Patchwork-Id: 70308 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id B4F1D3855889 for ; Tue, 30 May 2023 10:53:55 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org B4F1D3855889 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1685444035; bh=DgmVPvnsVr//kqMwJZwnzw/P49bUZRfBEglHIat7PPc=; h=To:Cc:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From:Reply-To:From; b=gemjf/weJaL9CPWq3gLqh95jSu1gPo+fO8wzKWqVQELjabPWPtMpwJkeMRzVtHyin 35qebfWYIMl5DcGGVXA6fvgSu6UJMoMj9qQB8M3nQ3QIvvhSjqAMj6KwMEDxzcZz2B qnokFaS2hWVn9ZLFTKFofdYWVRc7a9ae1nbIWHXM= X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from smtp-out2.suse.de (smtp-out2.suse.de [IPv6:2001:67c:2178:6::1d]) by sourceware.org (Postfix) with ESMTPS id 3708D3858C5E for ; Tue, 30 May 2023 10:53:27 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 3708D3858C5E Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id 66A791F8D9; Tue, 30 May 2023 10:53:26 +0000 (UTC) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id 5018413478; Tue, 30 May 2023 10:53:26 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id ODN9EqbVdWTNZgAAMHmgww (envelope-from ); Tue, 30 May 2023 10:53:26 +0000 To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [PATCH 2/3] [gdb] Add observable terminal_owner_changed Date: Tue, 30 May 2023 12:53:23 +0200 Message-Id: <20230530105324.23089-3-tdevries@suse.de> X-Mailer: git-send-email 2.35.3 In-Reply-To: <20230530105324.23089-1-tdevries@suse.de> References: <20230530105324.23089-1-tdevries@suse.de> MIME-Version: 1.0 X-Spam-Status: No, score=-12.3 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Tom de Vries via Gdb-patches From: Tom de Vries Reply-To: Tom de Vries Errors-To: gdb-patches-bounces+patchwork=sourceware.org@sourceware.org Sender: "Gdb-patches" Add a new observable, gdb::observers::terminal_owner_changed. Its observers are notified when gdb_tty_state changes. On each change, they are notified twice: - once with the old gdb_tty_state, and active == false, and - once with the new gdb_tty_state, and active == true. No functional changes. Tested on x86_64-linux. --- gdb/inflow.c | 176 ++++++++++++++++++++++++++--------------------- gdb/observable.c | 1 + gdb/observable.h | 5 ++ 3 files changed, 103 insertions(+), 79 deletions(-) diff --git a/gdb/inflow.c b/gdb/inflow.c index 767cfd02c48..9c82306be62 100644 --- a/gdb/inflow.c +++ b/gdb/inflow.c @@ -311,67 +311,76 @@ child_terminal_inferior (struct target_ops *self) inferior *inf = current_inferior (); terminal_info *tinfo = get_inflow_inferior_data (inf); - if (gdb_has_a_terminal () - && tinfo->ttystate != NULL - && sharing_input_terminal (inf)) - { - int result; + if (!(gdb_has_a_terminal () + && tinfo->ttystate != NULL + && sharing_input_terminal (inf))) + return; - /* Ignore SIGTTOU since it will happen when we try to set the - terminal's state (if gdb_tty_state is currently - ours_for_output). */ - scoped_ignore_sigttou ignore_sigttou; + /* Note that the old state will no longer be active. */ + gdb::observers::terminal_owner_changed.notify (gdb_tty_state, false); + + /* Scope containing scoped_ignore_sigtto. */ + { + int result; + + /* Ignore SIGTTOU since it will happen when we try to set the + terminal's state (if gdb_tty_state is currently + ours_for_output). */ + scoped_ignore_sigttou ignore_sigttou; #ifdef F_GETFL - result = fcntl (0, F_SETFL, tinfo->tflags); - OOPSY ("fcntl F_SETFL"); + result = fcntl (0, F_SETFL, tinfo->tflags); + OOPSY ("fcntl F_SETFL"); #endif - result = serial_set_tty_state (stdin_serial, tinfo->ttystate); - OOPSY ("setting tty state"); + result = serial_set_tty_state (stdin_serial, tinfo->ttystate); + OOPSY ("setting tty state"); - if (!job_control) - { - sigint_ours = install_sigint_handler (SIG_IGN); + if (!job_control) + { + sigint_ours = install_sigint_handler (SIG_IGN); #ifdef SIGQUIT - sigquit_ours = signal (SIGQUIT, SIG_IGN); + sigquit_ours = signal (SIGQUIT, SIG_IGN); #endif - } + } - if (job_control) - { + if (job_control) + { #ifdef HAVE_TERMIOS_H - /* If we can't tell the inferior's actual process group, - then restore whatever was the foreground pgrp the last - time the inferior was running. See also comments - describing terminal_state::process_group. */ + /* If we can't tell the inferior's actual process group, + then restore whatever was the foreground pgrp the last + time the inferior was running. See also comments + describing terminal_state::process_group. */ #ifdef HAVE_GETPGID - result = tcsetpgrp (0, getpgid (inf->pid)); + result = tcsetpgrp (0, getpgid (inf->pid)); #else - result = tcsetpgrp (0, tinfo->process_group); + result = tcsetpgrp (0, tinfo->process_group); #endif - if (result == -1) - { + if (result == -1) + { #if 0 - /* This fails if either GDB has no controlling terminal, - e.g., running under 'setsid(1)', or if the inferior - is not attached to GDB's controlling terminal. E.g., - if it called setsid to create a new session or used - the TIOCNOTTY ioctl, or simply if we've attached to a - process running on another terminal and we couldn't - tell whether it was sharing GDB's terminal (and so - assumed yes). */ - gdb_printf - (gdb_stderr, - "[tcsetpgrp failed in child_terminal_inferior: %s]\n", - safe_strerror (errno)); + /* This fails if either GDB has no controlling terminal, + e.g., running under 'setsid(1)', or if the inferior + is not attached to GDB's controlling terminal. E.g., + if it called setsid to create a new session or used + the TIOCNOTTY ioctl, or simply if we've attached to a + process running on another terminal and we couldn't + tell whether it was sharing GDB's terminal (and so + assumed yes). */ + gdb_printf + (gdb_stderr, + "[tcsetpgrp failed in child_terminal_inferior: %s]\n", + safe_strerror (errno)); #endif - } + } #endif - } + } - gdb_tty_state = target_terminal_state::is_inferior; - } + gdb_tty_state = target_terminal_state::is_inferior; + } + + /* Note that the new state is active. */ + gdb::observers::terminal_owner_changed.notify (gdb_tty_state, true); } /* Put some of our terminal settings into effect, @@ -447,55 +456,64 @@ child_terminal_ours_1 (target_terminal_state desired_state) if (!gdb_has_a_terminal ()) return; - if (gdb_tty_state != desired_state) - { - int result ATTRIBUTE_UNUSED; + if (gdb_tty_state == desired_state) + return; - /* Ignore SIGTTOU since it will happen when we try to set the - terminal's pgrp. */ - scoped_ignore_sigttou ignore_sigttou; + /* Note that the old state will no longer be active. */ + gdb::observers::terminal_owner_changed.notify (gdb_tty_state, false); - /* Set tty state to our_ttystate. */ - serial_set_tty_state (stdin_serial, our_terminal_info.ttystate); + /* Scope containing scoped_ignore_sigtto. */ + { + int result ATTRIBUTE_UNUSED; - /* If we only want output, then leave the inferior's pgrp in the - foreground, so that Ctrl-C/Ctrl-Z reach the inferior - directly. */ - if (job_control && desired_state == target_terminal_state::is_ours) - { + /* Ignore SIGTTOU since it will happen when we try to set the + terminal's pgrp. */ + scoped_ignore_sigttou ignore_sigttou; + + /* Set tty state to our_ttystate. */ + serial_set_tty_state (stdin_serial, our_terminal_info.ttystate); + + /* If we only want output, then leave the inferior's pgrp in the + foreground, so that Ctrl-C/Ctrl-Z reach the inferior + directly. */ + if (job_control && desired_state == target_terminal_state::is_ours) + { #ifdef HAVE_TERMIOS_H - result = tcsetpgrp (0, our_terminal_info.process_group); + result = tcsetpgrp (0, our_terminal_info.process_group); #if 0 - /* This fails on Ultrix with EINVAL if you run the testsuite - in the background with nohup, and then log out. GDB never - used to check for an error here, so perhaps there are other - such situations as well. */ - if (result == -1) - gdb_printf (gdb_stderr, - "[tcsetpgrp failed in child_terminal_ours: %s]\n", - safe_strerror (errno)); + /* This fails on Ultrix with EINVAL if you run the testsuite + in the background with nohup, and then log out. GDB never + used to check for an error here, so perhaps there are other + such situations as well. */ + if (result == -1) + gdb_printf (gdb_stderr, + "[tcsetpgrp failed in child_terminal_ours: %s]\n", + safe_strerror (errno)); #endif #endif /* termios */ - } + } - if (!job_control && desired_state == target_terminal_state::is_ours) - { - if (sigint_ours.has_value ()) - install_sigint_handler (*sigint_ours); - sigint_ours.reset (); + if (!job_control && desired_state == target_terminal_state::is_ours) + { + if (sigint_ours.has_value ()) + install_sigint_handler (*sigint_ours); + sigint_ours.reset (); #ifdef SIGQUIT - if (sigquit_ours.has_value ()) - signal (SIGQUIT, *sigquit_ours); - sigquit_ours.reset (); + if (sigquit_ours.has_value ()) + signal (SIGQUIT, *sigquit_ours); + sigquit_ours.reset (); #endif - } + } #ifdef F_GETFL - result = fcntl (0, F_SETFL, our_terminal_info.tflags); + result = fcntl (0, F_SETFL, our_terminal_info.tflags); #endif - gdb_tty_state = desired_state; - } + gdb_tty_state = desired_state; + } + + /* Note that the new state is active. */ + gdb::observers::terminal_owner_changed.notify (gdb_tty_state, true); } /* Interrupt the inferior. Implementation of target_interrupt for diff --git a/gdb/observable.c b/gdb/observable.c index 82563e3fab4..2ae9f325899 100644 --- a/gdb/observable.c +++ b/gdb/observable.c @@ -82,6 +82,7 @@ DEFINE_OBSERVABLE (gdb_exiting); DEFINE_OBSERVABLE (connection_removed); DEFINE_OBSERVABLE (target_pre_wait); DEFINE_OBSERVABLE (target_post_wait); +DEFINE_OBSERVABLE (terminal_owner_changed); } /* namespace observers */ } /* namespace gdb */ diff --git a/gdb/observable.h b/gdb/observable.h index e4e6f021f1a..9a4144a13ca 100644 --- a/gdb/observable.h +++ b/gdb/observable.h @@ -22,6 +22,7 @@ #include "gdbsupport/observable.h" #include "target/waitstatus.h" +#include "target/target.h" struct bpstat; struct so_list; @@ -276,6 +277,10 @@ extern observable target_pre_wait; /* About to leave target_wait (). */ extern observable target_post_wait; +/* When the terminal owner changes. */ +extern observable + terminal_owner_changed; + } /* namespace observers */ } /* namespace gdb */ From patchwork Tue May 30 10:53:24 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom de Vries X-Patchwork-Id: 70309 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id F37A83856DFB for ; Tue, 30 May 2023 10:54:21 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org F37A83856DFB DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1685444062; bh=IOsYpkFrB6KYYiQ+3GAGGr2zYFlEydOPMEzLiVV5T8s=; h=To:Cc:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From:Reply-To:From; b=nzbZV7Qhy0dbTXOzrrUwBSKXpaaA0IoWXJsN93wUGTtGbP20aE1fq64MPXirHi4LQ xDXHb1KtM2HrJcFpIJ5AeIBoAmWDu9eTCbpHsDgkBiejE6QGnR652PUZ4QmiHXoRKg 5c/gp0wdgY1/Vqq5IsgAA4y3PfBch2pQcmmKrXqo= X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) by sourceware.org (Postfix) with ESMTPS id 4D2F73858C00 for ; Tue, 30 May 2023 10:53:27 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 4D2F73858C00 Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id 800941FD68; Tue, 30 May 2023 10:53:26 +0000 (UTC) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id 69EE213A21; Tue, 30 May 2023 10:53:26 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id EBDWGKbVdWTNZgAAMHmgww (envelope-from ); Tue, 30 May 2023 10:53:26 +0000 To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [PATCH 3/3] [gdb/tui] Refresh on target_terminal_state::is_ours Date: Tue, 30 May 2023 12:53:24 +0200 Message-Id: <20230530105324.23089-4-tdevries@suse.de> X-Mailer: git-send-email 2.35.3 In-Reply-To: <20230530105324.23089-1-tdevries@suse.de> References: <20230530105324.23089-1-tdevries@suse.de> MIME-Version: 1.0 X-Spam-Status: No, score=-12.5 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Tom de Vries via Gdb-patches From: Tom de Vries Reply-To: Tom de Vries Errors-To: gdb-patches-bounces+patchwork=sourceware.org@sourceware.org Sender: "Gdb-patches" Consider a hello world compiled with -g into an a.out: ... int main (void) { printf ("hello\n"); return 0; } ... After starting TUI like this: ... $ gdb -q a.out -ex start -ex "tui enable" ... we do "echo \n" and type enter until the prompt is at the bottom of the screen. After doing next to execute the printf, we have: ... (gdb) next hello (gdb) ... but the entire screen scrolled, so: - the src window is missing the top border - the updates in the src and status window are misaligned with the current screen. We can fix this by doing ^L. Fix this by doing ^L automatically when gdb_tty_state changes to target_terminal_state::is_ours. Tested on x86_64-linux. Reviewed-By: Bruno Larsen --- gdb/testsuite/gdb.tui/hello.exp | 3 --- gdb/tui/tui-hooks.c | 11 +++++++++++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/gdb/testsuite/gdb.tui/hello.exp b/gdb/testsuite/gdb.tui/hello.exp index 9634d9d8059..641b3b0c48e 100644 --- a/gdb/testsuite/gdb.tui/hello.exp +++ b/gdb/testsuite/gdb.tui/hello.exp @@ -47,9 +47,6 @@ Term::check_box "before next: source box" 0 0 80 15 # Make the inferior print "hello". Term::command "next" -# Refresh to redraw the screen. -Term::command "refresh" - # Check the source box again. Term::check_box "after next: source box" 0 0 80 15 diff --git a/gdb/tui/tui-hooks.c b/gdb/tui/tui-hooks.c index d67c3d7f353..d1d307cf9ce 100644 --- a/gdb/tui/tui-hooks.c +++ b/gdb/tui/tui-hooks.c @@ -211,6 +211,15 @@ tui_symtab_changed () from_source_symtab = true; } +/* Observer for terminal_owner_changed. */ + +static void +tui_terminal_owner_changed (target_terminal_state gdb_tty_state, bool active) +{ + if (active && gdb_tty_state == target_terminal_state::is_ours) + tui_refresh_all_win (false); +} + /* Token associated with observers registered while TUI hooks are installed. */ static const gdb::observers::token tui_observers_token {}; @@ -250,6 +259,8 @@ tui_attach_detach_observers (bool attach) tui_context_changed, attach); attach_or_detach (gdb::observers::current_source_symtab_and_line_changed, tui_symtab_changed, attach); + attach_or_detach (gdb::observers::terminal_owner_changed, + tui_terminal_owner_changed, attach); } /* Install the TUI specific hooks. */