Keep highlight displayed until text beneath highlight is touched (low-level logic is stubbed).
This commit is contained in:
parent
14bf8dd843
commit
d89453e342
@ -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
|
||||||
|
|
||||||
|
@ -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) {
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user