GDB (xrefs)
tui-layout.c
Go to the documentation of this file.
1 /* TUI layout window management.
2 
3  Copyright (C) 1998-2018 Free Software Foundation, Inc.
4 
5  Contributed by Hewlett-Packard Company.
6 
7  This file is part of GDB.
8 
9  This program is free software; you can redistribute it and/or modify
10  it under the terms of the GNU General Public License as published by
11  the Free Software Foundation; either version 3 of the License, or
12  (at your option) any later version.
13 
14  This program is distributed in the hope that it will be useful,
15  but WITHOUT ANY WARRANTY; without even the implied warranty of
16  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  GNU General Public License for more details.
18 
19  You should have received a copy of the GNU General Public License
20  along with this program. If not, see <http://www.gnu.org/licenses/>. */
21 
22 #include "defs.h"
23 #include "arch-utils.h"
24 #include "command.h"
25 #include "symtab.h"
26 #include "frame.h"
27 #include "source.h"
28 #include <ctype.h>
29 
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"
39 #include "tui/tui-layout.h"
40 #include "gdb_curses.h"
41 
42 /*******************************
43 ** Static Local Decls
44 ********************************/
45 static void show_layout (enum tui_layout_type);
46 static void init_gen_win_info (struct tui_gen_win_info *,
47  enum tui_win_type,
48  int, int, int, int);
49 static void *init_and_make_win (void *, enum tui_win_type,
50  int, int, int, int, int);
52 static void make_source_or_disasm_window (struct tui_win_info **,
53  enum tui_win_type,
54  int, int);
55 static void make_command_window (struct tui_win_info **, int, int);
56 static void make_source_window (struct tui_win_info **, int, int);
57 static void make_disasm_window (struct tui_win_info **, int, int);
58 static void make_data_window (struct tui_win_info **, int, int);
59 static void show_source_command (void);
60 static void show_disasm_command (void);
61 static void show_source_disasm_command (void);
62 static void show_data (enum tui_layout_type);
63 static enum tui_layout_type next_layout (void);
64 static enum tui_layout_type prev_layout (void);
65 static void tui_layout_command (const char *, int);
66 static void extract_display_start_addr (struct gdbarch **, CORE_ADDR *);
67 
68 
69 /***************************************
70 ** DEFINITIONS
71 ***************************************/
72 
73 #define LAYOUT_USAGE "Usage: layout prev | next | <layout_name> \n"
74 
75 /* Show the screen layout defined. */
76 static void
78 {
79  enum tui_layout_type cur_layout = tui_current_layout ();
80 
81  if (layout != cur_layout)
82  {
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. */
88  if (layout == SRC_DATA_COMMAND
89  || layout == DISASSEM_DATA_COMMAND)
90  {
91  show_data (layout);
93  }
94  else
95  {
96  /* First make the current layout be invisible. */
99 
100  switch (layout)
101  {
102  /* Now show the new layout. */
103  case SRC_COMMAND:
106  break;
107  case DISASSEM_COMMAND:
110  break;
115  break;
116  default:
117  break;
118  }
119  }
120  }
121 }
122 
123 
124 /* Function to set the layout to SRC_COMMAND, DISASSEM_COMMAND,
125  SRC_DISASSEM_COMMAND, SRC_DATA_COMMAND, or DISASSEM_DATA_COMMAND. */
126 enum tui_status
127 tui_set_layout (enum tui_layout_type layout_type)
128 {
130 
131  if (layout_type != UNDEFINED_LAYOUT)
132  {
133  enum tui_layout_type cur_layout = tui_current_layout (),
134  new_layout = UNDEFINED_LAYOUT;
135  int regs_populate = FALSE;
136  struct gdbarch *gdbarch;
137  CORE_ADDR addr;
140 
142 
143  new_layout = layout_type;
144 
145  regs_populate = (new_layout == SRC_DATA_COMMAND
146  || new_layout == DISASSEM_DATA_COMMAND);
147  if (new_layout != cur_layout)
148  {
149  show_layout (new_layout);
150 
151  /* Now determine where focus should be. */
153  {
154  switch (new_layout)
155  {
156  case SRC_COMMAND:
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 
173  layout_def->split = FALSE;
174  break;
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 
187  else
189  layout_def->split = TRUE;
190  break;
191  case SRC_DATA_COMMAND:
194  else
197  layout_def->split = FALSE;
198  break;
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 
211  else
214  layout_def->split = FALSE;
215  break;
216  default:
217  break;
218  }
219  }
220  /*
221  * Now update the window content.
222  */
223  if (!regs_populate
224  && (new_layout == SRC_DATA_COMMAND
225  || new_layout == DISASSEM_DATA_COMMAND))
227 
229 
230  if (regs_populate)
231  {
232  struct reggroup *group =
233  TUI_DATA_WIN->detail.data_display_info.current_group;
234  tui_show_registers (group);
235  }
236  }
237  }
238  else
240 
241  return status;
242 }
243 
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. */
247 void
249 {
250  enum tui_layout_type cur_layout = tui_current_layout ();
251 
252  switch (type)
253  {
254  case SRC_WIN:
255  if (cur_layout != SRC_COMMAND
256  && cur_layout != SRC_DISASSEM_COMMAND
257  && cur_layout != SRC_DATA_COMMAND)
258  {
260  if (cur_layout == DISASSEM_DATA_COMMAND)
262  else
264  }
265  break;
266  case DISASSEM_WIN:
267  if (cur_layout != DISASSEM_COMMAND
268  && cur_layout != SRC_DISASSEM_COMMAND
269  && cur_layout != DISASSEM_DATA_COMMAND)
270  {
272  if (cur_layout == SRC_DATA_COMMAND)
274  else
276  }
277  break;
278  case DATA_WIN:
279  if (cur_layout != SRC_DATA_COMMAND
280  && cur_layout != DISASSEM_DATA_COMMAND)
281  {
282  if (cur_layout == DISASSEM_COMMAND)
284  else
286  }
287  break;
288  default:
289  break;
290  }
291 }
292 
293 
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. */
297 int
299  enum tui_layout_type layout)
300 {
301  int h;
302 
303  if (tui_win_list[type] != (struct tui_win_info *) NULL)
305  else
306  {
307  switch (layout)
308  {
309  case SRC_COMMAND:
310  case DISASSEM_COMMAND:
311  if (TUI_CMD_WIN == NULL)
312  h = tui_term_height () / 2;
313  else
314  h = tui_term_height () - TUI_CMD_WIN->generic.height;
315  break;
317  case SRC_DATA_COMMAND:
319  if (TUI_CMD_WIN == NULL)
320  h = tui_term_height () / 3;
321  else
322  h = (tui_term_height () - TUI_CMD_WIN->generic.height) / 2;
323  break;
324  default:
325  h = 0;
326  break;
327  }
328  }
329 
330  return h;
331 }
332 
333 
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. */
337 int
339  enum tui_layout_type layout)
340 {
341  int h;
342 
343  h = tui_default_win_height (type, layout);
344 
345  if (tui_win_list[type] == TUI_CMD_WIN)
346  h -= 1;
347  else
348  h -= 2;
349 
350  return h;
351 }
352 
353 /* Complete possible layout names. TEXT is the complete text entered so
354  far, WORD is the word currently being completed. */
355 
356 static void
358  completion_tracker &tracker,
359  const char *text, const char *word)
360 {
361  static const char *layout_names [] =
362  { "src", "asm", "split", "regs", "next", "prev", NULL };
363 
364  complete_on_enum (tracker, layout_names, text, word);
365 }
366 
367 /* Function to initialize gdb commands, for tui window layout
368  manipulation. */
369 
370 void
372 {
373  struct cmd_list_element *cmd;
374 
375  cmd = add_com ("layout", class_tui, tui_layout_command, _("\
376 Change the layout of windows.\n\
377 Usage: layout prev | next | <layout_name> \n\
378 Layout names are:\n\
379  src : Displays source and command windows.\n\
380  asm : Displays disassembly and command windows.\n\
381  split : Displays source, disassembly and command windows.\n\
382  regs : Displays register window. If existing layout\n\
383  is source/command or assembly/command, the \n\
384  register window is displayed. If the\n\
385  source/assembly/command (split) is displayed, \n\
386  the register window is displayed with \n\
387  the window that has current logical focus.\n"));
389 }
390 
391 
392 /*************************
393 ** STATIC LOCAL FUNCTIONS
394 **************************/
395 
396 
397 /* Function to set the layout to SRC, ASM, SPLIT, NEXT, PREV, DATA, or
398  REGS. */
399 enum tui_status
400 tui_set_layout_by_name (const char *layout_name)
401 {
403 
404  if (layout_name != (char *) NULL)
405  {
406  int i;
407  enum tui_layout_type new_layout = UNDEFINED_LAYOUT;
408  enum tui_layout_type cur_layout = tui_current_layout ();
409 
410  std::string copy = layout_name;
411  for (i = 0; i < copy.size (); i++)
412  copy[i] = toupper (copy[i]);
413  const char *buf_ptr = copy.c_str ();
414 
415  /* First check for ambiguous input. */
416  if (strlen (buf_ptr) <= 1 && *buf_ptr == 'S')
417  {
418  warning (_("Ambiguous command input."));
420  }
421  else
422  {
423  if (subset_compare (buf_ptr, "SRC"))
424  new_layout = SRC_COMMAND;
425  else if (subset_compare (buf_ptr, "ASM"))
426  new_layout = DISASSEM_COMMAND;
427  else if (subset_compare (buf_ptr, "SPLIT"))
428  new_layout = SRC_DISASSEM_COMMAND;
429  else if (subset_compare (buf_ptr, "REGS"))
430  {
431  if (cur_layout == SRC_COMMAND
432  || cur_layout == SRC_DATA_COMMAND)
433  new_layout = SRC_DATA_COMMAND;
434  else
435  new_layout = DISASSEM_DATA_COMMAND;
436  }
437  else if (subset_compare (buf_ptr, "NEXT"))
438  new_layout = next_layout ();
439  else if (subset_compare (buf_ptr, "PREV"))
440  new_layout = prev_layout ();
441  else
443 
444  if (status == TUI_SUCCESS)
445  {
446  /* Make sure the curses mode is enabled. */
447  tui_enable ();
448  tui_set_layout (new_layout);
449  }
450  }
451  }
452  else
454 
455  return status;
456 }
457 
458 
459 static void
460 extract_display_start_addr (struct gdbarch **gdbarch_p, CORE_ADDR *addr_p)
461 {
462  enum tui_layout_type cur_layout = tui_current_layout ();
463  struct gdbarch *gdbarch = get_current_arch ();
464  CORE_ADDR addr;
465  CORE_ADDR pc;
467 
468  switch (cur_layout)
469  {
470  case SRC_COMMAND:
471  case SRC_DATA_COMMAND:
472  gdbarch = TUI_SRC_WIN->detail.source_info.gdbarch;
473  find_line_pc (cursal.symtab,
474  TUI_SRC_WIN->detail.source_info.start_line_or_addr.u.line_no,
475  &pc);
476  addr = pc;
477  break;
478  case DISASSEM_COMMAND:
481  gdbarch = TUI_DISASM_WIN->detail.source_info.gdbarch;
482  addr = TUI_DISASM_WIN->detail.source_info.start_line_or_addr.u.addr;
483  break;
484  default:
485  addr = 0;
486  break;
487  }
488 
489  *gdbarch_p = gdbarch;
490  *addr_p = addr;
491 }
492 
493 
494 static void
495 tui_layout_command (const char *arg, int from_tty)
496 {
497  /* Switch to the selected layout. */
498  if (tui_set_layout_by_name (arg) != TUI_SUCCESS)
499  warning (_("Invalid layout specified.\n%s"), LAYOUT_USAGE);
500 }
501 
502 /* Answer the previous layout to cycle to. */
503 static enum tui_layout_type
505 {
506  int new_layout;
507 
508  new_layout = tui_current_layout ();
509  if (new_layout == UNDEFINED_LAYOUT)
510  new_layout = SRC_COMMAND;
511  else
512  {
513  new_layout++;
514  if (new_layout == UNDEFINED_LAYOUT)
515  new_layout = SRC_COMMAND;
516  }
517 
518  return (enum tui_layout_type) new_layout;
519 }
520 
521 
522 /* Answer the next layout to cycle to. */
523 static enum tui_layout_type
525 {
526  int new_layout;
527 
528  new_layout = tui_current_layout ();
529  if (new_layout == SRC_COMMAND)
530  new_layout = DISASSEM_DATA_COMMAND;
531  else
532  {
533  new_layout--;
534  if (new_layout == UNDEFINED_LAYOUT)
535  new_layout = DISASSEM_DATA_COMMAND;
536  }
537 
538  return (enum tui_layout_type) new_layout;
539 }
540 
541 
542 
543 static void
544 make_command_window (struct tui_win_info **win_info_ptr,
545  int height, int origin_y)
546 {
547  *win_info_ptr
548  = (struct tui_win_info *) init_and_make_win (*win_info_ptr,
549  CMD_WIN,
550  height,
551  tui_term_width (),
552  0,
553  origin_y,
555 
556  (*win_info_ptr)->can_highlight = FALSE;
557 }
558 
559 
560 /* make_source_window().
561  */
562 static void
563 make_source_window (struct tui_win_info **win_info_ptr,
564  int height, int origin_y)
565 {
566  make_source_or_disasm_window (win_info_ptr, SRC_WIN, height, origin_y);
567 
568  return;
569 } /* make_source_window */
570 
571 
572 /* make_disasm_window().
573  */
574 static void
575 make_disasm_window (struct tui_win_info **win_info_ptr,
576  int height, int origin_y)
577 {
578  make_source_or_disasm_window (win_info_ptr, DISASSEM_WIN, height, origin_y);
579 
580  return;
581 } /* make_disasm_window */
582 
583 
584 static void
585 make_data_window (struct tui_win_info **win_info_ptr,
586  int height, int origin_y)
587 {
588  *win_info_ptr
589  = (struct tui_win_info *) init_and_make_win (*win_info_ptr,
590  DATA_WIN,
591  height,
592  tui_term_width (),
593  0,
594  origin_y,
595  BOX_WINDOW);
596 }
597 
598 
599 
600 /* Show the Source/Command layout. */
601 static void
603 {
605 }
606 
607 
608 /* Show the Dissassem/Command layout. */
609 static void
611 {
613 }
614 
615 
616 /* Show the Source/Disassem/Command layout. */
617 static void
619 {
621  {
622  int cmd_height, src_height, asm_height;
623 
624  if (TUI_CMD_WIN != NULL)
625  cmd_height = TUI_CMD_WIN->generic.height;
626  else
627  cmd_height = tui_term_height () / 3;
628 
629  src_height = (tui_term_height () - cmd_height) / 2;
630  asm_height = tui_term_height () - (src_height + cmd_height);
631 
632  if (TUI_SRC_WIN == NULL)
633  make_source_window (&TUI_SRC_WIN, src_height, 0);
634  else
635  {
636  init_gen_win_info (&TUI_SRC_WIN->generic,
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);
642  TUI_SRC_WIN->can_highlight = TRUE;
643  init_gen_win_info (TUI_SRC_WIN->detail.source_info.execution_info,
645  src_height,
646  3,
647  0,
648  0);
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;;
652  }
653  if (TUI_SRC_WIN != NULL)
654  {
655  struct tui_gen_win_info *locator = tui_locator_win_info_ptr ();
656 
658  if (TUI_DISASM_WIN == NULL)
659  {
660  make_disasm_window (&TUI_DISASM_WIN, asm_height, src_height - 1);
661  locator
662  = ((struct tui_gen_win_info *)
663  init_and_make_win (locator,
664  LOCATOR_WIN,
665  2 /* 1 */ ,
666  tui_term_width (),
667  0,
668  (src_height + asm_height) - 1,
669  DONT_BOX_WINDOW));
670  }
671  else
672  {
673  init_gen_win_info (locator,
674  LOCATOR_WIN,
675  2 /* 1 */ ,
676  tui_term_width (),
677  0,
678  (src_height + asm_height) - 1);
679  TUI_DISASM_WIN->detail.source_info.has_locator = TRUE;
681  TUI_DISASM_WIN->generic.type,
682  asm_height,
683  TUI_DISASM_WIN->generic.width,
684  TUI_DISASM_WIN->detail.source_info.execution_info->width,
685  src_height - 1);
686  init_gen_win_info (TUI_DISASM_WIN->detail.source_info.execution_info,
688  asm_height,
689  3,
690  0,
691  src_height - 1);
692  TUI_DISASM_WIN->can_highlight = TRUE;
693  tui_make_visible (&TUI_DISASM_WIN->generic);
694  tui_make_visible (TUI_DISASM_WIN->detail.source_info.execution_info);
695  }
696  if (TUI_DISASM_WIN != NULL)
697  {
698  TUI_SRC_WIN->detail.source_info.has_locator = FALSE;
699  TUI_DISASM_WIN->detail.source_info.has_locator = TRUE;
700  tui_make_visible (locator);
703 
704  if (TUI_CMD_WIN == NULL)
706  cmd_height,
707  tui_term_height () - cmd_height);
708  else
709  {
710  init_gen_win_info (&TUI_CMD_WIN->generic,
711  TUI_CMD_WIN->generic.type,
712  TUI_CMD_WIN->generic.height,
713  TUI_CMD_WIN->generic.width,
714  0,
715  TUI_CMD_WIN->generic.origin.y);
716  TUI_CMD_WIN->can_highlight = FALSE;
717  tui_make_visible (&TUI_CMD_WIN->generic);
718  }
719  if (TUI_CMD_WIN != NULL)
720  tui_refresh_win (&TUI_CMD_WIN->generic);
721  }
722  }
724  }
725 }
726 
727 
728 /* Show the Source/Data/Command or the Dissassembly/Data/Command
729  layout. */
730 static void
731 show_data (enum tui_layout_type new_layout)
732 {
733  int total_height = (tui_term_height () - TUI_CMD_WIN->generic.height);
734  int src_height, data_height;
735  enum tui_win_type win_type;
736  struct tui_gen_win_info *locator = tui_locator_win_info_ptr ();
737 
738 
739  data_height = total_height / 2;
740  src_height = total_height - data_height;
742  tui_make_invisible (locator);
743  make_data_window (&TUI_DATA_WIN, data_height, 0);
744  TUI_DATA_WIN->can_highlight = TRUE;
745  if (new_layout == SRC_DATA_COMMAND)
746  win_type = SRC_WIN;
747  else
748  win_type = DISASSEM_WIN;
749  if (tui_win_list[win_type] == NULL)
750  {
751  if (win_type == SRC_WIN)
752  make_source_window (&tui_win_list[win_type], src_height, data_height - 1);
753  else
754  make_disasm_window (&tui_win_list[win_type], src_height, data_height - 1);
755  locator
756  = ((struct tui_gen_win_info *)
757  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));
764  }
765  else
766  {
767  init_gen_win_info (&tui_win_list[win_type]->generic,
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);
775  src_height,
776  3,
777  0,
778  data_height - 1);
779  tui_make_visible (&tui_win_list[win_type]->generic);
781  init_gen_win_info (locator,
782  LOCATOR_WIN,
783  2 /* 1 */ ,
784  tui_term_width (),
785  0,
786  total_height - 1);
787  }
788  tui_win_list[win_type]->detail.source_info.has_locator = TRUE;
789  tui_make_visible (locator);
792  tui_set_current_layout_to (new_layout);
793 }
794 
795 /* init_gen_win_info().
796  */
797 static void
799  enum tui_win_type type,
800  int height, int width,
801  int origin_x, int origin_y)
802 {
803  int h = height;
804 
805  win_info->type = type;
806  win_info->width = width;
807  win_info->height = h;
808  if (h > 1)
809  {
810  win_info->viewport_height = h - 1;
811  if (win_info->type != CMD_WIN)
812  win_info->viewport_height--;
813  }
814  else
815  win_info->viewport_height = 1;
816  win_info->origin.x = origin_x;
817  win_info->origin.y = origin_y;
818 
819  return;
820 } /* init_gen_win_info */
821 
822 /* init_and_make_win().
823  */
824 static void *
825 init_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,
829  int box_it)
830 {
831  struct tui_gen_win_info *generic;
832 
833  if (opaque_win_info == NULL)
834  {
835  if (tui_win_is_auxillary (win_type))
836  opaque_win_info = (void *) tui_alloc_generic_win_info ();
837  else
838  opaque_win_info = (void *) tui_alloc_win_info (win_type);
839  }
840  if (tui_win_is_auxillary (win_type))
841  generic = (struct tui_gen_win_info *) opaque_win_info;
842  else
843  generic = &((struct tui_win_info *) opaque_win_info)->generic;
844 
845  if (opaque_win_info != NULL)
846  {
847  init_gen_win_info (generic, win_type, height, width, origin_x, origin_y);
848  if (!tui_win_is_auxillary (win_type))
849  {
850  if (generic->type == CMD_WIN)
851  ((struct tui_win_info *) opaque_win_info)->can_highlight = FALSE;
852  else
853  ((struct tui_win_info *) opaque_win_info)->can_highlight = TRUE;
854  }
855  tui_make_window (generic, box_it);
856  }
857  return opaque_win_info;
858 }
859 
860 
861 static void
863  enum tui_win_type type,
864  int height, int origin_y)
865 {
866  struct tui_gen_win_info *execution_info = NULL;
867 
868  /* Create the exeuction info window. */
869  if (type == SRC_WIN)
870  execution_info = tui_source_exec_info_win_ptr ();
871  else
872  execution_info = tui_disassem_exec_info_win_ptr ();
873  execution_info
874  = ((struct tui_gen_win_info *)
875  init_and_make_win (execution_info,
877  height,
878  3,
879  0,
880  origin_y,
881  DONT_BOX_WINDOW));
882 
883  /* Now create the source window. */
884  *win_info_ptr
885  = ((struct tui_win_info *)
886  init_and_make_win (*win_info_ptr,
887  type,
888  height,
889  tui_term_width () - execution_info->width,
890  execution_info->width,
891  origin_y,
892  BOX_WINDOW));
893 
894  (*win_info_ptr)->detail.source_info.execution_info = execution_info;
895 }
896 
897 
898 /* Show the Source/Command or the Disassem layout. */
899 static void
901 {
902  if (tui_current_layout () != layout_type)
903  {
904  struct tui_win_info **win_info_ptr;
905  int src_height, cmd_height;
906  struct tui_gen_win_info *locator = tui_locator_win_info_ptr ();
907 
908  if (TUI_CMD_WIN != NULL)
909  cmd_height = TUI_CMD_WIN->generic.height;
910  else
911  cmd_height = tui_term_height () / 3;
912  src_height = tui_term_height () - cmd_height;
913 
914  if (layout_type == SRC_COMMAND)
915  win_info_ptr = &TUI_SRC_WIN;
916  else
917  win_info_ptr = &TUI_DISASM_WIN;
918 
919  if ((*win_info_ptr) == NULL)
920  {
921  if (layout_type == SRC_COMMAND)
922  make_source_window (win_info_ptr, src_height - 1, 0);
923  else
924  make_disasm_window (win_info_ptr, src_height - 1, 0);
925  locator
926  = ((struct tui_gen_win_info *)
927  init_and_make_win (locator,
928  LOCATOR_WIN,
929  2 /* 1 */ ,
930  tui_term_width (),
931  0,
932  src_height - 1,
933  DONT_BOX_WINDOW));
934  }
935  else
936  {
937  init_gen_win_info (locator,
938  LOCATOR_WIN,
939  2 /* 1 */ ,
940  tui_term_width (),
941  0,
942  src_height - 1);
943  (*win_info_ptr)->detail.source_info.has_locator = TRUE;
944  init_gen_win_info (&(*win_info_ptr)->generic,
945  (*win_info_ptr)->generic.type,
946  src_height - 1,
947  (*win_info_ptr)->generic.width,
948  (*win_info_ptr)->detail.source_info.execution_info->width,
949  0);
950  init_gen_win_info ((*win_info_ptr)->detail.source_info.execution_info,
952  src_height - 1,
953  3,
954  0,
955  0);
956  (*win_info_ptr)->can_highlight = TRUE;
957  tui_make_visible (&(*win_info_ptr)->generic);
958  tui_make_visible ((*win_info_ptr)->detail.source_info.execution_info);
959  }
960  if ((*win_info_ptr) != NULL)
961  {
962  (*win_info_ptr)->detail.source_info.has_locator = TRUE;
963  tui_make_visible (locator);
965  tui_show_source_content (*win_info_ptr);
966 
967  if (TUI_CMD_WIN == NULL)
968  {
969  make_command_window (&TUI_CMD_WIN, cmd_height, src_height);
970  tui_refresh_win (&TUI_CMD_WIN->generic);
971  }
972  else
973  {
974  init_gen_win_info (&TUI_CMD_WIN->generic,
975  TUI_CMD_WIN->generic.type,
976  TUI_CMD_WIN->generic.height,
977  TUI_CMD_WIN->generic.width,
978  TUI_CMD_WIN->generic.origin.x,
979  TUI_CMD_WIN->generic.origin.y);
980  TUI_CMD_WIN->can_highlight = FALSE;
981  tui_make_visible (&TUI_CMD_WIN->generic);
982  }
983  }
984  tui_set_current_layout_to (layout_type);
985  }
986 }
void tui_clear_source_windows_detail(void)
Definition: tui-data.c:179
const char * string
Definition: signals.c:50
void tui_make_all_invisible(void)
void tui_get_begin_asm_address(struct gdbarch **gdbarch_p, CORE_ADDR *addr_p)
Definition: tui-disasm.c:319
int viewport_height
Definition: tui-data.h:50
enum tui_win_type type
Definition: tui-data.h:43
struct tui_win_info * tui_win_list[MAX_MAJOR_WINDOWS]
Definition: tui-data.c:32
bfd_vma CORE_ADDR
Definition: common-types.h:41
int tui_term_height(void)
Definition: tui-data.c:261
void tui_make_invisible(struct tui_gen_win_info *win_info)
void warning(const char *fmt,...)
Definition: errors.c:26
tui_layout_type
Definition: tui-data.h:114
struct symtab_and_line get_current_source_symtab_and_line(void)
Definition: source.c:171
int tui_default_win_height(enum tui_win_type type, enum tui_layout_type layout)
Definition: tui-layout.c:298
void complete_on_enum(completion_tracker &tracker, const char *const *enumlist, const char *text, const char *word)
Definition: cli-decode.c:1853
void tui_add_to_source_windows(struct tui_win_info *win_info)
Definition: tui-data.c:192
#define LAYOUT_USAGE
Definition: tui-layout.c:73
struct tui_gen_win_info * tui_alloc_generic_win_info(void)
Definition: tui-data.c:440
static void show_source_or_disasm_and_command(enum tui_layout_type)
Definition: tui-layout.c:900
static void init_gen_win_info(struct tui_gen_win_info *, enum tui_win_type, int, int, int, int)
Definition: tui-layout.c:798
static void make_disasm_window(struct tui_win_info **, int, int)
Definition: tui-layout.c:575
static enum tui_layout_type next_layout(void)
Definition: tui-layout.c:504
void tui_set_win_focus_to(struct tui_win_info *win_info)
Definition: tui-win.c:564
#define _(String)
Definition: gdb_locale.h:35
static void make_data_window(struct tui_win_info **, int, int)
Definition: tui-layout.c:585
enum tui_status tui_set_layout(enum tui_layout_type layout_type)
Definition: tui-layout.c:127
static enum tui_layout_type prev_layout(void)
Definition: tui-layout.c:524
void _initialize_tui_layout(void)
Definition: tui-layout.c:371
void tui_make_window(struct tui_gen_win_info *win_info, int box_it)
void tui_show_registers(struct reggroup *group)
Definition: tui-regs.c:132
int x
Definition: tui-data.h:31
struct tui_gen_win_info generic
Definition: tui-data.h:275
struct tui_source_info source_info
Definition: tui-data.h:278
static void show_source_disasm_command(void)
Definition: tui-layout.c:618
void tui_show_source_content(struct tui_win_info *win_info)
static void * init_and_make_win(void *, enum tui_win_type, int, int, int, int, int)
Definition: tui-layout.c:825
void set_cmd_completer(struct cmd_list_element *cmd, completer_ftype *completer)
Definition: cli-decode.c:160
Definition: tui.h:39
struct tui_win_info * tui_win_with_focus(void)
Definition: tui-data.c:125
struct tui_gen_win_info * tui_locator_win_info_ptr(void)
Definition: tui-data.c:253
Definition: gdbtypes.h:749
static void make_source_or_disasm_window(struct tui_win_info **, enum tui_win_type, int, int)
Definition: tui-layout.c:862
static void show_layout(enum tui_layout_type)
Definition: tui-layout.c:77
tui_status
Definition: tui.h:30
static void show_source_command(void)
Definition: tui-layout.c:602
struct gdbarch * get_current_arch(void)
Definition: arch-utils.c:798
static void layout_completer(struct cmd_list_element *ignore, completion_tracker &tracker, const char *text, const char *word)
Definition: tui-layout.c:357
static const char * type
Definition: language.c:113
#define DONT_BOX_WINDOW
Definition: tui-data.h:70
static void make_source_window(struct tui_win_info **, int, int)
Definition: tui-layout.c:563
mach_port_t mach_port_t name mach_port_t mach_port_t name kern_return_t int status
Definition: gnu-nat.c:1822
static void make_command_window(struct tui_win_info **, int, int)
Definition: tui-layout.c:544
static void show_data(enum tui_layout_type)
Definition: tui-layout.c:731
static void extract_display_start_addr(struct gdbarch **, CORE_ADDR *)
Definition: tui-layout.c:460
#define BOX_WINDOW
Definition: tui-data.h:69
struct tui_layout_def * tui_layout_def(void)
Definition: tui-data.c:117
void tui_set_current_layout_to(enum tui_layout_type new_layout)
Definition: tui-data.c:301
#define TUI_DATA_WIN
Definition: tui-data.h:300
struct symtab * symtab
Definition: symtab.h:1751
Definition: tui.h:42
void tui_free_all_source_wins_content(void)
Definition: tui-data.c:751
tui_win_type
Definition: tui.h:37
#define TUI_CMD_WIN
Definition: tui-data.h:301
void tui_clear_source_windows(void)
Definition: tui-data.c:169
void tui_add_win_to_layout(enum tui_win_type type)
Definition: tui-layout.c:248
int find_line_pc(struct symtab *symtab, int line, CORE_ADDR *pc)
Definition: symtab.c:3456
void tui_show_locator_content(void)
Definition: tui-stack.c:242
int y
Definition: tui-data.h:31
void tui_make_visible(struct tui_gen_win_info *win_info)
#define TUI_SRC_WIN
Definition: tui-data.h:298
struct tui_win_info * tui_alloc_win_info(enum tui_win_type type)
Definition: tui-data.c:557
static void tui_layout_command(const char *, int)
Definition: tui-layout.c:495
union tui_win_info::@182 detail
struct tui_gen_win_info * tui_disassem_exec_info_win_ptr(void)
Definition: tui-data.c:244
struct tui_gen_win_info * execution_info
Definition: tui-data.h:254
void tui_update_source_windows_with_addr(struct gdbarch *gdbarch, CORE_ADDR addr)
enum tui_status tui_set_layout_by_name(const char *layout_name)
Definition: tui-layout.c:400
struct tui_point origin
Definition: tui-data.h:46
int tui_term_width(void)
Definition: tui-data.c:277
static struct tui_win_info * win_with_focus
Definition: tui-data.c:44
CORE_ADDR pc
Definition: symtab.h:1759
#define TUI_DISASM_WIN
Definition: tui-data.h:299
void tui_refresh_all(struct tui_win_info **list)
static int ignore(struct target_ops *ops, struct gdbarch *gdbarch, struct bp_target_info *bp_tgt)
Definition: corelow.c:879
void tui_display_all_data(void)
Definition: tui-windata.c:129
void tui_refresh_win(struct tui_gen_win_info *win_info)
void tui_enable(void)
Definition: tui.c:401
Definition: tui.h:41
struct tui_gen_win_info * tui_source_exec_info_win_ptr(void)
Definition: tui-data.c:236
int tui_win_is_auxillary(enum tui_win_type win_type)
Definition: tui-data.c:75
struct cmd_list_element * add_com(const char *name, enum command_class theclass, cmd_const_cfunc_ftype *fun, const char *doc)
Definition: cli-decode.c:902
enum tui_win_type display_mode
Definition: tui-data.h:153
static struct tui_layout_def layout_def
Definition: tui-data.c:45
static void show_disasm_command(void)
Definition: tui-layout.c:610
int subset_compare(const char *string_to_compare, const char *template_string)
Definition: utils.c:2654
enum tui_layout_type tui_current_layout(void)
Definition: tui-data.c:293
int tui_default_win_viewport_height(enum tui_win_type type, enum tui_layout_type layout)
Definition: tui-layout.c:338