Separate out data 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"
f33c6cbf 27
6a83354a 28#include "gdb_curses.h"
4e8f7a8b 29
c906108c
SS
30/***********************
31** PUBLIC FUNCTIONS
32***********************/
ec7d9e56 33
5b81daba
TT
34/* See tui-data.h. */
35
c906108c 36void
5b81daba 37tui_gen_win_info::refresh_window ()
c906108c 38{
5b81daba
TT
39 if (handle != NULL)
40 wrefresh (handle);
41}
c906108c 42
5b81daba
TT
43/* See tui-data.h. */
44
45void
46tui_data_window::refresh_window ()
47{
21e1c91e 48 if (!regs_content.empty ())
5b81daba 49 {
21e1c91e 50 for (auto &&win : regs_content)
c906108c 51 {
21e1c91e
TT
52 if (win != NULL && win->handle != NULL)
53 wrefresh (win->handle);
c906108c
SS
54 }
55 }
c906108c 56 else
5b81daba 57 tui_gen_win_info::refresh_window ();
ec7d9e56 58}
c906108c 59
1cc6d956 60/* Function to delete the curses window, checking for NULL. */
c906108c 61void
5b6fe301 62tui_delete_win (WINDOW *window)
c906108c 63{
cafb3438 64 if (window != NULL)
c906108c
SS
65 delwin (window);
66
67 return;
ec7d9e56 68}
c906108c
SS
69
70
af101512 71/* Draw a border arround the window. */
2c0b251b 72static void
08ef48c5
MS
73box_win (struct tui_gen_win_info *win_info,
74 int highlight_flag)
c906108c 75{
6d012f14 76 if (win_info && win_info->handle)
c906108c 77 {
af101512
SC
78 WINDOW *win;
79 int attrs;
80
6d012f14 81 win = win_info->handle;
6ba8e26f 82 if (highlight_flag == HILITE)
af101512 83 attrs = tui_active_border_attrs;
c906108c 84 else
af101512
SC
85 attrs = tui_border_attrs;
86
87 wattron (win, attrs);
8b9cf735 88#ifdef HAVE_WBORDER
af101512
SC
89 wborder (win, tui_border_vline, tui_border_vline,
90 tui_border_hline, tui_border_hline,
91 tui_border_ulcorner, tui_border_urcorner,
92 tui_border_llcorner, tui_border_lrcorner);
8b9cf735
MK
93#else
94 box (win, tui_border_vline, tui_border_hline);
95#endif
6d012f14 96 if (win_info->title)
63a33118 97 mvwaddstr (win, 0, 3, win_info->title);
af101512 98 wattroff (win, attrs);
c906108c 99 }
af101512 100}
c906108c
SS
101
102
c906108c 103void
5b6fe301 104tui_unhighlight_win (struct tui_win_info *win_info)
c906108c 105{
e5908723 106 if (win_info != NULL
bbc228ee 107 && win_info->can_highlight
cb2ce893 108 && win_info->handle != NULL)
c906108c 109 {
cb2ce893
TT
110 box_win (win_info, NO_HILITE);
111 wrefresh (win_info->handle);
214a5cbe 112 win_info->set_highlight (false);
c906108c 113 }
ec7d9e56 114}
c906108c
SS
115
116
c906108c 117void
5b6fe301 118tui_highlight_win (struct tui_win_info *win_info)
c906108c 119{
6d012f14
AC
120 if (win_info != NULL
121 && win_info->can_highlight
cb2ce893 122 && win_info->handle != NULL)
c906108c 123 {
cb2ce893
TT
124 box_win (win_info, HILITE);
125 wrefresh (win_info->handle);
214a5cbe 126 win_info->set_highlight (true);
c906108c 127 }
ec7d9e56 128}
c906108c 129
c906108c 130void
5b6fe301 131tui_check_and_display_highlight_if_needed (struct tui_win_info *win_info)
c906108c 132{
cb2ce893 133 if (win_info != NULL && win_info->type != CMD_WIN)
c906108c 134 {
6d012f14
AC
135 if (win_info->is_highlighted)
136 tui_highlight_win (win_info);
c906108c 137 else
6d012f14 138 tui_unhighlight_win (win_info);
c906108c
SS
139
140 }
141 return;
ec7d9e56 142}
c906108c
SS
143
144
c906108c 145void
17374de4 146tui_make_window (struct tui_gen_win_info *win_info, enum tui_box box_it)
c906108c
SS
147{
148 WINDOW *handle;
149
6d012f14
AC
150 handle = newwin (win_info->height,
151 win_info->width,
152 win_info->origin.y,
153 win_info->origin.x);
154 win_info->handle = handle;
cafb3438 155 if (handle != NULL)
c906108c 156 {
6ba8e26f
AC
157 if (box_it == BOX_WINDOW)
158 box_win (win_info, NO_HILITE);
56122977 159 win_info->is_visible = true;
c906108c 160 scrollok (handle, TRUE);
c906108c 161 }
bc712bbf 162}
c906108c
SS
163
164
ec7d9e56
AC
165/* We can't really make windows visible, or invisible. So we have to
166 delete the entire window when making it visible, and create it
167 again when making it visible. */
48a3bd16
TT
168void
169tui_gen_win_info::make_visible (bool visible)
c906108c 170{
c906108c
SS
171 if (visible)
172 {
48a3bd16 173 if (!is_visible)
c906108c 174 {
17374de4
TT
175 tui_make_window (this, (tui_win_is_auxillary (type)
176 ? DONT_BOX_WINDOW : BOX_WINDOW));
48a3bd16 177 is_visible = true;
c906108c 178 }
c906108c 179 }
e5908723 180 else if (!visible
48a3bd16
TT
181 && is_visible
182 && handle != NULL)
c906108c 183 {
48a3bd16
TT
184 is_visible = false;
185 tui_delete_win (handle);
186 handle = NULL;
c906108c 187 }
ec7d9e56 188}
c906108c 189
ec7d9e56
AC
190void
191tui_make_visible (struct tui_gen_win_info *win_info)
192{
48a3bd16 193 win_info->make_visible (true);
ec7d9e56 194}
c906108c 195
c906108c 196void
ec7d9e56
AC
197tui_make_invisible (struct tui_gen_win_info *win_info)
198{
48a3bd16 199 win_info->make_visible (false);
cda37efb
TT
200}
201
202/* See tui-data.h. */
203
204void
56122977 205tui_source_window_base::make_visible (bool visible)
cda37efb 206{
48a3bd16
TT
207 if (execution_info != nullptr)
208 execution_info->make_visible (visible);
cda37efb
TT
209 tui_win_info::make_visible (visible);
210}
ec7d9e56 211
1cc6d956
MS
212/* Makes all windows invisible (except the command and locator
213 windows). */
ec7d9e56 214static void
56122977 215make_all_visible (bool visible)
c906108c
SS
216{
217 int i;
218
219 for (i = 0; i < MAX_MAJOR_WINDOWS; i++)
220 {
cda37efb
TT
221 if (tui_win_list[i] != NULL)
222 tui_win_list[i]->make_visible (visible);
c906108c
SS
223 }
224
225 return;
ec7d9e56
AC
226}
227
228void
229tui_make_all_visible (void)
230{
56122977 231 make_all_visible (true);
ec7d9e56
AC
232}
233
234void
235tui_make_all_invisible (void)
236{
56122977 237 make_all_visible (false);
ec7d9e56
AC
238}
239
2042b506
TT
240/* See tui-data.h. */
241
242void
243tui_win_info::refresh ()
244{
cb2ce893 245 touchwin (handle);
5b81daba 246 refresh_window ();
2042b506
TT
247}
248
249/* See tui-data.h. */
250
251void
252tui_source_window_base::refresh ()
253{
254 touchwin (execution_info->handle);
5b81daba 255 execution_info->refresh_window ();
2042b506
TT
256 tui_win_info::refresh ();
257}
258
ec7d9e56 259/* Function to refresh all the windows currently displayed. */
c906108c 260
c906108c 261void
5b6fe301 262tui_refresh_all (struct tui_win_info **list)
c906108c 263{
570dc176 264 int type;
3add462f 265 struct tui_locator_window *locator = tui_locator_win_info_ptr ();
c906108c
SS
266
267 for (type = SRC_WIN; (type < MAX_MAJOR_WINDOWS); type++)
268 {
cb2ce893 269 if (list[type] && list[type]->is_visible)
2042b506 270 list[type]->refresh ();
c906108c 271 }
6d012f14 272 if (locator->is_visible)
c906108c
SS
273 {
274 touchwin (locator->handle);
5b81daba 275 locator->refresh_window ();
c906108c 276 }
6ba8e26f 277}
c906108c
SS
278
279
280/*********************************
281** Local Static Functions
282*********************************/
This page took 1.891082 seconds and 4 git commands to generate.