More type safety for TUI source window functions
[deliverable/binutils-gdb.git] / gdb / tui / tui-win.c
index a24f25928e27546ee00abc8c64a762a52e77cf9e..2f862c1a2f08b581e89ae8941c066a64e6576464 100644 (file)
@@ -55,7 +55,6 @@
 /*******************************
 ** Static Local Decls
 ********************************/
-static void make_visible_with_new_height (struct tui_win_info *);
 static void make_invisible_and_set_new_height (struct tui_win_info *, 
                                               int);
 static enum tui_status tui_adjust_win_heights (struct tui_win_info *, 
@@ -373,10 +372,10 @@ window_name_completer (completion_tracker &tracker,
 
       /* We can't focus on an invisible window.  */
       if (tui_win_list[win_type] == NULL
-         || !tui_win_list[win_type]->generic.is_visible)
+         || !tui_win_list[win_type]->is_visible)
        continue;
 
-      completion_name = tui_win_name (&tui_win_list [win_type]->generic);
+      completion_name = tui_win_list[win_type]->name ();
       gdb_assert (completion_name != NULL);
       completion_name_vec.push_back (completion_name);
     }
@@ -438,8 +437,8 @@ tui_update_gdb_sizes (void)
 
   if (tui_active)
     {
-      width = TUI_CMD_WIN->generic.width;
-      height = TUI_CMD_WIN->generic.height;
+      width = TUI_CMD_WIN->width;
+      height = TUI_CMD_WIN->height;
     }
   else
     {
@@ -459,139 +458,63 @@ tui_set_win_focus_to (struct tui_win_info *win_info)
     {
       struct tui_win_info *win_with_focus = tui_win_with_focus ();
 
-      if (win_with_focus != NULL
-         && win_with_focus->generic.type != CMD_WIN)
-       tui_unhighlight_win (win_with_focus);
+      tui_unhighlight_win (win_with_focus);
       tui_set_win_with_focus (win_info);
-      if (win_info->generic.type != CMD_WIN)
-       tui_highlight_win (win_info);
+      tui_highlight_win (win_info);
     }
 }
 
 
 void
-tui_scroll_forward (struct tui_win_info *win_to_scroll, 
-                   int num_to_scroll)
+tui_win_info::forward_scroll (int num_to_scroll)
 {
-  if (win_to_scroll != TUI_CMD_WIN)
-    {
-      int _num_to_scroll = num_to_scroll;
-
-      if (num_to_scroll == 0)
-       _num_to_scroll = win_to_scroll->generic.height - 3;
-
-      /* If we are scrolling the source or disassembly window, do a
-         "psuedo" scroll since not all of the source is in memory,
-         only what is in the viewport.  If win_to_scroll is the
-         command window do nothing since the term should handle
-         it.  */
-      if (win_to_scroll == TUI_SRC_WIN)
-       tui_vertical_source_scroll (FORWARD_SCROLL, _num_to_scroll);
-      else if (win_to_scroll == TUI_DISASM_WIN)
-       tui_vertical_disassem_scroll (FORWARD_SCROLL, _num_to_scroll);
-      else if (win_to_scroll == TUI_DATA_WIN)
-       tui_vertical_data_scroll (FORWARD_SCROLL, _num_to_scroll);
-    }
+  if (num_to_scroll == 0)
+    num_to_scroll = height - 3;
+
+  do_scroll_vertical (num_to_scroll);
 }
 
 void
-tui_scroll_backward (struct tui_win_info *win_to_scroll, 
-                    int num_to_scroll)
+tui_win_info::backward_scroll (int num_to_scroll)
 {
-  if (win_to_scroll != TUI_CMD_WIN)
-    {
-      int _num_to_scroll = num_to_scroll;
-
-      if (num_to_scroll == 0)
-       _num_to_scroll = win_to_scroll->generic.height - 3;
-
-      /* If we are scrolling the source or disassembly window, do a
-         "psuedo" scroll since not all of the source is in memory,
-         only what is in the viewport.  If win_to_scroll is the
-         command window do nothing since the term should handle
-         it.  */
-      if (win_to_scroll == TUI_SRC_WIN)
-       tui_vertical_source_scroll (BACKWARD_SCROLL, _num_to_scroll);
-      else if (win_to_scroll == TUI_DISASM_WIN)
-       tui_vertical_disassem_scroll (BACKWARD_SCROLL, _num_to_scroll);
-      else if (win_to_scroll == TUI_DATA_WIN)
-       tui_vertical_data_scroll (BACKWARD_SCROLL, _num_to_scroll);
-    }
+  if (num_to_scroll == 0)
+    num_to_scroll = height - 3;
+
+  do_scroll_vertical (-num_to_scroll);
 }
 
 
 void
-tui_scroll_left (struct tui_win_info *win_to_scroll,
-                int num_to_scroll)
+tui_win_info::left_scroll (int num_to_scroll)
 {
-  if (win_to_scroll != TUI_CMD_WIN)
-    {
-      int _num_to_scroll = num_to_scroll;
-
-      if (_num_to_scroll == 0)
-       _num_to_scroll = 1;
-
-      /* If we are scrolling the source or disassembly window, do a
-         "psuedo" scroll since not all of the source is in memory,
-         only what is in the viewport. If win_to_scroll is the command
-         window do nothing since the term should handle it.  */
-      if (win_to_scroll == TUI_SRC_WIN
-         || win_to_scroll == TUI_DISASM_WIN)
-       tui_horizontal_source_scroll (win_to_scroll, LEFT_SCROLL,
-                                     _num_to_scroll);
-    }
+  if (num_to_scroll == 0)
+    num_to_scroll = 1;
+
+  do_scroll_horizontal (num_to_scroll);
 }
 
 
 void
-tui_scroll_right (struct tui_win_info *win_to_scroll, 
-                 int num_to_scroll)
+tui_win_info::right_scroll (int num_to_scroll)
 {
-  if (win_to_scroll != TUI_CMD_WIN)
-    {
-      int _num_to_scroll = num_to_scroll;
-
-      if (_num_to_scroll == 0)
-       _num_to_scroll = 1;
-
-      /* If we are scrolling the source or disassembly window, do a
-         "psuedo" scroll since not all of the source is in memory,
-         only what is in the viewport. If win_to_scroll is the command
-         window do nothing since the term should handle it.  */
-      if (win_to_scroll == TUI_SRC_WIN
-         || win_to_scroll == TUI_DISASM_WIN)
-       tui_horizontal_source_scroll (win_to_scroll, RIGHT_SCROLL,
-                                     _num_to_scroll);
-    }
+  if (num_to_scroll == 0)
+    num_to_scroll = 1;
+
+  do_scroll_horizontal (-num_to_scroll);
 }
 
 
