diff options
Diffstat (limited to 'network/remmina/patches/20120430.patch')
-rw-r--r-- | network/remmina/patches/20120430.patch | 663 |
1 files changed, 0 insertions, 663 deletions
diff --git a/network/remmina/patches/20120430.patch b/network/remmina/patches/20120430.patch deleted file mode 100644 index b5fd340c90..0000000000 --- a/network/remmina/patches/20120430.patch +++ /dev/null @@ -1,663 +0,0 @@ -From 3ebdd6e7b0ee53ecdaf0d14bada6b92e7334b12a Mon Sep 17 00:00:00 2001 -From: Jean-Louis Dupond <jean-louis@dupond.be> -Date: Mon, 30 Apr 2012 23:10:04 +0200 -Subject: [PATCH] Add clipboard support - ---- - remmina-plugins/rdp/CMakeLists.txt | 2 + - remmina-plugins/rdp/rdp_cliprdr.c | 459 ++++++++++++++++++++++++++++++++++++ - remmina-plugins/rdp/rdp_cliprdr.h | 33 +++ - remmina-plugins/rdp/rdp_event.c | 19 ++ - remmina-plugins/rdp/rdp_plugin.c | 15 ++ - remmina-plugins/rdp/rdp_plugin.h | 6 +- - 6 files changed, 533 insertions(+), 1 deletion(-) - create mode 100644 remmina-plugins/rdp/rdp_cliprdr.c - create mode 100644 remmina-plugins/rdp/rdp_cliprdr.h - -diff --git a/remmina-plugins/rdp/CMakeLists.txt b/remmina-plugins/rdp/CMakeLists.txt -index e3ec20b..8ae4a4d 100644 ---- a/remmina-plugins/rdp/CMakeLists.txt -+++ b/remmina-plugins/rdp/CMakeLists.txt -@@ -33,6 +33,8 @@ set(REMMINA_PLUGIN_RDP_SRCS - rdp_gdi.h - rdp_graphics.c - rdp_graphics.h -+ rdp_cliprdr.c -+ rdp_cliprdr.h - ) - - add_library(remmina-plugin-rdp ${REMMINA_PLUGIN_RDP_SRCS}) -diff --git a/remmina-plugins/rdp/rdp_cliprdr.c b/remmina-plugins/rdp/rdp_cliprdr.c -new file mode 100644 -index 0000000..0821ffa ---- /dev/null -+++ b/remmina-plugins/rdp/rdp_cliprdr.c -@@ -0,0 +1,459 @@ -+/* -+ * Remmina - The GTK+ Remote Desktop Client -+ * Copyright (C) 2012-2012 Jean-Louis Dupond -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 59 Temple Place, Suite 330, -+ * Boston, MA 02111-1307, USA. -+ */ -+ -+#include "rdp_plugin.h" -+#include "rdp_cliprdr.h" -+ -+#include <freerdp/freerdp.h> -+#include <freerdp/utils/memory.h> -+#include <freerdp/channels/channels.h> -+#include <freerdp/plugins/cliprdr.h> -+ -+/* -+ * Get the formats we can export based on the current clipboard data. -+ */ -+void remmina_rdp_cliprdr_get_target_types(uint32** dst_formats, uint16* size, GdkAtom* types, int count) -+{ -+ int i; -+ gboolean image = FALSE; -+ gboolean text = FALSE; -+ gboolean textutf8 = FALSE; -+ int matches = 1; -+ uint32* formats = (uint32*) xmalloc(sizeof(uint32) * 10); -+ -+ formats[0] = CB_FORMAT_RAW; -+ for (i = 0; i < count; i++) -+ { -+ GdkAtom atom = GDK_POINTER_TO_ATOM(types[i]); -+ gchar* name = gdk_atom_name(atom); -+ if (g_strcmp0("UTF8_STRING", name) == 0 || g_strcmp0("text/plain;charset=utf-8", name) == 0) -+ { -+ textutf8 = TRUE; -+ } -+ if (g_strcmp0("TEXT", name) == 0 || g_strcmp0("text/plain", name) == 0) -+ { -+ text = TRUE; -+ } -+ if (g_strcmp0("text/html", name) == 0) -+ { -+ formats[matches] = CB_FORMAT_HTML; -+ matches++; -+ } -+ if (g_strcmp0("image/png", name) == 0) -+ { -+ formats[matches] = CB_FORMAT_PNG; -+ image = TRUE; -+ matches++; -+ } -+ if (g_strcmp0("image/jpeg", name) == 0) -+ { -+ formats[matches] = CB_FORMAT_JPEG; -+ image = TRUE; -+ matches++; -+ } -+ if (g_strcmp0("image/bmp", name) == 0) -+ { -+ formats[matches] = CB_FORMAT_DIB; -+ image = TRUE; -+ matches++; -+ } -+ } -+ //Only add text formats if we don't have image formats -+ if (!image) -+ { -+ if (textutf8) -+ { -+ formats[matches] = CB_FORMAT_UNICODETEXT; -+ matches++; -+ } -+ if (text) -+ { -+ formats[matches] = CB_FORMAT_TEXT; -+ matches++; -+ } -+ } -+ -+ *size = (uint16)matches; -+ *dst_formats = (uint32*) xmalloc(sizeof(uint32) * matches); -+ memcpy(*dst_formats, formats, sizeof(uint32) * matches); -+ g_free(formats); -+} -+ -+int remmina_rdp_cliprdr_send_format_list_event(RemminaProtocolWidget* gp) -+{ -+ GtkClipboard* clipboard; -+ GdkAtom* targets; -+ gboolean result = 0; -+ gint count; -+ RDP_EVENT* rdp_event; -+ RDP_CB_FORMAT_LIST_EVENT* format_list_event; -+ rfContext* rfi = GET_DATA(gp); -+ -+ /* Lets see if we have something in our clipboard */ -+ THREADS_ENTER -+ clipboard = gtk_widget_get_clipboard(rfi->drawing_area, GDK_SELECTION_CLIPBOARD); -+ if (clipboard) -+ { -+ result = gtk_clipboard_wait_for_targets(clipboard, &targets, &count); -+ } -+ THREADS_LEAVE -+ -+ if (!result) -+ return 1; -+ -+ int i; -+ for (i = 0; i < count; i++) -+ { -+ g_printf("Target %d: %s\n", i, gdk_atom_name(targets[i])); -+ } -+ -+ rdp_event = (RDP_EVENT*) xnew(RDP_CB_FORMAT_LIST_EVENT); -+ rdp_event->event_class = RDP_EVENT_CLASS_CLIPRDR; -+ rdp_event->event_type = RDP_EVENT_TYPE_CB_FORMAT_LIST; -+ format_list_event = (RDP_CB_FORMAT_LIST_EVENT*) rdp_event; -+ -+ remmina_rdp_cliprdr_get_target_types(&format_list_event->formats, &format_list_event->num_formats, targets, count); -+ g_free(targets); -+ -+ int num_formats = format_list_event->num_formats; -+ g_printf("Sending %d formats\n", num_formats); -+ for (i = 0; i < num_formats; i++) -+ { -+ g_printf("Sending format %#X\n", format_list_event->formats[i]); -+ } -+ -+ return freerdp_channels_send_event(rfi->channels, (RDP_EVENT*) format_list_event); -+} -+ -+static uint8* lf2crlf(uint8* data, int* size) -+{ -+ uint8 c; -+ uint8* outbuf; -+ uint8* out; -+ uint8* in_end; -+ uint8* in; -+ int out_size; -+ -+ out_size = (*size) * 2 + 1; -+ outbuf = (uint8*) xmalloc(out_size); -+ out = outbuf; -+ in = data; -+ in_end = data + (*size); -+ -+ while (in < in_end) -+ { -+ c = *in++; -+ if (c == '\n') -+ { -+ *out++ = '\r'; -+ *out++ = '\n'; -+ } -+ else -+ { -+ *out++ = c; -+ } -+ } -+ -+ *out++ = 0; -+ *size = out - outbuf; -+ -+ return outbuf; -+} -+ -+static void crlf2lf(uint8* data, int* size) -+{ -+ uint8 c; -+ uint8* out; -+ uint8* in; -+ uint8* in_end; -+ -+ out = data; -+ in = data; -+ in_end = data + (*size); -+ -+ while (in < in_end) -+ { -+ c = *in++; -+ -+ if (c != '\r') -+ *out++ = c; -+ } -+ -+ *size = out - data; -+} -+ -+uint8* remmina_rdp_cliprdr_get_data(RemminaProtocolWidget* gp, uint32 format, int* size) -+{ -+ g_printf("GetData: Requested Format: %#X\n", format); -+ rfContext* rfi = GET_DATA(gp); -+ GtkClipboard* clipboard; -+ uint8* inbuf = NULL; -+ uint8* outbuf = NULL; -+ GdkPixbuf *image = NULL; -+ -+ THREADS_ENTER -+ clipboard = gtk_widget_get_clipboard(rfi->drawing_area, GDK_SELECTION_CLIPBOARD); -+ if (clipboard) -+ { -+ if (format == CB_FORMAT_TEXT || format == CB_FORMAT_UNICODETEXT || format == CB_FORMAT_HTML) -+ { -+ inbuf = (uint8*)gtk_clipboard_wait_for_text(clipboard); -+ } -+ if (format == CB_FORMAT_PNG || format == CB_FORMAT_JPEG || format == CB_FORMAT_DIB) -+ { -+ image = gtk_clipboard_wait_for_image(clipboard); -+ } -+ } -+ THREADS_LEAVE -+ -+ if (format == CB_FORMAT_TEXT || format == CB_FORMAT_HTML || format == CB_FORMAT_UNICODETEXT) -+ { -+ lf2crlf(inbuf, size); -+ if (format == CB_FORMAT_TEXT) -+ { -+ outbuf = inbuf; -+ } -+ if (format == CB_FORMAT_HTML) -+ { -+ //TODO: check if we need special handling for HTML -+ outbuf = inbuf; -+ } -+ if (format == CB_FORMAT_UNICODETEXT) -+ { -+ size_t out_size; -+ UNICONV* uniconv; -+ -+ uniconv = freerdp_uniconv_new(); -+ outbuf = (uint8*) freerdp_uniconv_out(uniconv, (char*) inbuf, &out_size); -+ freerdp_uniconv_free(uniconv); -+ *size = out_size + 2; -+ } -+ } -+ if (format == CB_FORMAT_PNG || format == CB_FORMAT_JPEG || format == CB_FORMAT_DIB) -+ { -+ gchar* data; -+ gsize buffersize; -+ if (format == CB_FORMAT_PNG) -+ { -+ gdk_pixbuf_save_to_buffer(image, &data, &buffersize, "png", NULL, NULL); -+ memcpy(outbuf, data, buffersize); -+ } -+ if (format == CB_FORMAT_JPEG) -+ { -+ gdk_pixbuf_save_to_buffer(image, &data, &buffersize, "jpeg", NULL, NULL); -+ memcpy(outbuf, data, buffersize); -+ } -+ if (format == CB_FORMAT_DIB) -+ { -+ gdk_pixbuf_save_to_buffer(image, &data, &buffersize, "bmp", NULL, NULL); -+ *size = buffersize - 14; -+ g_printf("Size of pixels: %d\n", *size); -+ outbuf = (uint8*) xmalloc(*size); -+ memcpy(outbuf, data + 14, *size); -+ } -+ } -+ -+ if (!outbuf) -+ outbuf = (uint8*)""; -+ -+ return outbuf; -+} -+ -+void remmina_rdp_cliprdr_parse_response_event(RemminaProtocolWidget* gp, RDP_EVENT* event) -+{ -+ g_printf("Received RDP_EVENT_TYPE_CB_DATA_RESPONSE\n"); -+ -+ GtkClipboard* clipboard; -+ GdkPixbuf *image = NULL; -+ uint8* data; -+ int size; -+ gboolean text = FALSE; -+ gboolean img = FALSE; -+ rfContext* rfi = GET_DATA(gp); -+ RDP_CB_DATA_RESPONSE_EVENT* data_response_event; -+ -+ data_response_event = (RDP_CB_DATA_RESPONSE_EVENT*) event; -+ data = data_response_event->data; -+ size = data_response_event->size; -+ -+ g_printf("Requested format was: 0x%x\n", rfi->requested_format); -+ -+ if (rfi->requested_format == CB_FORMAT_TEXT || rfi->requested_format == CB_FORMAT_UNICODETEXT || rfi->requested_format == CB_FORMAT_HTML) -+ { -+ if (rfi->requested_format == CB_FORMAT_UNICODETEXT) -+ { -+ UNICONV* uniconv; -+ -+ uniconv = freerdp_uniconv_new(); -+ data = (uint8*) freerdp_uniconv_in(uniconv, data, size); -+ size = strlen((char*) data); -+ freerdp_uniconv_free(uniconv); -+ } -+ crlf2lf(data, &size); -+ text = TRUE; -+ } -+ if (rfi->requested_format == CB_FORMAT_DIB || rfi->requested_format == CB_FORMAT_PNG || rfi->requested_format == CB_FORMAT_JPEG) -+ { -+ /* Reconstruct header */ -+ if (rfi->requested_format == CB_FORMAT_DIB) -+ { -+ STREAM* s; -+ uint16 bpp; -+ uint32 offset; -+ uint32 ncolors; -+ -+ s = stream_new(0); -+ stream_attach(s, data, size); -+ stream_seek(s, 14); -+ stream_read_uint16(s, bpp); -+ stream_read_uint32(s, ncolors); -+ offset = 14 + 40 + (bpp <= 8 ? (ncolors == 0 ? (1 << bpp) : ncolors) * 4 : 0); -+ stream_detach(s); -+ stream_free(s); -+ -+ s = stream_new(14 + size); -+ stream_write_uint8(s, 'B'); -+ stream_write_uint8(s, 'M'); -+ stream_write_uint32(s, 14 + size); -+ stream_write_uint32(s, 0); -+ stream_write_uint32(s, offset); -+ stream_write(s, data, size); -+ -+ data = stream_get_head(s); -+ size = stream_get_length(s); -+ stream_detach(s); -+ stream_free(s); -+ } -+ GdkPixbufLoader *pixbuf; -+ pixbuf = gdk_pixbuf_loader_new(); -+ gdk_pixbuf_loader_write(pixbuf, data, size, NULL); -+ image = gdk_pixbuf_loader_get_pixbuf(pixbuf); -+ img = TRUE; -+ } -+ -+ THREADS_ENTER -+ clipboard = gtk_widget_get_clipboard(rfi->drawing_area, GDK_SELECTION_CLIPBOARD); -+ if (clipboard) -+ { -+ if (text || img) -+ rfi->clipboard_wait = TRUE; -+ if (text) -+ gtk_clipboard_set_text(clipboard, (gchar*)data, size); -+ if (img) -+ gtk_clipboard_set_image(clipboard, image); -+ } -+ THREADS_LEAVE -+ -+} -+ -+void remmina_handle_channel_event(RemminaProtocolWidget* gp, RDP_EVENT* event) -+{ -+ RDP_EVENT* rdp_event = NULL; -+ rfContext* rfi = GET_DATA(gp); -+ -+ switch (event->event_class) -+ { -+ case RDP_EVENT_CLASS_CLIPRDR: -+ g_printf("Event ID: %d\n", event->event_type); -+ if (event->event_type == RDP_EVENT_TYPE_CB_MONITOR_READY) -+ { -+ g_printf("Received CB_MONITOR_READY - Sending RDP_EVENT_TYPE_CB_FORMAT_LIST\n"); -+ /* Sending our format list */ -+ remmina_rdp_cliprdr_send_format_list_event(gp); -+ } -+ if (event->event_type == RDP_EVENT_TYPE_CB_FORMAT_LIST) -+ { -+ /* We received a FORMAT_LIST from the server, update our clipboard */ -+ g_printf("Received RDP_EVENT_TYPE_CB_FORMAT_LIST\n"); -+ int i; -+ uint32 format = CB_FORMAT_RAW; -+ RDP_CB_FORMAT_LIST_EVENT* format_list_event; -+ -+ format_list_event = (RDP_CB_FORMAT_LIST_EVENT*) event; -+ -+ g_printf("Format List Size: %d\n", format_list_event->num_formats); -+ for (i = 0; i < format_list_event->num_formats; i++) -+ { -+ g_printf("Format: 0x%X\n", format_list_event->formats[i]); -+ if (format_list_event->formats[i] == CB_FORMAT_UNICODETEXT) -+ { -+ format = CB_FORMAT_UNICODETEXT; -+ break; -+ } -+ if (format_list_event->formats[i] == CB_FORMAT_DIB) -+ { -+ format = CB_FORMAT_DIB; -+ break; -+ } -+ if (format_list_event->formats[i] == CB_FORMAT_JPEG) -+ { -+ format = CB_FORMAT_JPEG; -+ break; -+ } -+ if (format_list_event->formats[i] == CB_FORMAT_PNG) -+ { -+ format = CB_FORMAT_PNG; -+ break; -+ } -+ if (format_list_event->formats[i] == CB_FORMAT_TEXT) -+ { -+ format = CB_FORMAT_TEXT; -+ break; -+ } -+ } -+ rfi->requested_format = format; -+ -+ g_printf("Format Requested: 0x%X\n", format); -+ /* Request Clipboard data of the server */ -+ RDP_CB_DATA_REQUEST_EVENT* data_request_event; -+ rdp_event = (RDP_EVENT*) xnew(RDP_CB_DATA_REQUEST_EVENT); -+ rdp_event->event_class = RDP_EVENT_CLASS_CLIPRDR; -+ rdp_event->event_type = RDP_EVENT_TYPE_CB_DATA_REQUEST; -+ data_request_event = (RDP_CB_DATA_REQUEST_EVENT*) rdp_event; -+ data_request_event->format = format; -+ freerdp_channels_send_event(rfi->channels, (RDP_EVENT*) data_request_event); -+ } -+ if (event->event_type == RDP_EVENT_TYPE_CB_DATA_REQUEST) -+ { -+ g_printf("Received RDP_EVENT_TYPE_CB_DATA_REQUEST\n"); -+ -+ uint8* data; -+ int size; -+ RDP_CB_DATA_REQUEST_EVENT* data_request_event = (RDP_CB_DATA_REQUEST_EVENT*) event; -+ RDP_CB_DATA_RESPONSE_EVENT* data_response_event; -+ -+ g_printf("Event Format: %d\n", data_request_event->format); -+ -+ /* Send Data */ -+ rdp_event = (RDP_EVENT*) xnew(RDP_CB_DATA_RESPONSE_EVENT); -+ rdp_event->event_class = RDP_EVENT_CLASS_CLIPRDR; -+ rdp_event->event_type = RDP_EVENT_TYPE_CB_DATA_RESPONSE; -+ data_response_event = (RDP_CB_DATA_RESPONSE_EVENT*) rdp_event; -+ data = remmina_rdp_cliprdr_get_data(gp, data_request_event->format, &size); -+ data_response_event->data = data; -+ data_response_event->size = size; -+ freerdp_channels_send_event(rfi->channels, rdp_event); -+ } -+ if (event->event_type == RDP_EVENT_TYPE_CB_DATA_RESPONSE) -+ { -+ remmina_rdp_cliprdr_parse_response_event(gp, event); -+ } -+ } -+} -diff --git a/remmina-plugins/rdp/rdp_cliprdr.h b/remmina-plugins/rdp/rdp_cliprdr.h -new file mode 100644 -index 0000000..ed6bf70 ---- /dev/null -+++ b/remmina-plugins/rdp/rdp_cliprdr.h -@@ -0,0 +1,33 @@ -+/* -+ * Remmina - The GTK+ Remote Desktop Client -+ * Copyright (C) 2010-2011 Vic Lee -+ * Copyright (C) 2012-2012 Jean-Louis Dupond -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 59 Temple Place, Suite 330, -+ * Boston, MA 02111-1307, USA. -+ */ -+ -+#ifndef __REMMINA_RDP_CLIPRDR_H__ -+#define __REMMINA_RDP_CLIPRDR_H__ -+ -+G_BEGIN_DECLS -+ -+RDP_EVENT* remmina_rdp_cliprdr_get_event(uint16 event_type); -+int remmina_rdp_cliprdr_send_format_list_event(RemminaProtocolWidget* gp); -+void remmina_handle_channel_event(RemminaProtocolWidget* gp, RDP_EVENT* event); -+ -+G_END_DECLS -+ -+#endif -diff --git a/remmina-plugins/rdp/rdp_event.c b/remmina-plugins/rdp/rdp_event.c -index f77f5f1..a936fb1 100644 ---- a/remmina-plugins/rdp/rdp_event.c -+++ b/remmina-plugins/rdp/rdp_event.c -@@ -461,6 +461,16 @@ static gboolean remmina_rdp_event_on_key(GtkWidget* widget, GdkEventKey* event, - return TRUE; - } - -+static gboolean remmina_rdp_event_on_clipboard(GtkClipboard *clipboard, GdkEvent *event, RemminaProtocolWidget *gp) -+{ -+ RemminaPluginRdpEvent rdp_event = { 0 }; -+ -+ rdp_event.type = REMMINA_RDP_EVENT_TYPE_CLIPBOARD; -+ remmina_rdp_event_event_push(gp, &rdp_event); -+ -+ return TRUE; -+} -+ - void remmina_rdp_event_init(RemminaProtocolWidget* gp) - { - gint n; -@@ -470,6 +480,7 @@ void remmina_rdp_event_init(RemminaProtocolWidget* gp) - XPixmapFormatValues* pf; - XPixmapFormatValues* pfs; - rfContext* rfi; -+ GtkClipboard* clipboard; - - rfi = GET_DATA(gp); - rfi->drawing_area = gtk_drawing_area_new(); -@@ -508,6 +519,14 @@ void remmina_rdp_event_init(RemminaProtocolWidget* gp) - g_signal_connect(G_OBJECT(rfi->drawing_area), "key-release-event", - G_CALLBACK(remmina_rdp_event_on_key), gp); - -+ RemminaFile* remminafile = remmina_plugin_service->protocol_plugin_get_file(gp); -+ if (!remmina_plugin_service->file_get_int(remminafile, "disableclipboard", FALSE)) -+ { -+ clipboard = gtk_widget_get_clipboard(rfi->drawing_area, GDK_SELECTION_CLIPBOARD); -+ g_signal_connect(clipboard, "owner-change", -+ G_CALLBACK(remmina_rdp_event_on_clipboard), gp); -+ } -+ - rfi->pressed_keys = g_array_new(FALSE, TRUE, sizeof (gint)); - rfi->event_queue = g_async_queue_new_full(g_free); - rfi->ui_queue = g_async_queue_new(); -diff --git a/remmina-plugins/rdp/rdp_plugin.c b/remmina-plugins/rdp/rdp_plugin.c -index 08874e6..fd0fe08 100644 ---- a/remmina-plugins/rdp/rdp_plugin.c -+++ b/remmina-plugins/rdp/rdp_plugin.c -@@ -24,6 +24,7 @@ - #include "rdp_graphics.h" - #include "rdp_file.h" - #include "rdp_settings.h" -+#include "rdp_cliprdr.h" - - #include <errno.h> - #include <pthread.h> -@@ -31,6 +32,7 @@ - #include <freerdp/freerdp.h> - #include <freerdp/constants.h> - #include <freerdp/utils/memory.h> -+#include <freerdp/plugins/cliprdr.h> - - #define REMMINA_RDP_FEATURE_TOOL_REFRESH 1 - #define REMMINA_RDP_FEATURE_SCALE 2 -@@ -128,6 +130,11 @@ boolean rf_check_fds(RemminaProtocolWidget* gp) - input->MouseEvent(input, event->mouse_event.flags, - event->mouse_event.x, event->mouse_event.y); - break; -+ case REMMINA_RDP_EVENT_TYPE_CLIPBOARD: -+ if (!rfi->clipboard_wait) -+ remmina_rdp_cliprdr_send_format_list_event(gp); -+ rfi->clipboard_wait = FALSE; -+ break; - } - - g_free(event); -@@ -503,6 +510,7 @@ static boolean remmina_rdp_verify_certificate(freerdp* instance, char* subject, - - static int remmina_rdp_receive_channel_data(freerdp* instance, int channelId, uint8* data, int size, int flags, int total_size) - { -+ g_printf("EVENT RECEIVED -> DATA: %s\nSIZE: %d\nFLAGS: %d\n", (char*)data, size, flags); - return freerdp_channels_data(instance, channelId, data, size, flags, total_size); - } - -@@ -518,6 +526,7 @@ static void remmina_rdp_main_loop(RemminaProtocolWidget* gp) - fd_set rfds_set; - fd_set wfds_set; - rfContext* rfi; -+ RDP_EVENT* event; - - memset(rfds, 0, sizeof(rfds)); - memset(wfds, 0, sizeof(wfds)); -@@ -591,6 +600,12 @@ static void remmina_rdp_main_loop(RemminaProtocolWidget* gp) - { - break; - } -+ else -+ { -+ event = freerdp_channels_pop_event(rfi->channels); -+ if (event) -+ remmina_handle_channel_event(gp, event); -+ } - /* check ui */ - if (!rf_check_fds(gp)) - { -diff --git a/remmina-plugins/rdp/rdp_plugin.h b/remmina-plugins/rdp/rdp_plugin.h -index a3774d9..1931384 100644 ---- a/remmina-plugins/rdp/rdp_plugin.h -+++ b/remmina-plugins/rdp/rdp_plugin.h -@@ -133,12 +133,16 @@ struct rf_context - GArray* pressed_keys; - GAsyncQueue* event_queue; - gint event_pipe[2]; -+ -+ gboolean clipboard_wait; -+ uint32 requested_format; - }; - - typedef enum - { - REMMINA_RDP_EVENT_TYPE_SCANCODE, -- REMMINA_RDP_EVENT_TYPE_MOUSE -+ REMMINA_RDP_EVENT_TYPE_MOUSE, -+ REMMINA_RDP_EVENT_TYPE_CLIPBOARD - } RemminaPluginRdpEventType; - - struct remmina_plugin_rdp_event --- -1.7.10 - |