aboutsummaryrefslogtreecommitdiff
path: root/gdb/tui
diff options
context:
space:
mode:
authorTom Tromey <tromey@adacore.com>2020-09-23 12:57:19 -0600
committerTom Tromey <tromey@adacore.com>2020-09-24 12:25:59 -0600
commitb551a89f51504735e9979ac885a5784e21cfecef (patch)
tree508c40ffd9fabc399f80cb7987abdba626fc7e44 /gdb/tui
parent99bb393f1d107cf2c4016c486f85625d362027a7 (diff)
downloadbinutils-b551a89f51504735e9979ac885a5784e21cfecef.zip
binutils-b551a89f51504735e9979ac885a5784e21cfecef.tar.gz
binutils-b551a89f51504735e9979ac885a5784e21cfecef.tar.bz2
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".
Diffstat (limited to 'gdb/tui')
-rw-r--r--gdb/tui/tui-data.c34
-rw-r--r--gdb/tui/tui-data.h6
-rw-r--r--gdb/tui/tui-stack.h5
3 files changed, 37 insertions, 8 deletions
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.