-/* Scroll a window.  Arguments are passed through a va_list.  */
+/* See tui-data.h.  */
+
 void
-tui_scroll (enum tui_scroll_direction direction,
-           struct tui_win_info *win_to_scroll,
-           int num_to_scroll)
+tui_source_window_base::refresh_all ()
 {
-  switch (direction)
-    {
-    case FORWARD_SCROLL:
-      tui_scroll_forward (win_to_scroll, num_to_scroll);
-      break;
-    case BACKWARD_SCROLL:
-      tui_scroll_backward (win_to_scroll, num_to_scroll);
-      break;
-    case LEFT_SCROLL:
-      tui_scroll_left (win_to_scroll, num_to_scroll);
-      break;
-    case RIGHT_SCROLL:
-      tui_scroll_right (win_to_scroll, num_to_scroll);
-      break;
-    default:
-      break;
-    }
+  tui_show_source_content (this);
+  tui_check_and_display_highlight_if_needed (this);
+  tui_erase_exec_info_content (this);
+  tui_update_exec_info (this);
 }
 
-
 void
 tui_refresh_all_win (void)
 {
@@ -601,25 +524,8 @@ tui_refresh_all_win (void)
   tui_refresh_all (tui_win_list);
   for (type = SRC_WIN; type < MAX_MAJOR_WINDOWS; type++)
     {
-      if (tui_win_list[type] 
-         && tui_win_list[type]->generic.is_visible)
-       {
-         switch (type)
-           {
-           case SRC_WIN:
-           case DISASSEM_WIN:
-             tui_show_source_content (tui_win_list[type]);
-             tui_check_and_display_highlight_if_needed (tui_win_list[type]);
-             tui_erase_exec_info_content (tui_win_list[type]);
-             tui_update_exec_info (tui_win_list[type]);
-             break;
-           case DATA_WIN:
-             tui_refresh_data_win ();
-             break;
-           default:
-             break;
-           }
-       }
+      if (tui_win_list[type] && tui_win_list[type]->is_visible)
+       tui_win_list[type]->refresh_all ();
     }
   tui_show_locator_content ();
 }
@@ -650,7 +556,8 @@ tui_resize_all (void)
       struct tui_win_info *win_with_focus = tui_win_with_focus ();
       struct tui_win_info *first_win;
       struct tui_win_info *second_win;
-      struct tui_gen_win_info *locator = tui_locator_win_info_ptr ();
+      tui_source_window_base *src_win;
+      struct tui_locator_window *locator = tui_locator_win_info_ptr ();
       int win_type;
       int new_height, split_diff, cmd_split_diff, num_wins_displayed = 2;
 
@@ -659,7 +566,7 @@ tui_resize_all (void)
 #endif      
       /* Turn keypad off while we resize.  */
       if (win_with_focus != TUI_CMD_WIN)
-       keypad (TUI_CMD_WIN->generic.handle, FALSE);
+       keypad (TUI_CMD_WIN->handle, FALSE);
       tui_update_gdb_sizes ();
       tui_set_term_height_to (screenheight);
       tui_set_term_width_to (screenwidth);
