From patchwork Wed Aug 21 02:25:26 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Tromey X-Patchwork-Id: 34208 Received: (qmail 29894 invoked by alias); 21 Aug 2019 02:25:56 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 29068 invoked by uid 89); 21 Aug 2019 02:25:43 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-19.8 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_HELO_PASS autolearn=ham version=3.3.1 spammy=video, bears X-HELO: gateway33.websitewelcome.com Received: from gateway33.websitewelcome.com (HELO gateway33.websitewelcome.com) (192.185.147.108) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 21 Aug 2019 02:25:41 +0000 Received: from cm11.websitewelcome.com (cm11.websitewelcome.com [100.42.49.5]) by gateway33.websitewelcome.com (Postfix) with ESMTP id 11461D8590 for ; Tue, 20 Aug 2019 21:25:40 -0500 (CDT) Received: from box5379.bluehost.com ([162.241.216.53]) by cmsmtp with SMTP id 0GJgiDf5UdnCe0GJgicpkV; Tue, 20 Aug 2019 21:25:40 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=tromey.com; s=default; h=References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From: Sender:Reply-To:MIME-Version:Content-Type:Content-Transfer-Encoding: Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender: Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=9g3MWFmPrRDVpISF0GY4KciAPvLEB4k9htO4GnbXQJk=; b=QUBJ73M2wmlj8rN96/9KKg+1k/ hYpr4dG7YOOiutWeW7d38xS2BYI4q6TcrCNCs1qAaRw+7tJdEgDK9oR4xy0nUC/B1NOBApGZ9kfhy hF4yPlFHg0myNhLenYyRrUCCi; Received: from 97-122-178-82.hlrn.qwest.net ([97.122.178.82]:48672 helo=bapiya.Home) by box5379.bluehost.com with esmtpsa (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.92) (envelope-from ) id 1i0GJf-001K6n-NG; Tue, 20 Aug 2019 21:25:39 -0500 From: Tom Tromey To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [PATCH 06/15] Simplify register display Date: Tue, 20 Aug 2019 20:25:26 -0600 Message-Id: <20190821022535.9762-7-tom@tromey.com> In-Reply-To: <20190821022535.9762-1-tom@tromey.com> References: <20190821022535.9762-1-tom@tromey.com> This patch starts with the observation that the code in tui_data_window::display_registers_from can all be replaced with a call to resize. To make this work propertly, it also changes tui_display_register to be the "rerender" method on tui_data_item_window. The refresh_window method is needed due to the use of nested windows here. The ncurses man page makes it sound like this is not very well supported; and experience bears this out: negelecting the touchwin call in this path will cause the register window to blank when switching focus. gdb/ChangeLog 2019-08-20 Tom Tromey * tui/tui-regs.h (struct tui_data_item_window) : Declare. * tui/tui-regs.c (tui_data_window::display_registers_from): Call resize. (tui_data_item_window::rerender): Rename from tui_display_register. (tui_data_item_window::refresh_window): New method. * tui/tui-layout.c (tui_gen_win_info::resize): Do nothing on no-op. --- gdb/ChangeLog | 12 ++++++ gdb/tui/tui-layout.c | 5 +++ gdb/tui/tui-regs.c | 100 ++++++++++++++++++------------------------- gdb/tui/tui-regs.h | 4 ++ 4 files changed, 63 insertions(+), 58 deletions(-) diff --git a/gdb/tui/tui-layout.c b/gdb/tui/tui-layout.c index 387a4f51aff..7ec704e52f0 100644 --- a/gdb/tui/tui-layout.c +++ b/gdb/tui/tui-layout.c @@ -580,6 +580,11 @@ void tui_gen_win_info::resize (int height_, int width_, int origin_x_, int origin_y_) { + if (width == width_ && height == height_ + && origin.x == origin_x_ && origin.y == origin_y_ + && handle != nullptr) + return; + width = width_; height = height_; if (height > 1) diff --git a/gdb/tui/tui-regs.c b/gdb/tui/tui-regs.c index 98096e2cdc4..f62ba065ebe 100644 --- a/gdb/tui/tui-regs.c +++ b/gdb/tui/tui-regs.c @@ -42,8 +42,6 @@ #include "gdb_curses.h" -static void tui_display_register (struct tui_data_item_window *data); - /* Get the register from the frame and return a printable representation of it. */ @@ -274,34 +272,9 @@ tui_data_window::display_registers_from (int start_element_no) j < regs_column_count && i < regs_content.size (); j++) { - struct tui_data_item_window *data_item_win; - /* Create the window if necessary. */ - data_item_win = ®s_content[i]; - if (data_item_win->handle != NULL - && (data_item_win->height != 1 - || data_item_win->width != item_win_width - || data_item_win->origin.x != (item_win_width * j) + 1 - || data_item_win->origin.y != cur_y)) - { - tui_delete_win (data_item_win->handle); - data_item_win->handle = 0; - } - - if (data_item_win->handle == NULL) - { - data_item_win->height = 1; - data_item_win->width = item_win_width; - data_item_win->origin.x = (item_win_width * j) + 1; - data_item_win->origin.y = cur_y; - data_item_win->make_visible (true); - scrollok (data_item_win->handle, FALSE); - } - touchwin (data_item_win->handle); - - /* Get the printable representation of the register - and display it. */ - tui_display_register (data_item_win); + regs_content[i].resize (1, item_win_width, + (item_win_width * j) + 1, cur_y); i++; /* Next register. */ } cur_y++; /* Next row. */ @@ -508,43 +481,54 @@ tui_data_window::check_register_values (struct frame_info *frame) &data_item_win.highlight); if (data_item_win.highlight || was_hilighted) - tui_display_register (&data_item_win); + data_item_win.rerender (); } } } /* Display a register in a window. If hilite is TRUE, then the value will be displayed in reverse video. */ -static void -tui_display_register (struct tui_data_item_window *data) +void +tui_data_item_window::rerender () { - if (data->handle != NULL) - { - int i; - - if (data->highlight) - /* We ignore the return value, casting it to void in order to avoid - a compiler warning. The warning itself was introduced by a patch - to ncurses 5.7 dated 2009-08-29, changing this macro to expand - to code that causes the compiler to generate an unused-value - warning. */ - (void) wstandout (data->handle); + int i; + + scrollok (handle, FALSE); + if (highlight) + /* We ignore the return value, casting it to void in order to avoid + a compiler warning. The warning itself was introduced by a patch + to ncurses 5.7 dated 2009-08-29, changing this macro to expand + to code that causes the compiler to generate an unused-value + warning. */ + (void) wstandout (handle); - wmove (data->handle, 0, 0); - for (i = 1; i < data->width; i++) - waddch (data->handle, ' '); - wmove (data->handle, 0, 0); - if (data->content) - waddstr (data->handle, data->content.get ()); - - if (data->highlight) - /* We ignore the return value, casting it to void in order to avoid - a compiler warning. The warning itself was introduced by a patch - to ncurses 5.7 dated 2009-08-29, changing this macro to expand - to code that causes the compiler to generate an unused-value - warning. */ - (void) wstandend (data->handle); - data->refresh_window (); + wmove (handle, 0, 0); + for (i = 1; i < width; i++) + waddch (handle, ' '); + wmove (handle, 0, 0); + if (content) + waddstr (handle, content.get ()); + + if (highlight) + /* We ignore the return value, casting it to void in order to avoid + a compiler warning. The warning itself was introduced by a patch + to ncurses 5.7 dated 2009-08-29, changing this macro to expand + to code that causes the compiler to generate an unused-value + warning. */ + (void) wstandend (handle); + refresh_window (); +} + +void +tui_data_item_window::refresh_window () +{ + if (handle != nullptr) + { + /* This seems to be needed because the data items are nested + windows, which according to the ncurses man pages aren't well + supported. */ + touchwin (handle); + wrefresh (handle); } } diff --git a/gdb/tui/tui-regs.h b/gdb/tui/tui-regs.h index 2606c39f5a1..1f9fa73f1cc 100644 --- a/gdb/tui/tui-regs.h +++ b/gdb/tui/tui-regs.h @@ -37,6 +37,10 @@ struct tui_data_item_window : public tui_gen_win_info tui_data_item_window (tui_data_item_window &&) = default; + void rerender () override; + + void refresh_window () override; + const char *name = nullptr; /* The register number, or data display number. */ int item_no = -1;