gtk-demo: Make clipboard demo paste from clipboard
authorBenjamin Otte <otte@redhat.com>
Thu, 19 Aug 2021 01:14:59 +0000 (03:14 +0200)
committerBenjamin Otte <otte@redhat.com>
Thu, 19 Aug 2021 01:16:48 +0000 (03:16 +0200)
The old code was just pasting local clipboard data that we put there
ourselves and was causing criticals on remote clipboard data. Now the
code does the proper async paste.

demos/gtk-demo/demoimage.c

index 8fdc4257a578a1c7ea36631bce1eea53db508101..dc5776cc5be826cc88fa3c93ae7874aab62b0ed1 100644 (file)
@@ -146,24 +146,46 @@ copy_image (GtkWidget *widget,
     g_object_unref (paintable);
 }
 
+static void
+paste_image_cb (GObject      *source,
+                GAsyncResult *result,
+                gpointer      data)
+{
+  GdkClipboard *clipboard = GDK_CLIPBOARD (source);
+  DemoImage *demo = DEMO_IMAGE (data);
+  const GValue *value;
+
+  value = gdk_clipboard_read_value_finish (clipboard, result, NULL);
+  if (value == NULL)
+    {
+      gtk_widget_error_bell (GTK_WIDGET (demo));
+      g_object_unref (demo);
+      return;
+    }
+
+  gtk_image_set_from_paintable (GTK_IMAGE (demo->image), g_value_get_object (value));
+  g_object_unref (demo);
+}
+
 static void
 paste_image (GtkWidget *widget,
              const char *action_name,
              GVariant *parameter)
 {
   GdkClipboard *clipboard = gtk_widget_get_clipboard (widget);
-  DemoImage *demo = DEMO_IMAGE (widget);
-  GdkContentProvider *content = gdk_clipboard_get_content (clipboard);
-  GValue value = G_VALUE_INIT;
-  GdkPaintable *paintable;
+  GType type;
 
-  g_value_init (&value, GDK_TYPE_PAINTABLE);
-  if (!gdk_content_provider_get_value (content, &value, NULL))
-    return;
-
-  paintable = GDK_PAINTABLE (g_value_get_object (&value));
-  gtk_image_set_from_paintable (GTK_IMAGE (demo->image), paintable);
-  g_value_unset (&value);
+  if (gdk_content_formats_contain_gtype (gdk_clipboard_get_formats (clipboard), GDK_TYPE_TEXTURE))
+    type = GDK_TYPE_TEXTURE;
+  else
+    type = GDK_TYPE_PAINTABLE;
+
+  gdk_clipboard_read_value_async (clipboard, 
+                                  type,
+                                  G_PRIORITY_DEFAULT,
+                                  NULL,
+                                  paste_image_cb,
+                                  g_object_ref (widget));
 }
 
 static void