More type safety for TUI source window functions
[deliverable/binutils-gdb.git] / gdb / tui / tui-win.c
index 9c4f9ad57790a9db80651b95b8751724274e6423..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,12 +458,9 @@ 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);
     }
 }
 
@@ -473,18 +469,18 @@ void
 tui_win_info::forward_scroll (int num_to_scroll)
 {
   if (num_to_scroll == 0)
-    num_to_scroll = generic.height - 3;
+    num_to_scroll = height - 3;
 
-  do_scroll_vertical (FORWARD_SCROLL, num_to_scroll);
+  do_scroll_vertical (num_to_scroll);
 }
 
 void
 tui_win_info::backward_scroll (int num_to_scroll)
 {
   if (num_to_scroll == 0)
-    num_to_scroll = generic.height - 3;
+    num_to_scroll = height - 3;
 
-  do_scroll_vertical (BACKWARD_SCROLL, num_to_scroll);
+  do_scroll_vertical (-num_to_scroll);
 }
 
 
@@ -494,7 +490,7 @@ tui_win_info::left_scroll (int num_to_scroll)
   if (num_to_scroll == 0)
     num_to_scroll = 1;
 
-  do_scroll_horizontal (LEFT_SCROLL, num_to_scroll);
+  do_scroll_horizontal (num_to_scroll);
 }
 
 
@@ -504,10 +500,21 @@ tui_win_info::right_scroll (int num_to_scroll)
   if (num_to_scroll == 0)
     num_to_scroll = 1;
 
-  do_scroll_horizontal (RIGHT_SCROLL, num_to_scroll);
+  do_scroll_horizontal (-num_to_scroll);
 }
 
 
+/* See tui-data.h.  */
+
+void
+tui_source_window_base::refresh_all ()
+{
+  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)
 {
@@ -517,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 ();
 }
@@ -566,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;
 
@@ -575,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);
@@ -602,58 +593,61 @@ tui_resize_all (void)
        {
        case SRC_COMMAND:
        case DISASSEM_COMMAND:
-         first_win = tui_source_windows ()[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 ()[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;
@@ -661,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;
@@ -672,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
@@ -699,7 +691,7 @@ 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)
            {
              delete tui_win_list[win_type];
              tui_win_list[win_type] = NULL;
@@ -708,7 +700,7 @@ tui_resize_all (void)
       /* 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);
     }
 }
 
@@ -862,20 +854,20 @@ tui_set_focus (const char *arg, int from_tty)
       else
        win_info = tui_partial_win_by_name (buf_ptr);
 
-      if (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);
@@ -898,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);
       }
 }
 
@@ -929,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 ();
     }
 }
 
@@ -1031,7 +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 == 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
@@ -1061,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.  */
@@ -1104,21 +1097,21 @@ 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 ()[0];
                  src_win_info = win_info;
@@ -1129,25 +1122,32 @@ 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 ()[0];
                }
@@ -1160,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
@@ -1176,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)
@@ -1219,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);
            }
        }
@@ -1248,142 +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.  */
-  tui_source_window_base *base;
-  switch (win_info->generic.type)
-    {
-    case SRC_WIN:
-    case DISASSEM_WIN:
-      base = (tui_source_window_base *) win_info;
-      gen_win_info = base->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 ();
+}
 
-      if (win_info->has_locator ())
+/* See tui-data.h.  */
+
+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);
-  tui_source_window_base *base;
-  switch (win_info->generic.type)
-    {
-    case SRC_WIN:
-    case DISASSEM_WIN:
-      base = (tui_source_window_base *) win_info;
-      tui_free_win_content (base->execution_info);
-      tui_make_visible (base->execution_info);
-      if (win_info->generic.content != NULL)
-       {
-         struct gdbarch *gdbarch = base->gdbarch;
-         struct tui_line_or_address line_or_addr;
-         struct symtab_and_line cursal
-           = get_current_source_symtab_and_line ();
-
-         line_or_addr = base->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 (win_info->has_locator ())
-       {
-         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, 
@@ -1396,15 +1407,11 @@ 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;
@@ -1414,7 +1421,7 @@ new_height_ok (struct tui_win_info *primary_win_info,
              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
@@ -1438,20 +1445,20 @@ new_height_ok (struct tui_win_info *primary_win_info,
             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;
                }
            }
@@ -1462,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
@@ -1553,7 +1560,7 @@ parse_scrolling_args (const char *arg,
          *win_to_scroll = tui_partial_win_by_name (wname);
 
          if (*win_to_scroll == NULL
-             || !(*win_to_scroll)->generic.is_visible)
+             || !(*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)
This page took 0.040104 seconds and 4 git commands to generate.