1b725ae77Skettenis /* General window behavior.
2b725ae77Skettenis
3b725ae77Skettenis Copyright 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation,
4b725ae77Skettenis Inc.
5b725ae77Skettenis
6b725ae77Skettenis Contributed by Hewlett-Packard Company.
7b725ae77Skettenis
8b725ae77Skettenis This file is part of GDB.
9b725ae77Skettenis
10b725ae77Skettenis This program is free software; you can redistribute it and/or modify
11b725ae77Skettenis it under the terms of the GNU General Public License as published by
12b725ae77Skettenis the Free Software Foundation; either version 2 of the License, or
13b725ae77Skettenis (at your option) any later version.
14b725ae77Skettenis
15b725ae77Skettenis This program is distributed in the hope that it will be useful,
16b725ae77Skettenis but WITHOUT ANY WARRANTY; without even the implied warranty of
17b725ae77Skettenis MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18b725ae77Skettenis GNU General Public License for more details.
19b725ae77Skettenis
20b725ae77Skettenis You should have received a copy of the GNU General Public License
21b725ae77Skettenis along with this program; if not, write to the Free Software
22b725ae77Skettenis Foundation, Inc., 59 Temple Place - Suite 330,
23b725ae77Skettenis Boston, MA 02111-1307, USA. */
24b725ae77Skettenis
25b725ae77Skettenis #include "defs.h"
26b725ae77Skettenis #include "tui/tui.h"
27b725ae77Skettenis #include "tui/tui-data.h"
28b725ae77Skettenis #include "tui/tui-wingeneral.h"
29b725ae77Skettenis #include "tui/tui-win.h"
30b725ae77Skettenis
31b725ae77Skettenis #include "gdb_curses.h"
32b725ae77Skettenis
33b725ae77Skettenis /***********************
34b725ae77Skettenis ** PUBLIC FUNCTIONS
35b725ae77Skettenis ***********************/
36b725ae77Skettenis
37b725ae77Skettenis /* Refresh the window. */
38b725ae77Skettenis void
tui_refresh_win(struct tui_gen_win_info * win_info)39b725ae77Skettenis tui_refresh_win (struct tui_gen_win_info * win_info)
40b725ae77Skettenis {
41b725ae77Skettenis if (win_info->type == DATA_WIN && win_info->content_size > 0)
42b725ae77Skettenis {
43b725ae77Skettenis int i;
44b725ae77Skettenis
45b725ae77Skettenis for (i = 0; (i < win_info->content_size); i++)
46b725ae77Skettenis {
47b725ae77Skettenis struct tui_gen_win_info * data_item_win_ptr;
48b725ae77Skettenis
49b725ae77Skettenis data_item_win_ptr = &((tui_win_content)
50b725ae77Skettenis win_info->content)[i]->which_element.data_window;
51b725ae77Skettenis if (data_item_win_ptr != NULL
52b725ae77Skettenis && data_item_win_ptr->handle != (WINDOW *) NULL)
53b725ae77Skettenis wrefresh (data_item_win_ptr->handle);
54b725ae77Skettenis }
55b725ae77Skettenis }
56b725ae77Skettenis else if (win_info->type == CMD_WIN)
57b725ae77Skettenis {
58b725ae77Skettenis /* Do nothing */
59b725ae77Skettenis }
60b725ae77Skettenis else
61b725ae77Skettenis {
62b725ae77Skettenis if (win_info->handle != (WINDOW *) NULL)
63b725ae77Skettenis wrefresh (win_info->handle);
64b725ae77Skettenis }
65b725ae77Skettenis
66b725ae77Skettenis return;
67b725ae77Skettenis }
68b725ae77Skettenis
69b725ae77Skettenis
70b725ae77Skettenis /* Function to delete the curses window, checking for NULL. */
71b725ae77Skettenis void
tui_delete_win(WINDOW * window)72b725ae77Skettenis tui_delete_win (WINDOW * window)
73b725ae77Skettenis {
74b725ae77Skettenis if (window != (WINDOW *) NULL)
75b725ae77Skettenis delwin (window);
76b725ae77Skettenis
77b725ae77Skettenis return;
78b725ae77Skettenis }
79b725ae77Skettenis
80b725ae77Skettenis
81b725ae77Skettenis /* Draw a border arround the window. */
82b725ae77Skettenis void
box_win(struct tui_gen_win_info * win_info,int highlight_flag)83b725ae77Skettenis box_win (struct tui_gen_win_info * win_info, int highlight_flag)
84b725ae77Skettenis {
85b725ae77Skettenis if (win_info && win_info->handle)
86b725ae77Skettenis {
87b725ae77Skettenis WINDOW *win;
88b725ae77Skettenis int attrs;
89b725ae77Skettenis
90b725ae77Skettenis win = win_info->handle;
91b725ae77Skettenis if (highlight_flag == HILITE)
92b725ae77Skettenis attrs = tui_active_border_attrs;
93b725ae77Skettenis else
94b725ae77Skettenis attrs = tui_border_attrs;
95b725ae77Skettenis
96b725ae77Skettenis wattron (win, attrs);
97*11efff7fSkettenis #ifdef HAVE_WBORDER
98b725ae77Skettenis wborder (win, tui_border_vline, tui_border_vline,
99b725ae77Skettenis tui_border_hline, tui_border_hline,
100b725ae77Skettenis tui_border_ulcorner, tui_border_urcorner,
101b725ae77Skettenis tui_border_llcorner, tui_border_lrcorner);
102*11efff7fSkettenis #else
103*11efff7fSkettenis box (win, tui_border_vline, tui_border_hline);
104*11efff7fSkettenis #endif
105b725ae77Skettenis if (win_info->title)
106b725ae77Skettenis mvwaddstr (win, 0, 3, win_info->title);
107b725ae77Skettenis wattroff (win, attrs);
108b725ae77Skettenis }
109b725ae77Skettenis }
110b725ae77Skettenis
111b725ae77Skettenis
112b725ae77Skettenis void
tui_unhighlight_win(struct tui_win_info * win_info)113b725ae77Skettenis tui_unhighlight_win (struct tui_win_info * win_info)
114b725ae77Skettenis {
115b725ae77Skettenis if (win_info != NULL && win_info->generic.handle != (WINDOW *) NULL)
116b725ae77Skettenis {
117b725ae77Skettenis box_win ((struct tui_gen_win_info *) win_info, NO_HILITE);
118b725ae77Skettenis wrefresh (win_info->generic.handle);
119b725ae77Skettenis tui_set_win_highlight (win_info, 0);
120b725ae77Skettenis }
121b725ae77Skettenis }
122b725ae77Skettenis
123b725ae77Skettenis
124b725ae77Skettenis void
tui_highlight_win(struct tui_win_info * win_info)125b725ae77Skettenis tui_highlight_win (struct tui_win_info * win_info)
126b725ae77Skettenis {
127b725ae77Skettenis if (win_info != NULL
128b725ae77Skettenis && win_info->can_highlight
129b725ae77Skettenis && win_info->generic.handle != (WINDOW *) NULL)
130b725ae77Skettenis {
131b725ae77Skettenis box_win ((struct tui_gen_win_info *) win_info, HILITE);
132b725ae77Skettenis wrefresh (win_info->generic.handle);
133b725ae77Skettenis tui_set_win_highlight (win_info, 1);
134b725ae77Skettenis }
135b725ae77Skettenis }
136b725ae77Skettenis
137b725ae77Skettenis void
tui_check_and_display_highlight_if_needed(struct tui_win_info * win_info)138b725ae77Skettenis tui_check_and_display_highlight_if_needed (struct tui_win_info * win_info)
139b725ae77Skettenis {
140b725ae77Skettenis if (win_info != NULL && win_info->generic.type != CMD_WIN)
141b725ae77Skettenis {
142b725ae77Skettenis if (win_info->is_highlighted)
143b725ae77Skettenis tui_highlight_win (win_info);
144b725ae77Skettenis else
145b725ae77Skettenis tui_unhighlight_win (win_info);
146b725ae77Skettenis
147b725ae77Skettenis }
148b725ae77Skettenis return;
149b725ae77Skettenis }
150b725ae77Skettenis
151b725ae77Skettenis
152b725ae77Skettenis void
tui_make_window(struct tui_gen_win_info * win_info,int box_it)153b725ae77Skettenis tui_make_window (struct tui_gen_win_info * win_info, int box_it)
154b725ae77Skettenis {
155b725ae77Skettenis WINDOW *handle;
156b725ae77Skettenis
157b725ae77Skettenis handle = newwin (win_info->height,
158b725ae77Skettenis win_info->width,
159b725ae77Skettenis win_info->origin.y,
160b725ae77Skettenis win_info->origin.x);
161b725ae77Skettenis win_info->handle = handle;
162b725ae77Skettenis if (handle != (WINDOW *) NULL)
163b725ae77Skettenis {
164b725ae77Skettenis if (box_it == BOX_WINDOW)
165b725ae77Skettenis box_win (win_info, NO_HILITE);
166b725ae77Skettenis win_info->is_visible = TRUE;
167b725ae77Skettenis scrollok (handle, TRUE);
168b725ae77Skettenis }
169b725ae77Skettenis }
170b725ae77Skettenis
171b725ae77Skettenis
172b725ae77Skettenis /* We can't really make windows visible, or invisible. So we have to
173b725ae77Skettenis delete the entire window when making it visible, and create it
174b725ae77Skettenis again when making it visible. */
175b725ae77Skettenis static void
make_visible(struct tui_gen_win_info * win_info,int visible)176b725ae77Skettenis make_visible (struct tui_gen_win_info *win_info, int visible)
177b725ae77Skettenis {
178b725ae77Skettenis /* Don't tear down/recreate command window */
179b725ae77Skettenis if (win_info->type == CMD_WIN)
180b725ae77Skettenis return;
181b725ae77Skettenis
182b725ae77Skettenis if (visible)
183b725ae77Skettenis {
184b725ae77Skettenis if (!win_info->is_visible)
185b725ae77Skettenis {
186b725ae77Skettenis tui_make_window (win_info,
187b725ae77Skettenis (win_info->type != CMD_WIN
188b725ae77Skettenis && !tui_win_is_auxillary (win_info->type)));
189b725ae77Skettenis win_info->is_visible = TRUE;
190b725ae77Skettenis }
191b725ae77Skettenis }
192b725ae77Skettenis else if (!visible &&
193b725ae77Skettenis win_info->is_visible && win_info->handle != (WINDOW *) NULL)
194b725ae77Skettenis {
195b725ae77Skettenis win_info->is_visible = FALSE;
196b725ae77Skettenis tui_delete_win (win_info->handle);
197b725ae77Skettenis win_info->handle = (WINDOW *) NULL;
198b725ae77Skettenis }
199b725ae77Skettenis
200b725ae77Skettenis return;
201b725ae77Skettenis }
202b725ae77Skettenis
203b725ae77Skettenis void
tui_make_visible(struct tui_gen_win_info * win_info)204b725ae77Skettenis tui_make_visible (struct tui_gen_win_info *win_info)
205b725ae77Skettenis {
206b725ae77Skettenis make_visible (win_info, 1);
207b725ae77Skettenis }
208b725ae77Skettenis
209b725ae77Skettenis void
tui_make_invisible(struct tui_gen_win_info * win_info)210b725ae77Skettenis tui_make_invisible (struct tui_gen_win_info *win_info)
211b725ae77Skettenis {
212b725ae77Skettenis make_visible (win_info, 0);
213b725ae77Skettenis }
214b725ae77Skettenis
215b725ae77Skettenis
216b725ae77Skettenis /* Makes all windows invisible (except the command and locator windows). */
217b725ae77Skettenis static void
make_all_visible(int visible)218b725ae77Skettenis make_all_visible (int visible)
219b725ae77Skettenis {
220b725ae77Skettenis int i;
221b725ae77Skettenis
222b725ae77Skettenis for (i = 0; i < MAX_MAJOR_WINDOWS; i++)
223b725ae77Skettenis {
224b725ae77Skettenis if (tui_win_list[i] != NULL
225b725ae77Skettenis && ((tui_win_list[i])->generic.type) != CMD_WIN)
226b725ae77Skettenis {
227b725ae77Skettenis if (tui_win_is_source_type ((tui_win_list[i])->generic.type))
228b725ae77Skettenis make_visible ((tui_win_list[i])->detail.source_info.execution_info,
229b725ae77Skettenis visible);
230b725ae77Skettenis make_visible ((struct tui_gen_win_info *) tui_win_list[i], visible);
231b725ae77Skettenis }
232b725ae77Skettenis }
233b725ae77Skettenis
234b725ae77Skettenis return;
235b725ae77Skettenis }
236b725ae77Skettenis
237b725ae77Skettenis void
tui_make_all_visible(void)238b725ae77Skettenis tui_make_all_visible (void)
239b725ae77Skettenis {
240b725ae77Skettenis make_all_visible (1);
241b725ae77Skettenis }
242b725ae77Skettenis
243b725ae77Skettenis void
tui_make_all_invisible(void)244b725ae77Skettenis tui_make_all_invisible (void)
245b725ae77Skettenis {
246b725ae77Skettenis make_all_visible (0);
247b725ae77Skettenis }
248b725ae77Skettenis
249b725ae77Skettenis /* Function to refresh all the windows currently displayed. */
250b725ae77Skettenis
251b725ae77Skettenis void
tui_refresh_all(struct tui_win_info ** list)252b725ae77Skettenis tui_refresh_all (struct tui_win_info * * list)
253b725ae77Skettenis {
254b725ae77Skettenis enum tui_win_type type;
255b725ae77Skettenis struct tui_gen_win_info * locator = tui_locator_win_info_ptr ();
256b725ae77Skettenis
257b725ae77Skettenis for (type = SRC_WIN; (type < MAX_MAJOR_WINDOWS); type++)
258b725ae77Skettenis {
259b725ae77Skettenis if (list[type] && list[type]->generic.is_visible)
260b725ae77Skettenis {
261b725ae77Skettenis if (type == SRC_WIN || type == DISASSEM_WIN)
262b725ae77Skettenis {
263b725ae77Skettenis touchwin (list[type]->detail.source_info.execution_info->handle);
264b725ae77Skettenis tui_refresh_win (list[type]->detail.source_info.execution_info);
265b725ae77Skettenis }
266b725ae77Skettenis touchwin (list[type]->generic.handle);
267b725ae77Skettenis tui_refresh_win (&list[type]->generic);
268b725ae77Skettenis }
269b725ae77Skettenis }
270b725ae77Skettenis if (locator->is_visible)
271b725ae77Skettenis {
272b725ae77Skettenis touchwin (locator->handle);
273b725ae77Skettenis tui_refresh_win (locator);
274b725ae77Skettenis }
275b725ae77Skettenis }
276b725ae77Skettenis
277b725ae77Skettenis
278b725ae77Skettenis /*********************************
279b725ae77Skettenis ** Local Static Functions
280b725ae77Skettenis *********************************/
281