[review] Change "winheight" resizing to use new layout code

Message ID gerrit.1572212661000.I6bb681375a46adc8d29fd06f581deed4e078e78a@gnutoolchain-gerrit.osci.io
State New, archived
Headers

Commit Message

Simon Marchi (Code Review) Oct. 27, 2019, 9:44 p.m. UTC
  Change URL: https://gnutoolchain-gerrit.osci.io/r/c/binutils-gdb/+/370
......................................................................

Change "winheight" resizing to use new layout code

The "winheight" command resizes a specified window, resizing the other
windows in the layout to adapt.  In the current code, this is done by
examining each possible layout separately.  The new layout code has a
more general approach to handling this, and this patch simply removes
the old code in favor of a call into the new layout engine.

gdb/ChangeLog
2019-10-27  Tom Tromey  <tom@tromey.com>

	* tui/tui-win.c (tui_set_win_height_command): Call
	tui_adjust_window_height.
	(tui_adjust_win_heights, new_height_ok): Remove.
	* tui/tui-layout.h (tui_adjust_window_height): Declare.
	* tui/tui-layout.c (tui_adjust_window_height): New function.

Change-Id: I6bb681375a46adc8d29fd06f581deed4e078e78a
---
M gdb/ChangeLog
M gdb/tui/tui-layout.c
M gdb/tui/tui-layout.h
M gdb/tui/tui-win.c
4 files changed, 22 insertions(+), 279 deletions(-)
  

Comments

Simon Marchi (Code Review) Nov. 26, 2019, 11:55 p.m. UTC | #1
Andrew Burgess has posted comments on this change.

Change URL: https://gnutoolchain-gerrit.osci.io/r/c/binutils-gdb/+/370
......................................................................


Patch Set 4: Code-Review+2

LGTM.
  
Simon Marchi (Code Review) Dec. 11, 2019, 10:50 p.m. UTC | #2
Tom Tromey has posted comments on this change.

Change URL: https://gnutoolchain-gerrit.osci.io/r/c/binutils-gdb/+/370
......................................................................


Patch Set 4:

Now that gdb 9 has branched, I'm going to check this series in shortly.
  

Patch

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 06db797..18a7906 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,13 @@ 
 2019-10-27  Tom Tromey  <tom@tromey.com>
 
+	* tui/tui-win.c (tui_set_win_height_command): Call
+	tui_adjust_window_height.
+	(tui_adjust_win_heights, new_height_ok): Remove.
+	* tui/tui-layout.h (tui_adjust_window_height): Declare.
+	* tui/tui-layout.c (tui_adjust_window_height): New function.
+
+2019-10-27  Tom Tromey  <tom@tromey.com>
+
 	* tui/tui-win.c (tui_resize_all): Remove code, call
 	tui_apply_current_layout.
 
diff --git a/gdb/tui/tui-layout.c b/gdb/tui/tui-layout.c
index db958f6..f0ccb95 100644
--- a/gdb/tui/tui-layout.c
+++ b/gdb/tui/tui-layout.c
@@ -70,6 +70,14 @@ 
   applied_layout->apply (0, 0, tui_term_width (), tui_term_height ());
 }
 
+/* See tui-layout.  */
+
+void
+tui_adjust_window_height (struct tui_win_info *win, int new_height)
+{
+  applied_layout->adjust_size (win->name (), new_height);
+}
+
 /* Show the screen layout defined.  */
 static void
 show_layout (enum tui_layout_type layout)
diff --git a/gdb/tui/tui-layout.h b/gdb/tui/tui-layout.h
index 0bc0de5..c3c8d10 100644
--- a/gdb/tui/tui-layout.h
+++ b/gdb/tui/tui-layout.h
@@ -163,4 +163,8 @@ 
 /* Apply the current layout.  */
 extern void tui_apply_current_layout ();
 
+/* Adjust the window height of WIN to NEW_HEIGHT.  */
+extern void tui_adjust_window_height (struct tui_win_info *win,
+				      int new_height);
+
 #endif /* TUI_TUI_LAYOUT_H */
diff --git a/gdb/tui/tui-win.c b/gdb/tui/tui-win.c
index aeb271a..57b0eba 100644
--- a/gdb/tui/tui-win.c
+++ b/gdb/tui/tui-win.c
@@ -54,9 +54,6 @@ 
 
 #include <signal.h>
 
