GUACAMOLE-1622: Added margins to ssh sessions.
This commit is contained in:
parent
81300052e0
commit
1e9cd9137b
@ -202,6 +202,19 @@ int __guac_terminal_set(guac_terminal_display* display, int row, int col, int co
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calculate the size of margins around the terminal based on DPI.
|
||||||
|
*
|
||||||
|
* @param dpi
|
||||||
|
* The resolution of the display in DPI.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* Calculated size of margin in pixels.
|
||||||
|
*/
|
||||||
|
static int get_margin_by_dpi(int dpi) {
|
||||||
|
return dpi * GUAC_TERMINAL_MARGINS / GUAC_TERMINAL_MM_PER_INCH;
|
||||||
|
}
|
||||||
|
|
||||||
guac_terminal_display* guac_terminal_display_alloc(guac_client* client,
|
guac_terminal_display* guac_terminal_display_alloc(guac_client* client,
|
||||||
const char* font_name, int font_size, int dpi,
|
const char* font_name, int font_size, int dpi,
|
||||||
guac_terminal_color* foreground, guac_terminal_color* background,
|
guac_terminal_color* foreground, guac_terminal_color* background,
|
||||||
@ -229,6 +242,13 @@ guac_terminal_display* guac_terminal_display_alloc(guac_client* client,
|
|||||||
guac_protocol_send_move(client->socket, display->select_layer,
|
guac_protocol_send_move(client->socket, display->select_layer,
|
||||||
display->display_layer, 0, 0, 0);
|
display->display_layer, 0, 0, 0);
|
||||||
|
|
||||||
|
/* Calculate margin size by DPI */
|
||||||
|
display->margin = get_margin_by_dpi(dpi);
|
||||||
|
|
||||||
|
/* Offset the Default Layer to make margins even on all sides */
|
||||||
|
guac_protocol_send_move(client->socket, display->display_layer,
|
||||||
|
GUAC_DEFAULT_LAYER, display->margin, display->margin, 0);
|
||||||
|
|
||||||
display->default_foreground = display->glyph_foreground = *foreground;
|
display->default_foreground = display->glyph_foreground = *foreground;
|
||||||
display->default_background = display->glyph_background = *background;
|
display->default_background = display->glyph_background = *background;
|
||||||
display->default_palette = palette;
|
display->default_palette = palette;
|
||||||
@ -447,6 +467,10 @@ void guac_terminal_display_set_columns(guac_terminal_display* display, int row,
|
|||||||
|
|
||||||
void guac_terminal_display_resize(guac_terminal_display* display, int width, int height) {
|
void guac_terminal_display_resize(guac_terminal_display* display, int width, int height) {
|
||||||
|
|
||||||
|
/* Resize display only if dimensions have changed */
|
||||||
|
if (width == display->width && height == display->height)
|
||||||
|
return;
|
||||||
|
|
||||||
guac_terminal_operation* current;
|
guac_terminal_operation* current;
|
||||||
int x, y;
|
int x, y;
|
||||||
|
|
||||||
@ -828,6 +852,10 @@ void guac_terminal_display_dup(guac_terminal_display* display, guac_user* user,
|
|||||||
guac_protocol_send_move(socket, display->select_layer,
|
guac_protocol_send_move(socket, display->select_layer,
|
||||||
display->display_layer, 0, 0, 0);
|
display->display_layer, 0, 0, 0);
|
||||||
|
|
||||||
|
/* Offset the Default Layer to make margins even on all sides */
|
||||||
|
guac_protocol_send_move(socket, display->display_layer,
|
||||||
|
GUAC_DEFAULT_LAYER, display->margin, display->margin, 0);
|
||||||
|
|
||||||
/* Send select layer size */
|
/* Send select layer size */
|
||||||
guac_protocol_send_size(socket, display->select_layer,
|
guac_protocol_send_size(socket, display->select_layer,
|
||||||
display->char_width * display->width,
|
display->char_width * display->width,
|
||||||
@ -1020,7 +1048,7 @@ int guac_terminal_display_set_font(guac_terminal_display* display,
|
|||||||
if (new_width != display->width || new_height != display->height)
|
if (new_width != display->width || new_height != display->height)
|
||||||
guac_terminal_display_resize(display, new_width, new_height);
|
guac_terminal_display_resize(display, new_width, new_height);
|
||||||
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -335,6 +335,65 @@ guac_terminal_options* guac_terminal_options_create(
|
|||||||
return options;
|
return options;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calculate the available height and width in pixels within the terminal
|
||||||
|
* and set those values on the terminal struct.
|
||||||
|
* Then use the pixel height and width to calculate the available height and
|
||||||
|
* width in characters and store the results in the pointer arguments.
|
||||||
|
*
|
||||||
|
* @param terminal
|
||||||
|
* The terminal provides character width and height for calculations.
|
||||||
|
* This function requires outer_width, outer_height,
|
||||||
|
* display->margin, display->char_height, and display->char_width
|
||||||
|
* to be set on terminal in order to calculate available dimensions.
|
||||||
|
*
|
||||||
|
* @param columns
|
||||||
|
* Set with the available width for text of the terminal, by column count.
|
||||||
|
*
|
||||||
|
* @param rows
|
||||||
|
* Set with the available height for text of the terminal, by row count.
|
||||||
|
*/
|
||||||
|
static void calculate_and_save_available_dimensions(guac_terminal* term,
|
||||||
|
int* columns, int* rows) {
|
||||||
|
|
||||||
|
int margin = term->display->margin;
|
||||||
|
int width = term->outer_width;
|
||||||
|
int height = term->outer_height;
|
||||||
|
int char_width = term->display->char_width;
|
||||||
|
int char_height = term->display->char_height;
|
||||||
|
|
||||||
|
/* Calculate available display area */
|
||||||
|
int available_width = width - GUAC_TERMINAL_SCROLLBAR_WIDTH - 2 * margin;
|
||||||
|
if (available_width < 0)
|
||||||
|
available_width = 0;
|
||||||
|
|
||||||
|
int available_height = height - 2 * margin;
|
||||||
|
if (available_height < 0)
|
||||||
|
available_height = 0;
|
||||||
|
|
||||||
|
/* Calculate dimensions */
|
||||||
|
*rows = available_height / char_height;
|
||||||
|
*columns = available_width / char_width;
|
||||||
|
|
||||||
|
/* Keep height within predefined maximum */
|
||||||
|
if (*rows > GUAC_TERMINAL_MAX_ROWS) {
|
||||||
|
*rows = GUAC_TERMINAL_MAX_ROWS;
|
||||||
|
available_height = *rows * char_height;
|
||||||
|
height = available_height + 2 * margin;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Keep width within predefined maximum */
|
||||||
|
if (*columns > GUAC_TERMINAL_MAX_COLUMNS) {
|
||||||
|
*columns = GUAC_TERMINAL_MAX_COLUMNS;
|
||||||
|
available_width = *columns * char_width;
|
||||||
|
width = available_width + GUAC_TERMINAL_SCROLLBAR_WIDTH + 2 * margin;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set pixel size */
|
||||||
|
term->width = width;
|
||||||
|
term->height = height;
|
||||||
|
}
|
||||||
|
|
||||||
guac_terminal* guac_terminal_create(guac_client* client,
|
guac_terminal* guac_terminal_create(guac_client* client,
|
||||||
guac_terminal_options* options) {
|
guac_terminal_options* options) {
|
||||||
|
|
||||||
@ -363,11 +422,6 @@ guac_terminal* guac_terminal_create(guac_client* client,
|
|||||||
&default_char.attributes.background,
|
&default_char.attributes.background,
|
||||||
default_palette);
|
default_palette);
|
||||||
|
|
||||||
/* Calculate available display area */
|
|
||||||
int available_width = width - GUAC_TERMINAL_SCROLLBAR_WIDTH;
|
|
||||||
if (available_width < 0)
|
|
||||||
available_width = 0;
|
|
||||||
|
|
||||||
guac_terminal* term = malloc(sizeof(guac_terminal));
|
guac_terminal* term = malloc(sizeof(guac_terminal));
|
||||||
term->started = false;
|
term->started = false;
|
||||||
term->client = client;
|
term->client = client;
|
||||||
@ -379,10 +433,6 @@ guac_terminal* guac_terminal_create(guac_client* client,
|
|||||||
term->font_name = strdup(options->font_name);
|
term->font_name = strdup(options->font_name);
|
||||||
term->font_size = options->font_size;
|
term->font_size = options->font_size;
|
||||||
|
|
||||||
/* Set size of available screen area */
|
|
||||||
term->outer_width = width;
|
|
||||||
term->outer_height = height;
|
|
||||||
|
|
||||||
/* Init modified flag and conditional */
|
/* Init modified flag and conditional */
|
||||||
term->modified = 0;
|
term->modified = 0;
|
||||||
pthread_cond_init(&(term->modified_cond), NULL);
|
pthread_cond_init(&(term->modified_cond), NULL);
|
||||||
@ -425,27 +475,15 @@ guac_terminal* guac_terminal_create(guac_client* client,
|
|||||||
term->clipboard = guac_common_clipboard_alloc();
|
term->clipboard = guac_common_clipboard_alloc();
|
||||||
term->disable_copy = options->disable_copy;
|
term->disable_copy = options->disable_copy;
|
||||||
|
|
||||||
/* Calculate character size */
|
/* Set size of available screen area */
|
||||||
int rows = height / term->display->char_height;
|
term->outer_width = width;
|
||||||
int columns = available_width / term->display->char_width;
|
term->outer_height = height;
|
||||||
|
|
||||||
/* Keep height within predefined maximum */
|
/* Set available screen area on the terminal */
|
||||||
if (rows > GUAC_TERMINAL_MAX_ROWS) {
|
int rows, columns;
|
||||||
rows = GUAC_TERMINAL_MAX_ROWS;
|
calculate_and_save_available_dimensions(term, &columns, &rows);
|
||||||
height = rows * term->display->char_height;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Keep width within predefined maximum */
|
|
||||||
if (columns > GUAC_TERMINAL_MAX_COLUMNS) {
|
|
||||||
columns = GUAC_TERMINAL_MAX_COLUMNS;
|
|
||||||
available_width = columns * term->display->char_width;
|
|
||||||
width = available_width + GUAC_TERMINAL_SCROLLBAR_WIDTH;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Set pixel size */
|
|
||||||
term->width = width;
|
|
||||||
term->height = height;
|
|
||||||
|
|
||||||
|
/* Set rows and columns size */
|
||||||
term->term_width = columns;
|
term->term_width = columns;
|
||||||
term->term_height = rows;
|
term->term_height = rows;
|
||||||
|
|
||||||
@ -476,7 +514,7 @@ guac_terminal* guac_terminal_create(guac_client* client,
|
|||||||
|
|
||||||
/* Allocate scrollbar */
|
/* Allocate scrollbar */
|
||||||
term->scrollbar = guac_terminal_scrollbar_alloc(term->client, GUAC_DEFAULT_LAYER,
|
term->scrollbar = guac_terminal_scrollbar_alloc(term->client, GUAC_DEFAULT_LAYER,
|
||||||
width, height, term->term_height);
|
term->outer_width, term->outer_height, term->term_height);
|
||||||
|
|
||||||
/* Associate scrollbar with this terminal */
|
/* Associate scrollbar with this terminal */
|
||||||
term->scrollbar->data = term;
|
term->scrollbar->data = term;
|
||||||
@ -1303,7 +1341,7 @@ static void __guac_terminal_resize(guac_terminal* term, int width, int height) {
|
|||||||
guac_terminal_display_flush(term->display);
|
guac_terminal_display_flush(term->display);
|
||||||
guac_terminal_display_resize(term->display, width, height);
|
guac_terminal_display_resize(term->display, width, height);
|
||||||
|
|
||||||
/* Reraw any characters on right if widening */
|
/* Redraw any characters on right if widening */
|
||||||
if (width > term->term_width)
|
if (width > term->term_width)
|
||||||
__guac_terminal_redraw_rect(term, 0, term->term_width-1, height-1, width-1);
|
__guac_terminal_redraw_rect(term, 0, term->term_width-1, height-1, width-1);
|
||||||
|
|
||||||
@ -1390,51 +1428,25 @@ int guac_terminal_resize(guac_terminal* terminal, int width, int height) {
|
|||||||
terminal->outer_width = width;
|
terminal->outer_width = width;
|
||||||
terminal->outer_height = height;
|
terminal->outer_height = height;
|
||||||
|
|
||||||
/* Calculate available display area */
|
/* Set available screen area on the terminal */
|
||||||
int available_width = width - GUAC_TERMINAL_SCROLLBAR_WIDTH;
|
int rows, columns;
|
||||||
if (available_width < 0)
|
calculate_and_save_available_dimensions(terminal, &columns, &rows);
|
||||||
available_width = 0;
|
|
||||||
|
|
||||||
/* Calculate dimensions */
|
|
||||||
int rows = height / display->char_height;
|
|
||||||
int columns = available_width / display->char_width;
|
|
||||||
|
|
||||||
/* Keep height within predefined maximum */
|
|
||||||
if (rows > GUAC_TERMINAL_MAX_ROWS) {
|
|
||||||
rows = GUAC_TERMINAL_MAX_ROWS;
|
|
||||||
height = rows * display->char_height;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Keep width within predefined maximum */
|
|
||||||
if (columns > GUAC_TERMINAL_MAX_COLUMNS) {
|
|
||||||
columns = GUAC_TERMINAL_MAX_COLUMNS;
|
|
||||||
available_width = columns * display->char_width;
|
|
||||||
width = available_width + GUAC_TERMINAL_SCROLLBAR_WIDTH;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Set pixel sizes */
|
|
||||||
terminal->width = width;
|
|
||||||
terminal->height = height;
|
|
||||||
|
|
||||||
/* Resize default layer to given pixel dimensions */
|
/* Resize default layer to given pixel dimensions */
|
||||||
guac_terminal_repaint_default_layer(terminal, client->socket);
|
guac_terminal_repaint_default_layer(terminal, client->socket);
|
||||||
|
|
||||||
/* Resize terminal if row/column dimensions have changed */
|
/* Resize terminal if row/column dimensions have changed */
|
||||||
if (columns != terminal->term_width || rows != terminal->term_height) {
|
if (columns != terminal->term_width || rows != terminal->term_height) {
|
||||||
|
/* Resize terminal and set the columns and rows on the terminal struct */
|
||||||
guac_client_log(client, GUAC_LOG_DEBUG,
|
|
||||||
"Resizing terminal to %ix%i", rows, columns);
|
|
||||||
|
|
||||||
/* Resize terminal */
|
|
||||||
__guac_terminal_resize(terminal, columns, rows);
|
__guac_terminal_resize(terminal, columns, rows);
|
||||||
|
|
||||||
/* Reset scroll region */
|
/* Reset scroll region */
|
||||||
terminal->scroll_end = rows - 1;
|
terminal->scroll_end = rows - 1;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Notify scrollbar of resize */
|
/* Notify scrollbar of resize */
|
||||||
guac_terminal_scrollbar_parent_resized(terminal->scrollbar, width, height, rows);
|
guac_terminal_scrollbar_parent_resized(terminal->scrollbar,
|
||||||
|
terminal->outer_width, terminal->outer_height, terminal->term_height);
|
||||||
guac_terminal_scrollbar_set_bounds(terminal->scrollbar,
|
guac_terminal_scrollbar_set_bounds(terminal->scrollbar,
|
||||||
-guac_terminal_get_available_scroll(terminal), 0);
|
-guac_terminal_get_available_scroll(terminal), 0);
|
||||||
|
|
||||||
|
@ -44,6 +44,17 @@
|
|||||||
*/
|
*/
|
||||||
#define GUAC_TERMINAL_MAX_CHAR_WIDTH 2
|
#define GUAC_TERMINAL_MAX_CHAR_WIDTH 2
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The size of margins between the console text and the border in mm.
|
||||||
|
*/
|
||||||
|
#define GUAC_TERMINAL_MARGINS 2
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 1 inch is 25.4 millimeters, and we can therefore use the following
|
||||||
|
* to create a mm to px formula: (mm × dpi) ÷ 25.4 = px.
|
||||||
|
*/
|
||||||
|
#define GUAC_TERMINAL_MM_PER_INCH 25.4
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* All available terminal operations which affect character cells.
|
* All available terminal operations which affect character cells.
|
||||||
*/
|
*/
|
||||||
@ -123,6 +134,11 @@ typedef struct guac_terminal_display {
|
|||||||
*/
|
*/
|
||||||
int height;
|
int height;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The size of margins between the console text and the border in pixels.
|
||||||
|
*/
|
||||||
|
int margin;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The description of the font to use for rendering.
|
* The description of the font to use for rendering.
|
||||||
*/
|
*/
|
||||||
|
Loading…
Reference in New Issue
Block a user