X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Ftui%2Ftui-wingeneral.c;h=35468d43abcd40612fe5a0f7de92246f077b36ac;hb=359157df2087894563a900e5f63299b42f460be2;hp=98eb5abde16a0c8720930faaeb3ab1c98cd9d008;hpb=bbc228ee056cd006e971d5f1cb70ae0f69c1eb36;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/tui/tui-wingeneral.c b/gdb/tui/tui-wingeneral.c index 98eb5abde1..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,85 +22,108 @@ #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. */ -void -tui_data_window::refresh_window () +tui_suppress_output::~tui_suppress_output () { - if (content_size > 0) - { - for (int i = 0; i < content_size; i++) - { - struct tui_gen_win_info *data_item_win_ptr; + suppress_output = m_saved_suppress; + if (!suppress_output) + doupdate (); - data_item_win_ptr = content[i]->which_element.data_window; - if (data_item_win_ptr != NULL - && data_item_win_ptr->handle != NULL) - wrefresh (data_item_win_ptr->handle); - } - } - else - tui_gen_win_info::refresh_window (); + 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); - - return; + 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 -box_win (struct tui_gen_win_info *win_info, - int highlight_flag) +box_win (struct tui_win_info *win_info, + bool highlight_flag) { - if (win_info && win_info->handle) - { - WINDOW *win; - int attrs; + WINDOW *win; + int attrs; - win = win_info->handle; - if (highlight_flag == HILITE) - attrs = tui_active_border_attrs; - else - attrs = tui_border_attrs; - - wattron (win, attrs); + 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, - tui_border_hline, tui_border_hline, - tui_border_ulcorner, tui_border_urcorner, - tui_border_llcorner, tui_border_lrcorner); + wborder (win, tui_border_vline, tui_border_vline, + tui_border_hline, tui_border_hline, + tui_border_ulcorner, tui_border_urcorner, + tui_border_llcorner, tui_border_lrcorner); #else - box (win, tui_border_vline, tui_border_hline); + box (win, tui_border_vline, tui_border_hline); #endif - if (win_info->title) - mvwaddstr (win, 0, 3, win_info->title); - wattroff (win, attrs); + if (!win_info->title.empty ()) + { + /* 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 ()); } @@ -108,11 +131,11 @@ 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, NO_HILITE); - wrefresh (win_info->handle); + box_win (win_info, false); + win_info->refresh_window (); win_info->set_highlight (false); } } @@ -122,49 +145,47 @@ 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, HILITE); - wrefresh (win_info->handle); + box_win (win_info, true); + win_info->refresh_window (); win_info->set_highlight (true); } } void -tui_check_and_display_highlight_if_needed (struct tui_win_info *win_info) +tui_win_info::check_and_display_highlight_if_needed () { - if (win_info != NULL && win_info->type != CMD_WIN) + if (can_box ()) { - if (win_info->is_highlighted) - tui_highlight_win (win_info); + if (is_highlighted) + tui_highlight_win (this); else - tui_unhighlight_win (win_info); - + tui_unhighlight_win (this); } - return; } void -tui_make_window (struct tui_gen_win_info *win_info, enum tui_box box_it) +tui_gen_win_info::make_window () { - WINDOW *handle; - - handle = newwin (win_info->height, - win_info->width, - win_info->origin.y, - win_info->origin.x); - win_info->handle = handle; + handle.reset (newwin (height, width, y, x)); if (handle != NULL) { - if (box_it == BOX_WINDOW) - box_win (win_info, NO_HILITE); - win_info->is_visible = true; - scrollok (handle, TRUE); + if (suppress_output) + wnoutrefresh (handle.get ()); + scrollok (handle.get (), TRUE); } } +void +tui_win_info::make_window () +{ + tui_gen_win_info::make_window (); + if (handle != NULL && can_box ()) + box_win (this, false); +} /* We can't really make windows visible, or invisible. So we have to delete the entire window when making it visible, and create it @@ -172,115 +193,27 @@ tui_make_window (struct tui_gen_win_info *win_info, enum tui_box box_it) void tui_gen_win_info::make_visible (bool visible) { - if (visible) - { - if (!is_visible) - { - tui_make_window (this, (tui_win_is_auxillary (type) - ? DONT_BOX_WINDOW : BOX_WINDOW)); - is_visible = true; - } - } - else if (!visible - && is_visible - && handle != NULL) - { - is_visible = false; - tui_delete_win (handle); - handle = NULL; - } -} + if (is_visible () == visible) + return; -void -tui_make_visible (struct tui_gen_win_info *win_info) -{ - win_info->make_visible (true); -} - -void -tui_make_invisible (struct tui_gen_win_info *win_info) -{ - win_info->make_visible (false); -} - -/* See tui-data.h. */ - -void -tui_source_window_base::make_visible (bool visible) -{ - if (execution_info != nullptr) - execution_info->make_visible (visible); - tui_win_info::make_visible (visible); -} - -/* Makes all windows invisible (except the command and locator - windows). */ -static void -make_all_visible (bool visible) -{ - int i; - - for (i = 0; i < MAX_MAJOR_WINDOWS; i++) - { - if (tui_win_list[i] != NULL) - tui_win_list[i]->make_visible (visible); - } - - return; -} - -void -tui_make_all_visible (void) -{ - make_all_visible (true); -} - -void -tui_make_all_invisible (void) -{ - make_all_visible (false); -} - -/* See tui-data.h. */ - -void -tui_win_info::refresh () -{ - touchwin (handle); - refresh_window (); -} - -/* See tui-data.h. */ - -void -tui_source_window_base::refresh () -{ - touchwin (execution_info->handle); - execution_info->refresh_window (); - tui_win_info::refresh (); + if (visible) + make_window (); + else + handle.reset (nullptr); } /* Function to refresh all the windows currently displayed. */ void -tui_refresh_all (struct tui_win_info **list) +tui_refresh_all () { - int type; - struct tui_gen_win_info *locator = tui_locator_win_info_ptr (); + struct tui_locator_window *locator = tui_locator_win_info_ptr (); - for (type = SRC_WIN; (type < MAX_MAJOR_WINDOWS); type++) - { - if (list[type] && list[type]->is_visible) - list[type]->refresh (); - } - if (locator->is_visible) + for (tui_win_info *win_info : all_tui_windows ()) { - touchwin (locator->handle); - locator->refresh_window (); + if (win_info->is_visible ()) + win_info->refresh_window (); } + if (locator->is_visible ()) + locator->refresh_window (); } - - -/********************************* -** Local Static Functions -*********************************/