-static enum tui_status tui_adjust_win_heights (struct tui_win_info *, 
-					       int);
-static int new_height_ok (struct tui_win_info *, int);
 static void tui_set_tab_width_command (const char *, int);
 static void tui_refresh_all_command (const char *, int);
 static void tui_all_windows_info (const char *, int);
@@ -885,12 +882,8 @@ 
 
 		  /* Now change the window's height, and adjust
 		     all other windows around it.  */
-		  if (tui_adjust_win_heights (win_info,
-					      new_height) == TUI_FAILURE)
-		    warning (_("Invalid window height specified.\n%s"),
-			     WIN_HEIGHT_USAGE);
-		  else
-		    tui_update_gdb_sizes ();
+		  tui_adjust_window_height (win_info, new_height);
+		  tui_update_gdb_sizes ();
 		}
 	      else
 		warning (_("Invalid window height specified.\n%s"),
@@ -904,170 +897,6 @@ 
     printf_filtered (WIN_HEIGHT_USAGE);
 }
 
-/* Function to adjust all window heights around the primary.   */
-static enum tui_status
-tui_adjust_win_heights (struct tui_win_info *primary_win_info,
-			int new_height)
-{
-  enum tui_status status = TUI_FAILURE;
-
-  if (new_height_ok (primary_win_info, new_height))
-    {
-      status = TUI_SUCCESS;
-      if (new_height != primary_win_info->height)
-	{
-	  int diff;
-	  struct tui_win_info *win_info;
-	  struct tui_locator_window *locator = tui_locator_win_info_ptr ();
-	  enum tui_layout_type cur_layout = tui_current_layout ();
-	  int width = tui_term_width ();
-
-	  diff = (new_height - primary_win_info->height) * (-1);
-	  if (cur_layout == SRC_COMMAND 
-	      || cur_layout == DISASSEM_COMMAND)
-	    {
-	      struct tui_win_info *src_win_info;
-
-	      primary_win_info->resize (new_height, width,
-					0, primary_win_info->y);
-	      if (primary_win_info->type == CMD_WIN)
-		{
-		  win_info = *(tui_source_windows ().begin ());
-		  src_win_info = win_info;
-		}
-	      else
-		{
-		  win_info = tui_win_list[CMD_WIN];
-		  src_win_info = primary_win_info;
-		}
-	      win_info->resize (win_info->height + diff, width,
-				0, win_info->y);
-	      TUI_CMD_WIN->y = locator->y + 1;
-	      if ((src_win_info->type == SRC_WIN
-		   || src_win_info->type == DISASSEM_WIN))
-		{
-		  tui_source_window_base *src_base
-		    = (tui_source_window_base *) src_win_info;
-		  if (src_base->content.empty ())
-		    src_base->erase_source_content ();
-		}
-	    }
-	  else
-	    {
-	      struct tui_win_info *first_win;
-	      struct tui_source_window_base *second_win;
-	      tui_source_window_base *src1;
-
-	      if (cur_layout == SRC_DISASSEM_COMMAND)
-		{
-		  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 ().begin ());
-		}
-	      if (primary_win_info == TUI_CMD_WIN)
-		{ /* Split the change in height across the 1st & 2nd
-		     windows, adjusting them as well.  */
-		  /* Subtract the locator.  */
-		  int first_split_diff = diff / 2;
-		  int second_split_diff = first_split_diff;
-
-		  if (diff % 2)
-		    {
-		      if (first_win->height >
-			  second_win->height)
-			if (diff < 0)
-			  first_split_diff--;
-			else
-			  first_split_diff++;
-		      else
-			{
-			  if (diff < 0)
-			    second_split_diff--;
-			  else
-			    second_split_diff++;
-			}
-		    }
-		  /* Make sure that the minimum heights are
-		     honored.  */
-		  while ((first_win->height + first_split_diff) < 3)
-		    {
-		      first_split_diff++;
-		      second_split_diff--;
-		    }
-		  while ((second_win->height + second_split_diff) < 3)
-		    {
-		      second_split_diff++;
-		      first_split_diff--;
-		    }
-		  first_win->resize (first_win->height + first_split_diff,
-				     width,
-				     0, first_win->y);
-		  second_win->resize (second_win->height + second_split_diff,
-				      width,
-				      0, first_win->height - 1);
-		  locator->resize (1, width,
-				   0, (second_win->y
-				       + second_win->height + 1));
-
-		  TUI_CMD_WIN->resize (new_height, width,
-				       0, locator->y + 1);
-		}
-	      else
-		{
-		  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->height + diff) < 1)
-			{
-			  int i;
-
-			  for (i = TUI_CMD_WIN->height + diff;
-			       (i < 1); i++)
-			    if (primary_win_info == first_win)
-			      second_win->height--;
-			    else
-			      first_win->height--;
-			}
-		    }
-		  if (primary_win_info == first_win)
-		    first_win->resize (new_height, width, 0, 0);
-		  else
-		    first_win->resize (first_win->height, width, 0, 0);
-		  second_win->y = first_win->height - 1;
-		  if (primary_win_info == second_win)
-		    second_win->resize (new_height, width,
-					0, first_win->height - 1);
-		  else
-		    second_win->resize (second_win->height, width,
-					0, first_win->height - 1);
-		  locator->resize (1, width,
-				   0, (second_win->y
-				       + second_win->height + 1));
-		  TUI_CMD_WIN->y = locator->y + 1;
-		  if ((TUI_CMD_WIN->height + diff) < 1)
-		    TUI_CMD_WIN->resize (1, width, 0, locator->y + 1);
-		  else
-		    TUI_CMD_WIN->resize (TUI_CMD_WIN->height + diff, width,
-					 0, locator->y + 1);
-		}
-	      if (src1 != nullptr && src1->content.empty ())
-		src1->erase_source_content ();
-	      if (second_win->content.empty ())
-		second_win->erase_source_content ();
-	    }
-	}
-    }
-
-  return status;
-}
-
 /* See tui-data.h.  */
 
 int
