Keep highlight displayed until text beneath highlight is touched (low-level logic is stubbed).

This commit is contained in:
Michael Jumper 2013-05-14 13:26:22 -07:00
parent 14bf8dd843
commit d89453e342
3 changed files with 94 additions and 14 deletions

View File

@ -198,6 +198,39 @@ typedef struct guac_terminal_display {
*/ */
guac_layer* filled_glyphs; guac_layer* filled_glyphs;
/**
* Whether text is being selected.
*/
bool text_selected;
/**
* Whether the selection is finished, and will no longer be modified. A
* committed selection remains highlighted for reference, but the
* highlight will be removed when the display changes.
*/
bool selection_committed;
/**
* The row that the selection starts at.
*/
int selection_start_row;
/**
* The column that the selection starts at.
*/
int selection_start_column;
/**
* The row that the selection ends at.
*/
int selection_end_row;
/**
* The column that the selection ends at.
*/
int selection_end_column;
} guac_terminal_display; } guac_terminal_display;
/** /**
@ -249,9 +282,10 @@ void guac_terminal_display_select(guac_terminal_display* display,
int start_row, int start_col, int end_row, int end_col); int start_row, int start_col, int end_row, int end_col);
/** /**
* Clears the select rectangle. * Commits the select rectangle, allowing the display to clear it when
* necessary.
*/ */
void guac_terminal_display_clear_select(guac_terminal_display* display); void guac_terminal_display_commit_select(guac_terminal_display* display);
#endif #endif

View File

@ -68,6 +68,35 @@ const guac_terminal_color guac_terminal_palette[16] = {
}; };
/**
* Clears the currently-selected region, removing the highlight.
*/
static void __guac_terminal_display_clear_select(guac_terminal_display* display) {
guac_socket* socket = display->client->socket;
guac_layer* select_layer = display->select_layer;
guac_protocol_send_rect(socket, select_layer, 0, 0, 1, 1);
guac_protocol_send_cfill(socket, GUAC_COMP_SRC, select_layer,
0x00, 0x00, 0x00, 0x00);
guac_socket_flush(socket);
/* Text is no longer selected */
display->text_selected =
display->selection_committed = false;
}
/**
* Returns whether at least one character within the given range is selected.
*/
static bool __guac_terminal_display_contains_selected(guac_terminal_display* display,
int start_row, int start_column, int end_row, int end_column) {
/* STUB */
return false;
}
/* Maps any codepoint onto a number between 0 and 511 inclusive */ /* Maps any codepoint onto a number between 0 and 511 inclusive */
int __guac_terminal_hash_codepoint(int codepoint) { int __guac_terminal_hash_codepoint(int codepoint) {
@ -345,6 +374,10 @@ guac_terminal_display* guac_terminal_display_alloc(guac_client* client, int fore
display->height = 0; display->height = 0;
display->operations = NULL; display->operations = NULL;
/* Initially nothing selected */
display->text_selected =
display->selection_committed = false;
return display; return display;
} }
@ -398,6 +431,11 @@ void guac_terminal_display_copy_columns(guac_terminal_display* display, int row,
} }
/* If selection visible and committed, clear if update touches selection */
if (display->text_selected && display->selection_committed &&
__guac_terminal_display_contains_selected(display, row, row, start_column, end_column))
__guac_terminal_display_clear_select(display);
} }
void guac_terminal_display_copy_rows(guac_terminal_display* display, void guac_terminal_display_copy_rows(guac_terminal_display* display,
@ -443,6 +481,11 @@ void guac_terminal_display_copy_rows(guac_terminal_display* display,
} }
/* If selection visible and committed, clear if update touches selection */
if (display->text_selected && display->selection_committed &&
__guac_terminal_display_contains_selected(display, start_row, end_row, 0, display->width - 1))
__guac_terminal_display_clear_select(display);
} }
void guac_terminal_display_set_columns(guac_terminal_display* display, int row, void guac_terminal_display_set_columns(guac_terminal_display* display, int row,
@ -472,6 +515,11 @@ void guac_terminal_display_set_columns(guac_terminal_display* display, int row,
current++; current++;
} }
/* If selection visible and committed, clear if update touches selection */
if (display->text_selected && display->selection_committed &&
__guac_terminal_display_contains_selected(display, row, row, start_column, end_column))
__guac_terminal_display_clear_select(display);
} }
void guac_terminal_display_resize(guac_terminal_display* display, int width, int height) { void guac_terminal_display_resize(guac_terminal_display* display, int width, int height) {
@ -534,6 +582,10 @@ void guac_terminal_display_resize(guac_terminal_display* display, int width, int
display->char_width * width, display->char_width * width,
display->char_height * height); display->char_height * height);
/* If selection visible and committed, clear */
if (display->text_selected && display->selection_committed)
__guac_terminal_display_clear_select(display);
} }
void __guac_terminal_display_flush_copy(guac_terminal_display* display) { void __guac_terminal_display_flush_copy(guac_terminal_display* display) {
@ -841,17 +893,8 @@ void guac_terminal_display_flush(guac_terminal_display* display) {
} }
void guac_terminal_display_clear_select(guac_terminal_display* display) { void guac_terminal_display_commit_select(guac_terminal_display* display) {
display->selection_committed = true;
guac_socket* socket = display->client->socket;
guac_layer* select_layer = display->select_layer;
guac_protocol_send_rect(socket, select_layer, 0, 0, 1, 1);
guac_protocol_send_cfill(socket, GUAC_COMP_SRC, select_layer,
0x00, 0x00, 0x00, 0x00);
guac_socket_flush(socket);
} }
void guac_terminal_display_select(guac_terminal_display* display, void guac_terminal_display_select(guac_terminal_display* display,
@ -860,6 +903,9 @@ void guac_terminal_display_select(guac_terminal_display* display,
guac_socket* socket = display->client->socket; guac_socket* socket = display->client->socket;
guac_layer* select_layer = display->select_layer; guac_layer* select_layer = display->select_layer;
/* Text is now selected */
display->text_selected = true;
/* If single row, just need one rectangle */ /* If single row, just need one rectangle */
if (start_row == end_row) { if (start_row == end_row) {

View File

@ -428,7 +428,7 @@ void guac_terminal_select_end(guac_terminal* terminal, char* string) {
/* Deselect */ /* Deselect */
terminal->text_selected = false; terminal->text_selected = false;
guac_terminal_display_clear_select(terminal->display); guac_terminal_display_commit_select(terminal->display);
guac_terminal_buffer_row* buffer_row; guac_terminal_buffer_row* buffer_row;