@@ -686,58 +593,61 @@ tui_resize_all (void)
        {
        case SRC_COMMAND:
        case DISASSEM_COMMAND:
-         first_win = tui_source_windows ()->list[0];
-         first_win->generic.width += width_diff;
+         src_win = tui_source_windows ()[0];
+         first_win = src_win;
+         first_win->width += width_diff;
          locator->width += width_diff;
          /* Check for invalid heights.  */
          if (height_diff == 0)
-           new_height = first_win->generic.height;
-         else if ((first_win->generic.height + split_diff) >=
+           new_height = first_win->height;
+         else if ((first_win->height + split_diff) >=
                   (screenheight - MIN_CMD_WIN_HEIGHT - 1))
            new_height = screenheight - MIN_CMD_WIN_HEIGHT - 1;
-         else if ((first_win->generic.height + split_diff) <= 0)
+         else if ((first_win->height + split_diff) <= 0)
            new_height = MIN_WIN_HEIGHT;
          else
-           new_height = first_win->generic.height + split_diff;
+           new_height = first_win->height + split_diff;
 
          locator->origin.y = new_height + 1;
          make_invisible_and_set_new_height (first_win, new_height);
-         TUI_CMD_WIN->generic.origin.y = locator->origin.y + 1;
-         TUI_CMD_WIN->generic.width += width_diff;
-         new_height = screenheight - TUI_CMD_WIN->generic.origin.y;
+         TUI_CMD_WIN->origin.y = locator->origin.y + 1;
+         TUI_CMD_WIN->width += width_diff;
+         new_height = screenheight - TUI_CMD_WIN->origin.y;
          make_invisible_and_set_new_height (TUI_CMD_WIN, new_height);
-         make_visible_with_new_height (first_win);
-         make_visible_with_new_height (TUI_CMD_WIN);
-         if (first_win->generic.content_size <= 0)
-           tui_erase_source_content (first_win, EMPTY_SOURCE_PROMPT);
+         first_win->make_visible_with_new_height ();
+         TUI_CMD_WIN->make_visible_with_new_height ();
+         if (src_win->content_size <= 0)
+           tui_erase_source_content (src_win, EMPTY_SOURCE_PROMPT);
          break;
        default:
          if (cur_layout == SRC_DISASSEM_COMMAND)
            {
-             first_win = TUI_SRC_WIN;
-             first_win->generic.width += width_diff;
+             src_win = TUI_SRC_WIN;
+             first_win = src_win;
+             first_win->width += width_diff;
              second_win = TUI_DISASM_WIN;
-             second_win->generic.width += width_diff;
+             second_win->width += width_diff;
            }
          else
            {
              first_win = TUI_DATA_WIN;
-             first_win->generic.width += width_diff;
-             second_win = tui_source_windows ()->list[0];
-             second_win->generic.width += width_diff;
+             first_win->width += width_diff;
+             src_win = tui_source_windows ()[0];
+             second_win = src_win;
+             second_win->width += width_diff;
            }
          /* Change the first window's height/width.  */
          /* Check for invalid heights.  */
          if (height_diff == 0)
-           new_height = first_win->generic.height;
-         else if ((first_win->generic.height +
-                   second_win->generic.height + (split_diff * 2)) >=
+           new_height = first_win->height;
+         else if ((first_win->height +
+                   second_win->height + (split_diff * 2)) >=
                   (screenheight - MIN_CMD_WIN_HEIGHT - 1))
            new_height = (screenheight - MIN_CMD_WIN_HEIGHT - 1) / 2;
-         else if ((first_win->generic.height + split_diff) <= 0)
+         else if ((first_win->height + split_diff) <= 0)
            new_height = MIN_WIN_HEIGHT;
          else
-           new_height = first_win->generic.height + split_diff;
+           new_height = first_win->height + split_diff;
          make_invisible_and_set_new_height (first_win, new_height);
 
          locator->width += width_diff;
@@ -745,9 +655,9 @@ tui_resize_all (void)
          /* Change the second window's height/width.  */
          /* Check for invalid heights.  */
          if (height_diff == 0)
-           new_height = second_win->generic.height;
-         else if ((first_win->generic.height +
-                   second_win->generic.height + (split_diff * 2)) >=
+           new_height = second_win->height;
+         else if ((first_win->height +
+                   second_win->height + (split_diff * 2)) >=
                   (screenheight - MIN_CMD_WIN_HEIGHT - 1))
            {
              new_height = screenheight - MIN_CMD_WIN_HEIGHT - 1;
@@ -756,25 +666,23 @@ tui_resize_all (void)
              else
                new_height /= 2;
            }
-         else if ((second_win->generic.height + split_diff) <= 0)
+         else if ((second_win->height + split_diff) <= 0)
            new_height = MIN_WIN_HEIGHT;
          else
-           new_height = second_win->generic.height + split_diff;
-         second_win->generic.origin.y = first_win->generic.height - 1;
+           new_height = second_win->height + split_diff;
+         second_win->origin.y = first_win->height - 1;
          make_invisible_and_set_new_height (second_win, new_height);
 
          /* Change the command window's height/width.  */
-         TUI_CMD_WIN->generic.origin.y = locator->origin.y + 1;
+         TUI_CMD_WIN->origin.y = locator->origin.y + 1;
          make_invisible_and_set_new_height (TUI_CMD_WIN,
-                                            TUI_CMD_WIN->generic.height
+                                            TUI_CMD_WIN->height
                                             + cmd_split_diff);
-         make_visible_with_new_height (first_win);
-         make_visible_with_new_height (second_win);
-         make_visible_with_new_height (TUI_CMD_WIN);
-         if (first_win->generic.content_size <= 0)
-           tui_erase_source_content (first_win, EMPTY_SOURCE_PROMPT);
-         if (second_win->generic.content_size <= 0)
-           tui_erase_source_content (second_win, EMPTY_SOURCE_PROMPT);
+         first_win->make_visible_with_new_height ();
+         second_win->make_visible_with_new_height ();
+         TUI_CMD_WIN->make_visible_with_new_height ();
+         if (src_win->content_size <= 0)
+           tui_erase_source_content (src_win, EMPTY_SOURCE_PROMPT);
          break;
        }
       /* Now remove all invisible windows, and their content so that
@@ -783,16 +691,16 @@ tui_resize_all (void)
        {
          if (win_type != CMD_WIN 
              && (tui_win_list[win_type] != NULL)
-             && !tui_win_list[win_type]->generic.is_visible)
+             && !tui_win_list[win_type]->is_visible)
            {
-             tui_free_window (tui_win_list[win_type]);
+             delete tui_win_list[win_type];
              tui_win_list[win_type] = NULL;
            }
        }
       /* Turn keypad back on, unless focus is in the command
         window.  */
       if (win_with_focus != TUI_CMD_WIN)
-       keypad (TUI_CMD_WIN->generic.handle, TRUE);
+       keypad (TUI_CMD_WIN->handle, TRUE);
     }
 }
 
@@ -877,10 +785,10 @@ tui_scroll_forward_command (const char *arg, int from_tty)
   /* Make sure the curses mode is enabled.  */
   tui_enable ();
   if (arg == NULL)
-    parse_scrolling_args (arg, &win_to_scroll, (int *) NULL);
+    parse_scrolling_args (arg, &win_to_scroll, NULL);
   else
     parse_scrolling_args (arg, &win_to_scroll, &num_to_scroll);
-  tui_scroll (FORWARD_SCROLL, win_to_scroll, num_to_scroll);
+  win_to_scroll->forward_scroll (num_to_scroll);
 }
 
 
@@ -893,10 +801,10 @@ tui_scroll_backward_command (const char *arg, int from_tty)
   /* Make sure the curses mode is enabled.  */
   tui_enable ();
   if (arg == NULL)
-    parse_scrolling_args (arg, &win_to_scroll, (int *) NULL);
+    parse_scrolling_args (arg, &win_to_scroll, NULL);
   else
     parse_scrolling_args (arg, &win_to_scroll, &num_to_scroll);
-  tui_scroll (BACKWARD_SCROLL, win_to_scroll, num_to_scroll);
+  win_to_scroll->backward_scroll (num_to_scroll);
 }
 
 
@@ -909,7 +817,7 @@ tui_scroll_left_command (const char *arg, int from_tty)
   /* Make sure the curses mode is enabled.  */
   tui_enable ();
   parse_scrolling_args (arg, &win_to_scroll, &num_to_scroll);
-  tui_scroll (LEFT_SCROLL, win_to_scroll, num_to_scroll);
+  win_to_scroll->left_scroll (num_to_scroll);
 }
 
 
@@ -922,7 +830,7 @@ tui_scroll_right_command (const char *arg, int from_tty)
   /* Make sure the curses mode is enabled.  */
   tui_enable ();
   parse_scrolling_args (arg, &win_to_scroll, &num_to_scroll);
