aarch64: Normalize and sort feature bit macros
[deliverable/binutils-gdb.git] / gdb / tui / tui-wingeneral.c
index cad7b9a631c1262f037419df5aadc0f309b47a0f..35468d43abcd40612fe5a0f7de92246f077b36ac 100644 (file)
@@ -1,7 +1,6 @@
 /* General window behavior.
 
-   Copyright 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation,
-   Inc.
+   Copyright (C) 1998-2020 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,
    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 <http://www.gnu.org/licenses/>.  */
 
 #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"
 
-#ifdef HAVE_NCURSES_H       
-#include <ncurses.h>
-#else
-#ifdef HAVE_CURSES_H
-#include <curses.h>
-#endif
-#endif
-
-/***********************
-** PUBLIC FUNCTIONS
-***********************/
-
-/* Refresh the window.   */
-void
-tui_refresh_win (TuiGenWinInfoPtr winInfo)
-{
-  if (winInfo->type == DATA_WIN && winInfo->contentSize > 0)
-    {
-      int i;
-
-      for (i = 0; (i < winInfo->contentSize); i++)
-       {
-         TuiGenWinInfoPtr dataItemWinPtr;
+#include "gdb_curses.h"
 
-         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);
-    }
+/* 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.  */
 
-  return;
-}
+static bool suppress_output;
 
+/* See tui-data.h.  */
 
-/* Function to delete the curses window, checking for NULL.   */
-void
-tui_delete_win (WINDOW * window)
+tui_suppress_output::tui_suppress_output ()
+  : m_saved_suppress (suppress_output)
 {
-  if (window != (WINDOW *) NULL)
-    delwin (window);
+  suppress_output = true;
 
-  return;
+  for (const auto &win : all_tui_windows ())
+    win->no_refresh ();
 }
 
+/* See tui-data.h.  */
 
-/* Draw a border arround the window.  */
-void
-boxWin (TuiGenWinInfoPtr winInfo, int highlightFlag)
+tui_suppress_output::~tui_suppress_output ()
 {
-  if (winInfo && winInfo->handle)
-    {
-      WINDOW *win;
-      int attrs;
+  suppress_output = m_saved_suppress;
+  if (!suppress_output)
+    doupdate ();
 
-      win = winInfo->handle;
-      if (highlightFlag == HILITE)
-        attrs = tui_active_border_attrs;
-      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);
-    }
+  for (const auto &win : all_tui_windows ())
+    win->refresh_window ();
 }
 
+/* See tui-data.h.  */
 
 void
-tui_unhighlight_win (TuiWinInfoPtr winInfo)
+tui_wrefresh (WINDOW *win)
 {
-  if (m_winPtrNotNull (winInfo) && winInfo->generic.handle != (WINDOW *) NULL)
-    {
-      boxWin ((TuiGenWinInfoPtr) winInfo, NO_HILITE);
-      wrefresh (winInfo->generic.handle);
-      m_setWinHighlightOff (winInfo);
-    }
+  if (!suppress_output)
+    wrefresh (win);
 }
 
+/* See tui-data.h.  */
 
 void
-tui_highlight_win (TuiWinInfoPtr winInfo)
+tui_gen_win_info::refresh_window ()
 {
-  if (m_winPtrNotNull (winInfo) &&
-      winInfo->canHighlight && winInfo->generic.handle != (WINDOW *) NULL)
-    {
-      boxWin ((TuiGenWinInfoPtr) winInfo, HILITE);
-      wrefresh (winInfo->generic.handle);
-      m_setWinHighlightOn (winInfo);
-    }
+  if (handle != NULL)
+    tui_wrefresh (handle.get ());
 }
 
-void
-tui_check_and_display_highlight_if_needed (TuiWinInfoPtr winInfo)
+/* Draw a border arround the window.  */
+static void
+box_win (struct tui_win_info *win_info, 
+        bool highlight_flag)
 {
-  if (m_winPtrNotNull (winInfo) && winInfo->generic.type != CMD_WIN)
+  WINDOW *win;
+  int 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);
+#else
+  box (win, tui_border_vline, tui_border_hline);
+#endif
+  if (!win_info->title.empty ())
     {
-      if (winInfo->isHighlighted)
-       tui_highlight_win (winInfo);
-      else
-       tui_unhighlight_win (winInfo);
+      /* 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 ());
+       }
     }
-  return;
+  wattroff (win, attrs);
+  tui_apply_style (win, ui_file_style ());
 }
 
 
 void
-tui_make_window (TuiGenWinInfoPtr winInfo, int boxIt)
+tui_unhighlight_win (struct tui_win_info *win_info)
 {
-  WINDOW *handle;
-
-  handle = newwin (winInfo->height,
-                  winInfo->width,
-                  winInfo->origin.y,
-                  winInfo->origin.x);
-  winInfo->handle = handle;
-  if (handle != (WINDOW *) NULL)
+  if (win_info != NULL 
+      && win_info->can_box ()
+      && win_info->handle != NULL)
     {
-      if (boxIt == BOX_WINDOW)
-       boxWin (winInfo, NO_HILITE);
-      winInfo->isVisible = TRUE;
-      scrollok (handle, TRUE);
+      box_win (win_info, false);
+      win_info->refresh_window ();
+      win_info->set_highlight (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_highlight_win (struct tui_win_info *win_info)
 {
-  /* Don't tear down/recreate command window */
-  if (win_info->type == CMD_WIN)
-    return;
-
-  if (visible)
-    {
-      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)
+  if (win_info != NULL
+      && win_info->can_box ()
+      && win_info->handle != NULL)
     {
-      win_info->isVisible = FALSE;
-      tui_delete_win (win_info->handle);
-      win_info->handle = (WINDOW *) NULL;
+      box_win (win_info, true);
+      win_info->refresh_window ();
+      win_info->set_highlight (true);
     }
-
-  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)
+tui_win_info::check_and_display_highlight_if_needed ()
 {
-  make_visible (win_info, 0);
+  if (can_box ())
+    {
+      if (is_highlighted)
+       tui_highlight_win (this);
+      else
+       tui_unhighlight_win (this);
+    }
 }
 
 
-/* Makes all windows invisible (except the command and locator windows).   */
-static void
-make_all_visible (int visible)
+void
+tui_gen_win_info::make_window ()
 {
-  int i;
-
-  for (i = 0; i < MAX_MAJOR_WINDOWS; i++)
+  handle.reset (newwin (height, width, y, x));
+  if (handle != NULL)
     {
-      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);
-       }
+      if (suppress_output)
+       wnoutrefresh (handle.get ());
+      scrollok (handle.get (), TRUE);
     }
-
-  return;
 }
 
 void
-tui_make_all_visible (void)
+tui_win_info::make_window ()
 {
-  make_all_visible (1);
+  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.  */
 void
-tui_make_all_invisible (void)
+tui_gen_win_info::make_visible (bool visible)
 {
-  make_all_visible (0);
+  if (is_visible () == visible)
+    return;
+
+  if (visible)
+    make_window ();
+  else
+    handle.reset (nullptr);
 }
 
 /* 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 */
-
-
-/*********************************
-** Local Static Functions
-*********************************/
+  if (locator->is_visible ())
+    locator->refresh_window ();
+}
This page took 0.05896 seconds and 4 git commands to generate.