@@ -1076,112 +905,6 @@ 
   return tui_term_height () - 2;
 }
 
-static int
-new_height_ok (struct tui_win_info *primary_win_info, 
-	       int new_height)
-{
-  int ok = (new_height < tui_term_height ());
-
-  if (ok)
-    {
-      int diff;
-      enum tui_layout_type cur_layout = tui_current_layout ();
-
-      diff = (new_height - primary_win_info->height) * (-1);
-      if (cur_layout == SRC_COMMAND || cur_layout == DISASSEM_COMMAND)
-	{
-	  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 ().begin ());
-	      else
-		win_info = TUI_CMD_WIN;
-	      ok = ((new_height +
-		     (win_info->height + diff)) <= tui_term_height ());
-	    }
-	}
-      else
-	{
-	  int cur_total_height, total_height, min_height = 0;
-	  struct tui_win_info *first_win;
-	  struct tui_win_info *second_win;
-
-	  if (cur_layout == SRC_DISASSEM_COMMAND)
-	    {
-	      first_win = TUI_SRC_WIN;
-	      second_win = TUI_DISASM_WIN;
-	    }
-	  else
-	    {
-	      first_win = TUI_DATA_WIN;
-	      second_win = *(tui_source_windows ().begin ());
-	    }
-	  /* 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->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->height +
-		     second_win->height + diff) >=
-		    (MIN_WIN_HEIGHT * 2) 
-		    && new_height >= MIN_CMD_WIN_HEIGHT);
-	      if (ok)
-		{
-		  total_height = new_height + 
-		    (first_win->height +
-		     second_win->height + diff);
-		  min_height = MIN_CMD_WIN_HEIGHT;
-		}
-	    }
-	  else
-	    {
-	      min_height = MIN_WIN_HEIGHT;
-
-	      /* 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->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->height + diff) >= min_height;
-		  else
-		    ok = (first_win->height + diff) >= min_height;
-		}
-	      if (ok)
-		{
-		  if (primary_win_info == first_win)
-		    total_height = new_height +
-		      second_win->height +
-		      TUI_CMD_WIN->height + diff;
-		  else
-		    total_height = new_height +
-		      first_win->height +
-		      TUI_CMD_WIN->height + diff;
-		}
-	    }
-	  /* Now make sure that the proposed total height doesn't
-	     exceed the old total height.  */
-	  if (ok)
-	    ok = (new_height >= min_height 
-		  && total_height <= cur_total_height);
-	}
-    }
-
-  return ok;
-}
-
-
 static void
 parse_scrolling_args (const char *arg, 
 		      struct tui_win_info **win_to_scroll,