gdb: Add completer for layout command.
[deliverable/binutils-gdb.git] / gdb / tui / tui-layout.c
CommitLineData
f377b406 1/* TUI layout window management.
f33c6cbf 2
32d0add0 3 Copyright (C) 1998-2015 Free Software Foundation, Inc.
f33c6cbf 4
f377b406 5 Contributed by Hewlett-Packard Company.
c906108c 6
f377b406
SC
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/>. */
c906108c
SS
21
22#include "defs.h"
957b8b5a 23#include "arch-utils.h"
c906108c
SS
24#include "command.h"
25#include "symtab.h"
26#include "frame.h"
52575520 27#include "source.h"
84b1e7c7 28#include <ctype.h>
c906108c 29
d7b2e967
AC
30#include "tui/tui.h"
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"
2c0b251b 39#include "tui/tui-layout.h"
6a83354a 40#include "gdb_curses.h"
96ec9981 41
c906108c
SS
42/*******************************
43** Static Local Decls
44********************************/
6ba8e26f 45static void show_layout (enum tui_layout_type);
08ef48c5
MS
46static void init_gen_win_info (struct tui_gen_win_info *,
47 enum tui_win_type,
48 int, int, int, int);
49static void *init_and_make_win (void *, enum tui_win_type,
50 int, int, int, int, int);
6ba8e26f 51static void show_source_or_disasm_and_command (enum tui_layout_type);
08ef48c5
MS
52static void make_source_or_disasm_window (struct tui_win_info **,
53 enum tui_win_type,
54 int, int);
5b6fe301
MS
55static void make_command_window (struct tui_win_info **, int, int);
56static void make_source_window (struct tui_win_info **, int, int);
57static void make_disasm_window (struct tui_win_info **, int, int);
58static void make_data_window (struct tui_win_info **, int, int);
6ba8e26f
AC
59static void show_source_command (void);
60static void show_disasm_command (void);
61static void show_source_disasm_command (void);
62static void show_data (enum tui_layout_type);
63static enum tui_layout_type next_layout (void);
64static enum tui_layout_type prev_layout (void);
65static void tui_layout_command (char *, int);
13274fc3 66static void extract_display_start_addr (struct gdbarch **, CORE_ADDR *);
c906108c
SS
67
68
69/***************************************
70** DEFINITIONS
71***************************************/
72
73#define LAYOUT_USAGE "Usage: layout prev | next | <layout_name> \n"
74
c7037be1
SC
75/* Show the screen layout defined. */
76static void
6ba8e26f 77show_layout (enum tui_layout_type layout)
c906108c 78{
6ba8e26f 79 enum tui_layout_type cur_layout = tui_current_layout ();
c906108c 80
6ba8e26f 81 if (layout != cur_layout)
c906108c 82 {
ef5eab5a
MS
83 /* Since the new layout may cause changes in window size, we
84 should free the content and reallocate on next display of
85 source/asm. */
dd1abb8c
AC
86 tui_free_all_source_wins_content ();
87 tui_clear_source_windows ();
e5908723
MS
88 if (layout == SRC_DATA_COMMAND
89 || layout == DISASSEM_DATA_COMMAND)
c906108c 90 {
6ba8e26f 91 show_data (layout);
6d012f14 92 tui_refresh_all (tui_win_list);
c906108c
SS
93 }
94 else
95 {
1cc6d956 96 /* First make the current layout be invisible. */
ec7d9e56 97 tui_make_all_invisible ();
dd1abb8c 98 tui_make_invisible (tui_locator_win_info_ptr ());
c906108c
SS
99
100 switch (layout)
101 {
1cc6d956 102 /* Now show the new layout. */
c906108c 103 case SRC_COMMAND:
6ba8e26f 104 show_source_command ();
6d012f14 105 tui_add_to_source_windows (TUI_SRC_WIN);
c906108c
SS
106 break;
107 case DISASSEM_COMMAND:
6ba8e26f 108 show_disasm_command ();
6d012f14 109 tui_add_to_source_windows (TUI_DISASM_WIN);
c906108c
SS
110 break;
111 case SRC_DISASSEM_COMMAND:
6ba8e26f 112 show_source_disasm_command ();
6d012f14
AC
113 tui_add_to_source_windows (TUI_SRC_WIN);
114 tui_add_to_source_windows (TUI_DISASM_WIN);
c906108c
SS
115 break;
116 default:
117 break;
118 }
119 }
120 }
bc712bbf 121}
c906108c
SS
122
123
080ce8c0 124/* Function to set the layout to SRC_COMMAND, DISASSEM_COMMAND,
7bd0be3a 125 SRC_DISASSEM_COMMAND, SRC_DATA_COMMAND, or DISASSEM_DATA_COMMAND. */
080ce8c0 126enum tui_status
7bd0be3a 127tui_set_layout (enum tui_layout_type layout_type)
c906108c 128{
22940a24 129 enum tui_status status = TUI_SUCCESS;
c906108c 130
7bd0be3a 131 if (layout_type != UNDEFINED_LAYOUT)
c906108c 132 {
e5908723
MS
133 enum tui_layout_type cur_layout = tui_current_layout (),
134 new_layout = UNDEFINED_LAYOUT;
6ba8e26f 135 int regs_populate = FALSE;
13274fc3
UW
136 struct gdbarch *gdbarch;
137 CORE_ADDR addr;
5b6fe301
MS
138 struct tui_win_info *win_with_focus = tui_win_with_focus ();
139 struct tui_layout_def *layout_def = tui_layout_def ();
c906108c 140
13274fc3 141 extract_display_start_addr (&gdbarch, &addr);
c906108c 142
7bd0be3a 143 new_layout = layout_type;
c906108c 144
7bd0be3a
AB
145 regs_populate = (new_layout == SRC_DATA_COMMAND
146 || new_layout == DISASSEM_DATA_COMMAND);
147 if (new_layout != cur_layout)
c906108c 148 {
7bd0be3a 149 show_layout (new_layout);
ef5eab5a 150
7bd0be3a
AB
151 /* Now determine where focus should be. */
152 if (win_with_focus != TUI_CMD_WIN)
153 {
154 switch (new_layout)
c906108c 155 {
7bd0be3a
AB
156 case SRC_COMMAND:
157 tui_set_win_focus_to (TUI_SRC_WIN);
158 layout_def->display_mode = SRC_WIN;
159 layout_def->split = FALSE;
160 break;
161 case DISASSEM_COMMAND:
162 /* The previous layout was not showing code.
163 This can happen if there is no source
164 available:
165
166 1. if the source file is in another dir OR
167 2. if target was compiled without -g
168 We still want to show the assembly though! */
169
170 tui_get_begin_asm_address (&gdbarch, &addr);
171 tui_set_win_focus_to (TUI_DISASM_WIN);
172 layout_def->display_mode = DISASSEM_WIN;
173 layout_def->split = FALSE;
174 break;
175 case SRC_DISASSEM_COMMAND:
176 /* The previous layout was not showing code.
177 This can happen if there is no source
178 available:
179
180 1. if the source file is in another dir OR
181 2. if target was compiled without -g
182 We still want to show the assembly though! */
183
184 tui_get_begin_asm_address (&gdbarch, &addr);
185 if (win_with_focus == TUI_SRC_WIN)
186 tui_set_win_focus_to (TUI_SRC_WIN);
187 else
188 tui_set_win_focus_to (TUI_DISASM_WIN);
189 layout_def->split = TRUE;
190 break;
191 case SRC_DATA_COMMAND:
192 if (win_with_focus != TUI_DATA_WIN)
193 tui_set_win_focus_to (TUI_SRC_WIN);
194 else
195 tui_set_win_focus_to (TUI_DATA_WIN);
196 layout_def->display_mode = SRC_WIN;
197 layout_def->split = FALSE;
198 break;
199 case DISASSEM_DATA_COMMAND:
200 /* The previous layout was not showing code.
201 This can happen if there is no source
202 available:
203
204 1. if the source file is in another dir OR
205 2. if target was compiled without -g
206 We still want to show the assembly though! */
207
208 tui_get_begin_asm_address (&gdbarch, &addr);
209 if (win_with_focus != TUI_DATA_WIN)
210 tui_set_win_focus_to (TUI_DISASM_WIN);
211 else
212 tui_set_win_focus_to (TUI_DATA_WIN);
213 layout_def->display_mode = DISASSEM_WIN;
214 layout_def->split = FALSE;
215 break;
216 default:
217 break;
c906108c 218 }
c906108c 219 }
7bd0be3a
AB
220 /*
221 * Now update the window content.
222 */
223 if (!regs_populate
224 && (new_layout == SRC_DATA_COMMAND
225 || new_layout == DISASSEM_DATA_COMMAND))
226 tui_display_all_data ();
227
228 tui_update_source_windows_with_addr (gdbarch, addr);
229
6ba8e26f 230 if (regs_populate)
c906108c 231 {
7bd0be3a
AB
232 struct reggroup *group =
233 TUI_DATA_WIN->detail.data_display_info.current_group;
234 tui_show_registers (group);
c906108c
SS
235 }
236 }
237 }
238 else
239 status = TUI_FAILURE;
240
241 return status;
bc712bbf 242}
c906108c 243
080ce8c0
AC
244/* Add the specified window to the layout in a logical way. This
245 means setting up the most logical layout given the window to be
246 added. */
c906108c 247void
080ce8c0 248tui_add_win_to_layout (enum tui_win_type type)
c906108c 249{
6ba8e26f 250 enum tui_layout_type cur_layout = tui_current_layout ();
c906108c
SS
251
252 switch (type)
253 {
254 case SRC_WIN:
e5908723
MS
255 if (cur_layout != SRC_COMMAND
256 && cur_layout != SRC_DISASSEM_COMMAND
257 && cur_layout != SRC_DATA_COMMAND)
c906108c 258 {
dd1abb8c 259 tui_clear_source_windows_detail ();
6ba8e26f
AC
260 if (cur_layout == DISASSEM_DATA_COMMAND)
261 show_layout (SRC_DATA_COMMAND);
c906108c 262 else
6ba8e26f 263 show_layout (SRC_COMMAND);
c906108c
SS
264 }
265 break;
266 case DISASSEM_WIN:
e5908723
MS
267 if (cur_layout != DISASSEM_COMMAND
268 && cur_layout != SRC_DISASSEM_COMMAND
269 && cur_layout != DISASSEM_DATA_COMMAND)
c906108c 270 {
dd1abb8c 271 tui_clear_source_windows_detail ();
6ba8e26f
AC
272 if (cur_layout == SRC_DATA_COMMAND)
273 show_layout (DISASSEM_DATA_COMMAND);
c906108c 274 else
6ba8e26f 275 show_layout (DISASSEM_COMMAND);
c906108c
SS
276 }
277 break;
278 case DATA_WIN:
e5908723
MS
279 if (cur_layout != SRC_DATA_COMMAND
280 && cur_layout != DISASSEM_DATA_COMMAND)
c906108c 281 {
6ba8e26f
AC
282 if (cur_layout == DISASSEM_COMMAND)
283 show_layout (DISASSEM_DATA_COMMAND);
c906108c 284 else
6ba8e26f 285 show_layout (SRC_DATA_COMMAND);
c906108c
SS
286 }
287 break;
288 default:
289 break;
290 }
6ba8e26f 291}
c906108c
SS
292
293
6ba8e26f
AC
294/* Answer the height of a window. If it hasn't been created yet,
295 answer what the height of a window would be based upon its type and
296 the layout. */
c906108c 297int
08ef48c5
MS
298tui_default_win_height (enum tui_win_type type,
299 enum tui_layout_type layout)
c906108c
SS
300{
301 int h;
302
6d012f14
AC
303 if (tui_win_list[type] != (struct tui_win_info *) NULL)
304 h = tui_win_list[type]->generic.height;
c906108c
SS
305 else
306 {
307 switch (layout)
308 {
309 case SRC_COMMAND:
310 case DISASSEM_COMMAND:
6d012f14 311 if (TUI_CMD_WIN == NULL)
dd1abb8c 312 h = tui_term_height () / 2;
c906108c 313 else
6d012f14 314 h = tui_term_height () - TUI_CMD_WIN->generic.height;
c906108c
SS
315 break;
316 case SRC_DISASSEM_COMMAND:
317 case SRC_DATA_COMMAND:
318 case DISASSEM_DATA_COMMAND:
6d012f14 319 if (TUI_CMD_WIN == NULL)
dd1abb8c 320 h = tui_term_height () / 3;
c906108c 321 else
6d012f14 322 h = (tui_term_height () - TUI_CMD_WIN->generic.height) / 2;
c906108c
SS
323 break;
324 default:
325 h = 0;
326 break;
327 }
328 }
329
330 return h;
6ba8e26f 331}
c906108c
SS
332
333
080ce8c0
AC
334/* Answer the height of a window. If it hasn't been created yet,
335 answer what the height of a window would be based upon its type and
336 the layout. */
c906108c 337int
080ce8c0
AC
338tui_default_win_viewport_height (enum tui_win_type type,
339 enum tui_layout_type layout)
c906108c
SS
340{
341 int h;
342
6ba8e26f 343 h = tui_default_win_height (type, layout);
c906108c 344
6d012f14 345 if (tui_win_list[type] == TUI_CMD_WIN)
c906108c
SS
346 h -= 1;
347 else
348 h -= 2;
349
350 return h;
6ba8e26f 351}
c906108c 352
a0145030
AB
353/* Complete possible layout names. TEXT is the complete text entered so
354 far, WORD is the word currently being completed. */
355
356static VEC (char_ptr) *
357layout_completer (struct cmd_list_element *ignore,
358 const char *text, const char *word)
359{
360 static const char *layout_names [] =
361 { "src", "asm", "split", "regs", "next", "prev", NULL };
362
363 return complete_on_enum (layout_names, text, word);
364}
365
6ba8e26f
AC
366/* Function to initialize gdb commands, for tui window layout
367 manipulation. */
2c0b251b
PA
368
369/* Provide a prototype to silence -Wmissing-prototypes. */
370extern initialize_file_ftype _initialize_tui_layout;
371
c906108c 372void
6ba8e26f 373_initialize_tui_layout (void)
c906108c 374{
a0145030
AB
375 struct cmd_list_element *cmd;
376
377 cmd = add_com ("layout", class_tui, tui_layout_command, _("\
1bedd215 378Change the layout of windows.\n\
c906108c
SS
379Usage: layout prev | next | <layout_name> \n\
380Layout names are:\n\
381 src : Displays source and command windows.\n\
382 asm : Displays disassembly and command windows.\n\
383 split : Displays source, disassembly and command windows.\n\
384 regs : Displays register window. If existing layout\n\
385 is source/command or assembly/command, the \n\
386 register window is displayed. If the\n\
387 source/assembly/command (split) is displayed, \n\
388 the register window is displayed with \n\
1bedd215 389 the window that has current logical focus.\n"));
a0145030 390 set_cmd_completer (cmd, layout_completer);
41783295 391}
c906108c
SS
392
393
394/*************************
395** STATIC LOCAL FUNCTIONS
396**************************/
397
398
7bd0be3a
AB
399/* Function to set the layout to SRC, ASM, SPLIT, NEXT, PREV, DATA, or
400 REGS. */
22940a24 401enum tui_status
7bd0be3a 402tui_set_layout_by_name (const char *layout_name)
c906108c 403{
22940a24 404 enum tui_status status = TUI_SUCCESS;
c906108c 405
6ba8e26f 406 if (layout_name != (char *) NULL)
c906108c 407 {
d02c80cd
AC
408 int i;
409 char *buf_ptr;
6ba8e26f 410 enum tui_layout_type new_layout = UNDEFINED_LAYOUT;
6ba8e26f 411 enum tui_layout_type cur_layout = tui_current_layout ();
c906108c 412
6ba8e26f
AC
413 buf_ptr = (char *) xstrdup (layout_name);
414 for (i = 0; (i < strlen (layout_name)); i++)
415 buf_ptr[i] = toupper (buf_ptr[i]);
c906108c 416
1cc6d956 417 /* First check for ambiguous input. */
7bd0be3a 418 if (strlen (buf_ptr) <= 1 && *buf_ptr == 'S')
c906108c 419 {
8a3fe4f8 420 warning (_("Ambiguous command input."));
c906108c
SS
421 status = TUI_FAILURE;
422 }
423 else
424 {
6ba8e26f
AC
425 if (subset_compare (buf_ptr, "SRC"))
426 new_layout = SRC_COMMAND;
427 else if (subset_compare (buf_ptr, "ASM"))
428 new_layout = DISASSEM_COMMAND;
429 else if (subset_compare (buf_ptr, "SPLIT"))
430 new_layout = SRC_DISASSEM_COMMAND;
7bd0be3a 431 else if (subset_compare (buf_ptr, "REGS"))
c906108c 432 {
7bd0be3a 433 if (cur_layout == SRC_COMMAND
e5908723 434 || cur_layout == SRC_DATA_COMMAND)
6ba8e26f 435 new_layout = SRC_DATA_COMMAND;
c906108c 436 else
6ba8e26f 437 new_layout = DISASSEM_DATA_COMMAND;
c906108c 438 }
6ba8e26f
AC
439 else if (subset_compare (buf_ptr, "NEXT"))
440 new_layout = next_layout ();
441 else if (subset_compare (buf_ptr, "PREV"))
442 new_layout = prev_layout ();
c906108c
SS
443 else
444 status = TUI_FAILURE;
c906108c 445
7bd0be3a 446 tui_set_layout (new_layout);
c906108c 447 }
3e40160c 448 xfree (buf_ptr);
c906108c
SS
449 }
450 else
451 status = TUI_FAILURE;
452
453 return status;
e8b915dc 454}
c906108c
SS
455
456
13274fc3
UW
457static void
458extract_display_start_addr (struct gdbarch **gdbarch_p, CORE_ADDR *addr_p)
c906108c 459{
6ba8e26f 460 enum tui_layout_type cur_layout = tui_current_layout ();
957b8b5a 461 struct gdbarch *gdbarch = get_current_arch ();
c774cec6 462 CORE_ADDR addr;
84b1e7c7 463 CORE_ADDR pc;
52575520 464 struct symtab_and_line cursal = get_current_source_symtab_and_line ();
c906108c 465
6ba8e26f 466 switch (cur_layout)
c906108c
SS
467 {
468 case SRC_COMMAND:
469 case SRC_DATA_COMMAND:
13274fc3 470 gdbarch = TUI_SRC_WIN->detail.source_info.gdbarch;
52575520 471 find_line_pc (cursal.symtab,
362c05fe 472 TUI_SRC_WIN->detail.source_info.start_line_or_addr.u.line_no,
84b1e7c7 473 &pc);
c774cec6 474 addr = pc;
c906108c
SS
475 break;
476 case DISASSEM_COMMAND:
477 case SRC_DISASSEM_COMMAND:
478 case DISASSEM_DATA_COMMAND:
13274fc3 479 gdbarch = TUI_DISASM_WIN->detail.source_info.gdbarch;
362c05fe 480 addr = TUI_DISASM_WIN->detail.source_info.start_line_or_addr.u.addr;
c906108c
SS
481 break;
482 default:
c774cec6 483 addr = 0;
c906108c
SS
484 break;
485 }
486
13274fc3
UW
487 *gdbarch_p = gdbarch;
488 *addr_p = addr;
6ba8e26f 489}
c906108c
SS
490
491
c906108c 492static void
6ba8e26f 493tui_layout_command (char *arg, int from_tty)
c906108c 494{
19eb139b
SC
495 /* Make sure the curses mode is enabled. */
496 tui_enable ();
497
498 /* Switch to the selected layout. */
7bd0be3a 499 if (tui_set_layout_by_name (arg) != TUI_SUCCESS)
8a3fe4f8 500 warning (_("Invalid layout specified.\n%s"), LAYOUT_USAGE);
c906108c 501
e8b915dc 502}
c906108c 503
6ba8e26f 504/* Answer the previous layout to cycle to. */
2a8854a7 505static enum tui_layout_type
6ba8e26f 506next_layout (void)
c906108c 507{
570dc176 508 int new_layout;
c906108c 509
6ba8e26f
AC
510 new_layout = tui_current_layout ();
511 if (new_layout == UNDEFINED_LAYOUT)
512 new_layout = SRC_COMMAND;
c906108c
SS
513 else
514 {
6ba8e26f
AC
515 new_layout++;
516 if (new_layout == UNDEFINED_LAYOUT)
517 new_layout = SRC_COMMAND;
c906108c
SS
518 }
519
570dc176 520 return (enum tui_layout_type) new_layout;
6ba8e26f 521}
c906108c
SS
522
523
6ba8e26f 524/* Answer the next layout to cycle to. */
2a8854a7 525static enum tui_layout_type
6ba8e26f 526prev_layout (void)
c906108c 527{
570dc176 528 int new_layout;
c906108c 529
6ba8e26f
AC
530 new_layout = tui_current_layout ();
531 if (new_layout == SRC_COMMAND)
532 new_layout = DISASSEM_DATA_COMMAND;
c906108c
SS
533 else
534 {
6ba8e26f
AC
535 new_layout--;
536 if (new_layout == UNDEFINED_LAYOUT)
537 new_layout = DISASSEM_DATA_COMMAND;
c906108c
SS
538 }
539
570dc176 540 return (enum tui_layout_type) new_layout;
6ba8e26f 541}
c906108c
SS
542
543
544
c906108c 545static void
08ef48c5
MS
546make_command_window (struct tui_win_info **win_info_ptr,
547 int height, int origin_y)
c906108c 548{
d5d6fca5
DJ
549 *win_info_ptr = init_and_make_win (*win_info_ptr,
550 CMD_WIN,
551 height,
552 tui_term_width (),
553 0,
554 origin_y,
555 DONT_BOX_WINDOW);
c906108c 556
6ba8e26f
AC
557 (*win_info_ptr)->can_highlight = FALSE;
558}
c906108c
SS
559
560
ef5eab5a 561/* make_source_window().
c5aa993b 562 */
c906108c 563static void
08ef48c5
MS
564make_source_window (struct tui_win_info **win_info_ptr,
565 int height, int origin_y)
c906108c 566{
6ba8e26f 567 make_source_or_disasm_window (win_info_ptr, SRC_WIN, height, origin_y);
c906108c
SS
568
569 return;
6ba8e26f 570} /* make_source_window */
c906108c
SS
571
572
ef5eab5a 573/* make_disasm_window().
c5aa993b 574 */
c906108c 575static void
08ef48c5
MS
576make_disasm_window (struct tui_win_info **win_info_ptr,
577 int height, int origin_y)
c906108c 578{
6ba8e26f 579 make_source_or_disasm_window (win_info_ptr, DISASSEM_WIN, height, origin_y);
c906108c
SS
580
581 return;
6ba8e26f 582} /* make_disasm_window */
c906108c
SS
583
584
c906108c 585static void
08ef48c5
MS
586make_data_window (struct tui_win_info **win_info_ptr,
587 int height, int origin_y)
c906108c 588{
d5d6fca5
DJ
589 *win_info_ptr = init_and_make_win (*win_info_ptr,
590 DATA_WIN,
591 height,
592 tui_term_width (),
593 0,
594 origin_y,
595 BOX_WINDOW);
6ba8e26f 596}
c906108c
SS
597
598
599
6ba8e26f 600/* Show the Source/Command layout. */
c906108c 601static void
6ba8e26f 602show_source_command (void)
c906108c 603{
6ba8e26f
AC
604 show_source_or_disasm_and_command (SRC_COMMAND);
605}
c906108c
SS
606
607
6ba8e26f 608/* Show the Dissassem/Command layout. */
c906108c 609static void
6ba8e26f 610show_disasm_command (void)
c906108c 611{
6ba8e26f
AC
612 show_source_or_disasm_and_command (DISASSEM_COMMAND);
613}
c906108c
SS
614
615
6ba8e26f 616/* Show the Source/Disassem/Command layout. */
c906108c 617static void
6ba8e26f 618show_source_disasm_command (void)
c906108c 619{
dd1abb8c 620 if (tui_current_layout () != SRC_DISASSEM_COMMAND)
c906108c 621 {
6ba8e26f 622 int cmd_height, src_height, asm_height;
c906108c 623
6d012f14 624 if (TUI_CMD_WIN != NULL)
6ba8e26f 625 cmd_height = TUI_CMD_WIN->generic.height;
c906108c 626 else
6ba8e26f 627 cmd_height = tui_term_height () / 3;
c906108c 628
6ba8e26f
AC
629 src_height = (tui_term_height () - cmd_height) / 2;
630 asm_height = tui_term_height () - (src_height + cmd_height);
c906108c 631
6d012f14 632 if (TUI_SRC_WIN == NULL)
6ba8e26f 633 make_source_window (&TUI_SRC_WIN, src_height, 0);
c906108c
SS
634 else
635 {
6ba8e26f 636 init_gen_win_info (&TUI_SRC_WIN->generic,
08ef48c5
MS
637 TUI_SRC_WIN->generic.type,
638 src_height,
639 TUI_SRC_WIN->generic.width,
640 TUI_SRC_WIN->detail.source_info.execution_info->width,
641 0);
6d012f14 642 TUI_SRC_WIN->can_highlight = TRUE;
6ba8e26f 643 init_gen_win_info (TUI_SRC_WIN->detail.source_info.execution_info,
08ef48c5
MS
644 EXEC_INFO_WIN,
645 src_height,
646 3,
647 0,
648 0);
6d012f14
AC
649 tui_make_visible (&TUI_SRC_WIN->generic);
650 tui_make_visible (TUI_SRC_WIN->detail.source_info.execution_info);
651 TUI_SRC_WIN->detail.source_info.has_locator = FALSE;;
c906108c 652 }
6d012f14 653 if (TUI_SRC_WIN != NULL)
c906108c 654 {
5b6fe301 655 struct tui_gen_win_info *locator = tui_locator_win_info_ptr ();
c906108c 656
6d012f14
AC
657 tui_show_source_content (TUI_SRC_WIN);
658 if (TUI_DISASM_WIN == NULL)
c906108c 659 {
6ba8e26f 660 make_disasm_window (&TUI_DISASM_WIN, asm_height, src_height - 1);
d5d6fca5
DJ
661 locator = init_and_make_win (locator,
662 LOCATOR_WIN,
663 2 /* 1 */ ,
664 tui_term_width (),
665 0,
666 (src_height + asm_height) - 1,
667 DONT_BOX_WINDOW);
c906108c
SS
668 }
669 else
670 {
6ba8e26f 671 init_gen_win_info (locator,
08ef48c5
MS
672 LOCATOR_WIN,
673 2 /* 1 */ ,
674 tui_term_width (),
675 0,
676 (src_height + asm_height) - 1);
6d012f14 677 TUI_DISASM_WIN->detail.source_info.has_locator = TRUE;
08ef48c5
MS
678 init_gen_win_info (&TUI_DISASM_WIN->generic,
679 TUI_DISASM_WIN->generic.type,
680 asm_height,
681 TUI_DISASM_WIN->generic.width,
682 TUI_DISASM_WIN->detail.source_info.execution_info->width,
683 src_height - 1);
6ba8e26f 684 init_gen_win_info (TUI_DISASM_WIN->detail.source_info.execution_info,
08ef48c5
MS
685 EXEC_INFO_WIN,
686 asm_height,
687 3,
688 0,
689 src_height - 1);
6d012f14
AC
690 TUI_DISASM_WIN->can_highlight = TRUE;
691 tui_make_visible (&TUI_DISASM_WIN->generic);
692 tui_make_visible (TUI_DISASM_WIN->detail.source_info.execution_info);
c906108c 693 }
6d012f14 694 if (TUI_DISASM_WIN != NULL)
c906108c 695 {
6d012f14
AC
696 TUI_SRC_WIN->detail.source_info.has_locator = FALSE;
697 TUI_DISASM_WIN->detail.source_info.has_locator = TRUE;
ec7d9e56 698 tui_make_visible (locator);
47d3492a 699 tui_show_locator_content ();
6d012f14 700 tui_show_source_content (TUI_DISASM_WIN);
c906108c 701
6d012f14 702 if (TUI_CMD_WIN == NULL)
6ba8e26f 703 make_command_window (&TUI_CMD_WIN,
08ef48c5
MS
704 cmd_height,
705 tui_term_height () - cmd_height);
c906108c
SS
706 else
707 {
6ba8e26f 708 init_gen_win_info (&TUI_CMD_WIN->generic,
08ef48c5
MS
709 TUI_CMD_WIN->generic.type,
710 TUI_CMD_WIN->generic.height,
711 TUI_CMD_WIN->generic.width,
712 0,
713 TUI_CMD_WIN->generic.origin.y);
6d012f14
AC
714 TUI_CMD_WIN->can_highlight = FALSE;
715 tui_make_visible (&TUI_CMD_WIN->generic);
c906108c 716 }
6d012f14
AC
717 if (TUI_CMD_WIN != NULL)
718 tui_refresh_win (&TUI_CMD_WIN->generic);
c906108c
SS
719 }
720 }
dd1abb8c 721 tui_set_current_layout_to (SRC_DISASSEM_COMMAND);
c906108c 722 }
6ba8e26f 723}
c906108c
SS
724
725
6ba8e26f
AC
726/* Show the Source/Data/Command or the Dissassembly/Data/Command
727 layout. */
c906108c 728static void
6ba8e26f 729show_data (enum tui_layout_type new_layout)
c906108c 730{
6ba8e26f
AC
731 int total_height = (tui_term_height () - TUI_CMD_WIN->generic.height);
732 int src_height, data_height;
733 enum tui_win_type win_type;
5b6fe301 734 struct tui_gen_win_info *locator = tui_locator_win_info_ptr ();
c906108c
SS
735
736
6ba8e26f
AC
737 data_height = total_height / 2;
738 src_height = total_height - data_height;
ec7d9e56
AC
739 tui_make_all_invisible ();
740 tui_make_invisible (locator);
6ba8e26f 741 make_data_window (&TUI_DATA_WIN, data_height, 0);
6d012f14 742 TUI_DATA_WIN->can_highlight = TRUE;
6ba8e26f
AC
743 if (new_layout == SRC_DATA_COMMAND)
744 win_type = SRC_WIN;
c906108c 745 else
6ba8e26f
AC
746 win_type = DISASSEM_WIN;
747 if (tui_win_list[win_type] == NULL)
c906108c 748 {
6ba8e26f
AC
749 if (win_type == SRC_WIN)
750 make_source_window (&tui_win_list[win_type], src_height, data_height - 1);
c906108c 751 else
6ba8e26f 752 make_disasm_window (&tui_win_list[win_type], src_height, data_height - 1);
d5d6fca5
DJ
753 locator = init_and_make_win (locator,
754 LOCATOR_WIN,
755 2 /* 1 */ ,
756 tui_term_width (),
757 0,
758 total_height - 1,
759 DONT_BOX_WINDOW);
c906108c
SS
760 }
761 else
762 {
6ba8e26f 763 init_gen_win_info (&tui_win_list[win_type]->generic,
08ef48c5
MS
764 tui_win_list[win_type]->generic.type,
765 src_height,
766 tui_win_list[win_type]->generic.width,
767 tui_win_list[win_type]->detail.source_info.execution_info->width,
768 data_height - 1);
6ba8e26f 769 init_gen_win_info (tui_win_list[win_type]->detail.source_info.execution_info,
08ef48c5
MS
770 EXEC_INFO_WIN,
771 src_height,
772 3,
773 0,
774 data_height - 1);
6ba8e26f
AC
775 tui_make_visible (&tui_win_list[win_type]->generic);
776 tui_make_visible (tui_win_list[win_type]->detail.source_info.execution_info);
777 init_gen_win_info (locator,
08ef48c5
MS
778 LOCATOR_WIN,
779 2 /* 1 */ ,
780 tui_term_width (),
781 0,
782 total_height - 1);
c906108c 783 }
6ba8e26f 784 tui_win_list[win_type]->detail.source_info.has_locator = TRUE;
ec7d9e56 785 tui_make_visible (locator);
47d3492a 786 tui_show_locator_content ();
6ba8e26f
AC
787 tui_add_to_source_windows (tui_win_list[win_type]);
788 tui_set_current_layout_to (new_layout);
789}
c906108c 790
ef5eab5a 791/* init_gen_win_info().
c5aa993b 792 */
c906108c 793static void
08ef48c5
MS
794init_gen_win_info (struct tui_gen_win_info *win_info,
795 enum tui_win_type type,
796 int height, int width,
797 int origin_x, int origin_y)
c906108c
SS
798{
799 int h = height;
800
6ba8e26f
AC
801 win_info->type = type;
802 win_info->width = width;
803 win_info->height = h;
c906108c
SS
804 if (h > 1)
805 {
6ba8e26f
AC
806 win_info->viewport_height = h - 1;
807 if (win_info->type != CMD_WIN)
808 win_info->viewport_height--;
c906108c
SS
809 }
810 else
6ba8e26f
AC
811 win_info->viewport_height = 1;
812 win_info->origin.x = origin_x;
813 win_info->origin.y = origin_y;
c906108c
SS
814
815 return;
6ba8e26f 816} /* init_gen_win_info */
c906108c 817
ef5eab5a 818/* init_and_make_win().
c5aa993b 819 */
d5d6fca5 820static void *
08ef48c5
MS
821init_and_make_win (void *opaque_win_info,
822 enum tui_win_type win_type,
823 int height, int width,
824 int origin_x, int origin_y,
d5d6fca5 825 int box_it)
c906108c 826{
5b6fe301 827 struct tui_gen_win_info *generic;
c906108c 828
6ba8e26f 829 if (opaque_win_info == NULL)
c906108c 830 {
6ba8e26f
AC
831 if (tui_win_is_auxillary (win_type))
832 opaque_win_info = (void *) tui_alloc_generic_win_info ();
c906108c 833 else
6ba8e26f 834 opaque_win_info = (void *) tui_alloc_win_info (win_type);
c906108c 835 }
6ba8e26f
AC
836 if (tui_win_is_auxillary (win_type))
837 generic = (struct tui_gen_win_info *) opaque_win_info;
c906108c 838 else
6ba8e26f 839 generic = &((struct tui_win_info *) opaque_win_info)->generic;
c906108c 840
6ba8e26f 841 if (opaque_win_info != NULL)
c906108c 842 {
6ba8e26f
AC
843 init_gen_win_info (generic, win_type, height, width, origin_x, origin_y);
844 if (!tui_win_is_auxillary (win_type))
c906108c
SS
845 {
846 if (generic->type == CMD_WIN)
6ba8e26f 847 ((struct tui_win_info *) opaque_win_info)->can_highlight = FALSE;
c906108c 848 else
6ba8e26f 849 ((struct tui_win_info *) opaque_win_info)->can_highlight = TRUE;
c906108c 850 }
6ba8e26f 851 tui_make_window (generic, box_it);
c906108c 852 }
d5d6fca5 853 return opaque_win_info;
bc712bbf 854}
c906108c
SS
855
856
c906108c 857static void
08ef48c5
MS
858make_source_or_disasm_window (struct tui_win_info **win_info_ptr,
859 enum tui_win_type type,
860 int height, int origin_y)
c906108c 861{
5b6fe301 862 struct tui_gen_win_info *execution_info = (struct tui_gen_win_info *) NULL;
c906108c 863
ef5eab5a 864 /* Create the exeuction info window. */
c906108c 865 if (type == SRC_WIN)
6d012f14 866 execution_info = tui_source_exec_info_win_ptr ();
c906108c 867 else
6d012f14 868 execution_info = tui_disassem_exec_info_win_ptr ();
d5d6fca5
DJ
869 execution_info = init_and_make_win (execution_info,
870 EXEC_INFO_WIN,
871 height,
872 3,
873 0,
874 origin_y,
875 DONT_BOX_WINDOW);
ef5eab5a
MS
876
877 /* Now create the source window. */
d5d6fca5
DJ
878 *win_info_ptr = init_and_make_win (*win_info_ptr,
879 type,
880 height,
881 tui_term_width () - execution_info->width,
882 execution_info->width,
883 origin_y,
884 BOX_WINDOW);
c906108c 885
6ba8e26f
AC
886 (*win_info_ptr)->detail.source_info.execution_info = execution_info;
887}
c906108c
SS
888
889
1cc6d956 890/* Show the Source/Command or the Disassem layout. */
c906108c 891static void
6ba8e26f 892show_source_or_disasm_and_command (enum tui_layout_type layout_type)
c906108c 893{
6ba8e26f 894 if (tui_current_layout () != layout_type)
c906108c 895 {
5b6fe301 896 struct tui_win_info **win_info_ptr;
6ba8e26f 897 int src_height, cmd_height;
5b6fe301 898 struct tui_gen_win_info *locator = tui_locator_win_info_ptr ();
c906108c 899
6d012f14 900 if (TUI_CMD_WIN != NULL)
6ba8e26f 901 cmd_height = TUI_CMD_WIN->generic.height;
c906108c 902 else
6ba8e26f
AC
903 cmd_height = tui_term_height () / 3;
904 src_height = tui_term_height () - cmd_height;
c906108c 905
6ba8e26f
AC
906 if (layout_type == SRC_COMMAND)
907 win_info_ptr = &TUI_SRC_WIN;
c906108c 908 else
6ba8e26f 909 win_info_ptr = &TUI_DISASM_WIN;
c906108c 910
6ba8e26f 911 if ((*win_info_ptr) == NULL)
c906108c 912 {
6ba8e26f
AC
913 if (layout_type == SRC_COMMAND)
914 make_source_window (win_info_ptr, src_height - 1, 0);
c906108c 915 else
6ba8e26f 916 make_disasm_window (win_info_ptr, src_height - 1, 0);
d5d6fca5
DJ
917 locator = init_and_make_win (locator,
918 LOCATOR_WIN,
919 2 /* 1 */ ,
920 tui_term_width (),
921 0,
922 src_height - 1,
923 DONT_BOX_WINDOW);
c906108c
SS
924 }
925 else
926 {
6ba8e26f 927 init_gen_win_info (locator,
08ef48c5
MS
928 LOCATOR_WIN,
929 2 /* 1 */ ,
930 tui_term_width (),
931 0,
932 src_height - 1);
6ba8e26f 933 (*win_info_ptr)->detail.source_info.has_locator = TRUE;
08ef48c5
MS
934 init_gen_win_info (&(*win_info_ptr)->generic,
935 (*win_info_ptr)->generic.type,
936 src_height - 1,
937 (*win_info_ptr)->generic.width,
938 (*win_info_ptr)->detail.source_info.execution_info->width,
939 0);
6ba8e26f 940 init_gen_win_info ((*win_info_ptr)->detail.source_info.execution_info,
08ef48c5
MS
941 EXEC_INFO_WIN,
942 src_height - 1,
943 3,
944 0,
945 0);
6ba8e26f
AC
946 (*win_info_ptr)->can_highlight = TRUE;
947 tui_make_visible (&(*win_info_ptr)->generic);
948 tui_make_visible ((*win_info_ptr)->detail.source_info.execution_info);
c906108c 949 }
6ba8e26f 950 if ((*win_info_ptr) != NULL)
c906108c 951 {
6ba8e26f 952 (*win_info_ptr)->detail.source_info.has_locator = TRUE;
ec7d9e56 953 tui_make_visible (locator);
47d3492a 954 tui_show_locator_content ();
6ba8e26f 955 tui_show_source_content (*win_info_ptr);
c906108c 956
6d012f14 957 if (TUI_CMD_WIN == NULL)
c906108c 958 {
6ba8e26f 959 make_command_window (&TUI_CMD_WIN, cmd_height, src_height);
6d012f14 960 tui_refresh_win (&TUI_CMD_WIN->generic);
c906108c
SS
961 }
962 else
963 {
6ba8e26f 964 init_gen_win_info (&TUI_CMD_WIN->generic,
08ef48c5
MS
965 TUI_CMD_WIN->generic.type,
966 TUI_CMD_WIN->generic.height,
967 TUI_CMD_WIN->generic.width,
968 TUI_CMD_WIN->generic.origin.x,
969 TUI_CMD_WIN->generic.origin.y);
6d012f14
AC
970 TUI_CMD_WIN->can_highlight = FALSE;
971 tui_make_visible (&TUI_CMD_WIN->generic);
c906108c
SS
972 }
973 }
6ba8e26f 974 tui_set_current_layout_to (layout_type);
c906108c 975 }
6ba8e26f 976}
This page took 1.726127 seconds and 4 git commands to generate.