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