/* 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
-***********************/
-
/* See tui-data.h. */
void
tui_gen_win_info::refresh_window ()
{
if (handle != NULL)
- {
- touchwin (handle);
- wrefresh (handle);
- }
-}
-
-/* Function to delete the curses window, checking for NULL. */
-void
-tui_delete_win (WINDOW *window)
-{
- if (window != NULL)
- delwin (window);
+ wrefresh (handle.get ());
}
-
/* Draw a border arround the window. */
static void
-box_win (struct tui_gen_win_info *win_info,
- int highlight_flag)
+box_win (struct tui_win_info *win_info,
+ bool highlight_flag)
{
- if (win_info && win_info->handle)
- {
- WINDOW *win;
- int attrs;
-
- win = win_info->handle;
- if (highlight_flag == HILITE)
- attrs = tui_active_border_attrs;
- else
- attrs = tui_border_attrs;
+ WINDOW *win;
+ int attrs;
- wattron (win, 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. */
+ 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);
+ 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);
+ box (win, tui_border_vline, tui_border_hline);
#endif
- if (win_info->title)
- mvwaddstr (win, 0, 3, win_info->title);
- wattroff (win, attrs);
+ if (!win_info->title.empty ())
+ {
+ /* 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, 3, win_info->title.c_str ());
+ else
+ {
+ std::string truncated
+ = "..." + win_info->title.substr (win_info->title.size ()
+ - max_len + 3);
+ mvwaddstr (win, 0, 3, truncated.c_str ());
+ }
}
+ wattroff (win, attrs);
+ tui_apply_style (win, ui_file_style ());
}
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, NO_HILITE);
+ box_win (win_info, false);
win_info->refresh_window ();
win_info->set_highlight (false);
}
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, HILITE);
+ box_win (win_info, true);
win_info->refresh_window ();
win_info->set_highlight (true);
}
void
tui_win_info::check_and_display_highlight_if_needed ()
{
- if (can_highlight)
+ if (can_box ())
{
if (is_highlighted)
tui_highlight_win (this);
void
-tui_make_window (struct tui_gen_win_info *win_info)
+tui_gen_win_info::make_window ()
{
- WINDOW *handle;
-
- handle = newwin (win_info->height,
- win_info->width,
- win_info->origin.y,
- win_info->origin.x);
- win_info->handle = handle;
+ handle.reset (newwin (height, width, y, x));
if (handle != NULL)
- {
- if (win_info->can_box ())
- box_win (win_info, NO_HILITE);
- scrollok (handle, TRUE);
- }
+ scrollok (handle.get (), 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
return;
if (visible)
- tui_make_window (this);
+ make_window ();
else
- {
- tui_delete_win (handle);
- handle = NULL;
- }
+ handle.reset (nullptr);
}
/* See tui-wingeneral.h. */
if (locator->is_visible ())
locator->refresh_window ();
}
-
-
-/*********************************
-** Local Static Functions
-*********************************/