widgetfactory: Load textures in threads
authorMatthias Clasen <mclasen@redhat.com>
Sun, 15 Jan 2023 03:38:20 +0000 (22:38 -0500)
committerMatthias Clasen <mclasen@redhat.com>
Sun, 15 Jan 2023 03:38:20 +0000 (22:38 -0500)
It is useful to show how this is done, even
though the images here are not terribly large.

demos/widget-factory/widget-factory.c
demos/widget-factory/widget-factory.ui

index 99fd76c2582d2929af16fcecabcba5aef9f83bfd..146ecfab2620de1b43c0bd88c0aefbc39b46aad8 100644 (file)
@@ -2056,6 +2056,67 @@ hide_widget (GtkWidget *widget)
   gtk_widget_set_visible (widget, FALSE);
 }
 
+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)
 {
@@ -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");
 
index db55c43cc40ace1620e4184d860675acb67248dd..9c3b5d7e84d40bdeb4e94944e1f759abc8e86e9e 100644 (file)
@@ -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"/>