From 5bb56ed5ba62fe53356514a37ef42aa63a9961aa Mon Sep 17 00:00:00 2001 From: Alex Leitner Date: Thu, 7 Jul 2022 15:24:14 +0000 Subject: [PATCH] GUACAMOLE-1622: Restructured code to resolve scrollbar resizing bug where the scrollbar would clip off the side of the terminal. This fix also resolves the issue where the text would blur at certain intervals of resizing the window. --- src/terminal/terminal.c | 43 +++++++++++++++++++++++++---------------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/src/terminal/terminal.c b/src/terminal/terminal.c index 586a5edb..08cdc85e 100644 --- a/src/terminal/terminal.c +++ b/src/terminal/terminal.c @@ -377,14 +377,12 @@ static void calculate_rows_and_columns(guac_terminal* term, *columns = available_width / char_width; /* Keep height within predefined maximum */ - if (*rows > GUAC_TERMINAL_MAX_ROWS) { + if (*rows > GUAC_TERMINAL_MAX_ROWS) *rows = GUAC_TERMINAL_MAX_ROWS; - } /* Keep width within predefined maximum */ - if (*columns > GUAC_TERMINAL_MAX_COLUMNS) { + if (*columns > GUAC_TERMINAL_MAX_COLUMNS) *columns = GUAC_TERMINAL_MAX_COLUMNS; - } } /** @@ -414,9 +412,18 @@ static void calculate_height_and_width(guac_terminal* term, int margin = term->display->margin; int char_width = term->display->char_width; int char_height = term->display->char_height; - - *height = rows * char_height + 2 * margin; - *width = columns * char_width + GUAC_TERMINAL_SCROLLBAR_WIDTH + 2 * margin; + + /* Recalculate height if max rows reached */ + if (rows == GUAC_TERMINAL_MAX_ROWS) { + int available_height = GUAC_TERMINAL_MAX_ROWS * char_height; + *height = available_height + 2 * margin; + } + + /* Recalculate width if max columns reached */ + if (columns == GUAC_TERMINAL_MAX_COLUMNS) { + int available_width = GUAC_TERMINAL_MAX_COLUMNS * char_width; + *width = available_width + GUAC_TERMINAL_SCROLLBAR_WIDTH + 2 * margin; + } } guac_terminal* guac_terminal_create(guac_client* client, @@ -504,10 +511,11 @@ guac_terminal* guac_terminal_create(guac_client* client, int rows, columns; calculate_rows_and_columns(term, height, width, &rows, &columns); - /* Calculate available text display area in pixels */ - int available_height, available_width; + /* Calculate available display area in pixels */ + int adjusted_height = height; + int adjusted_width = width; calculate_height_and_width(term, rows, columns, - &available_height, &available_width); + &adjusted_height, &adjusted_width); /* Set size of available screen area */ term->outer_height = height; @@ -518,8 +526,8 @@ guac_terminal* guac_terminal_create(guac_client* client, term->term_width = columns; /* Set pixel size */ - term->height = available_height; - term->width = available_width; + term->height = adjusted_height; + term->width = adjusted_width; /* Open STDIN pipe */ if (pipe(term->stdin_pipe_fd)) { @@ -1462,18 +1470,19 @@ int guac_terminal_resize(guac_terminal* terminal, int width, int height) { int rows, columns; calculate_rows_and_columns(terminal, height, width, &rows, &columns); - /* Calculate available text display area in pixels */ - int available_height, available_width; + /* Calculate available display area in pixels */ + int adjusted_height = height; + int adjusted_width = width; calculate_height_and_width(terminal, rows, columns, - &available_height, &available_width); + &adjusted_height, &adjusted_width); /* Set size of available screen area */ terminal->outer_height = height; terminal->outer_width = width; /* Set pixel size */ - terminal->height = available_height; - terminal->width = available_width; + terminal->height = adjusted_height; + terminal->width = adjusted_width; /* Resize default layer to given pixel dimensions */ guac_terminal_repaint_default_layer(terminal, client->socket);