#include <signal.h>
-static enum tui_status tui_adjust_win_heights (struct tui_win_info *,
- int);
-static int new_height_ok (struct tui_win_info *, int);
static void tui_set_tab_width_command (const char *, int);
static void tui_refresh_all_command (const char *, int);
static void tui_all_windows_info (const char *, int);
/* Now change the window's height, and adjust
all other windows around it. */
- if (tui_adjust_win_heights (win_info,
- new_height) == TUI_FAILURE)
- warning (_("Invalid window height specified.\n%s"),
- WIN_HEIGHT_USAGE);
- else
- tui_update_gdb_sizes ();
+ tui_adjust_window_height (win_info, new_height);
+ tui_update_gdb_sizes ();
}
else
warning (_("Invalid window height specified.\n%s"),
printf_filtered (WIN_HEIGHT_USAGE);
}
-/* Function to adjust all window heights around the primary. */
-static enum tui_status
-tui_adjust_win_heights (struct tui_win_info *primary_win_info,
- int new_height)
-{
- enum tui_status status = TUI_FAILURE;
-
- if (new_height_ok (primary_win_info, new_height))
- {
- status = TUI_SUCCESS;
- if (new_height != primary_win_info->height)
- {
- int diff;
- struct tui_win_info *win_info;
- struct tui_locator_window *locator = tui_locator_win_info_ptr ();
- enum tui_layout_type cur_layout = tui_current_layout ();
- int width = tui_term_width ();
-
- diff = (new_height - primary_win_info->height) * (-1);
- if (cur_layout == SRC_COMMAND
- || cur_layout == DISASSEM_COMMAND)
- {
- struct tui_win_info *src_win_info;
-
- primary_win_info->resize (new_height, width,
- 0, primary_win_info->y);
- if (primary_win_info->type == CMD_WIN)
- {
- win_info = *(tui_source_windows ().begin ());
- src_win_info = win_info;
- }
- else
- {
- win_info = tui_win_list[CMD_WIN];
- src_win_info = primary_win_info;
- }
- win_info->resize (win_info->height + diff, width,
- 0, win_info->y);
- TUI_CMD_WIN->y = locator->y + 1;
- if ((src_win_info->type == SRC_WIN
- || src_win_info->type == DISASSEM_WIN))
- {
- tui_source_window_base *src_base
- = (tui_source_window_base *) src_win_info;
- if (src_base->content.empty ())
- src_base->erase_source_content ();
- }
- }
- else
- {
- struct tui_win_info *first_win;
- struct tui_source_window_base *second_win;
- tui_source_window_base *src1;
-
- if (cur_layout == SRC_DISASSEM_COMMAND)
- {
- src1 = TUI_SRC_WIN;
- first_win = src1;
- second_win = TUI_DISASM_WIN;
- }
- else
- {
- src1 = nullptr;
- first_win = TUI_DATA_WIN;
- second_win = *(tui_source_windows ().begin ());
- }
- if (primary_win_info == TUI_CMD_WIN)
- { /* Split the change in height across the 1st & 2nd
- windows, adjusting them as well. */
- /* Subtract the locator. */
- int first_split_diff = diff / 2;
- int second_split_diff = first_split_diff;
-
- if (diff % 2)
- {
- if (first_win->height >
- second_win->height)
- if (diff < 0)
- first_split_diff--;
- else
- first_split_diff++;
- else
- {
- if (diff < 0)
- second_split_diff--;
- else
- second_split_diff++;
- }
- }
- /* Make sure that the minimum heights are
- honored. */
- while ((first_win->height + first_split_diff) < 3)
- {
- first_split_diff++;
- second_split_diff--;
- }
- while ((second_win->height + second_split_diff) < 3)
- {
- second_split_diff++;
- first_split_diff--;
- }
- first_win->resize (first_win->height + first_split_diff,
- width,
- 0, first_win->y);
- second_win->resize (second_win->height + second_split_diff,
- width,
- 0, first_win->height - 1);
- locator->resize (1, width,
- 0, (second_win->y
- + second_win->height + 1));
-
- TUI_CMD_WIN->resize (new_height, width,
- 0, locator->y + 1);
- }
- else
- {
- if ((TUI_CMD_WIN->height + diff) < 1)
- { /* If there is no way to increase the command
- window take real estate from the 1st or 2nd
- window. */
- if ((TUI_CMD_WIN->height + diff) < 1)
- {
- int i;
-
- for (i = TUI_CMD_WIN->height + diff;
- (i < 1); i++)
- if (primary_win_info == first_win)
- second_win->height--;
- else
- first_win->height--;
- }
- }
- if (primary_win_info == first_win)
- first_win->resize (new_height, width, 0, 0);
- else
- first_win->resize (first_win->height, width, 0, 0);
- second_win->y = first_win->height - 1;
- if (primary_win_info == second_win)
- second_win->resize (new_height, width,
- 0, first_win->height - 1);
- else
- second_win->resize (second_win->height, width,
- 0, first_win->height - 1);
- locator->resize (1, width,
- 0, (second_win->y
- + second_win->height + 1));
- TUI_CMD_WIN->y = locator->y + 1;
- if ((TUI_CMD_WIN->height + diff) < 1)
- TUI_CMD_WIN->resize (1, width, 0, locator->y + 1);
- else
- TUI_CMD_WIN->resize (TUI_CMD_WIN->height + diff, width,
- 0, locator->y + 1);
- }
- if (src1 != nullptr && src1->content.empty ())
- src1->erase_source_content ();
- if (second_win->content.empty ())
- second_win->erase_source_content ();
- }
- }
- }
-
- return status;
-}
-
/* See tui-data.h. */
int
return tui_term_height () - 2;
}
-static int
-new_height_ok (struct tui_win_info *primary_win_info,
- int new_height)
-{
- int ok = (new_height < tui_term_height ());
-
- if (ok)
- {
- int diff;
- enum tui_layout_type cur_layout = tui_current_layout ();
-
- diff = (new_height - primary_win_info->height) * (-1);
- if (cur_layout == SRC_COMMAND || cur_layout == DISASSEM_COMMAND)
- {
- ok = (new_height <= primary_win_info->max_height ()
- && new_height >= MIN_CMD_WIN_HEIGHT);
- if (ok)
- { /* Check the total height. */
- struct tui_win_info *win_info;
-
- if (primary_win_info == TUI_CMD_WIN)
- win_info = *(tui_source_windows ().begin ());
- else
- win_info = TUI_CMD_WIN;
- ok = ((new_height +
- (win_info->height + diff)) <= tui_term_height ());
- }
- }
- else
- {
- int cur_total_height, total_height, min_height = 0;
- struct tui_win_info *first_win;
- struct tui_win_info *second_win;
-
- if (cur_layout == SRC_DISASSEM_COMMAND)
- {
- first_win = TUI_SRC_WIN;
- second_win = TUI_DISASM_WIN;
- }
- else
- {
- first_win = TUI_DATA_WIN;
- second_win = *(tui_source_windows ().begin ());
- }
- /* We could simply add all the heights to obtain the same
- result but below is more explicit since we subtract 1 for
- the line that the first and second windows share, and add
- one for the locator. */
- total_height = cur_total_height =
- (first_win->height + second_win->height - 1)
- + TUI_CMD_WIN->height + 1; /* Locator. */
- if (primary_win_info == TUI_CMD_WIN)
- {
- /* Locator included since first & second win share a line. */
- ok = ((first_win->height +
- second_win->height + diff) >=
- (MIN_WIN_HEIGHT * 2)
- && new_height >= MIN_CMD_WIN_HEIGHT);
- if (ok)
- {
- total_height = new_height +
- (first_win->height +
- second_win->height + diff);
- min_height = MIN_CMD_WIN_HEIGHT;
- }
- }
- else
- {
- min_height = MIN_WIN_HEIGHT;
-
- /* First see if we can increase/decrease the command
- window. And make sure that the command window is at
- least 1 line. */
- ok = ((TUI_CMD_WIN->height + diff) > 0);
- if (!ok)
- { /* Looks like we have to increase/decrease one of
- the other windows. */
- if (primary_win_info == first_win)
- ok = (second_win->height + diff) >= min_height;
- else
- ok = (first_win->height + diff) >= min_height;
- }
- if (ok)
- {
- if (primary_win_info == first_win)
- total_height = new_height +
- second_win->height +
- TUI_CMD_WIN->height + diff;
- else
- total_height = new_height +
- first_win->height +
- TUI_CMD_WIN->height + diff;
- }
- }
- /* Now make sure that the proposed total height doesn't
- exceed the old total height. */
- if (ok)
- ok = (new_height >= min_height
- && total_height <= cur_total_height);
- }
- }
-
- return ok;
-}
-
-
static void
parse_scrolling_args (const char *arg,
struct tui_win_info **win_to_scroll,