Skip to content

Commit

Permalink
GUACAMOLE-1961: Allow rectangular selection when ALT key is pressed.
Browse files Browse the repository at this point in the history
  • Loading branch information
corentin-soriano committed Jul 30, 2024
1 parent fa4e881 commit 3246acb
Show file tree
Hide file tree
Showing 3 changed files with 68 additions and 28 deletions.
52 changes: 33 additions & 19 deletions src/terminal/display.c
Original file line number Diff line number Diff line change
Expand Up @@ -863,7 +863,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 @@ -923,32 +923,46 @@ void guac_terminal_display_select(guac_terminal_display* display,

}

/* First row */
guac_protocol_send_rect(socket, select_layer,
/* Multilines rectangular selection */
if (rectangle) {
guac_protocol_send_rect(socket, select_layer,

start_col * display->char_width,
start_row * display->char_height,
start_col * display->char_width,
start_row * display->char_height,

display->width * display->char_width,
display->char_height);
(end_col - start_col + 1) * display->char_width,
(end_row - start_row + 1) * display->char_height);
}

/* Middle */
guac_protocol_send_rect(socket, select_layer,
/* Multilines standard selection */
else {
/* First row */
guac_protocol_send_rect(socket, select_layer,

0,
(start_row + 1) * display->char_height,
start_col * display->char_width,
start_row * display->char_height,

display->width * display->char_width,
(end_row - start_row - 1) * display->char_height);
display->width * display->char_width,
display->char_height);

/* Last row */
guac_protocol_send_rect(socket, select_layer,
/* Middle */
guac_protocol_send_rect(socket, select_layer,

0,
end_row * display->char_height,
0,
(start_row + 1) * display->char_height,

(end_col + 1) * display->char_width,
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
22 changes: 14 additions & 8 deletions src/terminal/select.c
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,8 @@ void guac_terminal_select_redraw(guac_terminal* terminal) {
else
end_column += terminal->selection_end_width - 1;

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->mod_alt);

}

Expand Down Expand Up @@ -371,32 +372,37 @@ void guac_terminal_select_end(guac_terminal* terminal) {
/* Otherwise, copy multiple rows */
else {

/* If rectangular selection, each row boundaries must
* match start_col/end_col, otherwise use whole rows */
int start_col_bound = terminal->mod_alt ? start_col : 0;
int end_col_bound = terminal->mod_alt ? end_col : -1;

/* Get last char of the row */
guac_terminal_buffer_row* buffer_row = guac_terminal_buffer_get_row(terminal->buffer, start_row, 0);

/* Store first row */
guac_terminal_clipboard_append_row(terminal, start_row, start_col, -1);
guac_terminal_clipboard_append_row(terminal, start_row, start_col, end_col_bound);

/* Store all middle rows */
for (int row = start_row + 1; row < end_row; row++) {

/* Add a new line only if the line was not wrapped */
if (buffer_row->wrapped_row == false)
/* Add a new line only if the line was not wrapped or rectangular selection */
if (buffer_row->wrapped_row == false || terminal->mod_alt)
guac_common_clipboard_append(terminal->clipboard, "\n", 1);

/* Store middle row */
guac_terminal_clipboard_append_row(terminal, row, 0, -1);
guac_terminal_clipboard_append_row(terminal, row, start_col_bound, end_col_bound);

/* Update to last char of current row */
buffer_row = guac_terminal_buffer_get_row(terminal->buffer, row, 0);
}

/* Add a new line only if the line was not wrapped */
if (buffer_row->wrapped_row == false)
/* Add a new line only if the line was not wrapped or rectangular selection */
if (buffer_row->wrapped_row == false || terminal->mod_alt)
guac_common_clipboard_append(terminal->clipboard, "\n", 1);

/* Store last row */
guac_terminal_clipboard_append_row(terminal, end_row, 0, end_col);
guac_terminal_clipboard_append_row(terminal, end_row, start_col_bound, end_col);

}

Expand Down
22 changes: 21 additions & 1 deletion src/terminal/terminal/display.h
Original file line number Diff line number Diff line change
Expand Up @@ -342,9 +342,29 @@ void guac_terminal_display_dup(

/**
* Draws the text selection rectangle from the given coordinates to the given end coordinates.
*
* @param display
* The terminal display to draw selection.
*
* @param start_row
* The row to start draw selection.
*
* @param start_col
* The col to start draw selection.
*
* @param end_row
* The row to end draw selection.
*
* @param end_col
* The row to end draw selection.
*
* @param rectangle
* True if rectangular selection (selection is always start to end col),
* False if normal selection (All columns for middle-rows).
*
*/
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);

/**
* Clears the currently-selected region, removing the highlight.
Expand Down

0 comments on commit 3246acb

Please sign in to comment.