Replace drawing with calls to delta functions, document terminal functions.
This commit is contained in:
parent
73d1cb4285
commit
96b12c7722
@ -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.
|
||||||
*/
|
*/
|
||||||
|
@ -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);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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,
|
||||||
|
Loading…
Reference in New Issue
Block a user