Allow using less horizontal space in TUI source window
[deliverable/binutils-gdb.git] / gdb / tui / tui-wingeneral.c
CommitLineData
f377b406 1/* General window behavior.
f33c6cbf 2
42a4f53d 3 Copyright (C) 1998-2019 Free Software Foundation, Inc.
f33c6cbf 4
f377b406
SC
5 Contributed by Hewlett-Packard Company.
6
7 This file is part of GDB.
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
a9762ec7 11 the Free Software Foundation; either version 3 of the License, or
f377b406
SC
12 (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
a9762ec7 20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c906108c 21
96ec9981 22#include "defs.h"
d7b2e967
AC
23#include "tui/tui.h"
24#include "tui/tui-data.h"
25#include "tui/tui-wingeneral.h"
26#include "tui/tui-win.h"
f2dda477 27#include "tui/tui-stack.h"
f33c6cbf 28
6a83354a 29#include "gdb_curses.h"
4e8f7a8b 30
5b81daba
TT
31/* See tui-data.h. */
32
c906108c 33void
5b81daba 34tui_gen_win_info::refresh_window ()
c906108c 35{
5b81daba 36 if (handle != NULL)
7523da63 37 wrefresh (handle.get ());
5b81daba 38}
c906108c 39
af101512 40/* Draw a border arround the window. */
2c0b251b 41static void
ab0e1f1a 42box_win (struct tui_win_info *win_info,
072272ce 43 bool highlight_flag)
c906108c 44{
108e13ab
TT
45 WINDOW *win;
46 int attrs;
af101512 47
7523da63 48 win = win_info->handle.get ();
108e13ab
TT
49 if (highlight_flag)
50 attrs = tui_active_border_attrs;
51 else
52 attrs = tui_border_attrs;
af101512 53
108e13ab 54 wattron (win, attrs);
8b9cf735 55#ifdef HAVE_WBORDER
108e13ab
TT
56 wborder (win, tui_border_vline, tui_border_vline,
57 tui_border_hline, tui_border_hline,
58 tui_border_ulcorner, tui_border_urcorner,
59 tui_border_llcorner, tui_border_lrcorner);
8b9cf735 60#else
108e13ab 61 box (win, tui_border_vline, tui_border_hline);
8b9cf735 62#endif
108e13ab 63 if (!win_info->title.empty ())
8634b462
TT
64 {
65 /* Emit "+-TITLE-+" -- so 2 characters on the right and 2 on
66 the left. */
67 int max_len = win_info->width - 2 - 2;
68
69 if (win_info->title.size () <= max_len)
70 mvwaddstr (win, 0, 3, win_info->title.c_str ());
71 else
72 {
73 std::string truncated
74 = "..." + win_info->title.substr (win_info->title.size ()
75 - max_len + 3);
76 mvwaddstr (win, 0, 3, truncated.c_str ());
77 }
78 }
108e13ab 79 wattroff (win, attrs);
af101512 80}
c906108c
SS
81
82
c906108c 83void
5b6fe301 84tui_unhighlight_win (struct tui_win_info *win_info)
c906108c 85{
e5908723 86 if (win_info != NULL
0b026263 87 && win_info->can_box ()
cb2ce893 88 && win_info->handle != NULL)
c906108c 89 {
072272ce 90 box_win (win_info, false);
cf82af05 91 win_info->refresh_window ();
214a5cbe 92 win_info->set_highlight (false);
c906108c 93 }
ec7d9e56 94}
c906108c
SS
95
96
c906108c 97void
5b6fe301 98tui_highlight_win (struct tui_win_info *win_info)
c906108c 99{
6d012f14 100 if (win_info != NULL
0b026263 101 && win_info->can_box ()
cb2ce893 102 && win_info->handle != NULL)
c906108c 103 {
072272ce 104 box_win (win_info, true);
cf82af05 105 win_info->refresh_window ();
214a5cbe 106 win_info->set_highlight (true);
c906108c 107 }
ec7d9e56 108}
c906108c 109
c906108c 110void
b4ef5aeb 111tui_win_info::check_and_display_highlight_if_needed ()
c906108c 112{
0b026263 113 if (can_box ())
c906108c 114 {
b4ef5aeb
TT
115 if (is_highlighted)
116 tui_highlight_win (this);
c906108c 117 else
b4ef5aeb 118 tui_unhighlight_win (this);
c906108c 119 }
ec7d9e56 120}
c906108c
SS
121
122
c906108c 123void
ab0e1f1a 124tui_gen_win_info::make_window ()
c906108c 125{
7523da63 126 handle.reset (newwin (height, width, origin.y, origin.x));
cafb3438 127 if (handle != NULL)
7523da63 128 scrollok (handle.get (), TRUE);
bc712bbf 129}
c906108c 130
ab0e1f1a
TT
131void
132tui_win_info::make_window ()
133{
134 tui_gen_win_info::make_window ();
135 if (handle != NULL && can_box ())
072272ce 136 box_win (this, false);
ab0e1f1a 137}
c906108c 138
ec7d9e56
AC
139/* We can't really make windows visible, or invisible. So we have to
140 delete the entire window when making it visible, and create it
141 again when making it visible. */
48a3bd16
TT
142void
143tui_gen_win_info::make_visible (bool visible)
c906108c 144{
2d83e710 145 if (is_visible () == visible)
8e3cfd09 146 return;
8e3cfd09 147
c906108c 148 if (visible)
ab0e1f1a 149 make_window ();
8e3cfd09 150 else
7523da63 151 handle.reset (nullptr);
ec7d9e56 152}
c906108c 153
3f3ffe54 154/* See tui-wingeneral.h. */
ec7d9e56 155
ec7d9e56
AC
156void
157tui_make_all_invisible (void)
158{
3f3ffe54
TT
159 for (tui_win_info *win_info : all_tui_windows ())
160 win_info->make_visible (false);
ec7d9e56
AC
161}
162
163/* Function to refresh all the windows currently displayed. */
c906108c 164
c906108c 165void
1ce3e844 166tui_refresh_all ()
c906108c 167{
3add462f 168 struct tui_locator_window *locator = tui_locator_win_info_ptr ();
c906108c 169
1ce3e844 170 for (tui_win_info *win_info : all_tui_windows ())
c906108c 171 {
2d83e710 172 if (win_info->is_visible ())
fd6c75ee 173 win_info->refresh_window ();
c906108c 174 }
2d83e710 175 if (locator->is_visible ())
fd6c75ee 176 locator->refresh_window ();
6ba8e26f 177}
This page took 2.429797 seconds and 4 git commands to generate.