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