[2/2,gdb/tui] Show focus window in status line

Message ID 20231127034534.13593-1-tdevries@suse.de
State Superseded
Headers
Series [1/2,gdb/tui] Use const std::string for string literals in tui-stack.c |

Checks

Context Check Description
linaro-tcwg-bot/tcwg_gdb_build--master-aarch64 success Testing passed
linaro-tcwg-bot/tcwg_gdb_build--master-arm success Testing passed
linaro-tcwg-bot/tcwg_gdb_check--master-arm success Testing passed
linaro-tcwg-bot/tcwg_gdb_check--master-aarch64 success Testing passed

Commit Message

Tom de Vries Nov. 27, 2023, 3:45 a.m. UTC
  The focused window is highlighting by using active-border-kind instead of
border-kind.

But if the focused window is the cmd window (which is an unboxed window), then
no highlighting is done, and it's not obvious from looking at the screen which
window has the focus.  Instead, you have to notice the absence of highlighting
on boxed windows, and then infer that the focus is on the unboxed window.

That approach stops working if there are multiple unboxed windows.

Likewise if highlighting is switched off by setting active-border-kind to the
same value as border-kind.

Make it more explicit which window has the focus by mentioning it in the status
window, like so:
...
native process 8282 (src) In: main                      L7    PC: 0x400525
...

Tested on x86_64-linux.
---
 gdb/testsuite/gdb.tui/single-key.exp |  4 ++--
 gdb/tui/tui-data.c                   |  2 ++
 gdb/tui/tui-stack.c                  | 16 ++++++++++++++++
 3 files changed, 20 insertions(+), 2 deletions(-)
  

Comments

Tom Tromey Dec. 8, 2023, 3:37 p.m. UTC | #1
>>>>> "Tom" == Tom de Vries <tdevries@suse.de> writes:

Tom> The focused window is highlighting by using active-border-kind instead of
Tom> border-kind.

Tom> But if the focused window is the cmd window (which is an unboxed window), then
Tom> no highlighting is done, and it's not obvious from looking at the screen which
Tom> window has the focus.  Instead, you have to notice the absence of highlighting
Tom> on boxed windows, and then infer that the focus is on the unboxed window.

Tom> That approach stops working if there are multiple unboxed windows.

Tom> Likewise if highlighting is switched off by setting active-border-kind to the
Tom> same value as border-kind.

Tom> Make it more explicit which window has the focus by mentioning it in the status
Tom> window, like so:
Tom> ...
Tom> native process 8282 (src) In: main                      L7    PC: 0x400525
Tom> ...

This seems fine to me, but the contents of the status line are
documented in the "TUI Overview" section, so I think that should be
updated.

Tom
  
Tom de Vries Dec. 8, 2023, 4:51 p.m. UTC | #2
On 12/8/23 16:37, Tom Tromey wrote:
>>>>>> "Tom" == Tom de Vries <tdevries@suse.de> writes:
> 
> Tom> The focused window is highlighting by using active-border-kind instead of
> Tom> border-kind.
> 
> Tom> But if the focused window is the cmd window (which is an unboxed window), then
> Tom> no highlighting is done, and it's not obvious from looking at the screen which
> Tom> window has the focus.  Instead, you have to notice the absence of highlighting
> Tom> on boxed windows, and then infer that the focus is on the unboxed window.
> 
> Tom> That approach stops working if there are multiple unboxed windows.
> 
> Tom> Likewise if highlighting is switched off by setting active-border-kind to the
> Tom> same value as border-kind.
> 
> Tom> Make it more explicit which window has the focus by mentioning it in the status
> Tom> window, like so:
> Tom> ...
> Tom> native process 8282 (src) In: main                      L7    PC: 0x400525
> Tom> ...
> 
> This seems fine to me, but the contents of the status line are
> documented in the "TUI Overview" section, so I think that should be
> updated.

Thanks for the review.

I've sent a v2 with doc added here ( 
https://sourceware.org/pipermail/gdb-patches/2023-December/204912.html ).

Thanks,
- Tom
  

Patch

diff --git a/gdb/testsuite/gdb.tui/single-key.exp b/gdb/testsuite/gdb.tui/single-key.exp
index 07c9b00cce5..3925a8142c1 100644
--- a/gdb/testsuite/gdb.tui/single-key.exp
+++ b/gdb/testsuite/gdb.tui/single-key.exp
@@ -25,12 +25,12 @@  set status_win { 0 15 80 1 }
 set command_win { 0 16 80 8 }
 
 # Check that the status window doesn't show Singlekey.
-set re "No process In:"
+set re [string_to_regexp "No process (src) In:"]
 Term::check_region_contents  "status window: initial" {*}$status_win $re
 
 # Enter single-key mode.  Check that the status window does show Singlekey.
 send_gdb "\030s"
-set re "No process \\(SingleKey\\) In:"
+set re [string_to_regexp "No process (SingleKey) (src) In:"]
 gdb_assert { [Term::wait_for_region_contents {*}$status_win $re] } \
     "status window: single-key mode"
 
diff --git a/gdb/tui/tui-data.c b/gdb/tui/tui-data.c
index fc90df25ddd..5e05cccf603 100644
--- a/gdb/tui/tui-data.c
+++ b/gdb/tui/tui-data.c
@@ -26,6 +26,7 @@ 
 #include "tui/tui-win.h"
 #include "tui/tui-wingeneral.h"
 #include "tui/tui-winsource.h"
+#include "tui/tui-stack.h"
 #include "gdb_curses.h"
 #include <algorithm>
 
@@ -69,6 +70,7 @@  tui_set_win_focus_to (struct tui_win_info *win_info)
       tui_unhighlight_win (win_with_focus);
       win_with_focus = win_info;
       tui_highlight_win (win_info);
+      tui_show_locator_content ();
     }
 }
 
diff --git a/gdb/tui/tui-stack.c b/gdb/tui/tui-stack.c
index 723d6268aad..8bf65ea3556 100644
--- a/gdb/tui/tui-stack.c
+++ b/gdb/tui/tui-stack.c
@@ -106,6 +106,12 @@  tui_locator_window::make_status_line () const
   const char *pc_buf = pc_out.c_str ();
   int pc_width = pc_out.size ();
 
+  /* Width of the field showing the window with current focus.  For a window
+     named "src" we show "(src)".  */
+  int focus_width = (tui_win_with_focus () != nullptr
+		     ? 1 + strlen (tui_win_with_focus ()->name ()) + 1
+		     : 0);
+
   /* First determine the amount of proc name width we have available.
      The +1 are for a space separator between fields.  */
   proc_width = (status_size
@@ -116,6 +122,9 @@  tui_locator_window::make_status_line () const
 		- (PC_PREFIX.size () + pc_width + 1)
 		- (tui_current_key_mode == TUI_SINGLE_KEY_MODE
 		   ? (SINGLE_KEY.size () + 1)
+		   : 0)
+		- (focus_width > 0
+		   ? focus_width + 1
 		   : 0));
 
   /* If there is no room to print the function name, try by removing
@@ -159,6 +168,13 @@  tui_locator_window::make_status_line () const
       string.puts (" ");
     }
 
+  if (tui_win_with_focus () != nullptr)
+    {
+      string.puts ("(");
+      string.puts (tui_win_with_focus ()->name ());
+      string.puts (") ");
+    }
+
   /* Procedure/class name.  */
   if (proc_width > 0)
     {