GUACAMOLE-1622: Added margins to ssh sessions.
diff --git a/src/terminal/display.c b/src/terminal/display.c
index a9d671f..d449325 100644
--- a/src/terminal/display.c
+++ b/src/terminal/display.c
@@ -202,6 +202,19 @@
 
 }
 
+/**
+ * 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,
         const char* font_name, int font_size, int dpi,
         guac_terminal_color* foreground, guac_terminal_color* background,
@@ -229,6 +242,13 @@
     guac_protocol_send_move(client->socket, display->select_layer,
             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_background = display->glyph_background = *background;
     display->default_palette = palette;
@@ -447,6 +467,10 @@
 
 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;
     int x, y;
 
@@ -828,6 +852,10 @@
     guac_protocol_send_move(socket, display->select_layer,
             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 */
     guac_protocol_send_size(socket, display->select_layer,
             display->char_width  * display->width,
@@ -1020,7 +1048,7 @@
     if (new_width != display->width || new_height != display->height)
         guac_terminal_display_resize(display, new_width, new_height);
 
+
     return 0;
 
-}
-
+}
\ No newline at end of file
diff --git a/src/terminal/terminal.c b/src/terminal/terminal.c
index 434c7d4..02e18bc 100644
--- a/src/terminal/terminal.c
+++ b/src/terminal/terminal.c
@@ -335,6 +335,65 @@
     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_options* options) {
 
@@ -363,11 +422,6 @@
                                      &default_char.attributes.background,
                                      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));
     term->started = false;
     term->client = client;
@@ -379,10 +433,6 @@
     term->font_name = strdup(options->font_name);
     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 */
     term->modified = 0;
     pthread_cond_init(&(term->modified_cond), NULL);
@@ -425,27 +475,15 @@
     term->clipboard = guac_common_clipboard_alloc();
     term->disable_copy = options->disable_copy;
 
-    /* Calculate character size */
-    int rows    = height / term->display->char_height;
-    int columns = available_width / term->display->char_width;
+    /* Set size of available screen area */
+    term->outer_width = width;
+    term->outer_height = height;
 
-    /* Keep height within predefined maximum */
-    if (rows > GUAC_TERMINAL_MAX_ROWS) {
-        rows = GUAC_TERMINAL_MAX_ROWS;
-        height = rows * term->display->char_height;
-    }
+    /* Set available screen area on the terminal */
+    int rows, columns;
+    calculate_and_save_available_dimensions(term, &columns, &rows);
 
-    /* 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_height = rows;
 
@@ -476,7 +514,7 @@
 
     /* Allocate scrollbar */
     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 */
     term->scrollbar->data = term;
@@ -1303,7 +1341,7 @@
     guac_terminal_display_flush(term->display);
     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)
         __guac_terminal_redraw_rect(term, 0, term->term_width-1, height-1, width-1);
 
@@ -1390,51 +1428,25 @@
     terminal->outer_width = width;
     terminal->outer_height = height;
 
-    /* Calculate available display area */
-    int available_width = width - GUAC_TERMINAL_SCROLLBAR_WIDTH;
-    if (available_width < 0)
-        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;
+    /* Set available screen area on the terminal */
+    int rows, columns;
+    calculate_and_save_available_dimensions(terminal, &columns, &rows);
 
     /* Resize default layer to given pixel dimensions */
     guac_terminal_repaint_default_layer(terminal, client->socket);
 
     /* Resize terminal if row/column dimensions have changed */
     if (columns != terminal->term_width || rows != terminal->term_height) {
-
-        guac_client_log(client, GUAC_LOG_DEBUG,
-                "Resizing terminal to %ix%i", rows, columns);
-
-        /* Resize terminal */
+        /* Resize terminal and set the columns and rows on the terminal struct */
         __guac_terminal_resize(terminal, columns, rows);
 
         /* Reset scroll region */
         terminal->scroll_end = rows - 1;
-
     }
 
     /* 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_get_available_scroll(terminal), 0);
 
@@ -2108,4 +2120,4 @@
 
     /* Remove the user from the terminal cursor */
     guac_common_cursor_remove_user(terminal->cursor, user);
-}
+}
\ No newline at end of file
diff --git a/src/terminal/terminal/display.h b/src/terminal/terminal/display.h
index db85b2a..1d74621 100644
--- a/src/terminal/terminal/display.h
+++ b/src/terminal/terminal/display.h
@@ -45,6 +45,17 @@
 #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.
  */
 typedef enum guac_terminal_operation_type {
@@ -124,6 +135,11 @@
     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.
      */
     PangoFontDescription* font_desc;