X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Ftui%2Ftui-wingeneral.c;h=235c17c5fa28a36b68f37dd883bec32c7f89601e;hb=7226433c44e3792aeea6ad19c54cd3056ea4308e;hp=cad7b9a631c1262f037419df5aadc0f309b47a0f;hpb=dd1abb8c9ec3fa79e36e4e14033f4309741442c1;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/tui/tui-wingeneral.c b/gdb/tui/tui-wingeneral.c index cad7b9a631..235c17c5fa 100644 --- a/gdb/tui/tui-wingeneral.c +++ b/gdb/tui/tui-wingeneral.c @@ -1,7 +1,6 @@ /* General window behavior. - Copyright 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, - Inc. + Copyright (C) 1998-2019 Free Software Foundation, Inc. Contributed by Hewlett-Packard Company. @@ -9,7 +8,7 @@ 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 2 of the License, or + 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, @@ -18,264 +17,180 @@ 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, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ + along with this program. If not, see . */ #include "defs.h" #include "tui/tui.h" #include "tui/tui-data.h" #include "tui/tui-wingeneral.h" #include "tui/tui-win.h" +#include "tui/tui-stack.h" -#ifdef HAVE_NCURSES_H -#include -#else -#ifdef HAVE_CURSES_H -#include -#endif -#endif +#include "gdb_curses.h" /*********************** ** PUBLIC FUNCTIONS ***********************/ -/* Refresh the window. */ +/* See tui-data.h. */ + void -tui_refresh_win (TuiGenWinInfoPtr winInfo) +tui_gen_win_info::refresh_window () { - if (winInfo->type == DATA_WIN && winInfo->contentSize > 0) - { - int i; - - for (i = 0; (i < winInfo->contentSize); i++) - { - TuiGenWinInfoPtr dataItemWinPtr; - - dataItemWinPtr = &((TuiWinContent) - winInfo->content)[i]->whichElement.dataWindow; - if (m_genWinPtrNotNull (dataItemWinPtr) && - dataItemWinPtr->handle != (WINDOW *) NULL) - wrefresh (dataItemWinPtr->handle); - } - } - else if (winInfo->type == CMD_WIN) - { - /* Do nothing */ - } - else - { - if (winInfo->handle != (WINDOW *) NULL) - wrefresh (winInfo->handle); - } - - return; + if (handle != NULL) + wrefresh (handle); } - -/* Function to delete the curses window, checking for NULL. */ +/* Function to delete the curses window, checking for NULL. */ void -tui_delete_win (WINDOW * window) +tui_delete_win (WINDOW *window) { - if (window != (WINDOW *) NULL) + if (window != NULL) delwin (window); - - return; } /* Draw a border arround the window. */ -void -boxWin (TuiGenWinInfoPtr winInfo, int highlightFlag) +static void +box_win (struct tui_win_info *win_info, + bool highlight_flag) { - if (winInfo && winInfo->handle) + WINDOW *win; + int attrs; + + win = win_info->handle; + if (highlight_flag) + attrs = tui_active_border_attrs; + else + attrs = tui_border_attrs; + + 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); +#else + box (win, tui_border_vline, tui_border_hline); +#endif + if (!win_info->title.empty ()) { - WINDOW *win; - int attrs; + /* Emit "+-TITLE-+" -- so 2 characters on the right and 2 on + the left. */ + int max_len = win_info->width - 2 - 2; - win = winInfo->handle; - if (highlightFlag == HILITE) - attrs = tui_active_border_attrs; + if (win_info->title.size () <= max_len) + mvwaddstr (win, 0, 3, win_info->title.c_str ()); else - attrs = tui_border_attrs; - - wattron (win, attrs); - 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); - if (winInfo->title) - mvwaddstr (win, 0, 3, winInfo->title); - wattroff (win, attrs); + { + std::string truncated + = "..." + win_info->title.substr (win_info->title.size () + - max_len + 3); + mvwaddstr (win, 0, 3, truncated.c_str ()); + } } + wattroff (win, attrs); } void -tui_unhighlight_win (TuiWinInfoPtr winInfo) +tui_unhighlight_win (struct tui_win_info *win_info) { - if (m_winPtrNotNull (winInfo) && winInfo->generic.handle != (WINDOW *) NULL) + if (win_info != NULL + && win_info->can_highlight + && win_info->handle != NULL) { - boxWin ((TuiGenWinInfoPtr) winInfo, NO_HILITE); - wrefresh (winInfo->generic.handle); - m_setWinHighlightOff (winInfo); + box_win (win_info, false); + win_info->refresh_window (); + win_info->set_highlight (false); } } void -tui_highlight_win (TuiWinInfoPtr winInfo) +tui_highlight_win (struct tui_win_info *win_info) { - if (m_winPtrNotNull (winInfo) && - winInfo->canHighlight && winInfo->generic.handle != (WINDOW *) NULL) + if (win_info != NULL + && win_info->can_highlight + && win_info->handle != NULL) { - boxWin ((TuiGenWinInfoPtr) winInfo, HILITE); - wrefresh (winInfo->generic.handle); - m_setWinHighlightOn (winInfo); + box_win (win_info, true); + win_info->refresh_window (); + win_info->set_highlight (true); } } void -tui_check_and_display_highlight_if_needed (TuiWinInfoPtr winInfo) +tui_win_info::check_and_display_highlight_if_needed () { - if (m_winPtrNotNull (winInfo) && winInfo->generic.type != CMD_WIN) + if (can_highlight) { - if (winInfo->isHighlighted) - tui_highlight_win (winInfo); + if (is_highlighted) + tui_highlight_win (this); else - tui_unhighlight_win (winInfo); - + tui_unhighlight_win (this); } - return; } void -tui_make_window (TuiGenWinInfoPtr winInfo, int boxIt) +tui_gen_win_info::make_window () { - WINDOW *handle; - - handle = newwin (winInfo->height, - winInfo->width, - winInfo->origin.y, - winInfo->origin.x); - winInfo->handle = handle; - if (handle != (WINDOW *) NULL) - { - if (boxIt == BOX_WINDOW) - boxWin (winInfo, NO_HILITE); - winInfo->isVisible = TRUE; - scrollok (handle, TRUE); - } + handle = newwin (height, width, origin.y, origin.x); + if (handle != NULL) + scrollok (handle, 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 again when making it visible. */ -static void -make_visible (struct tui_gen_win_info *win_info, int visible) +void +tui_gen_win_info::make_visible (bool visible) { - /* Don't tear down/recreate command window */ - if (win_info->type == CMD_WIN) + if (is_visible () == visible) return; if (visible) + make_window (); + else { - if (!win_info->isVisible) - { - tui_make_window (win_info, - (win_info->type != CMD_WIN - && !m_winIsAuxillary (win_info->type))); - win_info->isVisible = TRUE; - } - } - else if (!visible && - win_info->isVisible && win_info->handle != (WINDOW *) NULL) - { - win_info->isVisible = FALSE; - tui_delete_win (win_info->handle); - win_info->handle = (WINDOW *) NULL; - } - - return; -} - -void -tui_make_visible (struct tui_gen_win_info *win_info) -{ - make_visible (win_info, 1); -} - -void -tui_make_invisible (struct tui_gen_win_info *win_info) -{ - make_visible (win_info, 0); -} - - -/* Makes all windows invisible (except the command and locator windows). */ -static void -make_all_visible (int visible) -{ - int i; - - for (i = 0; i < MAX_MAJOR_WINDOWS; i++) - { - if (m_winPtrNotNull (winList[i]) && - ((winList[i])->generic.type) != CMD_WIN) - { - if (m_winIsSourceType ((winList[i])->generic.type)) - make_visible ((winList[i])->detail.sourceInfo.executionInfo, - visible); - make_visible ((TuiGenWinInfoPtr) winList[i], visible); - } + tui_delete_win (handle); + handle = NULL; } - - return; } -void -tui_make_all_visible (void) -{ - make_all_visible (1); -} +/* See tui-wingeneral.h. */ void tui_make_all_invisible (void) { - make_all_visible (0); + for (tui_win_info *win_info : all_tui_windows ()) + win_info->make_visible (false); } /* Function to refresh all the windows currently displayed. */ void -tui_refresh_all (TuiWinInfoPtr * list) +tui_refresh_all () { - TuiWinType type; - TuiGenWinInfoPtr 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]->generic.isVisible) - { - if (type == SRC_WIN || type == DISASSEM_WIN) - { - touchwin (list[type]->detail.sourceInfo.executionInfo->handle); - tui_refresh_win (list[type]->detail.sourceInfo.executionInfo); - } - touchwin (list[type]->generic.handle); - tui_refresh_win (&list[type]->generic); - } - } - if (locator->isVisible) + for (tui_win_info *win_info : all_tui_windows ()) { - touchwin (locator->handle); - tui_refresh_win (locator); + if (win_info->is_visible ()) + win_info->refresh_window (); } - - return; -} /* refreshAll */ + if (locator->is_visible ()) + locator->refresh_window (); +} /*********************************