in src/terminal/display.c [866:960]
void guac_terminal_display_select(guac_terminal_display* display,
int start_row, int start_col, int end_row, int end_col) {
guac_socket* socket = display->client->socket;
guac_layer* select_layer = display->select_layer;
/* Do nothing if selection is unchanged */
if (display->text_selected
&& display->selection_start_row == start_row
&& display->selection_start_column == start_col
&& display->selection_end_row == end_row
&& display->selection_end_column == end_col)
return;
/* Text is now selected */
display->text_selected = true;
display->selection_start_row = start_row;
display->selection_start_column = start_col;
display->selection_end_row = end_row;
display->selection_end_column = end_col;
/* If single row, just need one rectangle */
if (start_row == end_row) {
/* Ensure proper ordering of columns */
if (start_col > end_col) {
int temp = start_col;
start_col = end_col;
end_col = temp;
}
/* Select characters between columns */
guac_protocol_send_rect(socket, select_layer,
start_col * display->char_width,
start_row * display->char_height,
(end_col - start_col + 1) * display->char_width,
display->char_height);
}
/* Otherwise, need three */
else {
/* Ensure proper ordering of start and end coords */
if (start_row > end_row) {
int temp;
temp = start_row;
start_row = end_row;
end_row = temp;
temp = start_col;
start_col = end_col;
end_col = temp;
}
/* First row */
guac_protocol_send_rect(socket, select_layer,
start_col * display->char_width,
start_row * display->char_height,
display->width * display->char_width,
display->char_height);
/* Middle */
guac_protocol_send_rect(socket, select_layer,
0,
(start_row + 1) * display->char_height,
display->width * display->char_width,
(end_row - start_row - 1) * display->char_height);
/* Last row */
guac_protocol_send_rect(socket, select_layer,
0,
end_row * display->char_height,
(end_col + 1) * display->char_width,
display->char_height);
}
/* Draw new selection, erasing old */
guac_protocol_send_cfill(socket, GUAC_COMP_SRC, select_layer,
0x00, 0x80, 0xFF, 0x60);
}