aarch64: Normalize and sort feature bit macros
[deliverable/binutils-gdb.git] / gdb / tui / tui-wingeneral.c
index f900eab0133cf28394de75f904611845d3d3c618..35468d43abcd40612fe5a0f7de92246f077b36ac 100644 (file)
@@ -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.
 
 #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.  */
+
+tui_suppress_output::~tui_suppress_output ()
+{
+  suppress_output = m_saved_suppress;
+  if (!suppress_output)
+    doupdate ();
+
+  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);
+  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
@@ -58,12 +85,18 @@ box_win (struct tui_win_info *win_info,
   WINDOW *win;
   int attrs;
 
-  win = win_info->handle;
+  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,
@@ -74,8 +107,23 @@ box_win (struct tui_win_info *win_info,
   box (win, tui_border_vline, tui_border_hline);
 #endif
   if (!win_info->title.empty ())
-    mvwaddstr (win, 0, 3, win_info->title.c_str ());
+    {
+      /* 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 ());
 }
 
 
@@ -83,7 +131,7 @@ 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, false);
@@ -97,7 +145,7 @@ 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, true);
@@ -109,7 +157,7 @@ tui_highlight_win (struct tui_win_info *win_info)
 void
 tui_win_info::check_and_display_highlight_if_needed ()
 {
-  if (can_highlight)
+  if (can_box ())
     {
       if (is_highlighted)
        tui_highlight_win (this);
@@ -122,9 +170,13 @@ tui_win_info::check_and_display_highlight_if_needed ()
 void
 tui_gen_win_info::make_window ()
 {
-  handle = newwin (height, width, origin.y, origin.x);
+  handle.reset (newwin (height, width, y, x));
   if (handle != NULL)
-    scrollok (handle, TRUE);
+    {
+      if (suppress_output)
+       wnoutrefresh (handle.get ());
+      scrollok (handle.get (), TRUE);
+    }
 }
 
 void
@@ -147,19 +199,7 @@ tui_gen_win_info::make_visible (bool visible)
   if (visible)
     make_window ();
   else
-    {
-      tui_delete_win (handle);
-      handle = NULL;
-    }
-}
-
-/* See tui-wingeneral.h.  */
-
-void
-tui_make_all_invisible (void)
-{
-  for (tui_win_info *win_info : all_tui_windows ())
-    win_info->make_visible (false);
+    handle.reset (nullptr);
 }
 
 /* Function to refresh all the windows currently displayed.  */
@@ -177,8 +217,3 @@ tui_refresh_all ()
   if (locator->is_visible ())
     locator->refresh_window ();
 }
-
-
-/*********************************
-** Local Static Functions
-*********************************/
This page took 0.032326 seconds and 4 git commands to generate.