Free clipboard data properly.
[libguac-client-rdp.git] / src / client.c
index d7f0b8d..1dcd309 100644 (file)
@@ -91,6 +91,10 @@ enum ARGS_IDX {
     IDX_COLOR_DEPTH
 };
 
+int __guac_receive_channel_data(freerdp* rdp_inst, int channelId, uint8* data, int size, int flags, int total_size) {
+    return freerdp_channels_data(rdp_inst, channelId, data, size, flags, total_size);
+}
+
 boolean rdp_freerdp_pre_connect(freerdp* instance) {
 
     rdpContext* context = instance->context;
@@ -102,6 +106,9 @@ boolean rdp_freerdp_pre_connect(freerdp* instance) {
     rdpPrimaryUpdate* primary;
     CLRCONV* clrconv;
 
+    /* Load clipboard plugin */
+    freerdp_channels_load_plugin(channels, instance->settings, "cliprdr", NULL);
+
     /* Init color conversion structure */
     clrconv = xnew(CLRCONV);
     clrconv->alpha = 1;
@@ -192,10 +199,7 @@ boolean rdp_freerdp_post_connect(freerdp* instance) {
     client->handle_messages = rdp_guac_client_handle_messages;
     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);
+    client->clipboard_handler = rdp_guac_client_clipboard_handler;
 
     return true;
 
@@ -275,6 +279,7 @@ int guac_client_init(guac_client* client, int argc, char** argv) {
     rdp_inst = freerdp_new();
     rdp_inst->PreConnect = rdp_freerdp_pre_connect;
     rdp_inst->PostConnect = rdp_freerdp_post_connect;
+    rdp_inst->ReceiveChannelData = __guac_receive_channel_data;
 
     /* Allocate FreeRDP context */
     rdp_inst->context_size = sizeof(rdp_freerdp_context);
@@ -363,6 +368,7 @@ int guac_client_init(guac_client* client, int argc, char** argv) {
     guac_client_data->rdp_inst = rdp_inst;
     guac_client_data->mouse_button_mask = 0;
     guac_client_data->current_surface = GUAC_DEFAULT_LAYER;
+    guac_client_data->clipboard = NULL;
 
     /* Clear keysym state mapping and keymap */
     memset(guac_client_data->keysym_state, 0,
@@ -393,6 +399,17 @@ int guac_client_init(guac_client* client, int argc, char** argv) {
     /* 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 surfaces */
+    guac_client_data->opaque_glyph_surface = cairo_image_surface_create(
+            CAIRO_FORMAT_RGB24, settings->width, settings->height);
+
+    guac_client_data->trans_glyph_surface = cairo_image_surface_create(
+            CAIRO_FORMAT_ARGB32, settings->width, settings->height);
+
     /* Success */
     return 0;