Proper handling of new rows and removed rows.
This commit is contained in:
parent
22ee486019
commit
ac52c8fb64
@ -414,10 +414,77 @@ void guac_terminal_set_columns(guac_terminal* terminal, int row,
|
|||||||
|
|
||||||
void guac_terminal_resize(guac_terminal* term, int width, int height) {
|
void guac_terminal_resize(guac_terminal* term, int width, int height) {
|
||||||
|
|
||||||
|
/* If height is decreasing, shift display up */
|
||||||
|
if (height < term->term_height) {
|
||||||
|
|
||||||
|
int shift_amount;
|
||||||
|
|
||||||
|
/* Get number of rows actually occupying terminal space */
|
||||||
|
int used_height = term->buffer->length;
|
||||||
|
if (used_height > term->term_height)
|
||||||
|
used_height = term->term_height;
|
||||||
|
|
||||||
|
shift_amount = used_height - height;
|
||||||
|
|
||||||
|
/* If the new terminal bottom covers N rows, shift up N rows */
|
||||||
|
if (shift_amount > 0) {
|
||||||
|
|
||||||
|
guac_terminal_display_copy_rows(term->display,
|
||||||
|
shift_amount, term->display->height - 1, -shift_amount);
|
||||||
|
|
||||||
|
/* Update buffer top and cursor row based on shift */
|
||||||
|
term->buffer->top += shift_amount;
|
||||||
|
term->cursor_row -= shift_amount;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/* Resize display */
|
/* Resize display */
|
||||||
guac_terminal_display_flush(term->display);
|
guac_terminal_display_flush(term->display);
|
||||||
guac_terminal_display_resize(term->display, width, height);
|
guac_terminal_display_resize(term->display, width, height);
|
||||||
|
|
||||||
|
/* If height is increasing, shift display down */
|
||||||
|
if (height > term->term_height) {
|
||||||
|
|
||||||
|
/* If undisplayed rows exist in the buffer, shift them into view */
|
||||||
|
if (term->term_height < term->buffer->length) {
|
||||||
|
|
||||||
|
/* If the new terminal bottom reveals N rows, shift down N rows */
|
||||||
|
int shift_amount = height - term->term_height;
|
||||||
|
|
||||||
|
/* The maximum amount we can shift is the number of undisplayed rows */
|
||||||
|
int max_shift = term->buffer->length - term->term_height;
|
||||||
|
|
||||||
|
if (shift_amount > max_shift)
|
||||||
|
shift_amount = max_shift;
|
||||||
|
|
||||||
|
/* Update buffer top and cursor row based on shift */
|
||||||
|
term->buffer->top -= shift_amount;
|
||||||
|
term->cursor_row += shift_amount;
|
||||||
|
|
||||||
|
/* If scrolled enough, use scroll to fulfill entire resize */
|
||||||
|
if (term->scroll_offset >= shift_amount)
|
||||||
|
term->scroll_offset -= shift_amount;
|
||||||
|
|
||||||
|
/* Otherwise, fulfill with as much scroll as possible */
|
||||||
|
else {
|
||||||
|
|
||||||
|
/* Attempt to fulfill part with scroll */
|
||||||
|
shift_amount -= term->scroll_offset;
|
||||||
|
term->scroll_offset = 0;
|
||||||
|
|
||||||
|
/* If anything remains, move screen as necessary */
|
||||||
|
if (shift_amount > 0)
|
||||||
|
guac_terminal_display_copy_rows(term->display,
|
||||||
|
0, term->display->height - shift_amount - 1, shift_amount);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
} /* end if undisplayed rows exist */
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/* Commit new dimensions */
|
/* Commit new dimensions */
|
||||||
term->term_width = width;
|
term->term_width = width;
|
||||||
term->term_height = height;
|
term->term_height = height;
|
||||||
|
Loading…
Reference in New Issue
Block a user