xref: /netbsd-src/external/gpl3/gdb.old/dist/gdb/tui/tui-data.h (revision 8b657b0747480f8989760d71343d6dd33f8d4cf9)
1 /* TUI data manipulation routines.
2 
3    Copyright (C) 1998-2023 Free Software Foundation, Inc.
4 
5    Contributed by Hewlett-Packard Company.
6 
7    This file is part of GDB.
8 
9    This program is free software; you can redistribute it and/or modify
10    it under the terms of the GNU General Public License as published by
11    the Free Software Foundation; either version 3 of the License, or
12    (at your option) any later version.
13 
14    This program is distributed in the hope that it will be useful,
15    but WITHOUT ANY WARRANTY; without even the implied warranty of
16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17    GNU General Public License for more details.
18 
19    You should have received a copy of the GNU General Public License
20    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
21 
22 #ifndef TUI_TUI_DATA_H
23 #define TUI_TUI_DATA_H
24 
25 #include "tui/tui.h"
26 #include "gdb_curses.h"	/* For WINDOW.  */
27 #include "observable.h"
28 
29 /* A deleter that calls delwin.  */
30 struct curses_deleter
31 {
32   void operator() (WINDOW *win) const
33   {
34     delwin (win);
35   }
36 };
37 
38 #define MIN_WIN_HEIGHT          3
39 
40 /* Generic window information.  */
41 struct tui_win_info
42 {
43 protected:
44 
45   tui_win_info () = default;
46   DISABLE_COPY_AND_ASSIGN (tui_win_info);
47 
48   /* This is called after the window is resized, and should update the
49      window's contents.  */
50   virtual void rerender ();
51 
52   virtual void make_window ();
53 
54 public:
55   tui_win_info (tui_win_info &&) = default;
56   virtual ~tui_win_info () = default;
57 
58   /* Call to refresh this window.  */
59   virtual void refresh_window ();
60 
61   /* Make this window visible or invisible.  */
62   virtual void make_visible (bool visible);
63 
64   /* Return the name of this type of window.  */
65   virtual const char *name () const = 0;
66 
67   /* Compute the maximum height of this window.  */
68   virtual int max_height () const;
69 
70   /* Compute the minimum height of this window.  */
71   virtual int min_height () const
72   {
73     return MIN_WIN_HEIGHT;
74   }
75 
76   /* Compute the maximum width of this window.  */
77   int max_width () const;
78 
79   /* Compute the minimum width of this window.  */
80   int min_width () const
81   {
82     return 3;
83   }
84 
85   /* Return true if this window can be boxed.  */
86   virtual bool can_box () const
87   {
88     return true;
89   }
90 
91   /* Resize this window.  The parameters are used to set the window's
92      size and position.  */
93   virtual void resize (int height, int width,
94 		       int origin_x, int origin_y);
95 
96   /* Return true if this window is visible.  */
97   bool is_visible () const
98   {
99     return handle != nullptr && tui_active;
100   }
101 
102   /* Return true if this window can accept the focus.  */
103   virtual bool can_focus () const
104   {
105     return true;
106   }
107 
108   /* Disable output until the next call to doupdate.  */
109   void no_refresh ()
110   {
111     if (handle != nullptr)
112       wnoutrefresh (handle.get ());
113   }
114 
115   /* Called after the tab width has been changed.  */
116   virtual void update_tab_width ()
117   {
118   }
119 
120   /* Set whether this window is highlighted.  */
121   void set_highlight (bool highlight)
122   {
123     is_highlighted = highlight;
124   }
125 
126   /* Methods to scroll the contents of this window.  Note that they
127      are named with "_scroll" coming at the end because the more
128      obvious "scroll_forward" is defined as a macro in term.h.  */
129   void forward_scroll (int num_to_scroll);
130   void backward_scroll (int num_to_scroll);
131   void left_scroll (int num_to_scroll);
132   void right_scroll (int num_to_scroll);
133 
134   /* Return true if this window can be scrolled, false otherwise.  */
135   virtual bool can_scroll () const
136   {
137     return true;
138   }
139 
140   /* Called for each mouse click inside this window.  Coordinates MOUSE_X
141      and MOUSE_Y are 0-based relative to the window, and MOUSE_BUTTON can
142      be 1 (left), 2 (middle), or 3 (right).  */
143   virtual void click (int mouse_x, int mouse_y, int mouse_button)
144   {
145   }
146 
147   void check_and_display_highlight_if_needed ();
148 
149   /* Window handle.  */
150   std::unique_ptr<WINDOW, curses_deleter> handle;
151   /* Window width.  */
152   int width = 0;
153   /* Window height.  */
154   int height = 0;
155   /* Origin of window.  */
156   int x = 0;
157   int y = 0;
158 
159   /* Window title to display.  */
160   std::string title;
161 
162   /* Is this window highlighted?  */
163   bool is_highlighted = false;
164 
165 protected:
166 
167   /* Scroll the contents vertically.  This is only called via
168      forward_scroll and backward_scroll.  */
169   virtual void do_scroll_vertical (int num_to_scroll) = 0;
170 
171   /* Scroll the contents horizontally.  This is only called via
172      left_scroll and right_scroll.  */
173   virtual void do_scroll_horizontal (int num_to_scroll) = 0;
174 };
175 
176 /* Constant definitions.  */
177 #define SRC_NAME                "src"
178 #define CMD_NAME                "cmd"
179 #define DATA_NAME               "regs"
180 #define DISASSEM_NAME           "asm"
181 #define STATUS_NAME		"status"
182 
183 /* Global Data.  */
184 extern struct tui_win_info *tui_win_list[MAX_MAJOR_WINDOWS];
185 
186 #define TUI_SRC_WIN     ((tui_source_window *) tui_win_list[SRC_WIN])
187 #define TUI_DISASM_WIN	((tui_disasm_window *) tui_win_list[DISASSEM_WIN])
188 #define TUI_DATA_WIN    ((tui_data_window *) tui_win_list[DATA_WIN])
189 #define TUI_CMD_WIN     ((tui_cmd_window *) tui_win_list[CMD_WIN])
190 #define TUI_STATUS_WIN  ((tui_locator_window *) tui_win_list[STATUS_WIN])
191 
192 /* All the windows that are currently instantiated, in layout
193    order.  */
194 extern std::vector<tui_win_info *> tui_windows;
195 
196 /* Return a range adapter for iterating over TUI windows.  */
197 static inline std::vector<tui_win_info *> &
198 all_tui_windows ()
199 {
200   return tui_windows;
201 }
202 
203 /* Data Manipulation Functions.  */
204 extern int tui_term_height (void);
205 extern void tui_set_term_height_to (int);
206 extern int tui_term_width (void);
207 extern void tui_set_term_width_to (int);
208 extern struct tui_win_info *tui_win_with_focus (void);
209 extern bool tui_win_resized ();
210 extern void tui_set_win_resized_to (bool);
211 
212 extern struct tui_win_info *tui_next_win (struct tui_win_info *);
213 extern struct tui_win_info *tui_prev_win (struct tui_win_info *);
214 
215 extern unsigned int tui_tab_width;
216 
217 #endif /* TUI_TUI_DATA_H */
218