X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Ftui%2Ftui-wingeneral.c;h=35468d43abcd40612fe5a0f7de92246f077b36ac;hb=359157df2087894563a900e5f63299b42f460be2;hp=f900eab0133cf28394de75f904611845d3d3c618;hpb=772f3f0398b53cdb88cd744132cf7265928c12a0;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/tui/tui-wingeneral.c b/gdb/tui/tui-wingeneral.c index f900eab013..35468d43ab 100644 --- a/gdb/tui/tui-wingeneral.c +++ b/gdb/tui/tui-wingeneral.c @@ -1,6 +1,6 @@ /* General window behavior. - Copyright (C) 1998-2019 Free Software Foundation, Inc. + Copyright (C) 1998-2020 Free Software Foundation, Inc. Contributed by Hewlett-Packard Company. @@ -22,33 +22,60 @@ #include "defs.h" #include "tui/tui.h" #include "tui/tui-data.h" +#include "tui/tui-io.h" #include "tui/tui-wingeneral.h" #include "tui/tui-win.h" #include "tui/tui-stack.h" +#include "cli/cli-style.h" #include "gdb_curses.h" -/*********************** -** PUBLIC FUNCTIONS -***********************/ +/* This is true if we're currently suppressing output, via + wnoutrefresh. This is needed in case we create a new window while + in this mode. */ + +static bool suppress_output; /* See tui-data.h. */ -void -tui_gen_win_info::refresh_window () +tui_suppress_output::tui_suppress_output () + : m_saved_suppress (suppress_output) { - if (handle != NULL) - wrefresh (handle); + suppress_output = true; + + for (const auto &win : all_tui_windows ()) + win->no_refresh (); +} + +/* See tui-data.h. */ + +tui_suppress_output::~tui_suppress_output () +{ + suppress_output = m_saved_suppress; + if (!suppress_output) + doupdate (); + + for (const auto &win : all_tui_windows ()) + win->refresh_window (); } -/* Function to delete the curses window, checking for NULL. */ +/* See tui-data.h. */ + void -tui_delete_win (WINDOW *window) +tui_wrefresh (WINDOW *win) { - if (window != NULL) - delwin (window); + if (!suppress_output) + wrefresh (win); } +/* See tui-data.h. */ + +void +tui_gen_win_info::refresh_window () +{ + if (handle != NULL) + tui_wrefresh (handle.get ()); +} /* Draw a border arround the window. */ static void @@ -58,12 +85,18 @@ box_win (struct tui_win_info *win_info, WINDOW *win; int attrs; - win = win_info->handle; + win = win_info->handle.get (); if (highlight_flag) attrs = tui_active_border_attrs; else attrs = tui_border_attrs; + /* tui_apply_style resets the style entirely, so be sure to call it + before applying ATTRS. */ + if (cli_styling) + tui_apply_style (win, (highlight_flag + ? tui_active_border_style.style () + : tui_border_style.style ())); wattron (win, attrs); #ifdef HAVE_WBORDER wborder (win, tui_border_vline, tui_border_vline, @@ -74,8 +107,23 @@ box_win (struct tui_win_info *win_info, box (win, tui_border_vline, tui_border_hline); #endif if (!win_info->title.empty ()) - mvwaddstr (win, 0, 3, win_info->title.c_str ()); + { + /* Emit "+-TITLE-+" -- so 2 characters on the right and 2 on + the left. */ + int max_len = win_info->width - 2 - 2; + + if (win_info->title.size () <= max_len) + mvwaddstr (win, 0, 2, win_info->title.c_str ()); + else + { + std::string truncated + = "..." + win_info->title.substr (win_info->title.size () + - max_len + 3); + mvwaddstr (win, 0, 2, truncated.c_str ()); + } + } wattroff (win, attrs); + tui_apply_style (win, ui_file_style ()); } @@ -83,7 +131,7 @@ void tui_unhighlight_win (struct tui_win_info *win_info) { if (win_info != NULL - && win_info->can_highlight + && win_info->can_box () && win_info->handle != NULL) { box_win (win_info, false); @@ -97,7 +145,7 @@ void tui_highlight_win (struct tui_win_info *win_info) { if (win_info != NULL - && win_info->can_highlight + && win_info->can_box () && win_info->handle != NULL) { box_win (win_info, true); @@ -109,7 +157,7 @@ tui_highlight_win (struct tui_win_info *win_info) void tui_win_info::check_and_display_highlight_if_needed () { - if (can_highlight) + if (can_box ()) { if (is_highlighted) tui_highlight_win (this); @@ -122,9 +170,13 @@ tui_win_info::check_and_display_highlight_if_needed () void tui_gen_win_info::make_window () { - handle = newwin (height, width, origin.y, origin.x); + handle.reset (newwin (height, width, y, x)); if (handle != NULL) - scrollok (handle, TRUE); + { + if (suppress_output) + wnoutrefresh (handle.get ()); + scrollok (handle.get (), TRUE); + } } void @@ -147,19 +199,7 @@ tui_gen_win_info::make_visible (bool visible) if (visible) make_window (); else - { - tui_delete_win (handle); - handle = NULL; - } -} - -/* See tui-wingeneral.h. */ - -void -tui_make_all_invisible (void) -{ - for (tui_win_info *win_info : all_tui_windows ()) - win_info->make_visible (false); + handle.reset (nullptr); } /* Function to refresh all the windows currently displayed. */ @@ -177,8 +217,3 @@ tui_refresh_all () if (locator->is_visible ()) locator->refresh_window (); } - - -/********************************* -** Local Static Functions -*********************************/