Move content_in_use to tui_source_window class
[deliverable/binutils-gdb.git] / gdb / tui / tui-data.h
CommitLineData
f377b406 1/* TUI data manipulation routines.
55fb0713 2
42a4f53d 3 Copyright (C) 1998-2019 Free Software Foundation, Inc.
55fb0713 4
f377b406
SC
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
a9762ec7 11 the Free Software Foundation; either version 3 of the License, or
f377b406
SC
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
a9762ec7 20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
f377b406 21
1a5c2598
TT
22#ifndef TUI_TUI_DATA_H
23#define TUI_TUI_DATA_H
c906108c 24
6a83354a
AC
25#include "tui/tui.h" /* For enum tui_win_type. */
26#include "gdb_curses.h" /* For WINDOW. */
b73dd877 27#include "observable.h"
6a83354a
AC
28
29/* This is a point definition. */
30struct tui_point
31{
32 int x, y;
33};
2a5127c4 34
1cc6d956 35/* Generic window information. */
2a8854a7
AC
36struct tui_gen_win_info
37{
fb54fa76
TT
38protected:
39
ab313b35
TT
40 explicit tui_gen_win_info (enum tui_win_type t)
41 : type (t)
42 {
43 }
44
fb54fa76
TT
45public:
46
f936bca2 47 virtual ~tui_gen_win_info ();
ab313b35 48
5b81daba
TT
49 /* Call to refresh this window. */
50 virtual void refresh_window ();
51
48a3bd16
TT
52 /* Make this window visible or invisible. */
53 virtual void make_visible (bool visible);
54
152f3f4b
TT
55 /* Return the name of this type of window. */
56 virtual const char *name () const
57 {
58 return "";
59 }
60
d6ba6a11
TT
61 /* Reset this window. WIN_TYPE must match the existing type of this
62 window (it is only passed for self-test purposes). The other
63 parameters are used to set the window's size and position. */
64 void reset (enum tui_win_type win_type,
65 int height, int width,
66 int origin_x, int origin_y);
67
ab313b35
TT
68 /* Window handle. */
69 WINDOW *handle = nullptr;
70 /* Type of window. */
71 enum tui_win_type type;
72 /* Window width. */
73 int width = 0;
74 /* Window height. */
75 int height = 0;
76 /* Origin of window. */
77 struct tui_point origin = {0, 0};
ab313b35
TT
78 /* Viewport height. */
79 int viewport_height = 0;
80 /* Index of last visible line. */
81 int last_visible_line = 0;
82 /* Whether the window is visible or not. */
83 bool is_visible = false;
84 /* Window title to display. */
85 char *title = nullptr;
2a8854a7 86};
2a5127c4 87
17374de4
TT
88/* Whether or not a window should be drawn with a box. */
89enum tui_box
90{
91 DONT_BOX_WINDOW = 0,
92 BOX_WINDOW
93};
94
1cc6d956 95/* Constant definitions. */
08ef48c5
MS
96#define DEFAULT_TAB_LEN 8
97#define NO_SRC_STRING "[ No Source Available ]"
98#define NO_DISASSEM_STRING "[ No Assembly Available ]"
99#define NO_REGS_STRING "[ Register Values Unavailable ]"
100#define NO_DATA_STRING "[ No Data Values Displayed ]"
101#define MAX_CONTENT_COUNT 100
6dce28e4
AB
102#define SRC_NAME "src"
103#define CMD_NAME "cmd"
104#define DATA_NAME "regs"
105#define DISASSEM_NAME "asm"
08ef48c5
MS
106#define TUI_NULL_STR ""
107#define DEFAULT_HISTORY_COUNT 25
08ef48c5
MS
108#define HILITE TRUE
109#define NO_HILITE FALSE
110#define WITH_LOCATOR TRUE
111#define NO_LOCATOR FALSE
112#define EMPTY_SOURCE_PROMPT TRUE
113#define NO_EMPTY_SOURCE_PROMPT FALSE
114#define UNDEFINED_ITEM -1
115#define MIN_WIN_HEIGHT 3
116#define MIN_CMD_WIN_HEIGHT 3
c906108c 117
50265402 118/* Strings to display in the TUI status line. */
08ef48c5 119#define PROC_PREFIX "In: "
9f2850ba 120#define LINE_PREFIX "L"
08ef48c5
MS
121#define PC_PREFIX "PC: "
122#define SINGLE_KEY "(SingleKey)"
50265402 123
1cc6d956
MS
124/* Minimum/Maximum length of some fields displayed in the TUI status
125 line. */
126#define MIN_LINE_WIDTH 4 /* Use at least 4 digits for line
127 numbers. */
50265402
SC
128#define MIN_PROC_WIDTH 12
129#define MAX_TARGET_WIDTH 10
9f2850ba 130#define MAX_PID_WIDTH 19
c906108c 131
1cc6d956 132/* The kinds of layouts available. */
2a8854a7
AC
133enum tui_layout_type
134{
135 SRC_COMMAND,
136 DISASSEM_COMMAND,
137 SRC_DISASSEM_COMMAND,
138 SRC_DATA_COMMAND,
139 DISASSEM_DATA_COMMAND,
140 UNDEFINED_LAYOUT
141};
c906108c 142
52059ffd
TT
143enum tui_line_or_address_kind
144{
145 LOA_LINE,
146 LOA_ADDRESS
147};
148
1cc6d956 149/* Structure describing source line or line address. */
362c05fe 150struct tui_line_or_address
2a8854a7 151{
52059ffd 152 enum tui_line_or_address_kind loa;
362c05fe
AS
153 union
154 {
155 int line_no;
156 CORE_ADDR addr;
157 } u;
2a8854a7 158};
c906108c 159
1cc6d956 160/* Current Layout definition. */
2a8854a7
AC
161struct tui_layout_def
162{
6d012f14 163 enum tui_win_type display_mode;
2a8854a7 164};
c906108c 165
0598af48
TT
166/* Flags to tell what kind of breakpoint is at current line. */
167enum tui_bp_flag
168{
169 TUI_BP_ENABLED = 0x01,
170 TUI_BP_DISABLED = 0x02,
171 TUI_BP_HIT = 0x04,
172 TUI_BP_CONDITIONAL = 0x08,
173 TUI_BP_HARDWARE = 0x10
174};
175
176DEF_ENUM_FLAGS_TYPE (enum tui_bp_flag, tui_bp_flags);
177
1cc6d956 178/* Elements in the Source/Disassembly Window. */
2a8854a7
AC
179struct tui_source_element
180{
53e7cdba
TT
181 tui_source_element ()
182 {
183 line_or_addr.loa = LOA_LINE;
184 line_or_addr.u.line_no = 0;
185 }
186
187 ~tui_source_element ()
188 {
189 xfree (line);
190 }
191
192 char *line = nullptr;
362c05fe 193 struct tui_line_or_address line_or_addr;
53e7cdba 194 bool is_exec_point = false;
0598af48 195 tui_bp_flags break_mode = 0;
2a8854a7 196};
c906108c
SS
197
198
2d42f9a8
JB
199#ifdef PATH_MAX
200# define MAX_LOCATOR_ELEMENT_LEN PATH_MAX
201#else
202# define MAX_LOCATOR_ELEMENT_LEN 1024
203#endif
c906108c 204
00b2bad4
SC
205/* Position of breakpoint markers in the exec info string. */
206#define TUI_BP_HIT_POS 0
207#define TUI_BP_BREAK_POS 1
208#define TUI_EXEC_POS 2
209#define TUI_EXECINFO_SIZE 4
210
2a8854a7 211typedef char tui_exec_info_content[TUI_EXECINFO_SIZE];
c906108c 212
489e9d8b
TT
213/* Execution info window class. */
214
215struct tui_exec_info_window : public tui_gen_win_info
216{
217 tui_exec_info_window ()
218 : tui_gen_win_info (EXEC_INFO_WIN)
219 {
220 }
221
222 ~tui_exec_info_window () override
223 {
224 xfree (m_content);
225 }
226
227 /* Get or allocate contents. */
228 tui_exec_info_content *maybe_allocate_content (int n_elements);
229
230 /* Return the contents. */
231 const tui_exec_info_content *get_content () const
232 {
233 return m_content;
234 }
235
236private:
237
238 tui_exec_info_content *m_content = nullptr;
239};
240
3add462f
TT
241/* Locator window class. */
242
243struct tui_locator_window : public tui_gen_win_info
244{
245 tui_locator_window ()
246 : tui_gen_win_info (LOCATOR_WIN)
247 {
248 full_name[0] = 0;
249 proc_name[0] = 0;
250 }
251
252 char full_name[MAX_LOCATOR_ELEMENT_LEN];
253 char proc_name[MAX_LOCATOR_ELEMENT_LEN];
254 int line_no = 0;
255 CORE_ADDR addr = 0;
256 /* Architecture associated with code at this location. */
257 struct gdbarch *gdbarch = nullptr;
258};
259
41bcff7f
TT
260/* A data item window. */
261
262struct tui_data_item_window : public tui_gen_win_info
263{
264 tui_data_item_window ()
265 : tui_gen_win_info (DATA_ITEM_WIN)
266 {
267 }
268
269 ~tui_data_item_window () override;
270
271 const char *name = nullptr;
272 /* The register number, or data display number. */
273 int item_no = UNDEFINED_ITEM;
41bcff7f
TT
274 void *value = nullptr;
275 bool highlight = false;
276 char *content = nullptr;
277};
278
1cc6d956 279/* This defines information about each logical window. */
cb2ce893 280struct tui_win_info : public tui_gen_win_info
2a8854a7 281{
33b906ab 282protected:
e7e11af4 283
33b906ab 284 explicit tui_win_info (enum tui_win_type type);
6792b55e
TT
285 DISABLE_COPY_AND_ASSIGN (tui_win_info);
286
13446e05
TT
287 /* Scroll the contents vertically. This is only called via
288 forward_scroll and backward_scroll. */
c3bd716f 289 virtual void do_scroll_vertical (int num_to_scroll) = 0;
13446e05
TT
290
291 /* Scroll the contents horizontally. This is only called via
292 left_scroll and right_scroll. */
c3bd716f 293 virtual void do_scroll_horizontal (int num_to_scroll) = 0;
13446e05 294
5fcee43a
TT
295 /* Called after make_visible_with_new_height sets the new height.
296 Should update the window. */
297 virtual void do_make_visible_with_new_height () = 0;
298
33b906ab
TT
299public:
300
f936bca2
TT
301 ~tui_win_info () override
302 {
303 }
33b906ab 304
8761a91b
TT
305 /* Clear the pertinent detail in the window. */
306 virtual void clear_detail () = 0;
307
44f0e208
TT
308 /* Return true if this window has the locator. */
309 virtual bool has_locator () const
310 {
311 return false;
312 }
313
2042b506
TT
314 /* Refresh this window and any associated windows. */
315 virtual void refresh ();
316
1825f487
TT
317 /* Called after all the TUI windows are refreshed, to let this
318 window have a chance to update itself further. */
319 virtual void refresh_all ()
320 {
321 }
322
3f02ce1e
TT
323 /* Called after a TUI window is given a new height; this updates any
324 related auxiliary windows. */
325 virtual void set_new_height (int height)
326 {
327 }
328
8903bd8a
TT
329 /* Compute the maximum height of this window. */
330 virtual int max_height () const;
331
d83f1fe6
TT
332 /* Called after the tab width has been changed. */
333 virtual void update_tab_width ()
334 {
335 }
336
5fcee43a
TT
337 /* Make the window visible after the height has been changed. */
338 void make_visible_with_new_height ();
339
214a5cbe
TT
340 /* Set whether this window is highglighted. */
341 void set_highlight (bool highlight)
342 {
343 is_highlighted = highlight;
344 }
345
13446e05
TT
346 /* Methods to scroll the contents of this window. Note that they
347 are named with "_scroll" coming at the end because the more
348 obvious "scroll_forward" is defined as a macro in term.h. */
349 void forward_scroll (int num_to_scroll);
350 void backward_scroll (int num_to_scroll);
351 void left_scroll (int num_to_scroll);
352 void right_scroll (int num_to_scroll);
353
06210ce4
TT
354 /* Return true if this window can be scrolled, false otherwise. */
355 virtual bool can_scroll () const
356 {
357 return true;
358 }
359
33b906ab 360 /* Can this window ever be highlighted? */
d6ba6a11 361 bool can_highlight = true;
33b906ab
TT
362
363 /* Is this window highlighted? */
214a5cbe 364 bool is_highlighted = false;
33b906ab
TT
365};
366
5cf82909
TT
367/* The base class for all source-like windows, namely the source and
368 disassembly windows. */
369
370struct tui_source_window_base : public tui_win_info
33b906ab 371{
5cf82909
TT
372protected:
373 explicit tui_source_window_base (enum tui_win_type type);
374 ~tui_source_window_base () override;
375 DISABLE_COPY_AND_ASSIGN (tui_source_window_base);
376
c3bd716f 377 void do_scroll_horizontal (int num_to_scroll) override;
5fcee43a 378 void do_make_visible_with_new_height () override;
13446e05 379
5cf82909 380public:
8761a91b
TT
381
382 void clear_detail () override;
44f0e208
TT
383
384 /* Return true if this window has the locator. */
e6e41501
TT
385 bool has_locator () const override
386 {
387 return m_has_locator;
388 }
389
56122977 390 void make_visible (bool visible) override;
2042b506 391 void refresh () override;
1825f487 392 void refresh_all () override;
cda37efb 393
ad54d15b
TT
394 /* Refill the source window's source cache and update it. If this
395 is a disassembly window, then just update it. */
396 void refill ();
397
398 /* Set the location of the execution point. */
399 void set_is_exec_point_at (struct tui_line_or_address l);
400
3f02ce1e
TT
401 void set_new_height (int height) override;
402
d83f1fe6
TT
403 void update_tab_width () override;
404
c2cd8994
TT
405 /* Return true if the location LOC corresponds to the line number
406 LINE_NO in this source window; false otherwise. */
407 virtual bool location_matches_p (struct bp_location *loc, int line_no) = 0;
408
a38da35d
TT
409 /* Can it be used, or is it already used? */
410 bool content_in_use = false;
e6e41501
TT
411 /* Does the locator belong to this window? */
412 bool m_has_locator = false;
413 /* Execution information window. */
489e9d8b 414 struct tui_exec_info_window *execution_info = nullptr;
e6e41501
TT
415 /* Used for horizontal scroll. */
416 int horizontal_offset = 0;
417 struct tui_line_or_address start_line_or_addr;
418
419 /* It is the resolved form as returned by symtab_to_fullname. */
420 char *fullname = nullptr;
421
422 /* Architecture associated with code at this location. */
423 struct gdbarch *gdbarch = nullptr;
53e7cdba
TT
424
425 std::vector<tui_source_element> content;
33b906ab
TT
426};
427
5cf82909
TT
428/* A TUI source window. */
429
430struct tui_source_window : public tui_source_window_base
431{
b73dd877
TT
432 tui_source_window ();
433 ~tui_source_window ();
5cf82909
TT
434
435 DISABLE_COPY_AND_ASSIGN (tui_source_window);
13446e05 436
152f3f4b
TT
437 const char *name () const override
438 {
439 return SRC_NAME;
440 }
441
c2cd8994
TT
442 bool location_matches_p (struct bp_location *loc, int line_no) override;
443
a38da35d
TT
444 bool showing_source_p (const char *filename) const;
445
13446e05
TT
446protected:
447
c3bd716f 448 void do_scroll_vertical (int num_to_scroll) override;
b73dd877
TT
449
450private:
451
452 void style_changed ();
453
454 /* A token used to register and unregister an observer. */
455 gdb::observers::token m_observable;
5cf82909
TT
456};
457
458/* A TUI disassembly window. */
459
460struct tui_disasm_window : public tui_source_window_base
461{
462 tui_disasm_window ()
463 : tui_source_window_base (DISASSEM_WIN)
464 {
465 }
466
467 DISABLE_COPY_AND_ASSIGN (tui_disasm_window);
13446e05 468
152f3f4b
TT
469 const char *name () const override
470 {
471 return DISASSEM_NAME;
472 }
473
c2cd8994
TT
474 bool location_matches_p (struct bp_location *loc, int line_no) override;
475
13446e05
TT
476protected:
477
c3bd716f 478 void do_scroll_vertical (int num_to_scroll) override;
5cf82909
TT
479};
480
33b906ab
TT
481struct tui_data_window : public tui_win_info
482{
63901aec
TT
483 tui_data_window ()
484 : tui_win_info (DATA_WIN)
485 {
486 }
487
33b906ab 488 DISABLE_COPY_AND_ASSIGN (tui_data_window);
8761a91b
TT
489
490 void clear_detail () override;
1825f487 491 void refresh_all () override;
13446e05 492
3f02ce1e
TT
493 void set_new_height (int height) override;
494
5b81daba
TT
495 void refresh_window () override;
496
152f3f4b
TT
497 const char *name () const override
498 {
499 return DATA_NAME;
500 }
501
21e1c91e
TT
502 /* Windows that are used to display registers. */
503 std::vector<std::unique_ptr<tui_data_item_window>> regs_content;
63901aec
TT
504 int regs_column_count = 0;
505 /* Should regs be displayed at all? */
506 bool display_regs = false;
507 struct reggroup *current_group = nullptr;
238eb706 508
0b5ec218
TT
509 /* Answer the number of the last line in the regs display. If there
510 are no registers (-1) is returned. */
511 int last_regs_line_no () const;
512
3b23c5f2
TT
513 /* Answer the line number that the register element at element_no is
514 on. If element_no is greater than the number of register
515 elements there are, -1 is returned. */
516 int line_from_reg_element_no (int element_no) const;
517
baff0c28
TT
518 /* Answer the index of the first element in line_no. If line_no is
519 past the register area (-1) is returned. */
520 int first_reg_element_no_inline (int line_no) const;
521
50daf268
TT
522 /* Displays the data that is in the data window's content. It does
523 not set the content. */
524 void display_all_data ();
525
b4094625
TT
526 /* Delete all the item windows in the data window. This is usually
527 done when the data window is scrolled. */
528 void delete_data_content_windows ();
529
f76d8b19
TT
530 void erase_data_content (const char *prompt);
531
517e9505
TT
532 /* Display the registers in the content from 'start_element_no'
533 until the end of the register content or the end of the display
534 height. No checking for displaying past the end of the registers
535 is done here. */
536 void display_registers_from (int start_element_no);
537
538 /* Display the registers starting at line line_no in the data
539 window. Answers the line number that the display actually
540 started from. If nothing is displayed (-1) is returned. */
541 int display_registers_from_line (int line_no);
542
13446e05
TT
543protected:
544
c3bd716f
TT
545 void do_scroll_vertical (int num_to_scroll) override;
546 void do_scroll_horizontal (int num_to_scroll) override
13446e05
TT
547 {
548 }
5fcee43a 549 void do_make_visible_with_new_height () override;
eaf9738b
TT
550
551 /* Return the index of the first element displayed. If none are
552 displayed, then return -1. */
553 int first_data_item_displayed ();
aca2dd16
TT
554
555 /* Display the registers in the content from 'start_element_no' on
556 'start_line_no' until the end of the register content or the end
557 of the display height. This function checks that we won't
558 display off the end of the register display. */
559 void display_reg_element_at_line (int start_element_no, int start_line_no);
33b906ab
TT
560};
561
562struct tui_cmd_window : public tui_win_info
563{
63901aec
TT
564 tui_cmd_window ()
565 : tui_win_info (CMD_WIN)
566 {
d6ba6a11 567 can_highlight = false;
63901aec
TT
568 }
569
33b906ab 570 DISABLE_COPY_AND_ASSIGN (tui_cmd_window);
8761a91b
TT
571
572 void clear_detail () override;
13446e05 573
56122977 574 void make_visible (bool visible) override
cda37efb
TT
575 {
576 }
577
8903bd8a
TT
578 int max_height () const override;
579
5b81daba
TT
580 void refresh_window () override
581 {
582 }
583
152f3f4b
TT
584 const char *name () const override
585 {
586 return CMD_NAME;
587 }
588
06210ce4
TT
589 bool can_scroll () const override
590 {
591 return false;
592 }
593
63901aec 594 int start_line = 0;
81491aa0 595
13446e05
TT
596protected:
597
c3bd716f 598 void do_scroll_vertical (int num_to_scroll) override
13446e05
TT
599 {
600 }
601
c3bd716f 602 void do_scroll_horizontal (int num_to_scroll) override
13446e05
TT
603 {
604 }
5fcee43a
TT
605
606 void do_make_visible_with_new_height () override;
2a8854a7 607};
c906108c 608
6658b1bf 609extern int tui_win_is_auxiliary (enum tui_win_type win_type);
c906108c
SS
610
611
1cc6d956 612/* Global Data. */
7fa29be9 613extern struct tui_win_info *tui_win_list[MAX_MAJOR_WINDOWS];
c906108c 614
a38da35d 615#define TUI_SRC_WIN ((tui_source_window *) tui_win_list[SRC_WIN])
e6e41501 616#define TUI_DISASM_WIN ((tui_source_window_base *) tui_win_list[DISASSEM_WIN])
238eb706 617#define TUI_DATA_WIN ((tui_data_window *) tui_win_list[DATA_WIN])
81491aa0 618#define TUI_CMD_WIN ((tui_cmd_window *) tui_win_list[CMD_WIN])
c906108c 619
1ce3e844
TT
620/* An iterator that iterates over all windows. */
621
622class tui_window_iterator
623{
624public:
625
626 typedef tui_window_iterator self_type;
627 typedef struct tui_win_info *value_type;
628 typedef struct tui_win_info *&reference;
629 typedef struct tui_win_info **pointer;
630 typedef std::forward_iterator_tag iterator_category;
631 typedef int difference_type;
632
633 explicit tui_window_iterator (enum tui_win_type type)
634 : m_type (type)
635 {
636 advance ();
637 }
638
639 tui_window_iterator ()
640 : m_type (MAX_MAJOR_WINDOWS)
641 {
642 }
643
644 bool operator!= (const self_type &other) const
645 {
646 return m_type != other.m_type;
647 }
648
649 value_type operator* () const
650 {
651 gdb_assert (m_type < MAX_MAJOR_WINDOWS);
652 return tui_win_list[m_type];
653 }
654
655 self_type &operator++ ()
656 {
657 ++m_type;
658 advance ();
659 return *this;
660 }
661
662private:
663
664 void advance ()
665 {
666 while (m_type < MAX_MAJOR_WINDOWS && tui_win_list[m_type] == nullptr)
667 ++m_type;
668 }
669
670 int m_type;
671};
672
673/* A range adapter for iterating over TUI windows. */
674
675struct all_tui_windows
676{
677 tui_window_iterator begin () const
678 {
679 return tui_window_iterator (SRC_WIN);
680 }
681
682 tui_window_iterator end () const
683 {
684 return tui_window_iterator ();
685 }
686};
687
688
1cc6d956 689/* Data Manipulation Functions. */
dd1abb8c 690extern void tui_initialize_static_data (void);
a121b7c1 691extern struct tui_win_info *tui_partial_win_by_name (const char *);
2a8854a7
AC
692extern enum tui_layout_type tui_current_layout (void);
693extern void tui_set_current_layout_to (enum tui_layout_type);
dd1abb8c
AC
694extern int tui_term_height (void);
695extern void tui_set_term_height_to (int);
696extern int tui_term_width (void);
697extern void tui_set_term_width_to (int);
3add462f 698extern struct tui_locator_window *tui_locator_win_info_ptr (void);
ad54d15b 699extern std::vector<tui_source_window_base *> &tui_source_windows ();
dd1abb8c
AC
700extern void tui_clear_source_windows (void);
701extern void tui_clear_source_windows_detail (void);
ad54d15b 702extern void tui_add_to_source_windows (struct tui_source_window_base *);
dd1abb8c
AC
703extern struct tui_win_info *tui_win_with_focus (void);
704extern void tui_set_win_with_focus (struct tui_win_info *);
5b6fe301 705extern struct tui_layout_def *tui_layout_def (void);
dd1abb8c
AC
706extern int tui_win_resized (void);
707extern void tui_set_win_resized_to (int);
708
709extern struct tui_win_info *tui_next_win (struct tui_win_info *);
710extern struct tui_win_info *tui_prev_win (struct tui_win_info *);
711
7806cea7
TT
712extern unsigned int tui_tab_width;
713
1a5c2598 714#endif /* TUI_TUI_DATA_H */
This page took 2.084562 seconds and 4 git commands to generate.