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