1*b725ae77Skettenis /* Data/register window display.
2*b725ae77Skettenis
3*b725ae77Skettenis Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software
4*b725ae77Skettenis Foundation, Inc.
5*b725ae77Skettenis
6*b725ae77Skettenis Contributed by Hewlett-Packard Company.
7*b725ae77Skettenis
8*b725ae77Skettenis This file is part of GDB.
9*b725ae77Skettenis
10*b725ae77Skettenis This program is free software; you can redistribute it and/or modify
11*b725ae77Skettenis it under the terms of the GNU General Public License as published by
12*b725ae77Skettenis the Free Software Foundation; either version 2 of the License, or
13*b725ae77Skettenis (at your option) any later version.
14*b725ae77Skettenis
15*b725ae77Skettenis This program is distributed in the hope that it will be useful,
16*b725ae77Skettenis but WITHOUT ANY WARRANTY; without even the implied warranty of
17*b725ae77Skettenis MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18*b725ae77Skettenis GNU General Public License for more details.
19*b725ae77Skettenis
20*b725ae77Skettenis You should have received a copy of the GNU General Public License
21*b725ae77Skettenis along with this program; if not, write to the Free Software
22*b725ae77Skettenis Foundation, Inc., 59 Temple Place - Suite 330,
23*b725ae77Skettenis Boston, MA 02111-1307, USA. */
24*b725ae77Skettenis
25*b725ae77Skettenis #include "defs.h"
26*b725ae77Skettenis #include "tui/tui.h"
27*b725ae77Skettenis #include "tui/tui-data.h"
28*b725ae77Skettenis #include "tui/tui-wingeneral.h"
29*b725ae77Skettenis #include "tui/tui-regs.h"
30*b725ae77Skettenis
31*b725ae77Skettenis #include "gdb_string.h"
32*b725ae77Skettenis #include "gdb_curses.h"
33*b725ae77Skettenis
34*b725ae77Skettenis
35*b725ae77Skettenis /*****************************************
36*b725ae77Skettenis ** STATIC LOCAL FUNCTIONS FORWARD DECLS **
37*b725ae77Skettenis ******************************************/
38*b725ae77Skettenis
39*b725ae77Skettenis
40*b725ae77Skettenis
41*b725ae77Skettenis /*****************************************
42*b725ae77Skettenis ** PUBLIC FUNCTIONS **
43*b725ae77Skettenis ******************************************/
44*b725ae77Skettenis
45*b725ae77Skettenis
46*b725ae77Skettenis /* Answer the index first element displayed. If none are displayed,
47*b725ae77Skettenis then return (-1). */
48*b725ae77Skettenis int
tui_first_data_item_displayed(void)49*b725ae77Skettenis tui_first_data_item_displayed (void)
50*b725ae77Skettenis {
51*b725ae77Skettenis int element_no = (-1);
52*b725ae77Skettenis int i;
53*b725ae77Skettenis
54*b725ae77Skettenis for (i = 0; (i < TUI_DATA_WIN->generic.content_size && element_no < 0); i++)
55*b725ae77Skettenis {
56*b725ae77Skettenis struct tui_gen_win_info * data_item_win;
57*b725ae77Skettenis
58*b725ae77Skettenis data_item_win = &((tui_win_content)
59*b725ae77Skettenis TUI_DATA_WIN->generic.content)[i]->which_element.data_window;
60*b725ae77Skettenis if (data_item_win->handle != (WINDOW *) NULL && data_item_win->is_visible)
61*b725ae77Skettenis element_no = i;
62*b725ae77Skettenis }
63*b725ae77Skettenis
64*b725ae77Skettenis return element_no;
65*b725ae77Skettenis }
66*b725ae77Skettenis
67*b725ae77Skettenis
68*b725ae77Skettenis /* Answer the index of the first element in line_no. If line_no is
69*b725ae77Skettenis past the data area (-1) is returned. */
70*b725ae77Skettenis int
tui_first_data_element_no_in_line(int line_no)71*b725ae77Skettenis tui_first_data_element_no_in_line (int line_no)
72*b725ae77Skettenis {
73*b725ae77Skettenis int first_element_no = (-1);
74*b725ae77Skettenis
75*b725ae77Skettenis /*
76*b725ae77Skettenis ** First see if there is a register on line_no, and if so, set the
77*b725ae77Skettenis ** first element number
78*b725ae77Skettenis */
79*b725ae77Skettenis if ((first_element_no = tui_first_reg_element_no_inline (line_no)) == -1)
80*b725ae77Skettenis { /*
81*b725ae77Skettenis ** Looking at the general data, the 1st element on line_no
82*b725ae77Skettenis */
83*b725ae77Skettenis }
84*b725ae77Skettenis
85*b725ae77Skettenis return first_element_no;
86*b725ae77Skettenis }
87*b725ae77Skettenis
88*b725ae77Skettenis
89*b725ae77Skettenis /* Function to delete all the item windows in the data window. This
90*b725ae77Skettenis is usually done when the data window is scrolled. */
91*b725ae77Skettenis void
tui_delete_data_content_windows(void)92*b725ae77Skettenis tui_delete_data_content_windows (void)
93*b725ae77Skettenis {
94*b725ae77Skettenis int i;
95*b725ae77Skettenis struct tui_gen_win_info * data_item_win_ptr;
96*b725ae77Skettenis
97*b725ae77Skettenis for (i = 0; (i < TUI_DATA_WIN->generic.content_size); i++)
98*b725ae77Skettenis {
99*b725ae77Skettenis data_item_win_ptr = &((tui_win_content)
100*b725ae77Skettenis TUI_DATA_WIN->generic.content)[i]->which_element.data_window;
101*b725ae77Skettenis tui_delete_win (data_item_win_ptr->handle);
102*b725ae77Skettenis data_item_win_ptr->handle = (WINDOW *) NULL;
103*b725ae77Skettenis data_item_win_ptr->is_visible = FALSE;
104*b725ae77Skettenis }
105*b725ae77Skettenis }
106*b725ae77Skettenis
107*b725ae77Skettenis
108*b725ae77Skettenis void
tui_erase_data_content(char * prompt)109*b725ae77Skettenis tui_erase_data_content (char *prompt)
110*b725ae77Skettenis {
111*b725ae77Skettenis werase (TUI_DATA_WIN->generic.handle);
112*b725ae77Skettenis tui_check_and_display_highlight_if_needed (TUI_DATA_WIN);
113*b725ae77Skettenis if (prompt != (char *) NULL)
114*b725ae77Skettenis {
115*b725ae77Skettenis int half_width = (TUI_DATA_WIN->generic.width - 2) / 2;
116*b725ae77Skettenis int x_pos;
117*b725ae77Skettenis
118*b725ae77Skettenis if (strlen (prompt) >= half_width)
119*b725ae77Skettenis x_pos = 1;
120*b725ae77Skettenis else
121*b725ae77Skettenis x_pos = half_width - strlen (prompt);
122*b725ae77Skettenis mvwaddstr (TUI_DATA_WIN->generic.handle,
123*b725ae77Skettenis (TUI_DATA_WIN->generic.height / 2),
124*b725ae77Skettenis x_pos,
125*b725ae77Skettenis prompt);
126*b725ae77Skettenis }
127*b725ae77Skettenis wrefresh (TUI_DATA_WIN->generic.handle);
128*b725ae77Skettenis }
129*b725ae77Skettenis
130*b725ae77Skettenis
131*b725ae77Skettenis /* This function displays the data that is in the data window's
132*b725ae77Skettenis content. It does not set the content. */
133*b725ae77Skettenis void
tui_display_all_data(void)134*b725ae77Skettenis tui_display_all_data (void)
135*b725ae77Skettenis {
136*b725ae77Skettenis if (TUI_DATA_WIN->generic.content_size <= 0)
137*b725ae77Skettenis tui_erase_data_content (NO_DATA_STRING);
138*b725ae77Skettenis else
139*b725ae77Skettenis {
140*b725ae77Skettenis tui_erase_data_content ((char *) NULL);
141*b725ae77Skettenis tui_delete_data_content_windows ();
142*b725ae77Skettenis tui_check_and_display_highlight_if_needed (TUI_DATA_WIN);
143*b725ae77Skettenis tui_display_registers_from (0);
144*b725ae77Skettenis /*
145*b725ae77Skettenis ** Then display the other data
146*b725ae77Skettenis */
147*b725ae77Skettenis if (TUI_DATA_WIN->detail.data_display_info.data_content !=
148*b725ae77Skettenis (tui_win_content) NULL &&
149*b725ae77Skettenis TUI_DATA_WIN->detail.data_display_info.data_content_count > 0)
150*b725ae77Skettenis {
151*b725ae77Skettenis }
152*b725ae77Skettenis }
153*b725ae77Skettenis }
154*b725ae77Skettenis
155*b725ae77Skettenis
156*b725ae77Skettenis /* Function to display the data starting at line, line_no, in the data
157*b725ae77Skettenis window. */
158*b725ae77Skettenis void
tui_display_data_from_line(int line_no)159*b725ae77Skettenis tui_display_data_from_line (int line_no)
160*b725ae77Skettenis {
161*b725ae77Skettenis int _line_no = line_no;
162*b725ae77Skettenis
163*b725ae77Skettenis if (line_no < 0)
164*b725ae77Skettenis _line_no = 0;
165*b725ae77Skettenis
166*b725ae77Skettenis tui_check_and_display_highlight_if_needed (TUI_DATA_WIN);
167*b725ae77Skettenis
168*b725ae77Skettenis /* there is no general data, force regs to display (if there are any) */
169*b725ae77Skettenis if (TUI_DATA_WIN->detail.data_display_info.data_content_count <= 0)
170*b725ae77Skettenis tui_display_registers_from_line (_line_no, TRUE);
171*b725ae77Skettenis else
172*b725ae77Skettenis {
173*b725ae77Skettenis int element_no, start_line_no;
174*b725ae77Skettenis int regs_last_line = tui_last_regs_line_no ();
175*b725ae77Skettenis
176*b725ae77Skettenis
177*b725ae77Skettenis /* display regs if we can */
178*b725ae77Skettenis if (tui_display_registers_from_line (_line_no, FALSE) < 0)
179*b725ae77Skettenis { /*
180*b725ae77Skettenis ** _line_no is past the regs display, so calc where the
181*b725ae77Skettenis ** start data element is
182*b725ae77Skettenis */
183*b725ae77Skettenis if (regs_last_line < _line_no)
184*b725ae77Skettenis { /* figure out how many lines each element is to obtain
185*b725ae77Skettenis the start element_no */
186*b725ae77Skettenis }
187*b725ae77Skettenis }
188*b725ae77Skettenis else
189*b725ae77Skettenis { /*
190*b725ae77Skettenis ** calculate the starting element of the data display, given
191*b725ae77Skettenis ** regs_last_line and how many lines each element is, up to
192*b725ae77Skettenis ** _line_no
193*b725ae77Skettenis */
194*b725ae77Skettenis }
195*b725ae77Skettenis /* Now display the data , starting at element_no */
196*b725ae77Skettenis }
197*b725ae77Skettenis }
198*b725ae77Skettenis
199*b725ae77Skettenis
200*b725ae77Skettenis /* Display data starting at element element_no. */
201*b725ae77Skettenis void
tui_display_data_from(int element_no,int reuse_windows)202*b725ae77Skettenis tui_display_data_from (int element_no, int reuse_windows)
203*b725ae77Skettenis {
204*b725ae77Skettenis int first_line = (-1);
205*b725ae77Skettenis
206*b725ae77Skettenis if (element_no < TUI_DATA_WIN->detail.data_display_info.regs_content_count)
207*b725ae77Skettenis first_line = tui_line_from_reg_element_no (element_no);
208*b725ae77Skettenis else
209*b725ae77Skettenis { /* calculate the first_line from the element number */
210*b725ae77Skettenis }
211*b725ae77Skettenis
212*b725ae77Skettenis if (first_line >= 0)
213*b725ae77Skettenis {
214*b725ae77Skettenis tui_erase_data_content ((char *) NULL);
215*b725ae77Skettenis if (!reuse_windows)
216*b725ae77Skettenis tui_delete_data_content_windows ();
217*b725ae77Skettenis tui_display_data_from_line (first_line);
218*b725ae77Skettenis }
219*b725ae77Skettenis }
220*b725ae77Skettenis
221*b725ae77Skettenis
222*b725ae77Skettenis /* Function to redisplay the contents of the data window. */
223*b725ae77Skettenis void
tui_refresh_data_win(void)224*b725ae77Skettenis tui_refresh_data_win (void)
225*b725ae77Skettenis {
226*b725ae77Skettenis tui_erase_data_content ((char *) NULL);
227*b725ae77Skettenis if (TUI_DATA_WIN->generic.content_size > 0)
228*b725ae77Skettenis {
229*b725ae77Skettenis int first_element = tui_first_data_item_displayed ();
230*b725ae77Skettenis
231*b725ae77Skettenis if (first_element >= 0) /* re-use existing windows */
232*b725ae77Skettenis tui_display_data_from (first_element, TRUE);
233*b725ae77Skettenis }
234*b725ae77Skettenis }
235*b725ae77Skettenis
236*b725ae77Skettenis
237*b725ae77Skettenis /* Function to check the data values and hilite any that have changed. */
238*b725ae77Skettenis void
tui_check_data_values(struct frame_info * frame)239*b725ae77Skettenis tui_check_data_values (struct frame_info *frame)
240*b725ae77Skettenis {
241*b725ae77Skettenis tui_check_register_values (frame);
242*b725ae77Skettenis
243*b725ae77Skettenis /* Now check any other data values that there are */
244*b725ae77Skettenis if (TUI_DATA_WIN != NULL && TUI_DATA_WIN->generic.is_visible)
245*b725ae77Skettenis {
246*b725ae77Skettenis int i;
247*b725ae77Skettenis
248*b725ae77Skettenis for (i = 0; TUI_DATA_WIN->detail.data_display_info.data_content_count; i++)
249*b725ae77Skettenis {
250*b725ae77Skettenis #ifdef LATER
251*b725ae77Skettenis tui_data_element_ptr data_element_ptr;
252*b725ae77Skettenis struct tui_gen_win_info * data_item_win_ptr;
253*b725ae77Skettenis Opaque new_value;
254*b725ae77Skettenis
255*b725ae77Skettenis data_item_ptr = &TUI_DATA_WIN->detail.data_display_info.
256*b725ae77Skettenis data_content[i]->which_element.data_window;
257*b725ae77Skettenis data_element_ptr = &((tui_win_content)
258*b725ae77Skettenis data_item_win_ptr->content)[0]->which_element.data;
259*b725ae77Skettenis if value
260*b725ae77Skettenis has changed (data_element_ptr, frame, &new_value)
261*b725ae77Skettenis {
262*b725ae77Skettenis data_element_ptr->value = new_value;
263*b725ae77Skettenis update the display with the new value, hiliting it.
264*b725ae77Skettenis }
265*b725ae77Skettenis #endif
266*b725ae77Skettenis }
267*b725ae77Skettenis }
268*b725ae77Skettenis }
269*b725ae77Skettenis
270*b725ae77Skettenis
271*b725ae77Skettenis /* Scroll the data window vertically forward or backward. */
272*b725ae77Skettenis void
tui_vertical_data_scroll(enum tui_scroll_direction scroll_direction,int num_to_scroll)273*b725ae77Skettenis tui_vertical_data_scroll (enum tui_scroll_direction scroll_direction, int num_to_scroll)
274*b725ae77Skettenis {
275*b725ae77Skettenis int first_element_no;
276*b725ae77Skettenis int first_line = (-1);
277*b725ae77Skettenis
278*b725ae77Skettenis first_element_no = tui_first_data_item_displayed ();
279*b725ae77Skettenis if (first_element_no < TUI_DATA_WIN->detail.data_display_info.regs_content_count)
280*b725ae77Skettenis first_line = tui_line_from_reg_element_no (first_element_no);
281*b725ae77Skettenis else
282*b725ae77Skettenis { /* calculate the first line from the element number which is in
283*b725ae77Skettenis ** the general data content
284*b725ae77Skettenis */
285*b725ae77Skettenis }
286*b725ae77Skettenis
287*b725ae77Skettenis if (first_line >= 0)
288*b725ae77Skettenis {
289*b725ae77Skettenis int last_element_no, last_line;
290*b725ae77Skettenis
291*b725ae77Skettenis if (scroll_direction == FORWARD_SCROLL)
292*b725ae77Skettenis first_line += num_to_scroll;
293*b725ae77Skettenis else
294*b725ae77Skettenis first_line -= num_to_scroll;
295*b725ae77Skettenis tui_erase_data_content ((char *) NULL);
296*b725ae77Skettenis tui_delete_data_content_windows ();
297*b725ae77Skettenis tui_display_data_from_line (first_line);
298*b725ae77Skettenis }
299*b725ae77Skettenis }
300*b725ae77Skettenis
301*b725ae77Skettenis
302*b725ae77Skettenis /*****************************************
303*b725ae77Skettenis ** STATIC LOCAL FUNCTIONS **
304*b725ae77Skettenis ******************************************/
305