Term::command "winheight src +5"
Term::check_box "larger source box again" 0 0 80 15
+# Check that attempting a window to be too large gives an error.
+Term::command "winheight src 100"
+Term::check_box "source box has not changed" 0 0 80 15
+Term::check_region_contents "check error message about src size 100" 0 16 80 8 \
+ [multi_line "$gdb_prompt winheight src 100\\s+" \
+ "warning: Invalid window height specified\\s+" \
+ "$gdb_prompt"]
+
+# Check that incrementing to a size that is "too big" will trigger an
+# error, and that the window doesn't resize.
+Term::command "winheight src 20"
+Term::check_box "source box is at its max size" 0 0 80 20
+Term::command "winheight src +1"
+Term::check_box "source box is still at its max size" 0 0 80 20
+Term::check_region_contents "check error message about src +1" 0 21 80 3 \
+ [multi_line "$gdb_prompt winheight src \\+1\\s+" \
+ "warning: Invalid window height specified\\s+" \
+ "$gdb_prompt"]
+
+# Reset the cmd window to a sane size.
+Term::command "winheight cmd 8"
+
+Term::command "layout regs"
+Term::check_box "register window" 0 0 80 8
+Term::check_box "source window" 0 7 80 8
+
+Term::command "winheight cmd 10"
+Term::check_box "register window after resize" 0 0 80 7
+Term::check_box "source window after resize" 0 6 80 7
+
# At one point we had a bug where adjusting the winheight would result
# in GDB keeping hold of duplicate window pointers, which it might
# then try to delete when the layout was changed. Running this test
# under valgrind would expose that bug.
Term::command "layout asm"
+Term::command "winheight cmd 8"
Term::check_box "check for asm window" 0 0 80 15
tui_debug_printf ("before delta (%d) distribution, weights: %s",
delta, tui_debug_weights_to_string ().c_str ());
- /* Distribute the "delta" over the next window; but if the next
- window cannot hold it all, keep going until we either find a
- window that does, or until we loop all the way around. */
- for (int i = 0; delta != 0 && i < m_splits.size () - 1; ++i)
+ /* Distribute the "delta" over all other windows, while respecting their
+ min/max sizes. We grow each window by 1 line at a time continually
+ looping over all the windows. However, skip the window that the user
+ just resized, obviously we don't want to readjust that window. */
+ bool found_window_that_can_grow_p = true;
+ for (int i = 0; delta != 0; i = (i + 1) % m_splits.size ())
{
int index = (found_index + 1 + i) % m_splits.size ();
+ if (index == found_index)
+ {
+ if (!found_window_that_can_grow_p)
+ break;
+ found_window_that_can_grow_p = false;
+ continue;
+ }
int new_min, new_max;
m_splits[index].layout->get_sizes (m_vertical, &new_min, &new_max);
{
/* The primary window grew, so we are trying to shrink other
windows. */
- int available = m_splits[index].weight - new_min;
- int shrink_by = std::min (available, -delta);
- m_splits[index].weight -= shrink_by;
- delta += shrink_by;
+ if (m_splits[index].weight > new_min)
+ {
+ m_splits[index].weight -= 1;
+ delta += 1;
+ found_window_that_can_grow_p = true;
+ }
}
else
{
/* The primary window shrank, so we are trying to grow other
windows. */
- int available = new_max - m_splits[index].weight;
- int grow_by = std::min (available, delta);
- m_splits[index].weight += grow_by;
- delta -= grow_by;
+ if (m_splits[index].weight < new_max)
+ {
+ m_splits[index].weight += 1;
+ delta -= 1;
+ found_window_that_can_grow_p = true;
+ }
}
tui_debug_printf ("index = %d, weight now: %d",