TUI window resize should not need invisibility
authorTom Tromey <tom@tromey.com>
Tue, 9 Jul 2019 21:35:17 +0000 (15:35 -0600)
committerTom Tromey <tom@tromey.com>
Thu, 15 Aug 2019 18:29:28 +0000 (12:29 -0600)
When resizing a window, the TUI currently first makes it invisible,
then changes the size, and then restores its visibility.

I think this is done because curses doesn't truly support resizing a
window -- there is a "wresize" extension, but the man page says it
isn't available in all versions of curses.

First, this is probably not a major problem any more.  I imagine most
of those old systems are gone now.

Second, I think it's a better API to have this detail hidden inside of
the resize method.

This patch changes the code to follow this idea, and changes the
ordinary resize method to use wresize when it is available.  The
special case for the command window is also moved to methods on the
command window.

gdb/ChangeLog
2019-08-15  Tom Tromey  <tom@tromey.com>

* tui/tui-layout.c (show_layout, show_source_disasm_command)
(show_data): Don't change window visibility.
(tui_gen_win_info::resize): Remove special case for command
window.  Use wresize, when available.
(show_source_or_disasm_and_command): Don't change window
visibility.
* tui/tui-command.h (struct tui_cmd_window) <resize>: Declare.
<make_visible>: New method.
* tui/tui-command.c (tui_cmd_window::resize): New method.

gdb/ChangeLog
gdb/tui/tui-command.c
gdb/tui/tui-command.h
gdb/tui/tui-layout.c

index 5a42eee4f7ac2a8f467ec035754fab6d8ea2d4c5..57ecdac8176f117196a67749938284b97414440f 100644 (file)
@@ -1,3 +1,15 @@
+2019-08-15  Tom Tromey  <tom@tromey.com>
+
+       * tui/tui-layout.c (show_layout, show_source_disasm_command)
+       (show_data): Don't change window visibility.
+       (tui_gen_win_info::resize): Remove special case for command
+       window.  Use wresize, when available.
+       (show_source_or_disasm_and_command): Don't change window
+       visibility.
+       * tui/tui-command.h (struct tui_cmd_window) <resize>: Declare.
+       <make_visible>: New method.
+       * tui/tui-command.c (tui_cmd_window::resize): New method.
+
 2019-08-15  Tom Tromey  <tom@tromey.com>
 
        * tui/tui-winsource.h (struct tui_source_window_iterator): New.
index 034abd579821c3c9a70c57994704d3a105f3f522..ddbd8bccea5aab8f2f295e596468f6bd1f2c2547 100644 (file)
@@ -25,6 +25,7 @@
 #include "tui/tui-win.h"
 #include "tui/tui-io.h"
 #include "tui/tui-command.h"
+#include "tui/tui-wingeneral.h"
 
 #include "gdb_curses.h"
 
@@ -48,6 +49,40 @@ tui_cmd_window::max_height () const
   return tui_term_height () - 4;
 }
 
+void
+tui_cmd_window::resize (int height_, int width_, int origin_x, int origin_y)
+{
+  width = width_;
+  height = height_;
+  if (height > 1)
+    {
+      /* Note this differs from the base class implementation, because
+        this window can't be boxed.  */
+      viewport_height = height - 1;
+    }
+  else
+    viewport_height = 1;
+  origin.x = origin_x;
+  origin.y = origin_y;
+
+  if (handle == nullptr)
+    tui_make_window (this);
+  else
+    {
+      /* Another reason we don't call the base class method here is
+        that for the command window in particular, we want to avoid
+        destroying the underlying handle.  We don't currently track
+        the contents of this window, and so have no way to re-render
+        it.  However we can at least move it and keep the old size if
+        wresize isn't available.  */
+#ifdef HAVE_WRESIZE
+      wresize (handle, height, width);
+#endif
+      mvwin (handle, origin.y, origin.x);
+      wmove (handle, 0, 0);
+    }
+}
+
 /* See tui-command.h.  */
 
 void
index 1892956fe774e1abc5d6f512b6f0af40cfdac580..1fce0a18126fb6584af1b16bb9214bf90188e25f 100644 (file)
@@ -56,6 +56,13 @@ struct tui_cmd_window : public tui_win_info
     return false;
   }
 
+  void resize (int height, int width, int origin_x, int origin_y) override;
+
+  void make_visible (bool visible) override
+  {
+    /* The command window can't be made invisible.  */
+  }
+
   int start_line = 0;
 
 protected:
