+2020-02-22 Tom Tromey <tom@tromey.com>
+
+ * tui/tui.c (tui_rl_delete_other_windows): Call
+ tui_remove_some_windows.
+ * tui/tui-layout.h (class tui_layout_base) <remove_windows>:
+ Declare method.
+ (class tui_layout_window) <remove_windows>: New method.
+ (class tui_layout_split) <remove_windows>: Declare.
+ (tui_remove_some_windows): Declare.
+ * tui/tui-layout.c (tui_remove_some_windows): New function.
+ (tui_layout_split::remove_windows): New method.
+
2020-02-22 Tom Tromey <tom@tromey.com>
* tui/tui.c (tui_rl_change_windows): Call tui_next_layout.
tui_layout_command ("next", 0);
}
+/* See tui-layout.h. */
+
+void
+tui_remove_some_windows ()
+{
+ tui_win_info *focus = tui_win_with_focus ();
+
+ if (strcmp (focus->name (), "cmd") == 0)
+ {
+ /* Try leaving the source or disassembly window. If neither
+ exists, just do nothing. */
+ focus = TUI_SRC_WIN;
+ if (focus == nullptr)
+ focus = TUI_DISASM_WIN;
+ if (focus == nullptr)
+ return;
+ }
+
+ applied_layout->remove_windows (focus->name ());
+ tui_apply_current_layout ();
+}
+
static void
extract_display_start_addr (struct gdbarch **gdbarch_p, CORE_ADDR *addr_p)
{
m_applied = true;
}
+/* See tui-layout.h. */
+
+void
+tui_layout_split::remove_windows (const char *name)
+{
+ for (int i = 0; i < m_splits.size (); ++i)
+ {
+ const char *this_name = m_splits[i].layout->get_name ();
+ if (this_name == nullptr)
+ m_splits[i].layout->remove_windows (name);
+ else
+ {
+ if (strcmp (this_name, name) == 0
+ || strcmp (this_name, "cmd") == 0)
+ {
+ /* Keep. */
+ }
+ m_splits.erase (m_splits.begin () + i);
+ --i;
+ }
+ }
+}
+
static void
initialize_layouts ()
{
the sizes of the other windows around it. */
virtual bool adjust_size (const char *name, int new_height) = 0;
+ /* Remove some windows from the layout, leaving the command window
+ and the window being passed in here. */
+ virtual void remove_windows (const char *name) = 0;
+
/* The most recent space allocation. */
int x = 0;
int y = 0;
bool bottom_boxed_p () const override;
+ void remove_windows (const char *name) override
+ {
+ }
+
protected:
void get_sizes (int *min_height, int *max_height) override;
bool bottom_boxed_p () const override;
+ void remove_windows (const char *name) override;
+
protected:
void get_sizes (int *min_height, int *max_height) override;
/* Switch to the next layout. */
extern void tui_next_layout ();
+/* Remove some windows from the layout, leaving only the focused
+ window and the command window; if no window has the focus, then
+ some other window is chosen to remain. */
+extern void tui_remove_some_windows ();
+
/* Apply the current layout. */
extern void tui_apply_current_layout ();
tui_rl_switch_mode (0 /* notused */, 0 /* notused */);
if (tui_active)
- {
- enum tui_layout_type new_layout;
-
- new_layout = tui_current_layout ();
+ tui_remove_some_windows ();
- /* Kill one window. */
- switch (new_layout)
- {
- case SRC_COMMAND:
- case SRC_DATA_COMMAND:
- case SRC_DISASSEM_COMMAND:
- default:
- new_layout = SRC_COMMAND;
- break;
-
- case DISASSEM_COMMAND:
- case DISASSEM_DATA_COMMAND:
- new_layout = DISASSEM_COMMAND;
- break;
- }
- tui_set_layout (new_layout);
- }
return 0;
}