1 /* TUI layout window management.
3 Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2007, 2008, 2009
4 Free Software Foundation, Inc.
6 Contributed by Hewlett-Packard Company.
8 This file is part of GDB.
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
12 the Free Software Foundation; either version 3 of the License, or
13 (at your option) any later version.
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.
20 You should have received a copy of the GNU General Public License
21 along with this program. If not, see <http://www.gnu.org/licenses/>. */
31 #include "tui/tui-data.h"
32 #include "tui/tui-windata.h"
33 #include "tui/tui-wingeneral.h"
34 #include "tui/tui-stack.h"
35 #include "tui/tui-regs.h"
36 #include "tui/tui-win.h"
37 #include "tui/tui-winsource.h"
38 #include "tui/tui-disasm.h"
39 #include "tui/tui-layout.h"
41 #include "gdb_string.h"
42 #include "gdb_curses.h"
44 /*******************************
46 ********************************/
47 static void show_layout (enum tui_layout_type
);
48 static void init_gen_win_info (struct tui_gen_win_info
*,
51 static void *init_and_make_win (void *, enum tui_win_type
,
52 int, int, int, int, int);
53 static void show_source_or_disasm_and_command (enum tui_layout_type
);
54 static void make_source_or_disasm_window (struct tui_win_info
**,
57 static void make_command_window (struct tui_win_info
**, int, int);
58 static void make_source_window (struct tui_win_info
**, int, int);
59 static void make_disasm_window (struct tui_win_info
**, int, int);
60 static void make_data_window (struct tui_win_info
**, int, int);
61 static void show_source_command (void);
62 static void show_disasm_command (void);
63 static void show_source_disasm_command (void);
64 static void show_data (enum tui_layout_type
);
65 static enum tui_layout_type
next_layout (void);
66 static enum tui_layout_type
prev_layout (void);
67 static void tui_layout_command (char *, int);
68 static void tui_toggle_layout_command (char *, int);
69 static void tui_toggle_split_layout_command (char *, int);
70 static CORE_ADDR
extract_display_start_addr (void);
71 static void tui_handle_xdb_layout (struct tui_layout_def
*);
74 /***************************************
76 ***************************************/
78 #define LAYOUT_USAGE "Usage: layout prev | next | <layout_name> \n"
80 /* Show the screen layout defined. */
82 show_layout (enum tui_layout_type layout
)
84 enum tui_layout_type cur_layout
= tui_current_layout ();
86 if (layout
!= cur_layout
)
88 /* Since the new layout may cause changes in window size, we
89 should free the content and reallocate on next display of
91 tui_free_all_source_wins_content ();
92 tui_clear_source_windows ();
93 if (layout
== SRC_DATA_COMMAND
94 || layout
== DISASSEM_DATA_COMMAND
)
97 tui_refresh_all (tui_win_list
);
101 /* First make the current layout be invisible. */
102 tui_make_all_invisible ();
103 tui_make_invisible (tui_locator_win_info_ptr ());
107 /* Now show the new layout. */
109 show_source_command ();
110 tui_add_to_source_windows (TUI_SRC_WIN
);
112 case DISASSEM_COMMAND
:
113 show_disasm_command ();
114 tui_add_to_source_windows (TUI_DISASM_WIN
);
116 case SRC_DISASSEM_COMMAND
:
117 show_source_disasm_command ();
118 tui_add_to_source_windows (TUI_SRC_WIN
);
119 tui_add_to_source_windows (TUI_DISASM_WIN
);
129 /* Function to set the layout to SRC_COMMAND, DISASSEM_COMMAND,
130 SRC_DISASSEM_COMMAND, SRC_DATA_COMMAND, or DISASSEM_DATA_COMMAND.
131 If the layout is SRC_DATA_COMMAND, DISASSEM_DATA_COMMAND, or
132 UNDEFINED_LAYOUT, then the data window is populated according to
133 regs_display_type. */
135 tui_set_layout (enum tui_layout_type layout_type
,
136 enum tui_register_display_type regs_display_type
)
138 enum tui_status status
= TUI_SUCCESS
;
140 if (layout_type
!= UNDEFINED_LAYOUT
141 || regs_display_type
!= TUI_UNDEFINED_REGS
)
143 enum tui_layout_type cur_layout
= tui_current_layout (),
144 new_layout
= UNDEFINED_LAYOUT
;
145 int regs_populate
= FALSE
;
146 CORE_ADDR addr
= extract_display_start_addr ();
147 struct tui_win_info
*win_with_focus
= tui_win_with_focus ();
148 struct tui_layout_def
*layout_def
= tui_layout_def ();
151 if (layout_type
== UNDEFINED_LAYOUT
152 && regs_display_type
!= TUI_UNDEFINED_REGS
)
154 if (cur_layout
== SRC_DISASSEM_COMMAND
)
155 new_layout
= DISASSEM_DATA_COMMAND
;
156 else if (cur_layout
== SRC_COMMAND
157 || cur_layout
== SRC_DATA_COMMAND
)
158 new_layout
= SRC_DATA_COMMAND
;
159 else if (cur_layout
== DISASSEM_COMMAND
160 || cur_layout
== DISASSEM_DATA_COMMAND
)
161 new_layout
= DISASSEM_DATA_COMMAND
;
164 new_layout
= layout_type
;
166 regs_populate
= (new_layout
== SRC_DATA_COMMAND
167 || new_layout
== DISASSEM_DATA_COMMAND
168 || regs_display_type
!= TUI_UNDEFINED_REGS
);
169 if (new_layout
!= cur_layout
170 || regs_display_type
!= TUI_UNDEFINED_REGS
)
172 if (new_layout
!= cur_layout
)
174 show_layout (new_layout
);
176 /* Now determine where focus should be. */
177 if (win_with_focus
!= TUI_CMD_WIN
)
182 tui_set_win_focus_to (TUI_SRC_WIN
);
183 layout_def
->display_mode
= SRC_WIN
;
184 layout_def
->split
= FALSE
;
186 case DISASSEM_COMMAND
:
187 /* The previous layout was not showing code.
188 This can happen if there is no source
191 1. if the source file is in another dir OR
192 2. if target was compiled without -g
193 We still want to show the assembly though! */
195 addr
= tui_get_begin_asm_address ();
196 tui_set_win_focus_to (TUI_DISASM_WIN
);
197 layout_def
->display_mode
= DISASSEM_WIN
;
198 layout_def
->split
= FALSE
;
200 case SRC_DISASSEM_COMMAND
:
201 /* The previous layout was not showing code.
202 This can happen if there is no source
205 1. if the source file is in another dir OR
206 2. if target was compiled without -g
207 We still want to show the assembly though! */
209 addr
= tui_get_begin_asm_address ();
210 if (win_with_focus
== TUI_SRC_WIN
)
211 tui_set_win_focus_to (TUI_SRC_WIN
);
213 tui_set_win_focus_to (TUI_DISASM_WIN
);
214 layout_def
->split
= TRUE
;
216 case SRC_DATA_COMMAND
:
217 if (win_with_focus
!= TUI_DATA_WIN
)
218 tui_set_win_focus_to (TUI_SRC_WIN
);
220 tui_set_win_focus_to (TUI_DATA_WIN
);
221 layout_def
->display_mode
= SRC_WIN
;
222 layout_def
->split
= FALSE
;
224 case DISASSEM_DATA_COMMAND
:
225 /* The previous layout was not showing code.
226 This can happen if there is no source
229 1. if the source file is in another dir OR
230 2. if target was compiled without -g
231 We still want to show the assembly though! */
233 addr
= tui_get_begin_asm_address ();
234 if (win_with_focus
!= TUI_DATA_WIN
)
235 tui_set_win_focus_to (TUI_DISASM_WIN
);
237 tui_set_win_focus_to (TUI_DATA_WIN
);
238 layout_def
->display_mode
= DISASSEM_WIN
;
239 layout_def
->split
= FALSE
;
246 * Now update the window content.
249 && (new_layout
== SRC_DATA_COMMAND
250 || new_layout
== DISASSEM_DATA_COMMAND
))
251 tui_display_all_data ();
253 tui_update_source_windows_with_addr (addr
);
257 tui_show_registers (TUI_DATA_WIN
->detail
.data_display_info
.current_group
);
262 status
= TUI_FAILURE
;
267 /* Add the specified window to the layout in a logical way. This
268 means setting up the most logical layout given the window to be
271 tui_add_win_to_layout (enum tui_win_type type
)
273 enum tui_layout_type cur_layout
= tui_current_layout ();
278 if (cur_layout
!= SRC_COMMAND
279 && cur_layout
!= SRC_DISASSEM_COMMAND
280 && cur_layout
!= SRC_DATA_COMMAND
)
282 tui_clear_source_windows_detail ();
283 if (cur_layout
== DISASSEM_DATA_COMMAND
)
284 show_layout (SRC_DATA_COMMAND
);
286 show_layout (SRC_COMMAND
);
290 if (cur_layout
!= DISASSEM_COMMAND
291 && cur_layout
!= SRC_DISASSEM_COMMAND
292 && cur_layout
!= DISASSEM_DATA_COMMAND
)
294 tui_clear_source_windows_detail ();
295 if (cur_layout
== SRC_DATA_COMMAND
)
296 show_layout (DISASSEM_DATA_COMMAND
);
298 show_layout (DISASSEM_COMMAND
);
302 if (cur_layout
!= SRC_DATA_COMMAND
303 && cur_layout
!= DISASSEM_DATA_COMMAND
)
305 if (cur_layout
== DISASSEM_COMMAND
)
306 show_layout (DISASSEM_DATA_COMMAND
);
308 show_layout (SRC_DATA_COMMAND
);
317 /* Answer the height of a window. If it hasn't been created yet,
318 answer what the height of a window would be based upon its type and
321 tui_default_win_height (enum tui_win_type type
,
322 enum tui_layout_type layout
)
326 if (tui_win_list
[type
] != (struct tui_win_info
*) NULL
)
327 h
= tui_win_list
[type
]->generic
.height
;
333 case DISASSEM_COMMAND
:
334 if (TUI_CMD_WIN
== NULL
)
335 h
= tui_term_height () / 2;
337 h
= tui_term_height () - TUI_CMD_WIN
->generic
.height
;
339 case SRC_DISASSEM_COMMAND
:
340 case SRC_DATA_COMMAND
:
341 case DISASSEM_DATA_COMMAND
:
342 if (TUI_CMD_WIN
== NULL
)
343 h
= tui_term_height () / 3;
345 h
= (tui_term_height () - TUI_CMD_WIN
->generic
.height
) / 2;
357 /* Answer the height of a window. If it hasn't been created yet,
358 answer what the height of a window would be based upon its type and
361 tui_default_win_viewport_height (enum tui_win_type type
,
362 enum tui_layout_type layout
)
366 h
= tui_default_win_height (type
, layout
);
368 if (tui_win_list
[type
] == TUI_CMD_WIN
)
377 /* Function to initialize gdb commands, for tui window layout
380 /* Provide a prototype to silence -Wmissing-prototypes. */
381 extern initialize_file_ftype _initialize_tui_layout
;
384 _initialize_tui_layout (void)
386 add_com ("layout", class_tui
, tui_layout_command
, _("\
387 Change the layout of windows.\n\
388 Usage: layout prev | next | <layout_name> \n\
390 src : Displays source and command windows.\n\
391 asm : Displays disassembly and command windows.\n\
392 split : Displays source, disassembly and command windows.\n\
393 regs : Displays register window. If existing layout\n\
394 is source/command or assembly/command, the \n\
395 register window is displayed. If the\n\
396 source/assembly/command (split) is displayed, \n\
397 the register window is displayed with \n\
398 the window that has current logical focus.\n"));
401 add_com ("td", class_tui
, tui_toggle_layout_command
, _("\
402 Toggle between Source/Command and Disassembly/Command layouts.\n"));
403 add_com ("ts", class_tui
, tui_toggle_split_layout_command
, _("\
404 Toggle between Source/Command or Disassembly/Command and \n\
405 Source/Disassembly/Command layouts.\n"));
410 /*************************
411 ** STATIC LOCAL FUNCTIONS
412 **************************/
415 /* Function to set the layout to SRC, ASM, SPLIT, NEXT, PREV, DATA,
416 REGS, $REGS, $GREGS, $FREGS, $SREGS. */
418 tui_set_layout_for_display_command (const char *layout_name
)
420 enum tui_status status
= TUI_SUCCESS
;
422 if (layout_name
!= (char *) NULL
)
426 enum tui_layout_type new_layout
= UNDEFINED_LAYOUT
;
427 enum tui_register_display_type dpy_type
= TUI_UNDEFINED_REGS
;
428 enum tui_layout_type cur_layout
= tui_current_layout ();
430 buf_ptr
= (char *) xstrdup (layout_name
);
431 for (i
= 0; (i
< strlen (layout_name
)); i
++)
432 buf_ptr
[i
] = toupper (buf_ptr
[i
]);
434 /* First check for ambiguous input. */
435 if (strlen (buf_ptr
) <= 1
436 && (*buf_ptr
== 'S' || *buf_ptr
== '$'))
438 warning (_("Ambiguous command input."));
439 status
= TUI_FAILURE
;
443 if (subset_compare (buf_ptr
, "SRC"))
444 new_layout
= SRC_COMMAND
;
445 else if (subset_compare (buf_ptr
, "ASM"))
446 new_layout
= DISASSEM_COMMAND
;
447 else if (subset_compare (buf_ptr
, "SPLIT"))
448 new_layout
= SRC_DISASSEM_COMMAND
;
449 else if (subset_compare (buf_ptr
, "REGS")
450 || subset_compare (buf_ptr
, TUI_GENERAL_SPECIAL_REGS_NAME
)
451 || subset_compare (buf_ptr
, TUI_GENERAL_REGS_NAME
)
452 || subset_compare (buf_ptr
, TUI_FLOAT_REGS_NAME
)
453 || subset_compare (buf_ptr
, TUI_SPECIAL_REGS_NAME
))
455 if (cur_layout
== SRC_COMMAND
456 || cur_layout
== SRC_DATA_COMMAND
)
457 new_layout
= SRC_DATA_COMMAND
;
459 new_layout
= DISASSEM_DATA_COMMAND
;
461 /* Could ifdef out the following code. when compile with
462 -z, there are null pointer references that cause a
463 core dump if 'layout regs' is the first layout
464 command issued by the user. HP has asked us to hook
465 up this code. - edie epstein */
466 if (subset_compare (buf_ptr
, TUI_FLOAT_REGS_NAME
))
468 if (TUI_DATA_WIN
->detail
.data_display_info
.regs_display_type
!= TUI_SFLOAT_REGS
469 && TUI_DATA_WIN
->detail
.data_display_info
.regs_display_type
!= TUI_DFLOAT_REGS
)
470 dpy_type
= TUI_SFLOAT_REGS
;
473 TUI_DATA_WIN
->detail
.data_display_info
.regs_display_type
;
475 else if (subset_compare (buf_ptr
,
476 TUI_GENERAL_SPECIAL_REGS_NAME
))
477 dpy_type
= TUI_GENERAL_AND_SPECIAL_REGS
;
478 else if (subset_compare (buf_ptr
, TUI_GENERAL_REGS_NAME
))
479 dpy_type
= TUI_GENERAL_REGS
;
480 else if (subset_compare (buf_ptr
, TUI_SPECIAL_REGS_NAME
))
481 dpy_type
= TUI_SPECIAL_REGS
;
482 else if (TUI_DATA_WIN
)
484 if (TUI_DATA_WIN
->detail
.data_display_info
.regs_display_type
!=
487 TUI_DATA_WIN
->detail
.data_display_info
.regs_display_type
;
489 dpy_type
= TUI_GENERAL_REGS
;
492 /* End of potential ifdef.
495 /* If ifdefed out code above, then assume that the user
496 wishes to display the general purpose registers .
499 /* dpy_type = TUI_GENERAL_REGS; */
501 else if (subset_compare (buf_ptr
, "NEXT"))
502 new_layout
= next_layout ();
503 else if (subset_compare (buf_ptr
, "PREV"))
504 new_layout
= prev_layout ();
506 status
= TUI_FAILURE
;
508 tui_set_layout (new_layout
, dpy_type
);
513 status
= TUI_FAILURE
;
520 extract_display_start_addr (void)
522 enum tui_layout_type cur_layout
= tui_current_layout ();
525 struct symtab_and_line cursal
= get_current_source_symtab_and_line ();
530 case SRC_DATA_COMMAND
:
531 find_line_pc (cursal
.symtab
,
532 TUI_SRC_WIN
->detail
.source_info
.start_line_or_addr
.u
.line_no
,
536 case DISASSEM_COMMAND
:
537 case SRC_DISASSEM_COMMAND
:
538 case DISASSEM_DATA_COMMAND
:
539 addr
= TUI_DISASM_WIN
->detail
.source_info
.start_line_or_addr
.u
.addr
;
551 tui_handle_xdb_layout (struct tui_layout_def
*layout_def
)
553 if (layout_def
->split
)
555 tui_set_layout (SRC_DISASSEM_COMMAND
, TUI_UNDEFINED_REGS
);
556 tui_set_win_focus_to (tui_win_list
[layout_def
->display_mode
]);
560 if (layout_def
->display_mode
== SRC_WIN
)
561 tui_set_layout (SRC_COMMAND
, TUI_UNDEFINED_REGS
);
563 tui_set_layout (DISASSEM_DATA_COMMAND
, layout_def
->regs_display_type
);
569 tui_toggle_layout_command (char *arg
, int from_tty
)
571 struct tui_layout_def
*layout_def
= tui_layout_def ();
573 /* Make sure the curses mode is enabled. */
575 if (layout_def
->display_mode
== SRC_WIN
)
576 layout_def
->display_mode
= DISASSEM_WIN
;
578 layout_def
->display_mode
= SRC_WIN
;
580 if (!layout_def
->split
)
581 tui_handle_xdb_layout (layout_def
);
586 tui_toggle_split_layout_command (char *arg
, int from_tty
)
588 struct tui_layout_def
*layout_def
= tui_layout_def ();
590 /* Make sure the curses mode is enabled. */
592 layout_def
->split
= (!layout_def
->split
);
593 tui_handle_xdb_layout (layout_def
);
598 tui_layout_command (char *arg
, int from_tty
)
600 /* Make sure the curses mode is enabled. */
603 /* Switch to the selected layout. */
604 if (tui_set_layout_for_display_command (arg
) != TUI_SUCCESS
)
605 warning (_("Invalid layout specified.\n%s"), LAYOUT_USAGE
);
609 /* Answer the previous layout to cycle to. */
610 static enum tui_layout_type
613 enum tui_layout_type new_layout
;
615 new_layout
= tui_current_layout ();
616 if (new_layout
== UNDEFINED_LAYOUT
)
617 new_layout
= SRC_COMMAND
;
621 if (new_layout
== UNDEFINED_LAYOUT
)
622 new_layout
= SRC_COMMAND
;
629 /* Answer the next layout to cycle to. */
630 static enum tui_layout_type
633 enum tui_layout_type new_layout
;
635 new_layout
= tui_current_layout ();
636 if (new_layout
== SRC_COMMAND
)
637 new_layout
= DISASSEM_DATA_COMMAND
;
641 if (new_layout
== UNDEFINED_LAYOUT
)
642 new_layout
= DISASSEM_DATA_COMMAND
;
651 make_command_window (struct tui_win_info
**win_info_ptr
,
652 int height
, int origin_y
)
654 *win_info_ptr
= init_and_make_win (*win_info_ptr
,
662 (*win_info_ptr
)->can_highlight
= FALSE
;
666 /* make_source_window().
669 make_source_window (struct tui_win_info
**win_info_ptr
,
670 int height
, int origin_y
)
672 make_source_or_disasm_window (win_info_ptr
, SRC_WIN
, height
, origin_y
);
675 } /* make_source_window */
678 /* make_disasm_window().
681 make_disasm_window (struct tui_win_info
**win_info_ptr
,
682 int height
, int origin_y
)
684 make_source_or_disasm_window (win_info_ptr
, DISASSEM_WIN
, height
, origin_y
);
687 } /* make_disasm_window */
691 make_data_window (struct tui_win_info
**win_info_ptr
,
692 int height
, int origin_y
)
694 *win_info_ptr
= init_and_make_win (*win_info_ptr
,
705 /* Show the Source/Command layout. */
707 show_source_command (void)
709 show_source_or_disasm_and_command (SRC_COMMAND
);
713 /* Show the Dissassem/Command layout. */
715 show_disasm_command (void)
717 show_source_or_disasm_and_command (DISASSEM_COMMAND
);
721 /* Show the Source/Disassem/Command layout. */
723 show_source_disasm_command (void)
725 if (tui_current_layout () != SRC_DISASSEM_COMMAND
)
727 int cmd_height
, src_height
, asm_height
;
729 if (TUI_CMD_WIN
!= NULL
)
730 cmd_height
= TUI_CMD_WIN
->generic
.height
;
732 cmd_height
= tui_term_height () / 3;
734 src_height
= (tui_term_height () - cmd_height
) / 2;
735 asm_height
= tui_term_height () - (src_height
+ cmd_height
);
737 if (TUI_SRC_WIN
== NULL
)
738 make_source_window (&TUI_SRC_WIN
, src_height
, 0);
741 init_gen_win_info (&TUI_SRC_WIN
->generic
,
742 TUI_SRC_WIN
->generic
.type
,
744 TUI_SRC_WIN
->generic
.width
,
745 TUI_SRC_WIN
->detail
.source_info
.execution_info
->width
,
747 TUI_SRC_WIN
->can_highlight
= TRUE
;
748 init_gen_win_info (TUI_SRC_WIN
->detail
.source_info
.execution_info
,
754 tui_make_visible (&TUI_SRC_WIN
->generic
);
755 tui_make_visible (TUI_SRC_WIN
->detail
.source_info
.execution_info
);
756 TUI_SRC_WIN
->detail
.source_info
.has_locator
= FALSE
;;
758 if (TUI_SRC_WIN
!= NULL
)
760 struct tui_gen_win_info
*locator
= tui_locator_win_info_ptr ();
762 tui_show_source_content (TUI_SRC_WIN
);
763 if (TUI_DISASM_WIN
== NULL
)
765 make_disasm_window (&TUI_DISASM_WIN
, asm_height
, src_height
- 1);
766 locator
= init_and_make_win (locator
,
771 (src_height
+ asm_height
) - 1,
776 init_gen_win_info (locator
,
781 (src_height
+ asm_height
) - 1);
782 TUI_DISASM_WIN
->detail
.source_info
.has_locator
= TRUE
;
783 init_gen_win_info (&TUI_DISASM_WIN
->generic
,
784 TUI_DISASM_WIN
->generic
.type
,
786 TUI_DISASM_WIN
->generic
.width
,
787 TUI_DISASM_WIN
->detail
.source_info
.execution_info
->width
,
789 init_gen_win_info (TUI_DISASM_WIN
->detail
.source_info
.execution_info
,
795 TUI_DISASM_WIN
->can_highlight
= TRUE
;
796 tui_make_visible (&TUI_DISASM_WIN
->generic
);
797 tui_make_visible (TUI_DISASM_WIN
->detail
.source_info
.execution_info
);
799 if (TUI_DISASM_WIN
!= NULL
)
801 TUI_SRC_WIN
->detail
.source_info
.has_locator
= FALSE
;
802 TUI_DISASM_WIN
->detail
.source_info
.has_locator
= TRUE
;
803 tui_make_visible (locator
);
804 tui_show_locator_content ();
805 tui_show_source_content (TUI_DISASM_WIN
);
807 if (TUI_CMD_WIN
== NULL
)
808 make_command_window (&TUI_CMD_WIN
,
810 tui_term_height () - cmd_height
);
813 init_gen_win_info (&TUI_CMD_WIN
->generic
,
814 TUI_CMD_WIN
->generic
.type
,
815 TUI_CMD_WIN
->generic
.height
,
816 TUI_CMD_WIN
->generic
.width
,
818 TUI_CMD_WIN
->generic
.origin
.y
);
819 TUI_CMD_WIN
->can_highlight
= FALSE
;
820 tui_make_visible (&TUI_CMD_WIN
->generic
);
822 if (TUI_CMD_WIN
!= NULL
)
823 tui_refresh_win (&TUI_CMD_WIN
->generic
);
826 tui_set_current_layout_to (SRC_DISASSEM_COMMAND
);
831 /* Show the Source/Data/Command or the Dissassembly/Data/Command
834 show_data (enum tui_layout_type new_layout
)
836 int total_height
= (tui_term_height () - TUI_CMD_WIN
->generic
.height
);
837 int src_height
, data_height
;
838 enum tui_win_type win_type
;
839 struct tui_gen_win_info
*locator
= tui_locator_win_info_ptr ();
842 data_height
= total_height
/ 2;
843 src_height
= total_height
- data_height
;
844 tui_make_all_invisible ();
845 tui_make_invisible (locator
);
846 make_data_window (&TUI_DATA_WIN
, data_height
, 0);
847 TUI_DATA_WIN
->can_highlight
= TRUE
;
848 if (new_layout
== SRC_DATA_COMMAND
)
851 win_type
= DISASSEM_WIN
;
852 if (tui_win_list
[win_type
] == NULL
)
854 if (win_type
== SRC_WIN
)
855 make_source_window (&tui_win_list
[win_type
], src_height
, data_height
- 1);
857 make_disasm_window (&tui_win_list
[win_type
], src_height
, data_height
- 1);
858 locator
= init_and_make_win (locator
,
868 init_gen_win_info (&tui_win_list
[win_type
]->generic
,
869 tui_win_list
[win_type
]->generic
.type
,
871 tui_win_list
[win_type
]->generic
.width
,
872 tui_win_list
[win_type
]->detail
.source_info
.execution_info
->width
,
874 init_gen_win_info (tui_win_list
[win_type
]->detail
.source_info
.execution_info
,
880 tui_make_visible (&tui_win_list
[win_type
]->generic
);
881 tui_make_visible (tui_win_list
[win_type
]->detail
.source_info
.execution_info
);
882 init_gen_win_info (locator
,
889 tui_win_list
[win_type
]->detail
.source_info
.has_locator
= TRUE
;
890 tui_make_visible (locator
);
891 tui_show_locator_content ();
892 tui_add_to_source_windows (tui_win_list
[win_type
]);
893 tui_set_current_layout_to (new_layout
);
896 /* init_gen_win_info().
899 init_gen_win_info (struct tui_gen_win_info
*win_info
,
900 enum tui_win_type type
,
901 int height
, int width
,
902 int origin_x
, int origin_y
)
906 win_info
->type
= type
;
907 win_info
->width
= width
;
908 win_info
->height
= h
;
911 win_info
->viewport_height
= h
- 1;
912 if (win_info
->type
!= CMD_WIN
)
913 win_info
->viewport_height
--;
916 win_info
->viewport_height
= 1;
917 win_info
->origin
.x
= origin_x
;
918 win_info
->origin
.y
= origin_y
;
921 } /* init_gen_win_info */
923 /* init_and_make_win().
926 init_and_make_win (void *opaque_win_info
,
927 enum tui_win_type win_type
,
928 int height
, int width
,
929 int origin_x
, int origin_y
,
932 struct tui_gen_win_info
*generic
;
934 if (opaque_win_info
== NULL
)
936 if (tui_win_is_auxillary (win_type
))
937 opaque_win_info
= (void *) tui_alloc_generic_win_info ();
939 opaque_win_info
= (void *) tui_alloc_win_info (win_type
);
941 if (tui_win_is_auxillary (win_type
))
942 generic
= (struct tui_gen_win_info
*) opaque_win_info
;
944 generic
= &((struct tui_win_info
*) opaque_win_info
)->generic
;
946 if (opaque_win_info
!= NULL
)
948 init_gen_win_info (generic
, win_type
, height
, width
, origin_x
, origin_y
);
949 if (!tui_win_is_auxillary (win_type
))
951 if (generic
->type
== CMD_WIN
)
952 ((struct tui_win_info
*) opaque_win_info
)->can_highlight
= FALSE
;
954 ((struct tui_win_info
*) opaque_win_info
)->can_highlight
= TRUE
;
956 tui_make_window (generic
, box_it
);
958 return opaque_win_info
;
963 make_source_or_disasm_window (struct tui_win_info
**win_info_ptr
,
964 enum tui_win_type type
,
965 int height
, int origin_y
)
967 struct tui_gen_win_info
*execution_info
= (struct tui_gen_win_info
*) NULL
;
969 /* Create the exeuction info window. */
971 execution_info
= tui_source_exec_info_win_ptr ();
973 execution_info
= tui_disassem_exec_info_win_ptr ();
974 execution_info
= init_and_make_win (execution_info
,
982 /* Now create the source window. */
983 *win_info_ptr
= init_and_make_win (*win_info_ptr
,
986 tui_term_width () - execution_info
->width
,
987 execution_info
->width
,
991 (*win_info_ptr
)->detail
.source_info
.execution_info
= execution_info
;
995 /* Show the Source/Command or the Disassem layout. */
997 show_source_or_disasm_and_command (enum tui_layout_type layout_type
)
999 if (tui_current_layout () != layout_type
)
1001 struct tui_win_info
**win_info_ptr
;
1002 int src_height
, cmd_height
;
1003 struct tui_gen_win_info
*locator
= tui_locator_win_info_ptr ();
1005 if (TUI_CMD_WIN
!= NULL
)
1006 cmd_height
= TUI_CMD_WIN
->generic
.height
;
1008 cmd_height
= tui_term_height () / 3;
1009 src_height
= tui_term_height () - cmd_height
;
1011 if (layout_type
== SRC_COMMAND
)
1012 win_info_ptr
= &TUI_SRC_WIN
;
1014 win_info_ptr
= &TUI_DISASM_WIN
;
1016 if ((*win_info_ptr
) == NULL
)
1018 if (layout_type
== SRC_COMMAND
)
1019 make_source_window (win_info_ptr
, src_height
- 1, 0);
1021 make_disasm_window (win_info_ptr
, src_height
- 1, 0);
1022 locator
= init_and_make_win (locator
,
1032 init_gen_win_info (locator
,
1038 (*win_info_ptr
)->detail
.source_info
.has_locator
= TRUE
;
1039 init_gen_win_info (&(*win_info_ptr
)->generic
,
1040 (*win_info_ptr
)->generic
.type
,
1042 (*win_info_ptr
)->generic
.width
,
1043 (*win_info_ptr
)->detail
.source_info
.execution_info
->width
,
1045 init_gen_win_info ((*win_info_ptr
)->detail
.source_info
.execution_info
,
1051 (*win_info_ptr
)->can_highlight
= TRUE
;
1052 tui_make_visible (&(*win_info_ptr
)->generic
);
1053 tui_make_visible ((*win_info_ptr
)->detail
.source_info
.execution_info
);
1055 if ((*win_info_ptr
) != NULL
)
1057 (*win_info_ptr
)->detail
.source_info
.has_locator
= TRUE
;
1058 tui_make_visible (locator
);
1059 tui_show_locator_content ();
1060 tui_show_source_content (*win_info_ptr
);
1062 if (TUI_CMD_WIN
== NULL
)
1064 make_command_window (&TUI_CMD_WIN
, cmd_height
, src_height
);
1065 tui_refresh_win (&TUI_CMD_WIN
->generic
);
1069 init_gen_win_info (&TUI_CMD_WIN
->generic
,
1070 TUI_CMD_WIN
->generic
.type
,
1071 TUI_CMD_WIN
->generic
.height
,
1072 TUI_CMD_WIN
->generic
.width
,
1073 TUI_CMD_WIN
->generic
.origin
.x
,
1074 TUI_CMD_WIN
->generic
.origin
.y
);
1075 TUI_CMD_WIN
->can_highlight
= FALSE
;
1076 tui_make_visible (&TUI_CMD_WIN
->generic
);
1079 tui_set_current_layout_to (layout_type
);