binutils-gdb/gdb/tui/tui-command.c
Andrew Burgess b45b7407cd gdb/tui: relax restrictions on window max height and width
This commit removes some arbitrary adjustments made in
tui_cmd_window::max_height, tui_win_info::max_height, and
tui_win_info::max_width.

These member functions all subtract some constant from the theoretical
maximum height or width.  I've looked back through the history a
little and can see no real reason why these adjustments should be
needed, with these adjustments removed all the existing tui tests
still pass.

However, retaining these restrictions causes some bugs, consider:

  (gdb) tui new-layout hsrc {-horizontal src 1 cmd 1} 1

When this layout is selected with current master, gdb will leave a 4
line gap at the bottom of the terminal.

The problem is that the maximum height is restricted, for the cmd
window, to 4 less than the terminal height.

By removing this restriction gdb is able to size the windows to the
complete terminal height, and the layout is done correctly.

This 4 line restriction is also what prevents this layout from working
correctly:

  (gdb) tui new-layout conly cmd 1

Previously, this layout would present a cmd window only, but there
would be a 4 line gap at the bottom of the terminal.  This issue was
mentioned in an earlier commit in this series (when a different bug
was fixed), but with this commit, the above layout now correctly fills
the terminal.  The associated test is updated.

After removing the adjustment in tui_cmd_window::max_height, the
implementation is now the same as the implementation in the parent
class tui_win_info, so I've completely removed the max_height call
from tui_cmd_window.
2022-04-03 15:31:47 +01:00

74 lines
2.0 KiB
C

/* Specific command window processing.
Copyright (C) 1998-2022 Free Software Foundation, Inc.
Contributed by Hewlett-Packard Company.
This file is part of GDB.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
#include "defs.h"
#include "tui/tui.h"
#include "tui/tui-data.h"
#include "tui/tui-win.h"
#include "tui/tui-io.h"
#include "tui/tui-command.h"
#include "tui/tui-wingeneral.h"
#include "gdb_curses.h"
/* See tui-command.h. */
void
tui_cmd_window::resize (int height_, int width_, int origin_x, int origin_y)
{
width = width_;
height = height_;
x = origin_x;
y = origin_y;
if (handle == nullptr)
make_window ();
else
{
/* Another reason we don't call the base class method here is
that for the command window in particular, we want to avoid
destroying the underlying handle. We don't currently track
the contents of this window, and so have no way to re-render
it. However we can at least move it and keep the old size if
wresize isn't available. */
#ifdef HAVE_WRESIZE
wresize (handle.get (), height, width);
#endif
mvwin (handle.get (), y, x);
wmove (handle.get (), 0, 0);
}
}
/* See tui-command.h. */
void
tui_refresh_cmd_win (void)
{
WINDOW *w = TUI_CMD_WIN->handle.get ();
tui_wrefresh (w);
/* FIXME: It's not clear why this is here.
It was present in the original tui_puts code and is kept in order to
not introduce some subtle breakage. */
fflush (stdout);
}