1130803Smarcel/* General window behavior.
2130803Smarcel
3130803Smarcel   Copyright 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation,
4130803Smarcel   Inc.
5130803Smarcel
6130803Smarcel   Contributed by Hewlett-Packard Company.
7130803Smarcel
8130803Smarcel   This file is part of GDB.
9130803Smarcel
10130803Smarcel   This program is free software; you can redistribute it and/or modify
11130803Smarcel   it under the terms of the GNU General Public License as published by
12130803Smarcel   the Free Software Foundation; either version 2 of the License, or
13130803Smarcel   (at your option) any later version.
14130803Smarcel
15130803Smarcel   This program is distributed in the hope that it will be useful,
16130803Smarcel   but WITHOUT ANY WARRANTY; without even the implied warranty of
17130803Smarcel   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18130803Smarcel   GNU General Public License for more details.
19130803Smarcel
20130803Smarcel   You should have received a copy of the GNU General Public License
21130803Smarcel   along with this program; if not, write to the Free Software
22130803Smarcel   Foundation, Inc., 59 Temple Place - Suite 330,
23130803Smarcel   Boston, MA 02111-1307, USA.  */
24130803Smarcel
25130803Smarcel#include "defs.h"
26130803Smarcel#include "tui/tui.h"
27130803Smarcel#include "tui/tui-data.h"
28130803Smarcel#include "tui/tui-wingeneral.h"
29130803Smarcel#include "tui/tui-win.h"
30130803Smarcel
31130803Smarcel#include "gdb_curses.h"
32130803Smarcel
33130803Smarcel/***********************
34130803Smarcel** PUBLIC FUNCTIONS
35130803Smarcel***********************/
36130803Smarcel
37130803Smarcel/* Refresh the window.   */
38130803Smarcelvoid
39130803Smarceltui_refresh_win (struct tui_gen_win_info * win_info)
40130803Smarcel{
41130803Smarcel  if (win_info->type == DATA_WIN && win_info->content_size > 0)
42130803Smarcel    {
43130803Smarcel      int i;
44130803Smarcel
45130803Smarcel      for (i = 0; (i < win_info->content_size); i++)
46130803Smarcel	{
47130803Smarcel	  struct tui_gen_win_info * data_item_win_ptr;
48130803Smarcel
49130803Smarcel	  data_item_win_ptr = &((tui_win_content)
50130803Smarcel			     win_info->content)[i]->which_element.data_window;
51130803Smarcel	  if (data_item_win_ptr != NULL
52130803Smarcel	      && data_item_win_ptr->handle != (WINDOW *) NULL)
53130803Smarcel	    wrefresh (data_item_win_ptr->handle);
54130803Smarcel	}
55130803Smarcel    }
56130803Smarcel  else if (win_info->type == CMD_WIN)
57130803Smarcel    {
58130803Smarcel      /* Do nothing */
59130803Smarcel    }
60130803Smarcel  else
61130803Smarcel    {
62130803Smarcel      if (win_info->handle != (WINDOW *) NULL)
63130803Smarcel	wrefresh (win_info->handle);
64130803Smarcel    }
65130803Smarcel
66130803Smarcel  return;
67130803Smarcel}
68130803Smarcel
69130803Smarcel
70130803Smarcel/* Function to delete the curses window, checking for NULL.   */
71130803Smarcelvoid
72130803Smarceltui_delete_win (WINDOW * window)
73130803Smarcel{
74130803Smarcel  if (window != (WINDOW *) NULL)
75130803Smarcel    delwin (window);
76130803Smarcel
77130803Smarcel  return;
78130803Smarcel}
79130803Smarcel
80130803Smarcel
81130803Smarcel/* Draw a border arround the window.  */
82130803Smarcelvoid
83130803Smarcelbox_win (struct tui_gen_win_info * win_info, int highlight_flag)
84130803Smarcel{
85130803Smarcel  if (win_info && win_info->handle)
86130803Smarcel    {
87130803Smarcel      WINDOW *win;
88130803Smarcel      int attrs;
89130803Smarcel
90130803Smarcel      win = win_info->handle;
91130803Smarcel      if (highlight_flag == HILITE)
92130803Smarcel        attrs = tui_active_border_attrs;
93130803Smarcel      else
94130803Smarcel        attrs = tui_border_attrs;
95130803Smarcel
96130803Smarcel      wattron (win, attrs);
97130803Smarcel      wborder (win, tui_border_vline, tui_border_vline,
98130803Smarcel               tui_border_hline, tui_border_hline,
99130803Smarcel               tui_border_ulcorner, tui_border_urcorner,
100130803Smarcel               tui_border_llcorner, tui_border_lrcorner);
101130803Smarcel      if (win_info->title)
102130803Smarcel        mvwaddstr (win, 0, 3, win_info->title);
103130803Smarcel      wattroff (win, attrs);
104130803Smarcel    }
105130803Smarcel}
106130803Smarcel
107130803Smarcel
108130803Smarcelvoid
109130803Smarceltui_unhighlight_win (struct tui_win_info * win_info)
110130803Smarcel{
111130803Smarcel  if (win_info != NULL && win_info->generic.handle != (WINDOW *) NULL)
112130803Smarcel    {
113130803Smarcel      box_win ((struct tui_gen_win_info *) win_info, NO_HILITE);
114130803Smarcel      wrefresh (win_info->generic.handle);
115130803Smarcel      tui_set_win_highlight (win_info, 0);
116130803Smarcel    }
117130803Smarcel}
118130803Smarcel
119130803Smarcel
120130803Smarcelvoid
121130803Smarceltui_highlight_win (struct tui_win_info * win_info)
122130803Smarcel{
123130803Smarcel  if (win_info != NULL
124130803Smarcel      && win_info->can_highlight
125130803Smarcel      && win_info->generic.handle != (WINDOW *) NULL)
126130803Smarcel    {
127130803Smarcel      box_win ((struct tui_gen_win_info *) win_info, HILITE);
128130803Smarcel      wrefresh (win_info->generic.handle);
129130803Smarcel      tui_set_win_highlight (win_info, 1);
130130803Smarcel    }
131130803Smarcel}
132130803Smarcel
133130803Smarcelvoid
134130803Smarceltui_check_and_display_highlight_if_needed (struct tui_win_info * win_info)
135130803Smarcel{
136130803Smarcel  if (win_info != NULL && win_info->generic.type != CMD_WIN)
137130803Smarcel    {
138130803Smarcel      if (win_info->is_highlighted)
139130803Smarcel	tui_highlight_win (win_info);
140130803Smarcel      else
141130803Smarcel	tui_unhighlight_win (win_info);
142130803Smarcel
143130803Smarcel    }
144130803Smarcel  return;
145130803Smarcel}
146130803Smarcel
147130803Smarcel
148130803Smarcelvoid
149130803Smarceltui_make_window (struct tui_gen_win_info * win_info, int box_it)
150130803Smarcel{
151130803Smarcel  WINDOW *handle;
152130803Smarcel
153130803Smarcel  handle = newwin (win_info->height,
154130803Smarcel		   win_info->width,
155130803Smarcel		   win_info->origin.y,
156130803Smarcel		   win_info->origin.x);
157130803Smarcel  win_info->handle = handle;
158130803Smarcel  if (handle != (WINDOW *) NULL)
159130803Smarcel    {
160130803Smarcel      if (box_it == BOX_WINDOW)
161130803Smarcel	box_win (win_info, NO_HILITE);
162130803Smarcel      win_info->is_visible = TRUE;
163130803Smarcel      scrollok (handle, TRUE);
164130803Smarcel    }
165130803Smarcel}
166130803Smarcel
167130803Smarcel
168130803Smarcel/* We can't really make windows visible, or invisible.  So we have to
169130803Smarcel   delete the entire window when making it visible, and create it
170130803Smarcel   again when making it visible.  */
171130803Smarcelstatic void
172130803Smarcelmake_visible (struct tui_gen_win_info *win_info, int visible)
173130803Smarcel{
174130803Smarcel  /* Don't tear down/recreate command window */
175130803Smarcel  if (win_info->type == CMD_WIN)
176130803Smarcel    return;
177130803Smarcel
178130803Smarcel  if (visible)
179130803Smarcel    {
180130803Smarcel      if (!win_info->is_visible)
181130803Smarcel	{
182130803Smarcel	  tui_make_window (win_info,
183130803Smarcel			   (win_info->type != CMD_WIN
184130803Smarcel			    && !tui_win_is_auxillary (win_info->type)));
185130803Smarcel	  win_info->is_visible = TRUE;
186130803Smarcel	}
187130803Smarcel    }
188130803Smarcel  else if (!visible &&
189130803Smarcel	   win_info->is_visible && win_info->handle != (WINDOW *) NULL)
190130803Smarcel    {
191130803Smarcel      win_info->is_visible = FALSE;
192130803Smarcel      tui_delete_win (win_info->handle);
193130803Smarcel      win_info->handle = (WINDOW *) NULL;
194130803Smarcel    }
195130803Smarcel
196130803Smarcel  return;
197130803Smarcel}
198130803Smarcel
199130803Smarcelvoid
200130803Smarceltui_make_visible (struct tui_gen_win_info *win_info)
201130803Smarcel{
202130803Smarcel  make_visible (win_info, 1);
203130803Smarcel}
204130803Smarcel
205130803Smarcelvoid
206130803Smarceltui_make_invisible (struct tui_gen_win_info *win_info)
207130803Smarcel{
208130803Smarcel  make_visible (win_info, 0);
209130803Smarcel}
210130803Smarcel
211130803Smarcel
212130803Smarcel/* Makes all windows invisible (except the command and locator windows).   */
213130803Smarcelstatic void
214130803Smarcelmake_all_visible (int visible)
215130803Smarcel{
216130803Smarcel  int i;
217130803Smarcel
218130803Smarcel  for (i = 0; i < MAX_MAJOR_WINDOWS; i++)
219130803Smarcel    {
220130803Smarcel      if (tui_win_list[i] != NULL
221130803Smarcel	  && ((tui_win_list[i])->generic.type) != CMD_WIN)
222130803Smarcel	{
223130803Smarcel	  if (tui_win_is_source_type ((tui_win_list[i])->generic.type))
224130803Smarcel	    make_visible ((tui_win_list[i])->detail.source_info.execution_info,
225130803Smarcel			  visible);
226130803Smarcel	  make_visible ((struct tui_gen_win_info *) tui_win_list[i], visible);
227130803Smarcel	}
228130803Smarcel    }
229130803Smarcel
230130803Smarcel  return;
231130803Smarcel}
232130803Smarcel
233130803Smarcelvoid
234130803Smarceltui_make_all_visible (void)
235130803Smarcel{
236130803Smarcel  make_all_visible (1);
237130803Smarcel}
238130803Smarcel
239130803Smarcelvoid
240130803Smarceltui_make_all_invisible (void)
241130803Smarcel{
242130803Smarcel  make_all_visible (0);
243130803Smarcel}
244130803Smarcel
245130803Smarcel/* Function to refresh all the windows currently displayed.  */
246130803Smarcel
247130803Smarcelvoid
248130803Smarceltui_refresh_all (struct tui_win_info * * list)
249130803Smarcel{
250130803Smarcel  enum tui_win_type type;
251130803Smarcel  struct tui_gen_win_info * locator = tui_locator_win_info_ptr ();
252130803Smarcel
253130803Smarcel  for (type = SRC_WIN; (type < MAX_MAJOR_WINDOWS); type++)
254130803Smarcel    {
255130803Smarcel      if (list[type] && list[type]->generic.is_visible)
256130803Smarcel	{
257130803Smarcel	  if (type == SRC_WIN || type == DISASSEM_WIN)
258130803Smarcel	    {
259130803Smarcel	      touchwin (list[type]->detail.source_info.execution_info->handle);
260130803Smarcel	      tui_refresh_win (list[type]->detail.source_info.execution_info);
261130803Smarcel	    }
262130803Smarcel	  touchwin (list[type]->generic.handle);
263130803Smarcel	  tui_refresh_win (&list[type]->generic);
264130803Smarcel	}
265130803Smarcel    }
266130803Smarcel  if (locator->is_visible)
267130803Smarcel    {
268130803Smarcel      touchwin (locator->handle);
269130803Smarcel      tui_refresh_win (locator);
270130803Smarcel    }
271130803Smarcel}
272130803Smarcel
273130803Smarcel
274130803Smarcel/*********************************
275130803Smarcel** Local Static Functions
276130803Smarcel*********************************/
277