summaryrefslogtreecommitdiff
path: root/demos/widget-factory
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2023-01-14 22:38:20 -0500
committerMatthias Clasen <mclasen@redhat.com>2023-01-14 22:38:20 -0500
commita0f63160d6e8cf237bccf3302f4c9b7e5b9aec3c (patch)
treea2b7dbd29c3ca261002d92768b39fd525542b7f3 /demos/widget-factory
parentc99d85954aeda08cef4d24a1be354cc8a92799bc (diff)
downloadgtk+-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.c68
-rw-r--r--demos/widget-factory/widget-factory.ui9
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"/>