Skip to content

Commit

Permalink
GUACAMOLE-1586: Don't add \n in clipboard if the line isn't finished.
Browse files Browse the repository at this point in the history
  • Loading branch information
corentin-soriano committed Jun 6, 2024
1 parent 61f943d commit d7de57d
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 9 deletions.
2 changes: 1 addition & 1 deletion src/terminal/buffer.c
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ void guac_terminal_buffer_copy_rows(guac_terminal_buffer* buffer,
guac_terminal_buffer_row* dst_row = guac_terminal_buffer_get_row(buffer, current_row + offset, src_row->length);

/* Copy data */
memcpy(dst_row->characters, src_row->characters, sizeof(guac_terminal_char) * src_row->length);
memcpy(dst_row->characters, src_row->characters, sizeof(guac_terminal_char) * src_row->length + 1);
dst_row->length = src_row->length;

/* Next current_row */
Expand Down
20 changes: 18 additions & 2 deletions src/terminal/select.c
Original file line number Diff line number Diff line change
Expand Up @@ -358,17 +358,33 @@ void guac_terminal_select_end(guac_terminal* terminal) {
/* Otherwise, copy multiple rows */
else {

/* Get last char of the row */
guac_terminal_buffer_row* buffer_row = guac_terminal_buffer_get_row(terminal->buffer, start_row, 0);
int last_row_char = buffer_row->characters[buffer_row->length].value;

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

/* Store all middle rows */
for (int row = start_row + 1; row < end_row; row++) {
guac_common_clipboard_append(terminal->clipboard, "\n", 1);

/* Add new line only if the row above ended with a null character */
if (last_row_char == 0)
guac_common_clipboard_append(terminal->clipboard, "\n", 1);

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

/* Update to last char of current row */
buffer_row = guac_terminal_buffer_get_row(terminal->buffer, row, 0);
last_row_char = buffer_row->characters[buffer_row->length].value;
}

/* Add new line only if the row above ended with a null character */
if (last_row_char == 0)
guac_common_clipboard_append(terminal->clipboard, "\n", 1);

/* Store last row */
guac_common_clipboard_append(terminal->clipboard, "\n", 1);
guac_terminal_clipboard_append_row(terminal, end_row, 0, end_col);

}
Expand Down
22 changes: 17 additions & 5 deletions src/terminal/terminal-handlers.c
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,12 @@
* @param term
* The guac_terminal whose cursor should be advanced to the next row.
*/
static void guac_terminal_linefeed(guac_terminal* term) {
static void guac_terminal_linefeed(guac_terminal* term, bool force_wrap) {

/* Assign in column out of screen: 1 to avoid \n in clipboard or 0 to add \n */
guac_terminal_buffer_row* buffer_row =
guac_terminal_buffer_get_row(term->buffer, term->cursor_row, 0);
buffer_row->characters[buffer_row->length].value = force_wrap ? 1 : 0;

/* Scroll up if necessary */
if (term->cursor_row == term->scroll_end)
Expand All @@ -81,6 +86,11 @@ static void guac_terminal_linefeed(guac_terminal* term) {
*/
static void guac_terminal_reverse_linefeed(guac_terminal* term) {

/* Reset column out of screen */
guac_terminal_buffer_row* buffer_row =
guac_terminal_buffer_get_row(term->buffer, term->cursor_row, 0);
buffer_row->characters[buffer_row->length].value = 0;

/* Scroll down if necessary */
if (term->cursor_row == term->scroll_start)
guac_terminal_scroll_down(term, term->scroll_start,
Expand Down Expand Up @@ -221,7 +231,7 @@ int guac_terminal_echo(guac_terminal* term, unsigned char c) {
case 0x0C: /* FF */

/* Advance to next row */
guac_terminal_linefeed(term);
guac_terminal_linefeed(term, false);

/* If automatic carriage return, fall through to CR handler */
if (!term->automatic_carriage_return)
Expand Down Expand Up @@ -269,8 +279,10 @@ int guac_terminal_echo(guac_terminal* term, unsigned char c) {

/* Wrap if necessary */
if (term->cursor_col >= term->term_width) {

/* New line */
term->cursor_col = 0;
guac_terminal_linefeed(term);
guac_terminal_linefeed(term, true);
}

/* If insert mode, shift other characters right by 1 */
Expand Down Expand Up @@ -340,14 +352,14 @@ int guac_terminal_escape(guac_terminal* term, unsigned char c) {

/* Index (IND) */
case 'D':
guac_terminal_linefeed(term);
guac_terminal_linefeed(term, false);
term->char_handler = guac_terminal_echo;
break;

/* Next Line (NEL) */
case 'E':
guac_terminal_move_cursor(term, term->cursor_row, 0);
guac_terminal_linefeed(term);
guac_terminal_linefeed(term, false);
term->char_handler = guac_terminal_echo;
break;

Expand Down
2 changes: 1 addition & 1 deletion src/terminal/terminal.c
Original file line number Diff line number Diff line change
Expand Up @@ -243,7 +243,7 @@ void guac_terminal_reset(guac_terminal* term) {

/* Clear terminal */
for (row=0; row<term->term_height; row++)
guac_terminal_set_columns(term, row, 0, term->term_width, &(term->default_char));
guac_terminal_set_columns(term, row, 0, term->term_width-1, &(term->default_char));

}

Expand Down

0 comments on commit d7de57d

Please sign in to comment.