-  tui_scroll (RIGHT_SCROLL, win_to_scroll, num_to_scroll);
+  win_to_scroll->right_scroll (num_to_scroll);
 }
 
 
@@ -946,21 +854,20 @@ tui_set_focus (const char *arg, int from_tty)
       else
        win_info = tui_partial_win_by_name (buf_ptr);
 
-      if (win_info == (struct tui_win_info *) NULL
-         || !win_info->generic.is_visible)
+      if (win_info == NULL || !win_info->is_visible)
        warning (_("Invalid window specified. \n\
 The window name specified must be valid and visible.\n"));
       else
        {
          tui_set_win_focus_to (win_info);
-         keypad (TUI_CMD_WIN->generic.handle, (win_info != TUI_CMD_WIN));
+         keypad (TUI_CMD_WIN->handle, (win_info != TUI_CMD_WIN));
        }
 
-      if (TUI_DATA_WIN && TUI_DATA_WIN->generic.is_visible)
-       tui_refresh_data_win ();
+      if (TUI_DATA_WIN && TUI_DATA_WIN->is_visible)
+       TUI_DATA_WIN->refresh_all ();
       xfree (buf_ptr);
       printf_filtered (_("Focus set to %s window.\n"),
-                      tui_win_name (&tui_win_with_focus ()->generic));
+                      tui_win_with_focus ()->name ());
     }
   else
     warning (_("Incorrect Number of Arguments.\n%s"), FOCUS_USAGE);
@@ -983,16 +890,16 @@ tui_all_windows_info (const char *arg, int from_tty)
 
   for (type = SRC_WIN; (type < MAX_MAJOR_WINDOWS); type++)
     if (tui_win_list[type] 
-       && tui_win_list[type]->generic.is_visible)
+       && tui_win_list[type]->is_visible)
       {
        if (win_with_focus == tui_win_list[type])
          printf_filtered ("        %s\t(%d lines)  <has focus>\n",
-                          tui_win_name (&tui_win_list[type]->generic),
-                          tui_win_list[type]->generic.height);
+                          tui_win_list[type]->name (),
+                          tui_win_list[type]->height);
        else
          printf_filtered ("        %s\t(%d lines)\n",
-                          tui_win_name (&tui_win_list[type]->generic),
-                          tui_win_list[type]->generic.height);
+                          tui_win_list[type]->name (),
+                          tui_win_list[type]->height);
       }
 }
 
@@ -1014,29 +921,30 @@ unsigned int tui_tab_width = DEFAULT_TAB_LEN;
 
 static unsigned int internal_tab_width = DEFAULT_TAB_LEN;
 
-/* After the tab width is set, call this to update the relevant
-   windows.  */
+/* See tui-data.h.  */
 
-static void
-update_tab_width ()
+void
+tui_source_window_base::update_tab_width ()
 {
   /* We don't really change the height of any windows, but
      calling these 2 functions causes a complete regeneration
      and redisplay of the window's contents, which will take
      the new tab width into account.  */
-  if (tui_win_list[SRC_WIN]
-      && tui_win_list[SRC_WIN]->generic.is_visible)
-    {
-      make_invisible_and_set_new_height (TUI_SRC_WIN,
-                                        TUI_SRC_WIN->generic.height);
-      make_visible_with_new_height (TUI_SRC_WIN);
-    }
-  if (tui_win_list[DISASSEM_WIN]
-      && tui_win_list[DISASSEM_WIN]->generic.is_visible)
+  make_invisible_and_set_new_height (this, height);
+  make_visible_with_new_height ();
+}
+
+/* After the tab width is set, call this to update the relevant
+   windows.  */
+
+static void
+update_tab_width ()
+{
+  for (int win_type = SRC_WIN; win_type < MAX_MAJOR_WINDOWS; win_type++)
     {
-      make_invisible_and_set_new_height (TUI_DISASM_WIN,
-                                        TUI_DISASM_WIN->generic.height);
-      make_visible_with_new_height (TUI_DISASM_WIN);
+      if (tui_win_list[win_type] != NULL
+         && tui_win_list[win_type]->is_visible)
+       tui_win_list[win_type]->update_tab_width ();
     }
 }
 
@@ -1116,8 +1024,7 @@ tui_set_win_height (const char *arg, int from_tty)
            wname[i] = tolower (wname[i]);
          win_info = tui_partial_win_by_name (wname);
 
-         if (win_info == (struct tui_win_info *) NULL
-             || !win_info->generic.is_visible)
+         if (win_info == NULL || !win_info->is_visible)
            warning (_("Invalid window specified. \n\
 The window name specified must be valid and visible.\n"));
          else
@@ -1147,7 +1054,7 @@ The window name specified must be valid and visible.\n"));
                      if (fixed_size)
                        new_height = input_no;
                      else
-                       new_height = win_info->generic.height + input_no;
+                       new_height = win_info->height + input_no;
 
                      /* Now change the window's height, and adjust
                         all other windows around it.  */