index 4ea604a1017f4426a9920cf2cc4a727c58f27513..e0e804bac2abe4524f282a2b7b2d4138b362d921 100644 (file)
@@ -76,9 +76,7 @@ show_layout (enum tui_layout_type layout)
 
   if (layout != cur_layout)
     {
-      /* First make the current layout be invisible.  */
       tui_make_all_invisible ();
-      tui_locator_win_info_ptr ()->make_visible (false);
       switch (layout)
        {
        case SRC_DATA_COMMAND:
@@ -506,7 +504,6 @@ show_source_disasm_command (void)
                       tui_term_width (),
                       0,
                       0);
-  TUI_SRC_WIN->make_visible (true);
   TUI_SRC_WIN->m_has_locator = false;
 
   struct tui_locator_window *locator = tui_locator_win_info_ptr ();
@@ -519,14 +516,12 @@ show_source_disasm_command (void)
                          tui_term_width (),
                          0,
                          src_height - 1);
-  TUI_DISASM_WIN->make_visible (true);
   locator->resize (2 /* 1 */ ,
                   tui_term_width (),
                   0,
                   (src_height + asm_height) - 1);
   TUI_SRC_WIN->m_has_locator = false;
   TUI_DISASM_WIN->m_has_locator = true;
-  locator->make_visible (true);
   tui_show_locator_content ();
   TUI_DISASM_WIN->show_source_content ();
 
@@ -536,7 +531,6 @@ show_source_disasm_command (void)
                       tui_term_width (),
                       0,
                       tui_term_height () - cmd_height);
-  TUI_CMD_WIN->make_visible (true);
   current_layout = SRC_DISASSEM_COMMAND;
 }
 
@@ -558,7 +552,6 @@ show_data (enum tui_layout_type new_layout)
   if (tui_win_list[DATA_WIN] == nullptr)
     tui_win_list[DATA_WIN] = new tui_data_window ();
   tui_win_list[DATA_WIN]->resize (data_height, tui_term_width (), 0, 0);
-  tui_win_list[DATA_WIN]->make_visible (true);
 
   if (new_layout == SRC_DATA_COMMAND)
     win_type = SRC_WIN;
@@ -583,11 +576,11 @@ show_data (enum tui_layout_type new_layout)
                   tui_term_width (),
                   0,
                   total_height - 1);
-  base->make_visible (true);
+  TUI_CMD_WIN->resize (TUI_CMD_WIN->height, tui_term_width (),
+                      0, total_height);
+
   base->m_has_locator = true;
-  locator->make_visible (true);
   tui_show_locator_content ();
-  TUI_CMD_WIN->make_visible (true);
   current_layout = new_layout;
 }
 
@@ -595,20 +588,29 @@ void
 tui_gen_win_info::resize (int height_, int width_,
                          int origin_x_, int origin_y_)
 {
-  int h = height_;
-
   width = width_;
-  height = h;
-  if (h > 1)
-    {
-      viewport_height = h - 1;
-      if (type != CMD_WIN)
-       viewport_height--;
-    }
+  height = height_;
+  if (height > 1)
+    viewport_height = height - 2;
   else
     viewport_height = 1;
   origin.x = origin_x_;
   origin.y = origin_y_;
+
+  if (handle != nullptr)
+    {
+#ifdef HAVE_WRESIZE
+      wresize (handle, height, width);
+      mvwin (handle, origin.y, origin.x);
+      wmove (handle, 0, 0);
+#else
+      tui_delete_win (handle);
+      handle = NULL;
+#endif
+    }
+
+  if (handle == nullptr)
+    tui_make_window (this);
 }
 
 /* Show the Source/Command or the Disassem layout.  */
@@ -647,11 +649,8 @@ show_source_or_disasm_and_command (enum tui_layout_type layout_type)
                    tui_term_width (),
                    0,
                    0);
-  win_info->make_visible (true);
-
 
   win_info->m_has_locator = true;
-  locator->make_visible (true);
   tui_show_locator_content ();
   win_info->show_source_content ();
 
@@ -661,6 +660,5 @@ show_source_or_disasm_and_command (enum tui_layout_type layout_type)
                       tui_term_width (),
                       0,
                       src_height);
-  TUI_CMD_WIN->make_visible (true);
   current_layout = layout_type;
 }