More type safety for TUI source window functions
[deliverable/binutils-gdb.git] / gdb / tui / tui-win.c
index 22938b41f24f8fabf57bed4c28cac68e4cd29b16..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 *, 
@@ -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->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->type != CMD_WIN)
-       tui_highlight_win (win_info);
+      tui_highlight_win (win_info);
     }
 }
 
@@ -560,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;
 
@@ -596,7 +593,8 @@ tui_resize_all (void)
        {
        case SRC_COMMAND:
        case DISASSEM_COMMAND:
-         first_win = tui_source_windows ()[0];
+         src_win = tui_source_windows ()[0];
+         first_win = src_win;
          first_win->width += width_diff;
          locator->width += width_diff;
          /* Check for invalid heights.  */
@@ -616,15 +614,16 @@ tui_resize_all (void)
          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->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;
+             src_win = TUI_SRC_WIN;
+             first_win = src_win;
              first_win->width += width_diff;
              second_win = TUI_DISASM_WIN;
              second_win->width += width_diff;
@@ -633,7 +632,8 @@ tui_resize_all (void)
            {
              first_win = TUI_DATA_WIN;
              first_win->width += width_diff;
-             second_win = tui_source_windows ()[0];
+             src_win = tui_source_windows ()[0];
+             second_win = src_win;
              second_win->width += width_diff;
            }
          /* Change the first window's height/width.  */
@@ -678,13 +678,11 @@ tui_resize_all (void)
          make_invisible_and_set_new_height (TUI_CMD_WIN,
                                             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->content_size <= 0)
-           tui_erase_source_content (first_win, EMPTY_SOURCE_PROMPT);
-         if (second_win->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
@@ -923,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]->is_visible)
-    {
-      make_invisible_and_set_new_height (TUI_SRC_WIN,
-                                        TUI_SRC_WIN->height);
-      make_visible_with_new_height (TUI_SRC_WIN);
-    }
-  if (tui_win_list[DISASSEM_WIN]
-      && tui_win_list[DISASSEM_WIN]->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->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 ();
     }
 }
 
@@ -1102,7 +1101,7 @@ tui_adjust_win_heights (struct tui_win_info *primary_win_info,
        {
          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->height) * (-1);
@@ -1125,23 +1124,30 @@ tui_adjust_win_heights (struct tui_win_info *primary_win_info,
              make_invisible_and_set_new_height (win_info,
                                             win_info->height + diff);
              TUI_CMD_WIN->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->content_size <= 0)
-               tui_erase_source_content (src_win_info, EMPTY_SOURCE_PROMPT);
+             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];
                }
@@ -1227,11 +1233,11 @@ tui_adjust_win_heights (struct tui_win_info *primary_win_info,
                    make_invisible_and_set_new_height (TUI_CMD_WIN,
                                                       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->content_size <= 0)
-               tui_erase_source_content (first_win, EMPTY_SOURCE_PROMPT);
+             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);
            }
@@ -1258,7 +1264,7 @@ tui_source_window_base::set_new_height (int height)
 
   if (has_locator ())
     {
-      tui_gen_win_info *gen_win_info = tui_locator_win_info_ptr ();
+      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;
     }
@@ -1270,16 +1276,14 @@ void
 tui_data_window::set_new_height (int height)
 {
   /* Delete all data item windows.  */
-  for (int i = 0; i < content_size; i++)
+  for (auto &&win : regs_content)
     {
-      struct tui_gen_win_info *gen_win_info
-       = content[i]->which_element.data_window;
-      tui_delete_win (gen_win_info->handle);
-      gen_win_info->handle = NULL;
+      tui_delete_win (win->handle);
+      win->handle = NULL;
     }
 }
 
-/* Function make the target window (and auxillary windows associated
+/* Function make the target window (and auxiliary windows associated
    with the targer) invisible, and set the new height and
    location.  */
 static void
@@ -1295,87 +1299,86 @@ make_invisible_and_set_new_height (struct tui_win_info *win_info,
   if (win_info != TUI_CMD_WIN)
     win_info->viewport_height--;
 
-  /* Now deal with the auxillary windows associated with win_info.  */
+  /* Now deal with the auxiliary windows associated with win_info.  */
   win_info->set_new_height (height);
 }
 
 
-/* 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)
+/* See tui-data.h.  */
+
+void
+tui_win_info::make_visible_with_new_height ()
 {
-  struct symtab *s;
+  make_visible (true);
+  tui_check_and_display_highlight_if_needed (this);
+  do_make_visible_with_new_height ();
+}
 
-  tui_make_visible (win_info);
-  tui_check_and_display_highlight_if_needed (win_info);
-  tui_source_window_base *base;
-  switch (win_info->type)
+/* 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)
     {
-    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->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);
-         tui_update_source_window (base, gdbarch,
-                                   cursal.symtab, line_or_addr, TRUE);
-       }
-      else if (deprecated_safe_get_selected_frame () != 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)
        {
-         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->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 (base, gdbarch, s, line, TRUE);
+         line.loa = LOA_LINE;
+         line.u.line_no = cursal.line;
        }
-      if (win_info->has_locator ())
+      else
        {
-         tui_make_visible (tui_locator_win_info_ptr ());
-         tui_show_locator_content ();
+         line.loa = LOA_ADDRESS;
+         find_line_pc (s, cursal.line, &line.u.addr);
        }
-      break;
-    case DATA_WIN:
-      tui_display_all_data ();
-      break;
-    case CMD_WIN:
-#ifdef HAVE_WRESIZE
-      wresize (TUI_CMD_WIN->handle,
-              TUI_CMD_WIN->height,
-              TUI_CMD_WIN->width);
-#endif
-      mvwin (TUI_CMD_WIN->handle,
-            TUI_CMD_WIN->origin.y,
-            TUI_CMD_WIN->origin.x);
-      wmove (win_info->handle, 0, 0);
-      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.  */
+
+void
+tui_data_window::do_make_visible_with_new_height ()
+{
+  tui_display_all_data ();
+}
+
+/* See tui-data.h.  */
+
+void
+tui_cmd_window::do_make_visible_with_new_height ()
+{
+#ifdef HAVE_WRESIZE
+  wresize (handle, height, width);
+#endif
+  mvwin (handle, origin.y, origin.x);
+  wmove (handle, 0, 0);
+}
 
 /* See tui-data.h.  */
 
This page took 0.027931 seconds and 4 git commands to generate.