aarch64: Normalize and sort feature bit macros
[deliverable/binutils-gdb.git] / gdb / tui / tui-wingeneral.c
index da3aaa681ee4aa1ac3004a3566834e20e5459d7e..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 (struct tui_gen_win_info * winInfo)
-{
-  if (winInfo->type == DATA_WIN && winInfo->contentSize > 0)
-    {
-      int i;
-
-      for (i = 0; (i < winInfo->contentSize); i++)
-       {
-         struct tui_gen_win_info * dataItemWinPtr;
+#include "gdb_curses.h"
 
-         dataItemWinPtr = &((tui_win_content)
-                            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 (struct tui_gen_win_info * 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 (struct tui_win_info * winInfo)
+tui_wrefresh (WINDOW *win)
 {
-  if (m_winPtrNotNull (winInfo) && winInfo->generic.handle != (WINDOW *) NULL)
-    {
-      boxWin ((struct tui_gen_win_info *) winInfo, NO_HILITE);
-      wrefresh (winInfo->generic.handle);
-      m_setWinHighlightOff (winInfo);
-    }
+  if (!suppress_output)
+    wrefresh (win);
 }
 
+/* See tui-data.h.  */
 
 void
-tui_highlight_win (struct tui_win_info * winInfo)
+tui_gen_win_info::refresh_window ()
 {
-  if (m_winPtrNotNull (winInfo) &&
-      winInfo->canHighlight && winInfo->generic.handle != (WINDOW *) NULL)
-    {
-      boxWin ((struct tui_gen_win_info *) winInfo, HILITE);
-      wrefresh (winInfo->generic.handle);
-      m_setWinHighlightOn (winInfo);
-    }
+  if (handle != NULL)
+    tui_wrefresh (handle.get ());
 }
 
-void
-tui_check_and_display_highlight_if_needed (struct tui_win_info * 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 (struct tui_gen_win_info * 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 ((struct tui_gen_win_info *) 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 (struct tui_win_info * * list)
+tui_refresh_all ()
 {
-  TuiWinType 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]->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.033377 seconds and 4 git commands to generate.