X-Git-Url: http://git.alex.org.uk diff --git a/src/client.c b/src/client.c index 6109297..e71d839 100644 --- a/src/client.c +++ b/src/client.c @@ -57,6 +57,7 @@ #include #include #include +#include #include "client.h" #include "guac_handlers.h" @@ -121,6 +122,7 @@ boolean rdp_freerdp_pre_connect(freerdp* instance) { bitmap->Decompress = guac_rdp_bitmap_decompress; bitmap->SetSurface = guac_rdp_bitmap_setsurface; graphics_register_bitmap(context->graphics, bitmap); + xfree(bitmap); /* Set up glyph handling */ glyph = xnew(rdpGlyph); @@ -131,6 +133,7 @@ boolean rdp_freerdp_pre_connect(freerdp* instance) { glyph->BeginDraw = guac_rdp_glyph_begindraw; glyph->EndDraw = guac_rdp_glyph_enddraw; graphics_register_glyph(context->graphics, glyph); + xfree(glyph); /* Set up pointer handling */ pointer = xnew(rdpPointer); @@ -139,8 +142,10 @@ boolean rdp_freerdp_pre_connect(freerdp* instance) { pointer->Free = guac_rdp_pointer_free; pointer->Set = guac_rdp_pointer_set; graphics_register_pointer(context->graphics, pointer); + xfree(pointer); /* Set up GDI */ + instance->update->EndPaint = guac_rdp_gdi_end_paint; instance->update->Palette = guac_rdp_gdi_palette_update; instance->update->SetBounds = guac_rdp_gdi_set_bounds; @@ -188,10 +193,6 @@ boolean rdp_freerdp_post_connect(freerdp* instance) { client->mouse_handler = rdp_guac_client_mouse_handler; client->key_handler = rdp_guac_client_key_handler; - /* Send size */ - guac_protocol_send_size(client->socket, GUAC_DEFAULT_LAYER, - instance->settings->width, instance->settings->height); - return true; } @@ -204,6 +205,35 @@ void rdp_freerdp_context_free(freerdp* instance, rdpContext* context) { /* EMPTY */ } +void __guac_rdp_client_load_keymap(guac_client* client, + const guac_rdp_keymap* keymap) { + + rdp_guac_client_data* guac_client_data = + (rdp_guac_client_data*) client->data; + /* Get mapping */ + const guac_rdp_keysym_desc* mapping = keymap->mapping; + + /* If parent exists, load parent first */ + if (keymap->parent != NULL) + __guac_rdp_client_load_keymap(client, keymap->parent); + + /* Log load */ + guac_client_log_info(client, "Loading keymap \"%s\"", keymap->name); + + /* Load mapping into keymap */ + while (mapping->keysym != 0) { + + /* Copy mapping */ + GUAC_RDP_KEYSYM_LOOKUP(guac_client_data->keymap, mapping->keysym) = + *mapping; + + /* Next keysym */ + mapping++; + + } + +} + int guac_client_init(guac_client* client, int argc, char** argv) { rdp_guac_client_data* guac_client_data; @@ -216,8 +246,14 @@ int guac_client_init(guac_client* client, int argc, char** argv) { boolean bitmap_cache; if (argc < 8) { - guac_protocol_send_error(client->socket, "Wrong argument count received."); + + guac_protocol_send_error(client->socket, + "Wrong argument count received."); guac_socket_flush(client->socket); + + guac_error = GUAC_STATUS_BAD_ARGUMENT; + guac_error_message = "Wrong argument count received"; + return 1; } @@ -324,16 +360,46 @@ int guac_client_init(guac_client* client, int argc, char** argv) { guac_client_data->mouse_button_mask = 0; guac_client_data->current_surface = GUAC_DEFAULT_LAYER; - ((rdp_freerdp_context*) rdp_inst->context)->client = client; + /* Clear keysym state mapping and keymap */ + memset(guac_client_data->keysym_state, 0, + sizeof(guac_rdp_keysym_state_map)); + + memset(guac_client_data->keymap, 0, + sizeof(guac_rdp_static_keymap)); + client->data = guac_client_data; + ((rdp_freerdp_context*) rdp_inst->context)->client = client; + + /* Load keymap into client */ + __guac_rdp_client_load_keymap(client, &guac_rdp_keymap_en_us); /* Connect to RDP server */ if (!freerdp_connect(rdp_inst)) { - guac_protocol_send_error(client->socket, "Error connecting to RDP server"); + + guac_protocol_send_error(client->socket, + "Error connecting to RDP server"); guac_socket_flush(client->socket); + + guac_error = GUAC_STATUS_BAD_STATE; + guac_error_message = "Error connecting to RDP server"; + return 1; } + /* Send connection name */ + guac_protocol_send_name(client->socket, settings->window_title); + + /* Send size */ + guac_protocol_send_size(client->socket, GUAC_DEFAULT_LAYER, + settings->width, settings->height); + + /* Create glyph surface and cairo instance */ + guac_client_data->glyph_surface = cairo_image_surface_create( + CAIRO_FORMAT_RGB24, settings->width, settings->height); + + guac_client_data->glyph_cairo = cairo_create( + guac_client_data->glyph_surface); + /* Success */ return 0;