diff options
author | Matthias Clasen <mclasen@redhat.com> | 2023-01-14 22:38:20 -0500 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2023-01-14 22:38:20 -0500 |
commit | a0f63160d6e8cf237bccf3302f4c9b7e5b9aec3c (patch) | |
tree | a2b7dbd29c3ca261002d92768b39fd525542b7f3 /demos/widget-factory | |
parent | c99d85954aeda08cef4d24a1be354cc8a92799bc (diff) | |
download | gtk+-a0f63160d6e8cf237bccf3302f4c9b7e5b9aec3c.tar.gz |
widgetfactory: Load textures in threads
It is useful to show how this is done, even
though the images here are not terribly large.
Diffstat (limited to 'demos/widget-factory')
-rw-r--r-- | demos/widget-factory/widget-factory.c | 68 | ||||
-rw-r--r-- | demos/widget-factory/widget-factory.ui | 9 |
2 files changed, 71 insertions, 6 deletions
diff --git a/demos/widget-factory/widget-factory.c b/demos/widget-factory/widget-factory.c index 99fd76c258..146ecfab26 100644 --- a/demos/widget-factory/widget-factory.c +++ b/demos/widget-factory/widget-factory.c @@ -2057,6 +2057,67 @@ hide_widget (GtkWidget *widget) } static void +load_texture_thread (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + const char *resource_path = (const char *) task_data; + GBytes *bytes; + GdkTexture *texture; + GError *error = NULL; + + bytes = g_resources_lookup_data (resource_path, 0, &error); + if (!bytes) + { + g_task_return_error (task, error); + return; + } + + texture = gdk_texture_new_from_bytes (bytes, &error); + g_bytes_unref (bytes); + + if (!texture) + { + g_task_return_error (task, error); + return; + } + + g_task_return_pointer (task, texture, g_object_unref); +} + +static void +load_texture_done (GObject *source, + GAsyncResult *result, + gpointer data) +{ + GtkWidget *picture = GTK_WIDGET (source); + GdkTexture *texture; + GError *error = NULL; + + texture = g_task_propagate_pointer (G_TASK (result), &error); + if (!texture) + { + g_warning ("%s", error->message); + g_error_free (error); + return; + } + + gtk_picture_set_paintable (GTK_PICTURE (picture), GDK_PAINTABLE (texture)); + g_object_unref (texture); +} + +static void +load_texture_in_thread (GtkWidget *picture, + const char *resource_path) +{ + GTask *task = g_task_new (picture, NULL, load_texture_done, NULL); + g_task_set_task_data (task, (gpointer)resource_path, NULL); + g_task_run_in_thread (task, load_texture_thread); + g_object_unref (task); +} + +static void activate (GApplication *app) { GtkBuilder *builder; @@ -2155,6 +2216,13 @@ activate (GApplication *app) window = (GtkWindow *)gtk_builder_get_object (builder, "window"); + load_texture_in_thread ((GtkWidget *)gtk_builder_get_object (builder, "notebook_sunset"), + "/org/gtk/WidgetFactory4/sunset.jpg"); + load_texture_in_thread ((GtkWidget *)gtk_builder_get_object (builder, "notebook_nyc"), + "/org/gtk/WidgetFactory4/nyc.jpg"); + load_texture_in_thread ((GtkWidget *)gtk_builder_get_object (builder, "notebook_beach"), + "/org/gtk/WidgetFactory4/beach.jpg"); + if (g_strcmp0 (PROFILE, "devel") == 0) gtk_widget_add_css_class (GTK_WIDGET (window), "devel"); diff --git a/demos/widget-factory/widget-factory.ui b/demos/widget-factory/widget-factory.ui index db55c43cc4..9c3b5d7e84 100644 --- a/demos/widget-factory/widget-factory.ui +++ b/demos/widget-factory/widget-factory.ui @@ -1263,8 +1263,7 @@ Suspendisse feugiat quam quis dolor accumsan cursus.</property> <child> <object class="GtkNotebookPage"> <property name="child"> - <object class="GtkPicture"> - <property name="file">resource:///org/gtk/WidgetFactory4/sunset.jpg</property> + <object class="GtkPicture" id="notebook_sunset"> <property name="content-fit">cover</property> <child> <object class="GtkDragSource"> @@ -1290,8 +1289,7 @@ Suspendisse feugiat quam quis dolor accumsan cursus.</property> <child> <object class="GtkNotebookPage"> <property name="child"> - <object class="GtkPicture"> - <property name="file">resource:///org/gtk/WidgetFactory4/nyc.jpg</property> + <object class="GtkPicture" id="notebook_nyc"> <child> <object class="GtkDragSource"> <signal name="prepare" handler="on_picture_drag_prepare" swapped="no"/> @@ -1316,8 +1314,7 @@ Suspendisse feugiat quam quis dolor accumsan cursus.</property> <child> <object class="GtkNotebookPage"> <property name="child"> - <object class="GtkPicture"> - <property name="file">resource:///org/gtk/WidgetFactory4/beach.jpg</property> + <object class="GtkPicture" id="notebook_beach"> <child> <object class="GtkDragSource"> <signal name="prepare" handler="on_picture_drag_prepare" swapped="no"/> |