gdb/cli: Remove casts of NULL during assignment.
[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 ();
c1b009ee 412 struct cleanup *old_chain;
c906108c 413
6ba8e26f
AC
414 buf_ptr = (char *) xstrdup (layout_name);
415 for (i = 0; (i < strlen (layout_name)); i++)
416 buf_ptr[i] = toupper (buf_ptr[i]);
c1b009ee 417 old_chain = make_cleanup (xfree, buf_ptr);
c906108c 418
1cc6d956 419 /* First check for ambiguous input. */
7bd0be3a 420 if (strlen (buf_ptr) <= 1 && *buf_ptr == 'S')
c906108c 421 {
8a3fe4f8 422 warning (_("Ambiguous command input."));
c906108c
SS
423 status = TUI_FAILURE;
424 }
425 else
426 {
6ba8e26f
AC
427 if (subset_compare (buf_ptr, "SRC"))
428 new_layout = SRC_COMMAND;
429 else if (subset_compare (buf_ptr, "ASM"))
430 new_layout = DISASSEM_COMMAND;
431 else if (subset_compare (buf_ptr, "SPLIT"))
432 new_layout = SRC_DISASSEM_COMMAND;
7bd0be3a 433 else if (subset_compare (buf_ptr, "REGS"))
c906108c 434 {
7bd0be3a 435 if (cur_layout == SRC_COMMAND
e5908723 436 || cur_layout == SRC_DATA_COMMAND)
6ba8e26f 437 new_layout = SRC_DATA_COMMAND;
c906108c 438 else
6ba8e26f 439 new_layout = DISASSEM_DATA_COMMAND;
c906108c 440 }
6ba8e26f
AC
441 else if (subset_compare (buf_ptr, "NEXT"))
442 new_layout = next_layout ();
443 else if (subset_compare (buf_ptr, "PREV"))
444 new_layout = prev_layout ();
c906108c
SS
445 else
446 status = TUI_FAILURE;
c906108c 447
880d1e40
AB
448 if (status == TUI_SUCCESS)
449 {
450 /* Make sure the curses mode is enabled. */
451 tui_enable ();
452 tui_set_layout (new_layout);
453 }
c906108c 454 }
c1b009ee 455 do_cleanups (old_chain);
c906108c
SS
456 }
457 else
458 status = TUI_FAILURE;
459
460 return status;
e8b915dc 461}
c906108c
SS
462
463
13274fc3
UW
464static void
465extract_display_start_addr (struct gdbarch **gdbarch_p, CORE_ADDR *addr_p)
c906108c 466{
6ba8e26f 467 enum tui_layout_type cur_layout = tui_current_layout ();
957b8b5a 468 struct gdbarch *gdbarch = get_current_arch ();
c774cec6 469 CORE_ADDR addr;
84b1e7c7 470 CORE_ADDR pc;
52575520 471 struct symtab_and_line cursal = get_current_source_symtab_and_line ();
c906108c 472
6ba8e26f 473 switch (cur_layout)
c906108c
SS
474 {
475 case SRC_COMMAND:
476 case SRC_DATA_COMMAND:
13274fc3 477 gdbarch = TUI_SRC_WIN->detail.source_info.gdbarch;
52575520 478 find_line_pc (cursal.symtab,
362c05fe 479 TUI_SRC_WIN->detail.source_info.start_line_or_addr.u.line_no,
84b1e7c7 480 &pc);
c774cec6 481 addr = pc;
c906108c
SS
482 break;
483 case DISASSEM_COMMAND:
484 case SRC_DISASSEM_COMMAND:
485 case DISASSEM_DATA_COMMAND:
13274fc3 486 gdbarch = TUI_DISASM_WIN->detail.source_info.gdbarch;
362c05fe 487 addr = TUI_DISASM_WIN->detail.source_info.start_line_or_addr.u.addr;
c906108c
SS
488 break;
489 default:
c774cec6 490 addr = 0;
c906108c
SS
491 break;
492 }
493
13274fc3
UW
494 *gdbarch_p = gdbarch;
495 *addr_p = addr;
6ba8e26f 496}
c906108c
SS
497
498
c906108c 499static void
6ba8e26f 500tui_layout_command (char *arg, int from_tty)
c906108c 501{
19eb139b 502 /* Switch to the selected layout. */
7bd0be3a 503 if (tui_set_layout_by_name (arg) != TUI_SUCCESS)
8a3fe4f8 504 warning (_("Invalid layout specified.\n%s"), LAYOUT_USAGE);
c906108c 505
e8b915dc 506}
c906108c 507
6ba8e26f 508/* Answer the previous layout to cycle to. */
2a8854a7 509static enum tui_layout_type
6ba8e26f 510next_layout (void)
c906108c 511{
570dc176 512 int new_layout;
c906108c 513
6ba8e26f
AC
514 new_layout = tui_current_layout ();
515 if (new_layout == UNDEFINED_LAYOUT)
516 new_layout = SRC_COMMAND;
c906108c
SS
517 else
518 {
6ba8e26f
AC
519 new_layout++;
520 if (new_layout == UNDEFINED_LAYOUT)
521 new_layout = SRC_COMMAND;
c906108c
SS
522 }
523
570dc176 524 return (enum tui_layout_type) new_layout;
6ba8e26f 525}
c906108c
SS
526
527
6ba8e26f 528/* Answer the next layout to cycle to. */
2a8854a7 529static enum tui_layout_type
6ba8e26f 530prev_layout (void)
c906108c 531{
570dc176 532 int new_layout;
c906108c 533
6ba8e26f
AC
534 new_layout = tui_current_layout ();
535 if (new_layout == SRC_COMMAND)
536 new_layout = DISASSEM_DATA_COMMAND;
c906108c
SS
537 else
538 {
6ba8e26f
AC
539 new_layout--;
540 if (new_layout == UNDEFINED_LAYOUT)
541 new_layout = DISASSEM_DATA_COMMAND;
c906108c
SS
542 }
543
570dc176 544 return (enum tui_layout_type) new_layout;
6ba8e26f 545}
c906108c
SS
546
547
548
c906108c 549static void
08ef48c5
MS
550make_command_window (struct tui_win_info **win_info_ptr,
551 int height, int origin_y)
c906108c 552{
d5d6fca5
DJ
553 *win_info_ptr = init_and_make_win (*win_info_ptr,
554 CMD_WIN,
555 height,
556 tui_term_width (),
557 0,
558 origin_y,
559 DONT_BOX_WINDOW);
c906108c 560
6ba8e26f
AC
561 (*win_info_ptr)->can_highlight = FALSE;
562}
c906108c
SS
563
564
ef5eab5a 565/* make_source_window().
c5aa993b 566 */
c906108c 567static void
08ef48c5
MS
568make_source_window (struct tui_win_info **win_info_ptr,
569 int height, int origin_y)
c906108c 570{
6ba8e26f 571 make_source_or_disasm_window (win_info_ptr, SRC_WIN, height, origin_y);
c906108c
SS
572
573 return;
6ba8e26f 574} /* make_source_window */
c906108c
SS
575
576
ef5eab5a 577/* make_disasm_window().
c5aa993b 578 */
c906108c 579static void
08ef48c5
MS
580make_disasm_window (struct tui_win_info **win_info_ptr,
581 int height, int origin_y)
c906108c 582{
6ba8e26f 583 make_source_or_disasm_window (win_info_ptr, DISASSEM_WIN, height, origin_y);
c906108c
SS
584
585 return;
6ba8e26f 586} /* make_disasm_window */
c906108c
SS
587
588
c906108c 589static void
08ef48c5
MS
590make_data_window (struct tui_win_info **win_info_ptr,
591 int height, int origin_y)
c906108c 592{
d5d6fca5
DJ
593 *win_info_ptr = init_and_make_win (*win_info_ptr,
594 DATA_WIN,
595 height,
596 tui_term_width (),
597 0,
598 origin_y,
599 BOX_WINDOW);
6ba8e26f 600}
c906108c
SS
601
602
603
6ba8e26f 604/* Show the Source/Command layout. */
c906108c 605static void
6ba8e26f 606show_source_command (void)
c906108c 607{
6ba8e26f
AC
608 show_source_or_disasm_and_command (SRC_COMMAND);
609}
c906108c
SS
610
611
6ba8e26f 612/* Show the Dissassem/Command layout. */
c906108c 613static void
6ba8e26f 614show_disasm_command (void)
c906108c 615{
6ba8e26f
AC
616 show_source_or_disasm_and_command (DISASSEM_COMMAND);
617}
c906108c
SS
618
619
6ba8e26f 620/* Show the Source/Disassem/Command layout. */
c906108c 621static void
6ba8e26f 622show_source_disasm_command (void)
c906108c 623{
dd1abb8c 624 if (tui_current_layout () != SRC_DISASSEM_COMMAND)
c906108c 625 {
6ba8e26f 626 int cmd_height, src_height, asm_height;
c906108c 627
6d012f14 628 if (TUI_CMD_WIN != NULL)
6ba8e26f 629 cmd_height = TUI_CMD_WIN->generic.height;
c906108c 630 else
6ba8e26f 631 cmd_height = tui_term_height () / 3;
c906108c 632
6ba8e26f
AC
633 src_height = (tui_term_height () - cmd_height) / 2;
634 asm_height = tui_term_height () - (src_height + cmd_height);
c906108c 635
6d012f14 636 if (TUI_SRC_WIN == NULL)
6ba8e26f 637 make_source_window (&TUI_SRC_WIN, src_height, 0);
c906108c
SS
638 else
639 {
6ba8e26f 640 init_gen_win_info (&TUI_SRC_WIN->generic,
08ef48c5
MS
641 TUI_SRC_WIN->generic.type,
642 src_height,
643 TUI_SRC_WIN->generic.width,
644 TUI_SRC_WIN->detail.source_info.execution_info->width,
645 0);
6d012f14 646 TUI_SRC_WIN->can_highlight = TRUE;
6ba8e26f 647 init_gen_win_info (TUI_SRC_WIN->detail.source_info.execution_info,
08ef48c5
MS
648 EXEC_INFO_WIN,
649 src_height,
650 3,
651 0,
652 0);
6d012f14
AC
653 tui_make_visible (&TUI_SRC_WIN->generic);
654 tui_make_visible (TUI_SRC_WIN->detail.source_info.execution_info);
655 TUI_SRC_WIN->detail.source_info.has_locator = FALSE;;
c906108c 656 }
6d012f14 657 if (TUI_SRC_WIN != NULL)
c906108c 658 {
5b6fe301 659 struct tui_gen_win_info *locator = tui_locator_win_info_ptr ();
c906108c 660
6d012f14
AC
661 tui_show_source_content (TUI_SRC_WIN);
662 if (TUI_DISASM_WIN == NULL)
c906108c 663 {
6ba8e26f 664 make_disasm_window (&TUI_DISASM_WIN, asm_height, src_height - 1);
d5d6fca5
DJ
665 locator = init_and_make_win (locator,
666 LOCATOR_WIN,
667 2 /* 1 */ ,
668 tui_term_width (),
669 0,
670 (src_height + asm_height) - 1,
671 DONT_BOX_WINDOW);
c906108c
SS
672 }
673 else
674 {
6ba8e26f 675 init_gen_win_info (locator,
08ef48c5
MS
676 LOCATOR_WIN,
677 2 /* 1 */ ,
678 tui_term_width (),
679 0,
680 (src_height + asm_height) - 1);
6d012f14 681 TUI_DISASM_WIN->detail.source_info.has_locator = TRUE;
08ef48c5
MS
682 init_gen_win_info (&TUI_DISASM_WIN->generic,
683 TUI_DISASM_WIN->generic.type,
684 asm_height,
685 TUI_DISASM_WIN->generic.width,
686 TUI_DISASM_WIN->detail.source_info.execution_info->width,
687 src_height - 1);
6ba8e26f 688 init_gen_win_info (TUI_DISASM_WIN->detail.source_info.execution_info,
08ef48c5
MS
689 EXEC_INFO_WIN,
690 asm_height,
691 3,
692 0,
693 src_height - 1);
6d012f14
AC
694 TUI_DISASM_WIN->can_highlight = TRUE;
695 tui_make_visible (&TUI_DISASM_WIN->generic);
696 tui_make_visible (TUI_DISASM_WIN->detail.source_info.execution_info);
c906108c 697 }
6d012f14 698 if (TUI_DISASM_WIN != NULL)
c906108c 699 {
6d012f14
AC
700 TUI_SRC_WIN->detail.source_info.has_locator = FALSE;
701 TUI_DISASM_WIN->detail.source_info.has_locator = TRUE;
ec7d9e56 702 tui_make_visible (locator);
47d3492a 703 tui_show_locator_content ();
6d012f14 704 tui_show_source_content (TUI_DISASM_WIN);
c906108c 705
6d012f14 706 if (TUI_CMD_WIN == NULL)
6ba8e26f 707 make_command_window (&TUI_CMD_WIN,
08ef48c5
MS
708 cmd_height,
709 tui_term_height () - cmd_height);
c906108c
SS
710 else
711 {
6ba8e26f 712 init_gen_win_info (&TUI_CMD_WIN->generic,
08ef48c5
MS
713 TUI_CMD_WIN->generic.type,
714 TUI_CMD_WIN->generic.height,
715 TUI_CMD_WIN->generic.width,
716 0,
717 TUI_CMD_WIN->generic.origin.y);
6d012f14
AC
718 TUI_CMD_WIN->can_highlight = FALSE;
719 tui_make_visible (&TUI_CMD_WIN->generic);
c906108c 720 }
6d012f14
AC
721 if (TUI_CMD_WIN != NULL)
722 tui_refresh_win (&TUI_CMD_WIN->generic);
c906108c
SS
723 }
724 }
dd1abb8c 725 tui_set_current_layout_to (SRC_DISASSEM_COMMAND);
c906108c 726 }
6ba8e26f 727}
c906108c
SS
728
729
6ba8e26f
AC
730/* Show the Source/Data/Command or the Dissassembly/Data/Command
731 layout. */
c906108c 732static void
6ba8e26f 733show_data (enum tui_layout_type new_layout)
c906108c 734{
6ba8e26f
AC
735 int total_height = (tui_term_height () - TUI_CMD_WIN->generic.height);
736 int src_height, data_height;
737 enum tui_win_type win_type;
5b6fe301 738 struct tui_gen_win_info *locator = tui_locator_win_info_ptr ();
c906108c
SS
739
740
6ba8e26f
AC
741 data_height = total_height / 2;
742 src_height = total_height - data_height;
ec7d9e56
AC
743 tui_make_all_invisible ();
744 tui_make_invisible (locator);
6ba8e26f 745 make_data_window (&TUI_DATA_WIN, data_height, 0);
6d012f14 746 TUI_DATA_WIN->can_highlight = TRUE;
6ba8e26f
AC
747 if (new_layout == SRC_DATA_COMMAND)
748 win_type = SRC_WIN;
c906108c 749 else
6ba8e26f
AC
750 win_type = DISASSEM_WIN;
751 if (tui_win_list[win_type] == NULL)
c906108c 752 {
6ba8e26f
AC
753 if (win_type == SRC_WIN)
754 make_source_window (&tui_win_list[win_type], src_height, data_height - 1);
c906108c 755 else
6ba8e26f 756 make_disasm_window (&tui_win_list[win_type], src_height, data_height - 1);
d5d6fca5
DJ
757 locator = init_and_make_win (locator,
758 LOCATOR_WIN,
759 2 /* 1 */ ,
760 tui_term_width (),
761 0,
762 total_height - 1,
763 DONT_BOX_WINDOW);
c906108c
SS
764 }
765 else
766 {
6ba8e26f 767 init_gen_win_info (&tui_win_list[win_type]->generic,
08ef48c5
MS
768 tui_win_list[win_type]->generic.type,
769 src_height,
770 tui_win_list[win_type]->generic.width,
771 tui_win_list[win_type]->detail.source_info.execution_info->width,
772 data_height - 1);
6ba8e26f 773 init_gen_win_info (tui_win_list[win_type]->detail.source_info.execution_info,
08ef48c5
MS
774 EXEC_INFO_WIN,
775 src_height,
776 3,
777 0,
778 data_height - 1);
6ba8e26f
AC
779 tui_make_visible (&tui_win_list[win_type]->generic);
780 tui_make_visible (tui_win_list[win_type]->detail.source_info.execution_info);
781 init_gen_win_info (locator,
08ef48c5
MS
782 LOCATOR_WIN,
783 2 /* 1 */ ,
784 tui_term_width (),
785 0,
786 total_height - 1);
c906108c 787 }
6ba8e26f 788 tui_win_list[win_type]->detail.source_info.has_locator = TRUE;
ec7d9e56 789 tui_make_visible (locator);
47d3492a 790 tui_show_locator_content ();
6ba8e26f
AC
791 tui_add_to_source_windows (tui_win_list[win_type]);
792 tui_set_current_layout_to (new_layout);
793}
c906108c 794
ef5eab5a 795/* init_gen_win_info().
c5aa993b 796 */
c906108c 797static void
08ef48c5
MS
798init_gen_win_info (struct tui_gen_win_info *win_info,
799 enum tui_win_type type,
800 int height, int width,
801 int origin_x, int origin_y)
c906108c
SS
802{
803 int h = height;
804
6ba8e26f
AC
805 win_info->type = type;
806 win_info->width = width;
807 win_info->height = h;
c906108c
SS
808 if (h > 1)
809 {
6ba8e26f
AC
810 win_info->viewport_height = h - 1;
811 if (win_info->type != CMD_WIN)
812 win_info->viewport_height--;
c906108c
SS
813 }
814 else
6ba8e26f
AC
815 win_info->viewport_height = 1;
816 win_info->origin.x = origin_x;
817 win_info->origin.y = origin_y;
c906108c
SS
818
819 return;
6ba8e26f 820} /* init_gen_win_info */
c906108c 821
ef5eab5a 822/* init_and_make_win().
c5aa993b 823 */
d5d6fca5 824static void *
08ef48c5
MS
825init_and_make_win (void *opaque_win_info,
826 enum tui_win_type win_type,
827 int height, int width,
828 int origin_x, int origin_y,
d5d6fca5 829 int box_it)
c906108c 830{
5b6fe301 831 struct tui_gen_win_info *generic;
c906108c 832
6ba8e26f 833 if (opaque_win_info == NULL)
c906108c 834 {
6ba8e26f
AC
835 if (tui_win_is_auxillary (win_type))
836 opaque_win_info = (void *) tui_alloc_generic_win_info ();
c906108c 837 else
6ba8e26f 838 opaque_win_info = (void *) tui_alloc_win_info (win_type);
c906108c 839 }
6ba8e26f
AC
840 if (tui_win_is_auxillary (win_type))
841 generic = (struct tui_gen_win_info *) opaque_win_info;
c906108c 842 else
6ba8e26f 843 generic = &((struct tui_win_info *) opaque_win_info)->generic;
c906108c 844
6ba8e26f 845 if (opaque_win_info != NULL)
c906108c 846 {
6ba8e26f
AC
847 init_gen_win_info (generic, win_type, height, width, origin_x, origin_y);
848 if (!tui_win_is_auxillary (win_type))
c906108c
SS
849 {
850 if (generic->type == CMD_WIN)
6ba8e26f 851 ((struct tui_win_info *) opaque_win_info)->can_highlight = FALSE;
c906108c 852 else
6ba8e26f 853 ((struct tui_win_info *) opaque_win_info)->can_highlight = TRUE;
c906108c 854 }
6ba8e26f 855 tui_make_window (generic, box_it);
c906108c 856 }
d5d6fca5 857 return opaque_win_info;
bc712bbf 858}
c906108c
SS
859
860
c906108c 861static void
08ef48c5
MS
862make_source_or_disasm_window (struct tui_win_info **win_info_ptr,
863 enum tui_win_type type,
864 int height, int origin_y)
c906108c 865{
5b6fe301 866 struct tui_gen_win_info *execution_info = (struct tui_gen_win_info *) NULL;
c906108c 867
ef5eab5a 868 /* Create the exeuction info window. */
c906108c 869 if (type == SRC_WIN)
6d012f14 870 execution_info = tui_source_exec_info_win_ptr ();
c906108c 871 else
6d012f14 872 execution_info = tui_disassem_exec_info_win_ptr ();
d5d6fca5
DJ
873 execution_info = init_and_make_win (execution_info,
874 EXEC_INFO_WIN,
875 height,
876 3,
877 0,
878 origin_y,
879 DONT_BOX_WINDOW);
ef5eab5a
MS
880
881 /* Now create the source window. */
d5d6fca5
DJ
882 *win_info_ptr = init_and_make_win (*win_info_ptr,
883 type,
884 height,
885 tui_term_width () - execution_info->width,
886 execution_info->width,
887 origin_y,
888 BOX_WINDOW);
c906108c 889
6ba8e26f
AC
890 (*win_info_ptr)->detail.source_info.execution_info = execution_info;
891}
c906108c
SS
892
893
1cc6d956 894/* Show the Source/Command or the Disassem layout. */
c906108c 895static void
6ba8e26f 896show_source_or_disasm_and_command (enum tui_layout_type layout_type)
c906108c 897{
6ba8e26f 898 if (tui_current_layout () != layout_type)
c906108c 899 {
5b6fe301 900 struct tui_win_info **win_info_ptr;
6ba8e26f 901 int src_height, cmd_height;
5b6fe301 902 struct tui_gen_win_info *locator = tui_locator_win_info_ptr ();
c906108c 903
6d012f14 904 if (TUI_CMD_WIN != NULL)
6ba8e26f 905 cmd_height = TUI_CMD_WIN->generic.height;
c906108c 906 else
6ba8e26f
AC
907 cmd_height = tui_term_height () / 3;
908 src_height = tui_term_height () - cmd_height;
c906108c 909
6ba8e26f
AC
910 if (layout_type == SRC_COMMAND)
911 win_info_ptr = &TUI_SRC_WIN;
c906108c 912 else
6ba8e26f 913 win_info_ptr = &TUI_DISASM_WIN;
c906108c 914
6ba8e26f 915 if ((*win_info_ptr) == NULL)
c906108c 916 {
6ba8e26f
AC
917 if (layout_type == SRC_COMMAND)
918 make_source_window (win_info_ptr, src_height - 1, 0);
c906108c 919 else
6ba8e26f 920 make_disasm_window (win_info_ptr, src_height - 1, 0);
d5d6fca5
DJ
921 locator = init_and_make_win (locator,
922 LOCATOR_WIN,
923 2 /* 1 */ ,
924 tui_term_width (),
925 0,
926 src_height - 1,
927 DONT_BOX_WINDOW);
c906108c
SS
928 }
929 else
930 {
6ba8e26f 931 init_gen_win_info (locator,
08ef48c5
MS
932 LOCATOR_WIN,
933 2 /* 1 */ ,
934 tui_term_width (),
935 0,
936 src_height - 1);
6ba8e26f 937 (*win_info_ptr)->detail.source_info.has_locator = TRUE;
08ef48c5
MS
938 init_gen_win_info (&(*win_info_ptr)->generic,
939 (*win_info_ptr)->generic.type,
940 src_height - 1,
941 (*win_info_ptr)->generic.width,
942 (*win_info_ptr)->detail.source_info.execution_info->width,
943 0);
6ba8e26f 944 init_gen_win_info ((*win_info_ptr)->detail.source_info.execution_info,
08ef48c5
MS
945 EXEC_INFO_WIN,
946 src_height - 1,
947 3,
948 0,
949 0);
6ba8e26f
AC
950 (*win_info_ptr)->can_highlight = TRUE;
951 tui_make_visible (&(*win_info_ptr)->generic);
952 tui_make_visible ((*win_info_ptr)->detail.source_info.execution_info);
c906108c 953 }
6ba8e26f 954 if ((*win_info_ptr) != NULL)
c906108c 955 {
6ba8e26f 956 (*win_info_ptr)->detail.source_info.has_locator = TRUE;
ec7d9e56 957 tui_make_visible (locator);
47d3492a 958 tui_show_locator_content ();
6ba8e26f 959 tui_show_source_content (*win_info_ptr);
c906108c 960
6d012f14 961 if (TUI_CMD_WIN == NULL)
c906108c 962 {
6ba8e26f 963 make_command_window (&TUI_CMD_WIN, cmd_height, src_height);
6d012f14 964 tui_refresh_win (&TUI_CMD_WIN->generic);
c906108c
SS
965 }
966 else
967 {
6ba8e26f 968 init_gen_win_info (&TUI_CMD_WIN->generic,
08ef48c5
MS
969 TUI_CMD_WIN->generic.type,
970 TUI_CMD_WIN->generic.height,
971 TUI_CMD_WIN->generic.width,
972 TUI_CMD_WIN->generic.origin.x,
973 TUI_CMD_WIN->generic.origin.y);
6d012f14
AC
974 TUI_CMD_WIN->can_highlight = FALSE;
975 tui_make_visible (&TUI_CMD_WIN->generic);
c906108c
SS
976 }
977 }
6ba8e26f 978 tui_set_current_layout_to (layout_type);
c906108c 979 }
6ba8e26f 980}
This page took 2.458182 seconds and 4 git commands to generate.