summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2021-08-19 03:14:59 +0200
committerBenjamin Otte <otte@redhat.com>2021-08-19 03:16:48 +0200
commit6b733d294354c349b4b5ef7d689c0b2ef162f797 (patch)
tree5f45fa0f89ffd2c6b5200c97edbaad0e336f8bbd
parent6f165efcdbfb5c3a3254dbc8f6af56e90111cb5f (diff)
downloadgtk+-6b733d294354c349b4b5ef7d689c0b2ef162f797.tar.gz
gtk-demo: Make clipboard demo paste from clipboard
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.
-rw-r--r--demos/gtk-demo/demoimage.c44
1 files changed, 33 insertions, 11 deletions
diff --git a/demos/gtk-demo/demoimage.c b/demos/gtk-demo/demoimage.c
index 8fdc4257a5..dc5776cc5b 100644
--- a/demos/gtk-demo/demoimage.c
+++ b/demos/gtk-demo/demoimage.c
@@ -147,23 +147,45 @@ copy_image (GtkWidget *widget,
}
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