From: Jindřich Makovička <[email protected]>
Signed-off-by: Jindrich Makovicka <[email protected]>
Reviewed-by: Marc-André Lureau <[email protected]>
Message-ID: <[email protected]>
---
ui/gtk-clipboard.c | 53 ++++++++++++++++++++++++++++++++++------------
1 file changed, 40 insertions(+), 13 deletions(-)
diff --git a/ui/gtk-clipboard.c b/ui/gtk-clipboard.c
index 65d89ec601d..463ed4e905b 100644
--- a/ui/gtk-clipboard.c
+++ b/ui/gtk-clipboard.c
@@ -136,26 +136,55 @@ 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_targets_received_callback(
+ GtkClipboard *clipboard,
+ GdkAtom *targets,
+ gint n_targets,
+ gpointer data)
+{
+ QemuClipboardInfo *info = (QemuClipboardInfo *)data;
+
+ if (n_targets) {
+ if (gtk_targets_include_text(targets, n_targets)) {
+ 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 +202,10 @@ 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_targets(
+ clipboard,
+ gd_clipboard_owner_change_targets_received_callback,
+ info);
break;
default:
qemu_clipboard_peer_release(&gd->cbpeer, s);
--
2.54.0