@@ -1190,23 +1097,23 @@ tui_adjust_win_heights (struct tui_win_info *primary_win_info,
   if (new_height_ok (primary_win_info, new_height))
     {
       status = TUI_SUCCESS;
-      if (new_height != primary_win_info->generic.height)
+      if (new_height != primary_win_info->height)
        {
          int diff;
          struct tui_win_info *win_info;
-         struct tui_gen_win_info *locator = tui_locator_win_info_ptr ();
+         struct tui_locator_window *locator = tui_locator_win_info_ptr ();
          enum tui_layout_type cur_layout = tui_current_layout ();
 
-         diff = (new_height - primary_win_info->generic.height) * (-1);
+         diff = (new_height - primary_win_info->height) * (-1);
          if (cur_layout == SRC_COMMAND 
              || cur_layout == DISASSEM_COMMAND)
            {
              struct tui_win_info *src_win_info;
 
              make_invisible_and_set_new_height (primary_win_info, new_height);
-             if (primary_win_info->generic.type == CMD_WIN)
+             if (primary_win_info->type == CMD_WIN)
                {
-                 win_info = (tui_source_windows ())->list[0];
+                 win_info = tui_source_windows ()[0];
                  src_win_info = win_info;
                }
              else
@@ -1215,27 +1122,34 @@ tui_adjust_win_heights (struct tui_win_info *primary_win_info,
                  src_win_info = primary_win_info;
                }
              make_invisible_and_set_new_height (win_info,
-                                            win_info->generic.height + diff);
-             TUI_CMD_WIN->generic.origin.y = locator->origin.y + 1;
-             make_visible_with_new_height (win_info);
-             make_visible_with_new_height (primary_win_info);
-             if (src_win_info->generic.content_size <= 0)
-               tui_erase_source_content (src_win_info, EMPTY_SOURCE_PROMPT);
+                                            win_info->height + diff);
+             TUI_CMD_WIN->origin.y = locator->origin.y + 1;
+             win_info->make_visible_with_new_height ();
+             primary_win_info->make_visible_with_new_height ();
+             if ((src_win_info->type == SRC_WIN
+                  || src_win_info->type == DISASSEM_WIN)
+                 && src_win_info->content_size <= 0)
+               tui_erase_source_content
+                 ((tui_source_window_base *) src_win_info,
+                  EMPTY_SOURCE_PROMPT);
            }
          else
            {
              struct tui_win_info *first_win;
-             struct tui_win_info *second_win;
+             struct tui_source_window_base *second_win;
+             tui_source_window_base *src1;
 
              if (cur_layout == SRC_DISASSEM_COMMAND)
                {
-                 first_win = TUI_SRC_WIN;
+                 src1 = TUI_SRC_WIN;
+                 first_win = src1;
                  second_win = TUI_DISASM_WIN;
                }
              else
                {
+                 src1 = nullptr;
                  first_win = TUI_DATA_WIN;
-                 second_win = (tui_source_windows ())->list[0];
+                 second_win = tui_source_windows ()[0];
                }
              if (primary_win_info == TUI_CMD_WIN)
                { /* Split the change in height accross the 1st & 2nd
@@ -1246,8 +1160,8 @@ tui_adjust_win_heights (struct tui_win_info *primary_win_info,
 
                  if (diff % 2)
                    {
-                     if (first_win->generic.height >
-                         second_win->generic.height)
+                     if (first_win->height >
+                         second_win->height)
                        if (diff < 0)
                          first_split_diff--;
                        else
@@ -1262,42 +1176,42 @@ tui_adjust_win_heights (struct tui_win_info *primary_win_info,
                    }
                  /* Make sure that the minimum hieghts are
                     honored.  */
-                 while ((first_win->generic.height + first_split_diff) < 3)
+                 while ((first_win->height + first_split_diff) < 3)
                    {
                      first_split_diff++;
                      second_split_diff--;
                    }
-                 while ((second_win->generic.height + second_split_diff) < 3)
+                 while ((second_win->height + second_split_diff) < 3)
                    {
                      second_split_diff++;
                      first_split_diff--;
                    }
                  make_invisible_and_set_new_height (
                                                  first_win,
-                                first_win->generic.height + first_split_diff);
-                 second_win->generic.origin.y = first_win->generic.height - 1;
+                                first_win->height + first_split_diff);
+                 second_win->origin.y = first_win->height - 1;
                  make_invisible_and_set_new_height (second_win,
-                                                    second_win->generic.height
+                                                    second_win->height
                                                     + second_split_diff);
-                 TUI_CMD_WIN->generic.origin.y = locator->origin.y + 1;
+                 TUI_CMD_WIN->origin.y = locator->origin.y + 1;
                  make_invisible_and_set_new_height (TUI_CMD_WIN, new_height);
                }
              else
                {
-                 if ((TUI_CMD_WIN->generic.height + diff) < 1)
+                 if ((TUI_CMD_WIN->height + diff) < 1)
                    { /* If there is no way to increase the command
                         window take real estate from the 1st or 2nd
                         window.  */
-                     if ((TUI_CMD_WIN->generic.height + diff) < 1)
+                     if ((TUI_CMD_WIN->height + diff) < 1)
                        {
                          int i;
 
-                         for (i = TUI_CMD_WIN->generic.height + diff;
+                         for (i = TUI_CMD_WIN->height + diff;
                               (i < 1); i++)
                            if (primary_win_info == first_win)
-                             second_win->generic.height--;
+                             second_win->height--;
                            else
-                             first_win->generic.height--;
+                             first_win->height--;
                        }
                    }
                  if (primary_win_info == first_win)
@@ -1305,26 +1219,26 @@ tui_adjust_win_heights (struct tui_win_info *primary_win_info,
                  else
                    make_invisible_and_set_new_height (
                                                    first_win,
-                                                 first_win->generic.height);
-                 second_win->generic.origin.y = first_win->generic.height - 1;
+                                                 first_win->height);
+                 second_win->origin.y = first_win->height - 1;
                  if (primary_win_info == second_win)
                    make_invisible_and_set_new_height (second_win, new_height);
                  else
                    make_invisible_and_set_new_height (
-                                     second_win, second_win->generic.height);
-                 TUI_CMD_WIN->generic.origin.y = locator->origin.y + 1;
-                 if ((TUI_CMD_WIN->generic.height + diff) < 1)
+                                     second_win, second_win->height);
+                 TUI_CMD_WIN->origin.y = locator->origin.y + 1;
+                 if ((TUI_CMD_WIN->height + diff) < 1)
                    make_invisible_and_set_new_height (TUI_CMD_WIN, 1);
                  else
                    make_invisible_and_set_new_height (TUI_CMD_WIN,
-                                                      TUI_CMD_WIN->generic.height + diff);
+                                                      TUI_CMD_WIN->height + diff);
                }
-             make_visible_with_new_height (TUI_CMD_WIN);
-             make_visible_with_new_height (second_win);
-             make_visible_with_new_height (first_win);
-             if (first_win->generic.content_size <= 0)
-               tui_erase_source_content (first_win, EMPTY_SOURCE_PROMPT);
-             if (second_win->generic.content_size <= 0)
+             TUI_CMD_WIN->make_visible_with_new_height ();
+             second_win->make_visible_with_new_height ();
+             first_win->make_visible_with_new_height ();
+             if (src1 != nullptr && src1->content_size <= 0)
+               tui_erase_source_content (src1, EMPTY_SOURCE_PROMPT);
+             if (second_win->content_size <= 0)
                tui_erase_source_content (second_win, EMPTY_SOURCE_PROMPT);
            }
        }
