Add port and font options.

This commit is contained in:
Michael Jumper 2013-05-25 23:50:13 -07:00
parent 6d33be152c
commit 2a6de3aaed
8 changed files with 81 additions and 14 deletions

View File

@ -51,9 +51,13 @@
typedef struct ssh_guac_client_data { typedef struct ssh_guac_client_data {
char hostname[1024]; char hostname[1024];
int port;
char username[1024]; char username[1024];
char password[1024]; char password[1024];
char font_name[1024];
int font_size;
pthread_t client_thread; pthread_t client_thread;
ssh_session session; ssh_session session;

View File

@ -237,7 +237,9 @@ typedef struct guac_terminal_display {
* Allocates a new display having the given default foreground and background * Allocates a new display having the given default foreground and background
* colors. * colors.
*/ */
guac_terminal_display* guac_terminal_display_alloc(guac_client* client, int foreground, int background); guac_terminal_display* guac_terminal_display_alloc(guac_client* client,
const char* font_name, int font_size,
int foreground, int background);
/** /**
* Frees the given display. * Frees the given display.

View File

@ -240,6 +240,7 @@ struct guac_terminal {
* rendering to the given client. * rendering to the given client.
*/ */
guac_terminal* guac_terminal_create(guac_client* client, guac_terminal* guac_terminal_create(guac_client* client,
const char* font_name, int font_size,
int width, int height); int width, int height);
/** /**

View File

@ -53,20 +53,53 @@
#include "ibar.h" #include "ibar.h"
#include "ssh_client.h" #include "ssh_client.h"
#define GUAC_SSH_DEFAULT_FONT_NAME "monospace"
#define GUAC_SSH_DEFAULT_FONT_SIZE 12
#define GUAC_SSH_DEFAULT_PORT 22
/* Client plugin arguments */ /* Client plugin arguments */
const char* GUAC_CLIENT_ARGS[] = { const char* GUAC_CLIENT_ARGS[] = {
"hostname", "hostname",
"port", "port",
"username", "username",
"password", "password",
"font-name",
"font-size",
NULL NULL
}; };
enum __SSH_ARGS_IDX { enum __SSH_ARGS_IDX {
/**
* The hostname to connect to. Required.
*/
IDX_HOSTNAME, IDX_HOSTNAME,
/**
* The port to connect to. Optional.
*/
IDX_PORT, IDX_PORT,
/**
* The name of the user to login as. Optional.
*/
IDX_USERNAME, IDX_USERNAME,
/**
* The password to use when logging in. Optional.
*/
IDX_PASSWORD, IDX_PASSWORD,
/**
* The name of the font to use within the terminal.
*/
IDX_FONT_NAME,
/**
* The size of the font to use within the terminal, in points.
*/
IDX_FONT_SIZE,
SSH_ARGS_COUNT SSH_ARGS_COUNT
}; };
@ -75,12 +108,9 @@ int guac_client_init(guac_client* client, int argc, char** argv) {
guac_socket* socket = client->socket; guac_socket* socket = client->socket;
ssh_guac_client_data* client_data = malloc(sizeof(ssh_guac_client_data)); ssh_guac_client_data* client_data = malloc(sizeof(ssh_guac_client_data));
guac_terminal* term = guac_terminal_create(client,
client->info.optimal_width, client->info.optimal_height);
/* Init client data */ /* Init client data */
client->data = client_data; client->data = client_data;
client_data->term = term;
client_data->mod_alt = 0; client_data->mod_alt = 0;
client_data->mod_ctrl = 0; client_data->mod_ctrl = 0;
client_data->clipboard_data = NULL; client_data->clipboard_data = NULL;
@ -96,6 +126,29 @@ int guac_client_init(guac_client* client, int argc, char** argv) {
strcpy(client_data->username, argv[IDX_USERNAME]); strcpy(client_data->username, argv[IDX_USERNAME]);
strcpy(client_data->password, argv[IDX_PASSWORD]); strcpy(client_data->password, argv[IDX_PASSWORD]);
/* Read font name */
if (argv[IDX_FONT_NAME][0] != 0)
strcpy(client_data->font_name, argv[IDX_FONT_NAME]);
else
strcpy(client_data->font_name, GUAC_SSH_DEFAULT_FONT_NAME );
/* Read font size */
if (argv[IDX_FONT_SIZE][0] != 0)
client_data->font_size = atoi(argv[IDX_FONT_SIZE]);
else
client_data->font_size = GUAC_SSH_DEFAULT_FONT_SIZE;
/* Read port */
if (argv[IDX_PORT][0] != 0)
client_data->port = atoi(argv[IDX_PORT]);
else
client_data->port = GUAC_SSH_DEFAULT_PORT;
/* Create terminal */
client_data->term = guac_terminal_create(client,
client_data->font_name, client_data->font_size,
client->info.optimal_width, client->info.optimal_height);
/* Set up I-bar pointer */ /* Set up I-bar pointer */
client_data->ibar_cursor = guac_ssh_create_ibar(client); client_data->ibar_cursor = guac_ssh_create_ibar(client);

View File

@ -339,7 +339,9 @@ int __guac_terminal_set(guac_terminal_display* display, int row, int col, int co
} }
guac_terminal_display* guac_terminal_display_alloc(guac_client* client, int foreground, int background) { guac_terminal_display* guac_terminal_display_alloc(guac_client* client,
const char* font_name, int font_size,
int foreground, int background) {
PangoFontMap* font_map; PangoFontMap* font_map;
PangoFont* font; PangoFont* font;
@ -358,22 +360,22 @@ guac_terminal_display* guac_terminal_display_alloc(guac_client* client, int fore
/* Get font */ /* Get font */
display->font_desc = pango_font_description_new(); display->font_desc = pango_font_description_new();
pango_font_description_set_family(display->font_desc, "monospace"); pango_font_description_set_family(display->font_desc, font_name);
pango_font_description_set_weight(display->font_desc, PANGO_WEIGHT_NORMAL); pango_font_description_set_weight(display->font_desc, PANGO_WEIGHT_NORMAL);
pango_font_description_set_size(display->font_desc, 12*PANGO_SCALE); pango_font_description_set_size(display->font_desc, font_size*PANGO_SCALE);
font_map = pango_cairo_font_map_get_default(); font_map = pango_cairo_font_map_get_default();
context = pango_font_map_create_context(font_map); context = pango_font_map_create_context(font_map);
font = pango_font_map_load_font(font_map, context, display->font_desc); font = pango_font_map_load_font(font_map, context, display->font_desc);
if (font == NULL) { if (font == NULL) {
guac_client_log_error(display->client, "Unable to get font."); guac_client_log_error(display->client, "Unable to get font \"%s\"", font_name);
return NULL; return NULL;
} }
metrics = pango_font_get_metrics(font, NULL); metrics = pango_font_get_metrics(font, NULL);
if (metrics == NULL) { if (metrics == NULL) {
guac_client_log_error(display->client, "Unable to get font metrics."); guac_client_log_error(display->client, "Unable to get font metrics for font \"%s\"", font_name);
return NULL; return NULL;
} }

View File

@ -386,8 +386,10 @@ int ssh_guac_client_free_handler(guac_client* client) {
ssh_guac_client_data* guac_client_data = (ssh_guac_client_data*) client->data; ssh_guac_client_data* guac_client_data = (ssh_guac_client_data*) client->data;
/* Close SSH channel */ /* Close SSH channel */
if (guac_client_data->term_channel != NULL) {
ssh_channel_close(guac_client_data->term_channel); ssh_channel_close(guac_client_data->term_channel);
ssh_channel_send_eof(guac_client_data->term_channel); ssh_channel_send_eof(guac_client_data->term_channel);
}
/* Free terminal */ /* Free terminal */
guac_terminal_free(guac_client_data->term); guac_terminal_free(guac_client_data->term);

View File

@ -169,6 +169,7 @@ void* ssh_client_thread(void* data) {
/* Set session options */ /* Set session options */
ssh_options_set(client_data->session, SSH_OPTIONS_HOST, client_data->hostname); ssh_options_set(client_data->session, SSH_OPTIONS_HOST, client_data->hostname);
ssh_options_set(client_data->session, SSH_OPTIONS_PORT, &(client_data->port));
ssh_options_set(client_data->session, SSH_OPTIONS_USER, client_data->username); ssh_options_set(client_data->session, SSH_OPTIONS_USER, client_data->username);
/* Connect */ /* Connect */

View File

@ -90,6 +90,7 @@ void guac_terminal_reset(guac_terminal* term) {
} }
guac_terminal* guac_terminal_create(guac_client* client, guac_terminal* guac_terminal_create(guac_client* client,
const char* font_name, int font_size,
int width, int height) { int width, int height) {
guac_terminal_char default_char = { guac_terminal_char default_char = {
@ -110,6 +111,7 @@ guac_terminal* guac_terminal_create(guac_client* client,
/* Init display */ /* Init display */
term->display = guac_terminal_display_alloc(client, term->display = guac_terminal_display_alloc(client,
font_name, font_size,
default_char.attributes.foreground, default_char.attributes.foreground,
default_char.attributes.background); default_char.attributes.background);