diff options
-rw-r--r-- | gdb/ChangeLog | 9 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/testsuite/gdb.tui/list.exp | 1 | ||||
-rw-r--r-- | gdb/tui/tui-data.c | 34 | ||||
-rw-r--r-- | gdb/tui/tui-data.h | 6 | ||||
-rw-r--r-- | gdb/tui/tui-stack.h | 5 |
6 files changed, 52 insertions, 8 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 3b851db..3872a8d 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -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 diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index c85f3ed..4184975 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -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. diff --git a/gdb/testsuite/gdb.tui/list.exp b/gdb/testsuite/gdb.tui/list.exp index 77dbd69..576b33f 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 8f7d257..d475d03 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 5e7a122..d61bfc7 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 9ff57b1..0e5916f 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. |