[gdb/tui] Fix fingerprint for cmd-only layout
authorTom de Vries <tdevries@suse.de>
Wed, 31 May 2023 05:39:31 +0000 (07:39 +0200)
committerTom de Vries <tdevries@suse.de>
Wed, 31 May 2023 05:39:31 +0000 (07:39 +0200)
I added a cmd-only layout:
...
(gdb) tui new-layout cmd cmd 1
...
and set it:
...
(gdb) layout cmd
...
which gave me the expect result: only the cmd window in the screen.

However, after going back to layout src:
...
(gdb) layout src
...
I got a source window with only one line in it, and the cmd window taking most
of the screen.

I traced this back to tui_set_layout, where for both the old and the new
layout the fingerprint of the cmd window in the layout is taken.  If the
fingerprint is the same, an effort will be done to preserve the command
window size.

The fingerprint is "VC" for both the old (cmd) and new (src) layouts, which
explains the behaviour.

I think this is essentially a bug in the finger print calculation, and it
should be "C" for the cmd layout.

Fix this by not adding a V or H in the fingerprint if the list size is one.

Tested on x86_64-linux.

Reviewed-By: Tom Tromey <tom@tromey.com>
gdb/testsuite/gdb.tui/new-layout.exp
gdb/tui/tui-layout.c
gdb/tui/tui-layout.h

index eaebac88ce1a1a4a055a4b9e71ca387018a5f3ab..3085cc36232569454a8c2927e79f719e55126013 100644 (file)
@@ -142,3 +142,12 @@ foreach_with_prefix layout $layouts {
                           "$gdb_prompt\\s+"]
     }
 }
+
+Term::command "layout src"
+Term::command "winheight cmd 8"
+Term::check_box "before cmd_only: src box in src layout" 0 0 80 15
+
+Term::command "layout cmd_only"
+
+Term::command "layout src"
+Term::check_box "after cmd_only: src box in src layout" 0 0 80 15
index 50c568fb7d7cc74adcf16550d8892aab7766e034..159445dc52079df5678d8dedf306dbb7b139fb96 100644 (file)
@@ -1101,7 +1101,7 @@ tui_layout_split::layout_fingerprint () const
   for (auto &item : m_splits)
     {
       std::string fp = item.layout->layout_fingerprint ();
-      if (!fp.empty ())
+      if (!fp.empty () && m_splits.size () != 1)
        return std::string (m_vertical ? "V" : "H") + fp;
     }
 
index ff354fb7c2fc7a9dddcee4d1a7d69a82ee6bd953..a6d34851bef4a47e28977cc87d53fbddec15121b 100644 (file)
@@ -111,7 +111,8 @@ public:
      non-empty string made of 'V' and 'H' characters, followed by a single
      'C' character.  Each 'V' and 'H' represents a vertical or horizontal
      layout that must be passed through in order to find the cmd
-     window.
+     window.  A vertical or horizontal layout of just one window does not add
+     a 'V' or 'H' character.
 
      Of course, layouts are built recursively, so, when called on a partial
      layout, if this object represents a single window, then either the
@@ -119,7 +120,7 @@ public:
      containing a single 'C' is returned.
 
      For object representing layouts, if the layout contains the cmd
-     window then we will get back a valid fingerprint string (contains 'V'
+     window then we will get back a valid fingerprint string (may contain 'V'
      and 'H', ends with 'C'), or, if this layout doesn't contain the cmd
      window, an empty string is returned.  */
   virtual std::string layout_fingerprint () const = 0;