aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog9
-rw-r--r--gdb/testsuite/ChangeLog5
-rw-r--r--gdb/testsuite/gdb.tui/list.exp1
-rw-r--r--gdb/tui/tui-data.c34
-rw-r--r--gdb/tui/tui-data.h6
-rw-r--r--gdb/tui/tui-stack.h5
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.