Skip to content
73 changes: 31 additions & 42 deletions src/terminal/display.c
Original file line number Diff line number Diff line change
Expand Up @@ -922,7 +922,7 @@ void guac_terminal_display_dup(
}

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, bool rectangle) {

guac_socket* socket = display->client->socket;
guac_layer* select_layer = display->select_layer;
Expand Down Expand Up @@ -955,10 +955,8 @@ void guac_terminal_display_select(guac_terminal_display* display,

/* 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);

Expand All @@ -967,47 +965,38 @@ void guac_terminal_display_select(guac_terminal_display* display,
/* 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;

/* Multilines rectangular selection */
if (rectangle) {
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,
(end_row - start_row + 1) * display->char_height);
}

/* 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);
/* Multilines standard selection */
else {
/* 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);
}

}

Expand Down
17 changes: 12 additions & 5 deletions src/terminal/select.c
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,8 @@ void guac_terminal_select_redraw(guac_terminal* terminal) {
int end_row = terminal->selection_end_row + terminal->scroll_offset;
int end_column = terminal->selection_end_column;

guac_terminal_display_select(terminal->display, start_row, start_column, end_row, end_column);
guac_terminal_display_select(terminal->display, start_row,
start_column, end_row, end_column, terminal->rectangle_selection);

}

Expand Down Expand Up @@ -173,11 +174,17 @@ void guac_terminal_select_update(guac_terminal* terminal,
int new_start_column = guac_terminal_selection_point_round_up(start);
int new_end_column = guac_terminal_selection_point_round_down(end);

if (terminal->rectangle_selection && new_start_column > new_end_column) {
new_start_column = guac_terminal_selection_point_round_up(end);
new_end_column = guac_terminal_selection_point_round_down(start);
}

/* Only notify terminal if actual selection has changed */
if (terminal->selection_start_row != start->row ||
terminal->selection_start_column != new_start_column ||
terminal->selection_end_row != end->row ||
terminal->selection_end_column != new_end_column) {
terminal->selection_end_column != new_end_column ||
!terminal->text_selected) {

terminal->selection_start_row = start->row;
terminal->selection_start_column = new_start_column;
Expand Down Expand Up @@ -342,7 +349,7 @@ void guac_terminal_select_end(guac_terminal* terminal) {
for (int row = start_row; row <= end_row; row++) {

/* Add a newline only if the previous line was not wrapped */
if (!last_row_was_wrapped)
if (!last_row_was_wrapped || (terminal->rectangle_selection && row != start_row))
guac_common_clipboard_append(terminal->clipboard, "\n", 1);

/* Append next row from desired region, adjusting the start/end column
Expand All @@ -351,8 +358,8 @@ void guac_terminal_select_end(guac_terminal* terminal) {
* copied in their entirety. */
int length = guac_terminal_buffer_get_columns(terminal->current_buffer, &characters, &last_row_was_wrapped, row);
guac_terminal_clipboard_append_characters(terminal, characters, length,
(row == start_row) ? start_col : 0,
(row == end_row) ? end_col : length - 1);
(row == start_row || terminal->rectangle_selection) ? start_col : 0,
(row == end_row || terminal->rectangle_selection) ? end_col : length - 1);

}

Expand Down
Loading