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 ();
+}
/*********************************