From: Tom Tromey Date: Wed, 23 Sep 2020 18:57:19 +0000 (-0600) Subject: Don't let TUI focus on locator X-Git-Tag: gdb-10.1-release~44 X-Git-Url: http://git.ipfire.org/?p=thirdparty%2Fbinutils-gdb.git;a=commitdiff_plain;h=8ccf2a20fbfe4b4a4199709b999ce3b601a9065a 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. 2020-09-24 Tom Tromey PR tui/26638: * tui/tui-stack.h (struct tui_locator_window) : New method. * tui/tui-data.h (struct tui_win_info) : 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 PR tui/26638: * gdb.tui/list.exp: Check output of "focus next". --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index f26afc042da..e7d020314d0 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,12 @@ +2020-09-24 Tom Tromey + + PR tui/26638: + * tui/tui-stack.h (struct tui_locator_window) : New + method. + * tui/tui-data.h (struct tui_win_info) : New method. + * tui/tui-data.c (tui_next_win): Exclude non-focusable windows. + (tui_prev_win): Rewrite. + 2020-09-23 Hannes Domani * nat/windows-nat.c (handle_exception): Handle 64bit breakpoints diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 3fe12bfe366..bef594693d2 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2020-09-24 Tom Tromey + + PR tui/26638: + * gdb.tui/list.exp: Check output of "focus next". + 2020-09-18 Victor Collod PR gdb/26635 diff --git a/gdb/testsuite/gdb.tui/list.exp b/gdb/testsuite/gdb.tui/list.exp index 77dbd69efd8..576b33fa869 100644 --- a/gdb/testsuite/gdb.tui/list.exp +++ b/gdb/testsuite/gdb.tui/list.exp @@ -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" diff --git a/gdb/tui/tui-data.c b/gdb/tui/tui-data.c index 8f7d257e945..d475d031065 100644 --- a/gdb/tui/tui-data.c +++ b/gdb/tui/tui-data.c @@ -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; } diff --git a/gdb/tui/tui-data.h b/gdb/tui/tui-data.h index 5e7a12293c9..d61bfc7dff8 100644 --- a/gdb/tui/tui-data.h +++ b/gdb/tui/tui-data.h @@ -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 () { diff --git a/gdb/tui/tui-stack.h b/gdb/tui/tui-stack.h index 9ff57b1ba73..0e5916f0ce3 100644 --- a/gdb/tui/tui-stack.h +++ b/gdb/tui/tui-stack.h @@ -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.