Don't let TUI focus on locator

PR tui/26638 notes that the C-x o binding can put the focus on the
locator window.  However, this is not useful and did not happen
historically.  This patch changes the TUI to skip this window when
switching focus.

gdb/ChangeLog
2020-09-24  Tom Tromey  <tromey@adacore.com>

	PR tui/26638:
	* tui/tui-stack.h (struct tui_locator_window) <can_focus>: New
	method.
	* tui/tui-data.h (struct tui_win_info) <can_focus>: New method.
	* tui/tui-data.c (tui_next_win): Exclude non-focusable windows.
	(tui_prev_win): Rewrite.

gdb/testsuite/ChangeLog
2020-09-24  Tom Tromey  <tromey@adacore.com>

	PR tui/26638:
	* gdb.tui/list.exp: Check output of "focus next".
This commit is contained in:
Tom Tromey 2020-09-23 12:57:19 -06:00
parent 99bb393f1d
commit b551a89f51
6 changed files with 52 additions and 8 deletions

View file

@ -1,3 +1,12 @@
2020-09-24 Tom Tromey <tromey@adacore.com>
PR tui/26638:
* tui/tui-stack.h (struct tui_locator_window) <can_focus>: New
method.
* tui/tui-data.h (struct tui_win_info) <can_focus>: New method.
* tui/tui-data.c (tui_next_win): Exclude non-focusable windows.
(tui_prev_win): Rewrite.
2020-09-23 Hannes Domani <ssbssa@yahoo.de>
* nat/windows-nat.c (handle_exception): Handle 64bit breakpoints

View file

@ -1,3 +1,8 @@
2020-09-24 Tom Tromey <tromey@adacore.com>
PR tui/26638:
* gdb.tui/list.exp: Check output of "focus next".
2020-09-23 Tom Tromey <tom@tromey.com>
* gdb.dwarf2/intbits.exp: New file.

View file

@ -39,3 +39,4 @@ Term::check_contents "list main" "21 *return 0"
# The following 'focus next' must be immediately after 'list main' to
# ensure that GDB has a valid idea of what is currently focused.
Term::command "focus next"
Term::check_contents "focus next" "Focus set to cmd window"

View file

@ -113,9 +113,18 @@ tui_next_win (struct tui_win_info *cur_win)
auto iter = std::find (tui_windows.begin (), tui_windows.end (), cur_win);
gdb_assert (iter != tui_windows.end ());
++iter;
if (iter == tui_windows.end ())
return tui_windows[0];
gdb_assert (cur_win->can_focus ());
/* This won't loop forever since we can't have just an un-focusable
window. */
while (true)
{
++iter;
if (iter == tui_windows.end ())
iter = tui_windows.begin ();
if ((*iter)->can_focus ())
break;
}
return *iter;
}
@ -125,12 +134,21 @@ tui_next_win (struct tui_win_info *cur_win)
struct tui_win_info *
tui_prev_win (struct tui_win_info *cur_win)
{
auto iter = std::find (tui_windows.begin (), tui_windows.end (), cur_win);
gdb_assert (iter != tui_windows.end ());
auto iter = std::find (tui_windows.rbegin (), tui_windows.rend (), cur_win);
gdb_assert (iter != tui_windows.rend ());
gdb_assert (cur_win->can_focus ());
/* This won't loop forever since we can't have just an un-focusable
window. */
while (true)
{
++iter;
if (iter == tui_windows.rend ())
iter = tui_windows.rbegin ();
if ((*iter)->can_focus ())
break;
}
if (iter == tui_windows.begin ())
return tui_windows.back ();
--iter;
return *iter;
}

View file

@ -99,6 +99,12 @@ public:
return handle != nullptr;
}
/* Return true if this window can accept the focus. */
virtual bool can_focus () const
{
return true;
}
/* Disable output until the next call to doupdate. */
void no_refresh ()
{

View file

@ -52,6 +52,11 @@ struct tui_locator_window : public tui_win_info
return false;
}
bool can_focus () const override
{
return false;
}
void rerender () override;
/* Update the locator, with the provided arguments.