@@ -1334,138 +1248,153 @@ tui_adjust_win_heights (struct tui_win_info *primary_win_info,
 }
 
 
-/* Function make the target window (and auxillary windows associated
+/* See tui-data.h.  */
+
+void
+tui_source_window_base::set_new_height (int height)
+{
+  tui_make_invisible (execution_info);
+  execution_info->height = height;
+  execution_info->origin.y = origin.y;
+  if (height > 1)
+    execution_info->viewport_height = height - 1;
+  else
+    execution_info->viewport_height = height;
+  execution_info->viewport_height--;
+
+  if (has_locator ())
+    {
+      tui_locator_window *gen_win_info = tui_locator_win_info_ptr ();
+      tui_make_invisible (gen_win_info);
+      gen_win_info->origin.y = origin.y + height;
+    }
+}
+
+/* See tui-data.h.  */
+
+void
+tui_data_window::set_new_height (int height)
+{
+  /* Delete all data item windows.  */
+  for (auto &&win : regs_content)
+    {
+      tui_delete_win (win->handle);
+      win->handle = NULL;
+    }
+}
+
+/* Function make the target window (and auxiliary windows associated
    with the targer) invisible, and set the new height and
    location.  */
 static void
 make_invisible_and_set_new_height (struct tui_win_info *win_info, 
                                   int height)
 {
-  int i;
-  struct tui_gen_win_info *gen_win_info;
-
-  tui_make_invisible (&win_info->generic);
-  win_info->generic.height = height;
+  tui_make_invisible (win_info);
+  win_info->height = height;
   if (height > 1)
-    win_info->generic.viewport_height = height - 1;
+    win_info->viewport_height = height - 1;
   else
-    win_info->generic.viewport_height = height;
+    win_info->viewport_height = height;
   if (win_info != TUI_CMD_WIN)
-    win_info->generic.viewport_height--;
+    win_info->viewport_height--;
 
-  /* Now deal with the auxillary windows associated with win_info.  */
-  switch (win_info->generic.type)
-    {
-    case SRC_WIN:
-    case DISASSEM_WIN:
-      gen_win_info = win_info->detail.source_info.execution_info;
-      tui_make_invisible (gen_win_info);
-      gen_win_info->height = height;
-      gen_win_info->origin.y = win_info->generic.origin.y;
-      if (height > 1)
-       gen_win_info->viewport_height = height - 1;
-      else
-       gen_win_info->viewport_height = height;
-      if (win_info != TUI_CMD_WIN)
-       gen_win_info->viewport_height--;
+  /* Now deal with the auxiliary windows associated with win_info.  */
+  win_info->set_new_height (height);
+}
+
+
+/* See tui-data.h.  */
+
+void
+tui_win_info::make_visible_with_new_height ()
+{
+  make_visible (true);
+  tui_check_and_display_highlight_if_needed (this);
+  do_make_visible_with_new_height ();
+}
+
+/* See tui-data.h.  */
 
-      if (tui_win_has_locator (win_info))
+void
+tui_source_window_base::do_make_visible_with_new_height ()
+{
+  tui_free_win_content (execution_info);
+  tui_make_visible (execution_info);
+  if (content != NULL)
+    {
+      struct tui_line_or_address line_or_addr;
+      struct symtab_and_line cursal
+       = get_current_source_symtab_and_line ();
+
+      line_or_addr = start_line_or_addr;
+      tui_free_win_content (this);
+      tui_update_source_window (this, gdbarch,
+                               cursal.symtab, line_or_addr, TRUE);
+    }
+  else if (deprecated_safe_get_selected_frame () != NULL)
+    {
+      struct tui_line_or_address line;
+      struct symtab_and_line cursal
+       = get_current_source_symtab_and_line ();
+      struct frame_info *frame = deprecated_safe_get_selected_frame ();
+      struct gdbarch *gdbarch = get_frame_arch (frame);
+
+      struct symtab *s = find_pc_line_symtab (get_frame_pc (frame));
+      if (type == SRC_WIN)
        {
-         gen_win_info = tui_locator_win_info_ptr ();
-         tui_make_invisible (gen_win_info);
-         gen_win_info->origin.y = win_info->generic.origin.y + height;
+         line.loa = LOA_LINE;
+         line.u.line_no = cursal.line;
        }
-      break;
-    case DATA_WIN:
-      /* Delete all data item windows.  */
-      for (i = 0; i < win_info->generic.content_size; i++)
+      else
        {
-         gen_win_info
-           = &win_info->generic.content[i]->which_element.data_window;
-         tui_delete_win (gen_win_info->handle);
-         gen_win_info->handle = NULL;
+         line.loa = LOA_ADDRESS;
+         find_line_pc (s, cursal.line, &line.u.addr);
        }
-      break;
-    default:
-      break;
+      tui_update_source_window (this, gdbarch, s, line, TRUE);
+    }
+  if (has_locator ())
+    {
+      tui_make_visible (tui_locator_win_info_ptr ());
+      tui_show_locator_content ();
     }
 }
 
+/* See tui-data.h.  */
 
-/* Function to make the windows with new heights visible.  This means
-   re-creating the windows' content since the window had to be
-   destroyed to be made invisible.  */
-static void
-make_visible_with_new_height (struct tui_win_info *win_info)
+void
+tui_data_window::do_make_visible_with_new_height ()
 {
-  struct symtab *s;
+  tui_display_all_data ();
+}
 
-  tui_make_visible (&win_info->generic);
-  tui_check_and_display_highlight_if_needed (win_info);
-  switch (win_info->generic.type)
-    {
-    case SRC_WIN:
-    case DISASSEM_WIN:
-      tui_free_win_content (win_info->detail.source_info.execution_info);
-      tui_make_visible (win_info->detail.source_info.execution_info);
-      if (win_info->generic.content != NULL)
-       {
-         struct gdbarch *gdbarch = win_info->detail.source_info.gdbarch;
-         struct tui_line_or_address line_or_addr;
-         struct symtab_and_line cursal
-           = get_current_source_symtab_and_line ();
-
-         line_or_addr = win_info->detail.source_info.start_line_or_addr;
-         tui_free_win_content (&win_info->generic);
-         tui_update_source_window (win_info, gdbarch,
-                                   cursal.symtab, line_or_addr, TRUE);
-       }
-      else if (deprecated_safe_get_selected_frame () != NULL)
-       {
-         struct tui_line_or_address line;
-         struct symtab_and_line cursal
-           = get_current_source_symtab_and_line ();
-         struct frame_info *frame = deprecated_safe_get_selected_frame ();
-         struct gdbarch *gdbarch = get_frame_arch (frame);
-
-         s = find_pc_line_symtab (get_frame_pc (frame));
-         if (win_info->generic.type == SRC_WIN)
-           {
-             line.loa = LOA_LINE;
-             line.u.line_no = cursal.line;
-           }
-         else
-           {
-             line.loa = LOA_ADDRESS;
-             find_line_pc (s, cursal.line, &line.u.addr);
-           }
-         tui_update_source_window (win_info, gdbarch, s, line, TRUE);
-       }
-      if (tui_win_has_locator (win_info))
-       {
-         tui_make_visible (tui_locator_win_info_ptr ());
-         tui_show_locator_content ();
-       }
-      break;
-    case DATA_WIN:
-      tui_display_all_data ();
-      break;
-    case CMD_WIN:
+/* See tui-data.h.  */
+
+void
+tui_cmd_window::do_make_visible_with_new_height ()
+{
 #ifdef HAVE_WRESIZE
-      wresize (TUI_CMD_WIN->generic.handle,
-              TUI_CMD_WIN->generic.height,
-              TUI_CMD_WIN->generic.width);
+  wresize (handle, height, width);
 #endif
-      mvwin (TUI_CMD_WIN->generic.handle,
-            TUI_CMD_WIN->generic.origin.y,
-            TUI_CMD_WIN->generic.origin.x);
-      wmove (win_info->generic.handle, 0, 0);
-      break;
-    default:
-      break;
-    }
+  mvwin (handle, origin.y, origin.x);
+  wmove (handle, 0, 0);
+}
+
+/* See tui-data.h.  */
+
+int
+tui_win_info::max_height () const
+{
+  return tui_term_height () - 2;
 }
 
+/* See tui-data.h.  */
+
+int
+tui_cmd_window::max_height () const
+{
+  return tui_term_height () - 4;
+}
 
 static int
 new_height_ok (struct tui_win_info *primary_win_info, 
@@ -1478,25 +1407,21 @@ new_height_ok (struct tui_win_info *primary_win_info,
       int diff;
       enum tui_layout_type cur_layout = tui_current_layout ();
 
-      diff = (new_height - primary_win_info->generic.height) * (-1);
+      diff = (new_height - primary_win_info->height) * (-1);
       if (cur_layout == SRC_COMMAND || cur_layout == DISASSEM_COMMAND)
        {
-         ok = ((primary_win_info->generic.type == CMD_WIN 
-                && new_height <= (tui_term_height () - 4) 
-                && new_height >= MIN_CMD_WIN_HEIGHT) 
-               || (primary_win_info->generic.type != CMD_WIN 
-                   && new_height <= (tui_term_height () - 2) 
-                   && new_height >= MIN_WIN_HEIGHT));
+         ok = (new_height <= primary_win_info->max_height ()
+               && new_height >= MIN_CMD_WIN_HEIGHT);
          if (ok)
            {                   /* Check the total height.  */
              struct tui_win_info *win_info;
 
              if (primary_win_info == TUI_CMD_WIN)
-               win_info = (tui_source_windows ())->list[0];
+               win_info = tui_source_windows ()[0];
              else
                win_info = TUI_CMD_WIN;
              ok = ((new_height +
-                    (win_info->generic.height + diff)) <= tui_term_height ());
+                    (win_info->height + diff)) <= tui_term_height ());
            }
        }
       else
@@ -1513,27 +1438,27 @@ new_height_ok (struct tui_win_info *primary_win_info,
          else
            {
              first_win = TUI_DATA_WIN;
-             second_win = (tui_source_windows ())->list[0];
+             second_win = tui_source_windows ()[0];
            }
          /* We could simply add all the heights to obtain the same
             result but below is more explicit since we subtract 1 for
             the line that the first and second windows share, and add
             one for the locator.  */
          total_height = cur_total_height =
-           (first_win->generic.height + second_win->generic.height - 1)
-           + TUI_CMD_WIN->generic.height + 1;  /* Locator. */
+           (first_win->height + second_win->height - 1)
+           + TUI_CMD_WIN->height + 1;  /* Locator. */
          if (primary_win_info == TUI_CMD_WIN)
            {
              /* Locator included since first & second win share a line.  */
-             ok = ((first_win->generic.height +
-                    second_win->generic.height + diff) >=
+             ok = ((first_win->height +
+                    second_win->height + diff) >=
                    (MIN_WIN_HEIGHT * 2) 
                    && new_height >= MIN_CMD_WIN_HEIGHT);
              if (ok)
                {
                  total_height = new_height + 
-                   (first_win->generic.height +
-                    second_win->generic.height + diff);
+                   (first_win->height +
+                    second_win->height + diff);
                  min_height = MIN_CMD_WIN_HEIGHT;
                }
            }
@@ -1544,25 +1469,25 @@ new_height_ok (struct tui_win_info *primary_win_info,
              /* First see if we can increase/decrease the command
                 window.  And make sure that the command window is at
                 least 1 line.  */
-             ok = ((TUI_CMD_WIN->generic.height + diff) > 0);
+             ok = ((TUI_CMD_WIN->height + diff) > 0);
              if (!ok)
                { /* Looks like we have to increase/decrease one of
                     the other windows.  */
                  if (primary_win_info == first_win)
-                   ok = (second_win->generic.height + diff) >= min_height;
+                   ok = (second_win->height + diff) >= min_height;
                  else
-                   ok = (first_win->generic.height + diff) >= min_height;
+                   ok = (first_win->height + diff) >= min_height;
                }
              if (ok)
                {
                  if (primary_win_info == first_win)
                    total_height = new_height +
-                     second_win->generic.height +
-                     TUI_CMD_WIN->generic.height + diff;
+                     second_win->height +
+                     TUI_CMD_WIN->height + diff;
                  else
                    total_height = new_height +
-                     first_win->generic.height +
-                     TUI_CMD_WIN->generic.height + diff;
+                     first_win->height +
+                     TUI_CMD_WIN->height + diff;
                }
            }
          /* Now make sure that the proposed total height doesn't
@@ -1634,12 +1559,12 @@ parse_scrolling_args (const char *arg,
          
          *win_to_scroll = tui_partial_win_by_name (wname);
 
-         if (*win_to_scroll == (struct tui_win_info *) NULL
-             || !(*win_to_scroll)->generic.is_visible)
+         if (*win_to_scroll == NULL
+             || !(*win_to_scroll)->is_visible)
            error (_("Invalid window specified. \n\
 The window name specified must be valid and visible.\n"));
          else if (*win_to_scroll == TUI_CMD_WIN)
-           *win_to_scroll = (tui_source_windows ())->list[0];
+           *win_to_scroll = tui_source_windows ()[0];
        }
     }
 }
@@ -1666,47 +1591,47 @@ _initialize_tui_win (void)
                  0 /* allow-unknown */, &showlist);
 
   add_com ("refresh", class_tui, tui_refresh_all_command,
-           _("Refresh the terminal display.\n"));
+           _("Refresh the terminal display."));
 
   cmd = add_com ("tabset", class_tui, tui_set_tab_width_command, _("\
 Set the width (in characters) of tab stops.\n\
-Usage: tabset N\n"));
+Usage: tabset N"));
   deprecate_cmd (cmd, "set tui tab-width");
 
   cmd = add_com ("winheight", class_tui, tui_set_win_height_command, _("\
 Set or modify the height of a specified window.\n"
 WIN_HEIGHT_USAGE
 "Window names are:\n\
-src  : the source window\n\
-cmd  : the command window\n\
-asm  : the disassembly window\n\
-regs : the register display\n"));
+   src  : the source window\n\
+   cmd  : the command window\n\
+   asm  : the disassembly window\n\
+   regs : the register display"));
   add_com_alias ("wh", "winheight", class_tui, 0);
   set_cmd_completer (cmd, winheight_completer);
   add_info ("win", tui_all_windows_info,
-           _("List of all displayed windows.\n"));
+           _("List of all displayed windows."));
   cmd = add_com ("focus", class_tui, tui_set_focus_command, _("\
 Set focus to named window or next/prev window.\n"
 FOCUS_USAGE
 "Valid Window names are:\n\
-src  : the source window\n\
-asm  : the disassembly window\n\
-regs : the register display\n\
-cmd  : the command window\n"));
+   src  : the source window\n\
+   asm  : the disassembly window\n\
+   regs : the register display\n\
+   cmd  : the command window"));
   add_com_alias ("fs", "focus", class_tui, 0);
   set_cmd_completer (cmd, focus_completer);
   add_com ("+", class_tui, tui_scroll_forward_command, _("\
 Scroll window forward.\n\
-Usage: + [WIN] [N]\n"));
+Usage: + [WIN] [N]"));
   add_com ("-", class_tui, tui_scroll_backward_command, _("\
 Scroll window backward.\n\
-Usage: - [WIN] [N]\n"));
+Usage: - [WIN] [N]"));
   add_com ("<", class_tui, tui_scroll_left_command, _("\
 Scroll window text to the left.\n\
-Usage: < [WIN] [N]\n"));
+Usage: < [WIN] [N]"));
   add_com (">", class_tui, tui_scroll_right_command, _("\
 Scroll window text to the right.\n\
-Usage: > [WIN] [N]\n"));
+Usage: > [WIN] [N]"));
 
   /* Define the tui control variables.  */
   add_setshow_enum_cmd ("border-kind", no_class, tui_border_kind_enums,
@@ -1714,9 +1639,9 @@ Usage: > [WIN] [N]\n"));
 Set the kind of border for TUI windows."), _("\
 Show the kind of border for TUI windows."), _("\
 This variable controls the border of TUI windows:\n\
-space           use a white space\n\
-ascii           use ascii characters + - | for the border\n\
-acs             use the Alternate Character Set"),
+   space           use a white space\n\
+   ascii           use ascii characters + - | for the border\n\
+   acs             use the Alternate Character Set"),
                        tui_set_var_cmd,
                        show_tui_border_kind,
                        &tui_setlist, &tui_showlist);
