Reimplement tui_next_win and tui_prev_win
authorTom Tromey <tom@tromey.com>
Sat, 22 Feb 2020 18:48:26 +0000 (11:48 -0700)
committerTom Tromey <tom@tromey.com>
Sat, 22 Feb 2020 18:48:35 +0000 (11:48 -0700)
This reimplements tui_next_win and tui_prev_win.  Now they account for
the possibility of windows not on tui_win_list.

gdb/ChangeLog
2020-02-22  Tom Tromey  <tom@tromey.com>

* tui/tui-data.c (tui_next_win, tui_prev_win): Reimplement.

Change-Id: Ifcd402f76fe0a16e0fe9275a185d550279c01660

gdb/ChangeLog
gdb/tui/tui-data.c

index d0062218a2b70d7beeb4790f44a44524f05fdaf7..16daac356c5859e4cc4782b264bb33f681de780c 100644 (file)
@@ -1,3 +1,7 @@
+2020-02-22  Tom Tromey  <tom@tromey.com>
+
+       * tui/tui-data.c (tui_next_win, tui_prev_win): Reimplement.
+
 2020-02-22  Tom Tromey  <tom@tromey.com>
 
        * tui/tui-winsource.h (struct tui_source_window_iterator)
index 06bd42ee536c076ccb928bc047a849667b4b8560..5d42fafccca3c9bbcc406437eeb106ae96c27cfe 100644 (file)
@@ -26,6 +26,7 @@
 #include "tui/tui-wingeneral.h"
 #include "tui/tui-winsource.h"
 #include "gdb_curses.h"
+#include <algorithm>
 
 struct tui_win_info *tui_win_list[MAX_MAJOR_WINDOWS];
 
@@ -103,28 +104,13 @@ tui_set_term_width_to (int w)
 struct tui_win_info *
 tui_next_win (struct tui_win_info *cur_win)
 {
-  int type = cur_win->type;
-  struct tui_win_info *next_win = NULL;
-
-  if (cur_win->type == CMD_WIN)
-    type = SRC_WIN;
-  else
-    type = cur_win->type + 1;
-  while (type != cur_win->type && (next_win == NULL))
-    {
-      if (tui_win_list[type]
-         && tui_win_list[type]->is_visible ())
-       next_win = tui_win_list[type];
-      else
-       {
-         if (type == CMD_WIN)
-           type = SRC_WIN;
-         else
-           type++;
-       }
-    }
+  auto iter = std::find (tui_windows.begin (), tui_windows.end (), cur_win);
+  gdb_assert (iter != tui_windows.end ());
 
-  return next_win;
+  ++iter;
+  if (iter == tui_windows.end ())
+    return tui_windows[0];
+  return *iter;
 }
 
 
@@ -133,28 +119,13 @@ tui_next_win (struct tui_win_info *cur_win)
 struct tui_win_info *
 tui_prev_win (struct tui_win_info *cur_win)
 {
-  int type = cur_win->type;
-  struct tui_win_info *prev = NULL;
-
-  if (cur_win->type == SRC_WIN)
-    type = CMD_WIN;
-  else
-    type = cur_win->type - 1;
-  while (type != cur_win->type && (prev == NULL))
-    {
-      if (tui_win_list[type]
-         && tui_win_list[type]->is_visible ())
-       prev = tui_win_list[type];
-      else
-       {
-         if (type == SRC_WIN)
-           type = CMD_WIN;
-         else
-           type--;
-       }
-    }
+  auto iter = std::find (tui_windows.begin (), tui_windows.end (), cur_win);
+  gdb_assert (iter != tui_windows.end ());
 
-  return prev;
+  if (iter == tui_windows.begin ())
+    return tui_windows.back ();
+  --iter;
+  return *iter;
 }