Replace drawing with calls to delta functions, document terminal functions.

This commit is contained in:
Michael Jumper 2013-03-24 16:56:17 -07:00
parent 73d1cb4285
commit 96b12c7722
3 changed files with 86 additions and 42 deletions

View File

@ -348,28 +348,46 @@ void guac_terminal_free(guac_terminal* term);
*/ */
int guac_terminal_write(guac_terminal* term, const char* c, int size); int guac_terminal_write(guac_terminal* term, const char* c, int size);
int guac_terminal_set_colors(guac_terminal* term, /**
int foreground, int background); * Sets the character at the given row and column to the specified value.
*/
int guac_terminal_set(guac_terminal* term, int row, int col, char c); int guac_terminal_set(guac_terminal* term, int row, int col, char c);
/**
* Copies a rectangular region of characters which may overlap with the
* destination.
*/
int guac_terminal_copy(guac_terminal* term, int guac_terminal_copy(guac_terminal* term,
int src_row, int src_col, int rows, int cols, int src_row, int src_col, int rows, int cols,
int dst_row, int dst_col); int dst_row, int dst_col);
/**
* Clears a rectangular region of characters, replacing them with the
* given background color.
*/
int guac_terminal_clear(guac_terminal* term, int guac_terminal_clear(guac_terminal* term,
int row, int col, int rows, int cols, int background_color); int row, int col, int rows, int cols, int background_color);
int guac_terminal_scroll_up(guac_terminal* term, /**
int start_row, int end_row, int amount); * Clears the given region from right-to-left, top-to-bottom, replacing
* all characters with the given background color.
int guac_terminal_scroll_down(guac_terminal* term, */
int start_row, int end_row, int amount);
int guac_terminal_clear_range(guac_terminal* term, int guac_terminal_clear_range(guac_terminal* term,
int start_row, int start_col, int start_row, int start_col,
int end_row, int end_col, int background_color); int end_row, int end_col, int background_color);
/**
* Scrolls the terminal's current scroll region up by one row.
*/
int guac_terminal_scroll_up(guac_terminal* term,
int start_row, int end_row, int amount);
/**
* Scrolls the terminal's current scroll region down by one row.
*/
int guac_terminal_scroll_down(guac_terminal* term,
int start_row, int end_row, int amount);
/** /**
* Allocates a new guac_terminal_delta. * Allocates a new guac_terminal_delta.
*/ */

View File

@ -189,6 +189,12 @@ void guac_terminal_free(guac_terminal* term) {
} }
/**
* Returns the location of the given character in the glyph cache layer,
* sending it first if necessary. The location returned is in characters,
* and thus must be multiplied by the glyph width to obtain the actual
* location within the glyph cache layer.
*/
int __guac_terminal_get_glyph(guac_terminal* term, char c) { int __guac_terminal_get_glyph(guac_terminal* term, char c) {
guac_socket* socket = term->client->socket; guac_socket* socket = term->client->socket;
@ -264,11 +270,30 @@ int __guac_terminal_get_glyph(guac_terminal* term, char c) {
} }
int guac_terminal_set_colors(guac_terminal* term, /**
int foreground, int background) { * Sets the attributes of the glyph cache layer such that future copies from
* this layer will display as expected.
*/
int __guac_terminal_set_colors(guac_terminal* term,
guac_terminal_attributes* attributes) {
guac_socket* socket = term->client->socket; guac_socket* socket = term->client->socket;
const guac_terminal_color* background_color; const guac_terminal_color* background_color;
int background, foreground;
/* Handle reverse video */
if (attributes->reverse) {
background = attributes->foreground;
foreground = attributes->background;
}
else {
foreground = attributes->foreground;
background = attributes->background;
}
/* Handle bold */
if (attributes->bold && foreground <= 7)
foreground += 8;
/* Get background color */ /* Get background color */
background_color = &guac_terminal_palette[background]; background_color = &guac_terminal_palette[background];
@ -294,7 +319,8 @@ int guac_terminal_set_colors(guac_terminal* term,
} }
/* If any color change at all, update filled */ /* If any color change at all, update filled */
if (foreground != term->glyph_foreground || background != term->glyph_background) { if (foreground != term->glyph_foreground
|| background != term->glyph_background) {
/* Set background */ /* Set background */
guac_protocol_send_rect(socket, term->filled_glyphs, guac_protocol_send_rect(socket, term->filled_glyphs,
@ -325,7 +351,12 @@ int guac_terminal_set_colors(guac_terminal* term,
} }
int guac_terminal_set(guac_terminal* term, int row, int col, char c) { /**
* Sends the given character to the terminal at the given row and column,
* rendering the charater immediately. This bypasses the guac_terminal_delta
* mechanism and is intended for flushing of updates only.
*/
int __guac_terminal_set(guac_terminal* term, int row, int col, char c) {
guac_socket* socket = term->client->socket; guac_socket* socket = term->client->socket;
int location = __guac_terminal_get_glyph(term, c); int location = __guac_terminal_get_glyph(term, c);
@ -339,6 +370,19 @@ int guac_terminal_set(guac_terminal* term, int row, int col, char c) {
} }
int guac_terminal_set(guac_terminal* term, int row, int col, char c) {
/* Build character with current attributes */
guac_terminal_char guac_char;
guac_char.value = c;
guac_char.attributes = term->current_attributes;
/* Set delta */
guac_terminal_delta_set(term->delta, row, col, &guac_char);
return 0;
}
int guac_terminal_write(guac_terminal* term, const char* c, int size) { int guac_terminal_write(guac_terminal* term, const char* c, int size) {
while (size > 0) { while (size > 0) {
@ -354,17 +398,13 @@ int guac_terminal_copy(guac_terminal* term,
int src_row, int src_col, int rows, int cols, int src_row, int src_col, int rows, int cols,
int dst_row, int dst_col) { int dst_row, int dst_col) {
guac_socket* socket = term->client->socket; /* Update delta */
guac_terminal_delta_copy(term->delta,
dst_row, dst_col,
src_row, src_col,
cols, rows);
/* Send copy instruction */ return 0;
return guac_protocol_send_copy(socket,
GUAC_DEFAULT_LAYER,
src_col * term->char_width, src_row * term->char_height,
cols * term->char_width, rows * term->char_height,
GUAC_COMP_OVER, GUAC_DEFAULT_LAYER,
dst_col * term->char_width, dst_row * term->char_height);
} }

View File

@ -42,9 +42,6 @@
int guac_terminal_echo(guac_terminal* term, char c) { int guac_terminal_echo(guac_terminal* term, char c) {
int foreground = term->current_attributes.foreground;
int background = term->current_attributes.background;
switch (c) { switch (c) {
/* Bell */ /* Bell */
@ -71,7 +68,8 @@ int guac_terminal_echo(guac_terminal* term, char c) {
term->cursor_row = term->scroll_end; term->cursor_row = term->scroll_end;
/* Scroll up by one row */ /* Scroll up by one row */
guac_terminal_scroll_up(term, term->scroll_start, term->scroll_end, 1); guac_terminal_scroll_up(term, term->scroll_start,
term->scroll_end, 1);
} }
break; break;
@ -95,24 +93,12 @@ int guac_terminal_echo(guac_terminal* term, char c) {
term->cursor_row = term->scroll_end; term->cursor_row = term->scroll_end;
/* Scroll up by one row */ /* Scroll up by one row */
guac_terminal_scroll_up(term, term->scroll_start, term->scroll_end, 1); guac_terminal_scroll_up(term, term->scroll_start,
term->scroll_end, 1);
} }
/* Handle reverse video */ /* Write character */
if (term->current_attributes.reverse) {
int swap = background;
background = foreground;
foreground = swap;
}
/* Handle bold */
if (term->current_attributes.bold && foreground <= 7)
foreground += 8;
guac_terminal_set_colors(term,
foreground, background);
guac_terminal_set(term, guac_terminal_set(term,
term->cursor_row, term->cursor_row,
term->cursor_col, term->cursor_col,