* infrun.c (follow_fork): Initialize new step_* locals
[deliverable/binutils-gdb.git] / gdb / tui / tui-windata.c
CommitLineData
f377b406 1/* Data/register window display.
f33c6cbf 2
0fb0cc75 3 Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2007, 2008, 2009
6aba47ca 4 Free Software Foundation, Inc.
f33c6cbf 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
a9762ec7 12 the Free Software Foundation; either version 3 of the License, or
f377b406
SC
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
a9762ec7 21 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c906108c 22
96ec9981 23#include "defs.h"
d7b2e967
AC
24#include "tui/tui.h"
25#include "tui/tui-data.h"
26#include "tui/tui-wingeneral.h"
27#include "tui/tui-regs.h"
2c0b251b 28#include "tui/tui-windata.h"
f33c6cbf 29
88289b6e 30#include "gdb_string.h"
6a83354a 31#include "gdb_curses.h"
4e8f7a8b 32
c906108c
SS
33
34/*****************************************
35** STATIC LOCAL FUNCTIONS FORWARD DECLS **
36******************************************/
37
38
39
40/*****************************************
41** PUBLIC FUNCTIONS **
42******************************************/
43
44
6ba8e26f
AC
45/* Answer the index first element displayed. If none are displayed,
46 then return (-1). */
c906108c 47int
6ba8e26f 48tui_first_data_item_displayed (void)
c906108c 49{
6ba8e26f 50 int element_no = (-1);
c906108c
SS
51 int i;
52
e5908723
MS
53 for (i = 0;
54 i < TUI_DATA_WIN->generic.content_size && element_no < 0;
55 i++)
c906108c 56 {
5b6fe301 57 struct tui_gen_win_info *data_item_win;
c906108c 58
6ba8e26f 59 data_item_win = &((tui_win_content)
08ef48c5 60 TUI_DATA_WIN->generic.content)[i]->which_element.data_window;
e5908723
MS
61 if (data_item_win->handle != (WINDOW *) NULL
62 && data_item_win->is_visible)
6ba8e26f 63 element_no = i;
c906108c
SS
64 }
65
6ba8e26f
AC
66 return element_no;
67}
c906108c
SS
68
69
6ba8e26f
AC
70/* Answer the index of the first element in line_no. If line_no is
71 past the data area (-1) is returned. */
c906108c 72int
6ba8e26f 73tui_first_data_element_no_in_line (int line_no)
c906108c 74{
6ba8e26f 75 int first_element_no = (-1);
c906108c 76
ef5eab5a
MS
77 /* First see if there is a register on line_no, and if so, set the
78 first element number. */
6ba8e26f 79 if ((first_element_no = tui_first_reg_element_no_inline (line_no)) == -1)
ef5eab5a 80 { /* Looking at the general data, the 1st element on line_no. */
c906108c
SS
81 }
82
6ba8e26f
AC
83 return first_element_no;
84}
c906108c
SS
85
86
6ba8e26f
AC
87/* Function to delete all the item windows in the data window. This
88 is usually done when the data window is scrolled. */
c906108c 89void
6ba8e26f 90tui_delete_data_content_windows (void)
c906108c
SS
91{
92 int i;
5b6fe301 93 struct tui_gen_win_info *data_item_win_ptr;
c906108c 94
6d012f14 95 for (i = 0; (i < TUI_DATA_WIN->generic.content_size); i++)
c906108c 96 {
6ba8e26f 97 data_item_win_ptr = &((tui_win_content)
08ef48c5 98 TUI_DATA_WIN->generic.content)[i]->which_element.data_window;
6ba8e26f
AC
99 tui_delete_win (data_item_win_ptr->handle);
100 data_item_win_ptr->handle = (WINDOW *) NULL;
101 data_item_win_ptr->is_visible = FALSE;
c906108c 102 }
6ba8e26f 103}
c906108c
SS
104
105
106void
edae1ccf 107tui_erase_data_content (char *prompt)
c906108c 108{
6d012f14
AC
109 werase (TUI_DATA_WIN->generic.handle);
110 tui_check_and_display_highlight_if_needed (TUI_DATA_WIN);
c906108c
SS
111 if (prompt != (char *) NULL)
112 {
6ba8e26f
AC
113 int half_width = (TUI_DATA_WIN->generic.width - 2) / 2;
114 int x_pos;
c906108c 115
6ba8e26f
AC
116 if (strlen (prompt) >= half_width)
117 x_pos = 1;
c906108c 118 else
6ba8e26f 119 x_pos = half_width - strlen (prompt);
6d012f14
AC
120 mvwaddstr (TUI_DATA_WIN->generic.handle,
121 (TUI_DATA_WIN->generic.height / 2),
6ba8e26f 122 x_pos,
c906108c
SS
123 prompt);
124 }
6d012f14 125 wrefresh (TUI_DATA_WIN->generic.handle);
edae1ccf 126}
c906108c
SS
127
128
edae1ccf
AC
129/* This function displays the data that is in the data window's
130 content. It does not set the content. */
c906108c 131void
edae1ccf 132tui_display_all_data (void)
c906108c 133{
6d012f14 134 if (TUI_DATA_WIN->generic.content_size <= 0)
edae1ccf 135 tui_erase_data_content (NO_DATA_STRING);
c906108c
SS
136 else
137 {
edae1ccf 138 tui_erase_data_content ((char *) NULL);
6ba8e26f 139 tui_delete_data_content_windows ();
6d012f14 140 tui_check_and_display_highlight_if_needed (TUI_DATA_WIN);
55fb0713 141 tui_display_registers_from (0);
ef5eab5a
MS
142
143 /* Then display the other data. */
6d012f14 144 if (TUI_DATA_WIN->detail.data_display_info.data_content !=
e5908723
MS
145 (tui_win_content) NULL
146 && TUI_DATA_WIN->detail.data_display_info.data_content_count > 0)
c906108c
SS
147 {
148 }
149 }
edae1ccf 150}
c906108c
SS
151
152
6ba8e26f
AC
153/* Function to display the data starting at line, line_no, in the data
154 window. */
c906108c 155void
6ba8e26f 156tui_display_data_from_line (int line_no)
c906108c 157{
6ba8e26f 158 int _line_no = line_no;
c906108c 159
6ba8e26f
AC
160 if (line_no < 0)
161 _line_no = 0;
c906108c 162
6d012f14 163 tui_check_and_display_highlight_if_needed (TUI_DATA_WIN);
c906108c 164
1cc6d956
MS
165 /* There is no general data, force regs to display (if there are
166 any). */
6d012f14 167 if (TUI_DATA_WIN->detail.data_display_info.data_content_count <= 0)
6ba8e26f 168 tui_display_registers_from_line (_line_no, TRUE);
c906108c
SS
169 else
170 {
6ba8e26f
AC
171 int element_no, start_line_no;
172 int regs_last_line = tui_last_regs_line_no ();
c906108c
SS
173
174
1cc6d956 175 /* Display regs if we can. */
6ba8e26f 176 if (tui_display_registers_from_line (_line_no, FALSE) < 0)
ef5eab5a
MS
177 { /* _line_no is past the regs display, so calc where the
178 start data element is. */
6ba8e26f 179 if (regs_last_line < _line_no)
ef5eab5a
MS
180 { /* Figure out how many lines each element is to obtain
181 the start element_no. */
c906108c
SS
182 }
183 }
184 else
ef5eab5a
MS
185 { /* Calculate the starting element of the data display, given
186 regs_last_line and how many lines each element is, up to
187 _line_no. */
c906108c 188 }
1cc6d956 189 /* Now display the data , starting at element_no. */
c906108c 190 }
6ba8e26f 191}
c906108c
SS
192
193
1cc6d956 194/* Display data starting at element element_no. */
c906108c 195void
6ba8e26f 196tui_display_data_from (int element_no, int reuse_windows)
c906108c 197{
6ba8e26f 198 int first_line = (-1);
c906108c 199
6ba8e26f
AC
200 if (element_no < TUI_DATA_WIN->detail.data_display_info.regs_content_count)
201 first_line = tui_line_from_reg_element_no (element_no);
c906108c 202 else
1cc6d956 203 { /* Calculate the first_line from the element number. */
c906108c
SS
204 }
205
6ba8e26f 206 if (first_line >= 0)
c906108c 207 {
edae1ccf 208 tui_erase_data_content ((char *) NULL);
6ba8e26f
AC
209 if (!reuse_windows)
210 tui_delete_data_content_windows ();
211 tui_display_data_from_line (first_line);
c906108c 212 }
6ba8e26f 213}
c906108c
SS
214
215
edae1ccf 216/* Function to redisplay the contents of the data window. */
c906108c 217void
edae1ccf 218tui_refresh_data_win (void)
c906108c 219{
edae1ccf 220 tui_erase_data_content ((char *) NULL);
6d012f14 221 if (TUI_DATA_WIN->generic.content_size > 0)
c906108c 222 {
6ba8e26f 223 int first_element = tui_first_data_item_displayed ();
c906108c 224
1cc6d956 225 if (first_element >= 0) /* Re-use existing windows. */
6ba8e26f 226 tui_display_data_from (first_element, TRUE);
c906108c 227 }
edae1ccf 228}
c906108c
SS
229
230
1cc6d956
MS
231/* Function to check the data values and hilite any that have
232 changed. */
c906108c 233void
edae1ccf 234tui_check_data_values (struct frame_info *frame)
c906108c 235{
55fb0713 236 tui_check_register_values (frame);
c906108c 237
1cc6d956 238 /* Now check any other data values that there are. */
6d012f14 239 if (TUI_DATA_WIN != NULL && TUI_DATA_WIN->generic.is_visible)
c906108c
SS
240 {
241 int i;
242
e5908723
MS
243 for (i = 0;
244 TUI_DATA_WIN->detail.data_display_info.data_content_count;
245 i++)
c906108c
SS
246 {
247#ifdef LATER
6ba8e26f 248 tui_data_element_ptr data_element_ptr;
5b6fe301 249 struct tui_gen_win_info *data_item_win_ptr;
6ba8e26f 250 Opaque new_value;
c906108c 251
6ba8e26f 252 data_item_ptr = &TUI_DATA_WIN->detail.data_display_info.
6d012f14 253 data_content[i]->which_element.data_window;
6ba8e26f
AC
254 data_element_ptr = &((tui_win_content)
255 data_item_win_ptr->content)[0]->which_element.data;
c906108c 256 if value
6ba8e26f 257 has changed (data_element_ptr, frame, &new_value)
c906108c 258 {
6ba8e26f 259 data_element_ptr->value = new_value;
c906108c
SS
260 update the display with the new value, hiliting it.
261 }
262#endif
263 }
264 }
edae1ccf 265}
c906108c
SS
266
267
1cc6d956 268/* Scroll the data window vertically forward or backward. */
c906108c 269void
08ef48c5
MS
270tui_vertical_data_scroll (enum tui_scroll_direction scroll_direction,
271 int num_to_scroll)
c906108c 272{
6ba8e26f
AC
273 int first_element_no;
274 int first_line = (-1);
c906108c 275
6ba8e26f
AC
276 first_element_no = tui_first_data_item_displayed ();
277 if (first_element_no < TUI_DATA_WIN->detail.data_display_info.regs_content_count)
278 first_line = tui_line_from_reg_element_no (first_element_no);
c906108c 279 else
1cc6d956
MS
280 { /* Calculate the first line from the element number which is in
281 the general data content. */
c906108c
SS
282 }
283
6ba8e26f 284 if (first_line >= 0)
c906108c 285 {
6ba8e26f 286 int last_element_no, last_line;
c906108c 287
6ba8e26f
AC
288 if (scroll_direction == FORWARD_SCROLL)
289 first_line += num_to_scroll;
c906108c 290 else
6ba8e26f 291 first_line -= num_to_scroll;
edae1ccf 292 tui_erase_data_content ((char *) NULL);
6ba8e26f
AC
293 tui_delete_data_content_windows ();
294 tui_display_data_from_line (first_line);
c906108c 295 }
6ba8e26f 296}
c906108c
SS
297
298
299/*****************************************
300** STATIC LOCAL FUNCTIONS **
301******************************************/
This page took 0.854212 seconds and 4 git commands to generate.