@@ -1726,13 +1651,13 @@ acs             use the Alternate Character Set"),
 Set the attribute mode to use for the TUI window borders."), _("\
 Show the attribute mode to use for the TUI window borders."), _("\
 This variable controls the attributes to use for the window borders:\n\
-normal          normal display\n\
-standout        use highlight mode of terminal\n\
-reverse         use reverse video mode\n\
-half            use half bright\n\
-half-standout   use half bright and standout mode\n\
-bold            use extra bright or bold\n\
-bold-standout   use extra bright or bold with standout mode"),
+   normal          normal display\n\
+   standout        use highlight mode of terminal\n\
+   reverse         use reverse video mode\n\
+   half            use half bright\n\
+   half-standout   use half bright and standout mode\n\
+   bold            use extra bright or bold\n\
+   bold-standout   use extra bright or bold with standout mode"),
                        tui_set_var_cmd,
                        show_tui_border_mode,
                        &tui_setlist, &tui_showlist);
@@ -1742,13 +1667,13 @@ bold-standout   use extra bright or bold with standout mode"),
 Set the attribute mode to use for the active TUI window border."), _("\
 Show the attribute mode to use for the active TUI window border."), _("\
 This variable controls the attributes to use for the active window border:\n\
-normal          normal display\n\
-standout        use highlight mode of terminal\n\
-reverse         use reverse video mode\n\
-half            use half bright\n\
-half-standout   use half bright and standout mode\n\
-bold            use extra bright or bold\n\
-bold-standout   use extra bright or bold with standout mode"),
+   normal          normal display\n\
+   standout        use highlight mode of terminal\n\
+   reverse         use reverse video mode\n\
+   half            use half bright\n\
+   half-standout   use half bright and standout mode\n\
+   bold            use extra bright or bold\n\
+   bold-standout   use extra bright or bold with standout mode"),
                        tui_set_var_cmd,
                        show_tui_active_border_mode,
                        &tui_setlist, &tui_showlist);
This page took 0.041165 seconds and 4 git commands to generate.