diff options
author | Benjamin Otte <otte@redhat.com> | 2021-08-19 03:14:59 +0200 |
---|---|---|
committer | Benjamin Otte <otte@redhat.com> | 2021-08-19 03:16:48 +0200 |
commit | 6b733d294354c349b4b5ef7d689c0b2ef162f797 (patch) | |
tree | 5f45fa0f89ffd2c6b5200c97edbaad0e336f8bbd | |
parent | 6f165efcdbfb5c3a3254dbc8f6af56e90111cb5f (diff) | |
download | gtk+-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.c | 44 |
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 |