xref: /openbsd-src/gnu/usr.bin/binutils/gdb/tui/tui-wingeneral.c (revision 11efff7f3ac2b3cfeff0c0cddc14294d9b3aca4f)
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