Signed-off-by: Jindrich Makovicka <makovick@gmail.com>
---
ui/gtk-clipboard.c | 47 ++++++++++++++++++++++++++++++++++-------------
1 file changed, 34 insertions(+), 13 deletions(-)
diff --git a/ui/gtk-clipboard.c b/ui/gtk-clipboard.c
index 65d89ec601..23d32947cc 100644
--- a/ui/gtk-clipboard.c
+++ b/ui/gtk-clipboard.c
@@ -136,26 +136,50 @@ static void gd_clipboard_notify(Notifier *notifier, void *data)
}
}
+static void
+gd_clipboard_request_text_received_callback(GtkClipboard *clipboard,
+ const gchar *text,
+ gpointer data)
+{
+ QemuClipboardInfo *info = (QemuClipboardInfo *)data;
+ if (text) {
+ qemu_clipboard_set_data(info->owner, info, QEMU_CLIPBOARD_TYPE_TEXT,
+ strlen(text), text, true);
+ }
+ qemu_clipboard_info_unref(info);
+}
+
static void gd_clipboard_request(QemuClipboardInfo *info,
QemuClipboardType type)
{
GtkDisplayState *gd = container_of(info->owner, GtkDisplayState, cbpeer);
- char *text;
switch (type) {
case QEMU_CLIPBOARD_TYPE_TEXT:
- text = gtk_clipboard_wait_for_text(gd->gtkcb[info->selection]);
- if (text) {
- qemu_clipboard_set_data(&gd->cbpeer, info, type,
- strlen(text), text, true);
- g_free(text);
- }
+ qemu_clipboard_info_ref(info);
+ gtk_clipboard_request_text(gd->gtkcb[info->selection],
+ gd_clipboard_request_text_received_callback,
+ info);
break;
default:
break;
}
}
+static void
+gd_clipboard_owner_change_text_received_callback(GtkClipboard *clipboard,
+ const gchar *text,
+ gpointer data)
+{
+ QemuClipboardInfo *info = (QemuClipboardInfo *)data;
+ if (text) {
+ info->types[QEMU_CLIPBOARD_TYPE_TEXT].available = true;
+ }
+
+ qemu_clipboard_update(info);
+ qemu_clipboard_info_unref(info);
+}
+
static void gd_owner_change(GtkClipboard *clipboard,
GdkEvent *event,
gpointer data)
@@ -173,12 +197,9 @@ static void gd_owner_change(GtkClipboard *clipboard,
switch (event->owner_change.reason) {
case GDK_OWNER_CHANGE_NEW_OWNER:
info = qemu_clipboard_info_new(&gd->cbpeer, s);
- if (gtk_clipboard_wait_is_text_available(clipboard)) {
- info->types[QEMU_CLIPBOARD_TYPE_TEXT].available = true;
- }
-
- qemu_clipboard_update(info);
- qemu_clipboard_info_unref(info);
+ gtk_clipboard_request_text(clipboard,
+ gd_clipboard_owner_change_text_received_callback,
+ info);
break;
default:
qemu_clipboard_peer_release(&gd->cbpeer, s);
--
2.53.0