Clear cells when resizing or scrolling.

This commit is contained in:
Michael Jumper 2013-04-26 14:52:51 -07:00
parent 6092badb3b
commit 3a50c9572d
2 changed files with 50 additions and 11 deletions

View File

@ -410,9 +410,14 @@ void guac_terminal_display_resize(guac_terminal_display* display, int width, int
guac_terminal_operation* current; guac_terminal_operation* current;
int x, y; int x, y;
/* Set width and height */ /* Fill with background color (index 0) */
display->width = width; guac_terminal_char fill = {
display->height = height; .value = ' ',
.attributes = {
.foreground = 0,
.background = 0
}
};
/* Free old operations buffer */ /* Free old operations buffer */
if (display->operations != NULL) if (display->operations != NULL)
@ -427,19 +432,34 @@ void guac_terminal_display_resize(guac_terminal_display* display, int width, int
for (y=0; y<height; y++) { for (y=0; y<height; y++) {
/* Init entire row to NOP */ /* Init entire row to NOP */
for (x=0; x<width; x++) for (x=0; x<width; x++) {
(current++)->type = GUAC_CHAR_NOP;
/* If on old part of screen, do not clear */
if (x < display->width && y < display->height)
current->type = GUAC_CHAR_NOP;
/* Otherwise, clear contents first */
else {
current->type = GUAC_CHAR_SET;
current->character = fill;
}
current++;
}
} }
/* Set width and height */
display->width = width;
display->height = height;
/* Send initial display size */ /* Send initial display size */
guac_protocol_send_size(display->client->socket, guac_protocol_send_size(display->client->socket,
GUAC_DEFAULT_LAYER, GUAC_DEFAULT_LAYER,
display->char_width * width, display->char_width * width,
display->char_height * height); display->char_height * height);
} }
void __guac_terminal_display_flush_copy(guac_terminal_display* display) { void __guac_terminal_display_flush_copy(guac_terminal_display* display) {

View File

@ -162,8 +162,21 @@ int guac_terminal_write(guac_terminal* term, const char* c, int size) {
int guac_terminal_scroll_up(guac_terminal* term, int guac_terminal_scroll_up(guac_terminal* term,
int start_row, int end_row, int amount) { int start_row, int end_row, int amount) {
/* Copy row data upwards */ /* If scrolling entire display, update scroll offset */
guac_terminal_copy_rows(term, start_row + amount, end_row, -amount); if (start_row == 0 && end_row == term->term_height - 1) {
/* Scroll up visibly */
guac_terminal_display_copy_rows(term->display, start_row + amount, end_row, -amount);
/* Advance by scroll amount */
term->buffer->top += amount;
term->buffer->length += amount;
}
/* Otherwise, just copy row data upwards */
else
guac_terminal_copy_rows(term, start_row + amount, end_row, -amount);
/* Clear new area */ /* Clear new area */
guac_terminal_clear_range(term, guac_terminal_clear_range(term,
@ -274,8 +287,11 @@ void guac_terminal_scroll_display_down(guac_terminal* terminal,
guac_terminal_buffer_row* buffer_row = guac_terminal_buffer_row* buffer_row =
guac_terminal_buffer_get_row(terminal->buffer, row, 0); guac_terminal_buffer_get_row(terminal->buffer, row, 0);
/* Clear row */
guac_terminal_display_set_columns(terminal->display,
dest_row, 0, terminal->display->width, &(terminal->default_char));
/* Draw row */ /* Draw row */
/* FIXME: Clear row first */
guac_terminal_char* current = buffer_row->characters; guac_terminal_char* current = buffer_row->characters;
for (column=0; column<buffer_row->length; column++) for (column=0; column<buffer_row->length; column++)
guac_terminal_display_set_columns(terminal->display, guac_terminal_display_set_columns(terminal->display,
@ -329,8 +345,11 @@ void guac_terminal_scroll_display_up(guac_terminal* terminal,
guac_terminal_buffer_row* buffer_row = guac_terminal_buffer_row* buffer_row =
guac_terminal_buffer_get_row(terminal->buffer, row, 0); guac_terminal_buffer_get_row(terminal->buffer, row, 0);
/* Clear row */
guac_terminal_display_set_columns(terminal->display,
dest_row, 0, terminal->display->width, &(terminal->default_char));
/* Draw row */ /* Draw row */
/* FIXME: Clear row first */
guac_terminal_char* current = buffer_row->characters; guac_terminal_char* current = buffer_row->characters;
for (column=0; column<buffer_row->length; column++) for (column=0; column<buffer_row->length; column++)
guac_terminal_display_set_columns(terminal->display, guac_terminal_display_set_columns(terminal->display,