Implement more console codes and reverse linefeed, de-stub buffer functions.
This commit is contained in:
parent
edc4c223bb
commit
3a32e7084c
@ -36,8 +36,10 @@
|
|||||||
* ***** END LICENSE BLOCK ***** */
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
#include "buffer.h"
|
#include "buffer.h"
|
||||||
|
#include "common.h"
|
||||||
|
|
||||||
guac_terminal_buffer* guac_terminal_buffer_alloc(int rows, guac_terminal_char* default_character) {
|
guac_terminal_buffer* guac_terminal_buffer_alloc(int rows, guac_terminal_char* default_character) {
|
||||||
|
|
||||||
@ -132,12 +134,66 @@ guac_terminal_buffer_row* guac_terminal_buffer_get_row(guac_terminal_buffer* buf
|
|||||||
|
|
||||||
void guac_terminal_buffer_copy_columns(guac_terminal_buffer* buffer, int row,
|
void guac_terminal_buffer_copy_columns(guac_terminal_buffer* buffer, int row,
|
||||||
int start_column, int end_column, int offset) {
|
int start_column, int end_column, int offset) {
|
||||||
/* STUB */
|
|
||||||
|
guac_terminal_char* src;
|
||||||
|
guac_terminal_char* dst;
|
||||||
|
|
||||||
|
/* Get row */
|
||||||
|
guac_terminal_buffer_row* buffer_row = guac_terminal_buffer_get_row(buffer, row, end_column + offset + 1);
|
||||||
|
|
||||||
|
/* Fit range within bounds */
|
||||||
|
start_column = guac_terminal_fit_to_range(start_column, 0, buffer_row->length - 1);
|
||||||
|
end_column = guac_terminal_fit_to_range(end_column, 0, buffer_row->length - 1);
|
||||||
|
start_column = guac_terminal_fit_to_range(start_column + offset, 0, buffer_row->length - 1) - offset;
|
||||||
|
end_column = guac_terminal_fit_to_range(end_column + offset, 0, buffer_row->length - 1) - offset;
|
||||||
|
|
||||||
|
/* Determine source and destination locations */
|
||||||
|
src = &(buffer_row->characters[start_column]);
|
||||||
|
dst = &(buffer_row->characters[start_column + offset]);
|
||||||
|
|
||||||
|
/* Copy data */
|
||||||
|
memmove(dst, src, sizeof(guac_terminal_char) * (end_column - start_column + 1));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void guac_terminal_buffer_copy_rows(guac_terminal_buffer* buffer,
|
void guac_terminal_buffer_copy_rows(guac_terminal_buffer* buffer,
|
||||||
int start_row, int end_row, int offset) {
|
int start_row, int end_row, int offset) {
|
||||||
/* STUB */
|
|
||||||
|
int row;
|
||||||
|
int step;
|
||||||
|
|
||||||
|
/* If shifting down, copy in reverse */
|
||||||
|
if (offset > 0) {
|
||||||
|
|
||||||
|
/* Swap start/end */
|
||||||
|
int temp = end_row;
|
||||||
|
end_row = start_row;
|
||||||
|
start_row = temp;
|
||||||
|
|
||||||
|
/* Iterate backwards */
|
||||||
|
step = -1;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Otherwise, copy forwards */
|
||||||
|
else
|
||||||
|
step = 1;
|
||||||
|
|
||||||
|
/* Copy each row individually */
|
||||||
|
for (row = start_row; row <= end_row; row += step) {
|
||||||
|
|
||||||
|
guac_terminal_buffer_row* src_row;
|
||||||
|
guac_terminal_buffer_row* dst_row;
|
||||||
|
|
||||||
|
/* Get source and destination rows */
|
||||||
|
src_row = guac_terminal_buffer_get_row(buffer, row, 0);
|
||||||
|
dst_row = guac_terminal_buffer_get_row(buffer, row + offset, src_row->length);
|
||||||
|
|
||||||
|
/* Copy data */
|
||||||
|
memcpy(dst_row->characters, src_row->characters, sizeof(guac_terminal_char) * src_row->length);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void guac_terminal_buffer_set_columns(guac_terminal_buffer* buffer, int row,
|
void guac_terminal_buffer_set_columns(guac_terminal_buffer* buffer, int row,
|
||||||
|
@ -75,8 +75,10 @@ int guac_terminal_echo(guac_terminal* term, char c) {
|
|||||||
bytes_remaining--;
|
bytes_remaining--;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Unrecognized prefix */
|
||||||
else {
|
else {
|
||||||
/* FIXME: Handle */
|
codepoint = '?';
|
||||||
|
bytes_remaining = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If we need more bytes, wait for more bytes */
|
/* If we need more bytes, wait for more bytes */
|
||||||
@ -170,6 +172,23 @@ int guac_terminal_escape(guac_terminal* term, char c) {
|
|||||||
term->char_handler = guac_terminal_csi;
|
term->char_handler = guac_terminal_csi;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'M': /* Reverse Linefeed */
|
||||||
|
|
||||||
|
term->cursor_row--;
|
||||||
|
|
||||||
|
/* Scroll down if necessary */
|
||||||
|
if (term->cursor_row < term->scroll_start) {
|
||||||
|
term->cursor_row = term->scroll_start;
|
||||||
|
|
||||||
|
/* Scroll down by one row */
|
||||||
|
guac_terminal_scroll_down(term, term->scroll_start,
|
||||||
|
term->scroll_end, 1);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
term->char_handler = guac_terminal_echo;
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
guac_client_log_info(term->client, "Unhandled ESC sequence: %c", c);
|
guac_client_log_info(term->client, "Unhandled ESC sequence: %c", c);
|
||||||
term->char_handler = guac_terminal_echo;
|
term->char_handler = guac_terminal_echo;
|
||||||
@ -334,14 +353,14 @@ int guac_terminal_csi(guac_terminal* term, char c) {
|
|||||||
else if (value == 7)
|
else if (value == 7)
|
||||||
term->current_attributes.reverse = true;
|
term->current_attributes.reverse = true;
|
||||||
|
|
||||||
|
/* Reset underscore */
|
||||||
|
else if (value == 24)
|
||||||
|
term->current_attributes.underscore = false;
|
||||||
|
|
||||||
/* Reset reverse video */
|
/* Reset reverse video */
|
||||||
else if (value == 27)
|
else if (value == 27)
|
||||||
term->current_attributes.reverse = false;
|
term->current_attributes.reverse = false;
|
||||||
|
|
||||||
/* Reset intensity */
|
|
||||||
else if (value == 27)
|
|
||||||
term->current_attributes.bold = false;
|
|
||||||
|
|
||||||
else
|
else
|
||||||
guac_client_log_info(term->client,
|
guac_client_log_info(term->client,
|
||||||
"Unhandled graphics rendition: %i", value);
|
"Unhandled graphics rendition: %i", value);
|
||||||
|
Loading…
Reference in New Issue
Block a user