[gnome-initial-setup: 1/3] account: Use facesdirs setting to override faces



commit 4c020713141ef6745f02fe7421daf045fe5823e0
Author: Daniel GarcĂ­a Moreno <daniel endlessm com>
Date:   Tue Sep 17 18:58:52 2019 +0200

    account: Use facesdirs setting to override faces
    
    This patch uses the org.gnome.desktop.interface.facesdirs
    configuration to override the default faces dir.
    
    See this MR: https://gitlab.gnome.org/GNOME/gsettings-desktop-schemas/-/merge_requests/29
    
    See https://gitlab.gnome.org/GNOME/gnome-control-center/issues/678

 .../pages/account/um-photo-dialog.c                | 122 +++++++++++++++------
 1 file changed, 89 insertions(+), 33 deletions(-)
---
diff --git a/gnome-initial-setup/pages/account/um-photo-dialog.c 
b/gnome-initial-setup/pages/account/um-photo-dialog.c
index f85f054c..709c619d 100644
--- a/gnome-initial-setup/pages/account/um-photo-dialog.c
+++ b/gnome-initial-setup/pages/account/um-photo-dialog.c
@@ -215,45 +215,63 @@ create_face_widget (gpointer item,
         return image;
 }
 
-static void
-setup_photo_popup (UmPhotoDialog *um)
+static GStrv
+get_settings_facesdirs (void)
 {
-        GFileType type;
-        const gchar *target;
-        const gchar * const * dirs;
-        guint i;
-        gboolean added_faces;
+        g_autoptr(GSettingsSchema) schema = NULL;
+        g_autoptr(GPtrArray) facesdirs = g_ptr_array_new ();
+        g_autoptr(GSettings) settings = g_settings_new ("org.gnome.desktop.interface");
+        g_auto(GStrv) settings_dirs = g_settings_get_strv (settings, "avatar-directories");
+
+        if (settings_dirs != NULL) {
+                int i;
+                for (i = 0; settings_dirs[i] != NULL; i++) {
+                        char *path = settings_dirs[i];
+                        if (path != NULL && g_strcmp0 (path, "") != 0)
+                                g_ptr_array_add (facesdirs, g_strdup (path));
+                }
+        }
 
-        um->faces = g_list_store_new (G_TYPE_FILE);
-        gtk_flow_box_bind_model (GTK_FLOW_BOX (um->flowbox),
-                                 G_LIST_MODEL (um->faces),
-                                 create_face_widget,
-                                 um,
-                                 NULL);
+        // NULL terminated array
+        g_ptr_array_add (facesdirs, NULL);
+        return (GStrv) g_steal_pointer (&facesdirs->pdata);
+}
 
-        g_signal_connect (um->flowbox, "child-activated",
-                          G_CALLBACK (face_widget_activated), um);
+static GStrv
+get_system_facesdirs (void)
+{
+        g_autoptr(GPtrArray) facesdirs = NULL;
+        const char * const * data_dirs;
+        int i;
 
-        um->recent_faces = g_list_store_new (G_TYPE_FILE);
-        gtk_flow_box_bind_model (GTK_FLOW_BOX (um->recent_pictures),
-                                 G_LIST_MODEL (um->recent_faces),
-                                 create_face_widget,
-                                 um,
-                                 NULL);
-        g_signal_connect (um->recent_pictures, "child-activated",
-                          G_CALLBACK (generated_avatar_activated), um);
-        um->custom_avatar_was_chosen = FALSE;
+        facesdirs = g_ptr_array_new ();
+
+        data_dirs = g_get_system_data_dirs ();
+        for (i = 0; data_dirs[i] != NULL; i++) {
+                char *path = g_build_filename (data_dirs[i], "pixmaps", "faces", NULL);
+                g_ptr_array_add (facesdirs, path);
+        }
+
+        // NULL terminated array
+        g_ptr_array_add (facesdirs, NULL);
+        return (GStrv) g_steal_pointer (&facesdirs->pdata);
+}
+
+static gboolean
+add_faces_from_dirs (GListStore *faces, GStrv facesdirs, gboolean add_all)
+{
+        gboolean added_faces = FALSE;
+        const gchar *target;
+        int i;
+        GFileType type;
 
-        dirs = g_get_system_data_dirs ();
-        for (i = 0; dirs[i] != NULL; i++) {
+        for (i = 0; facesdirs[i] != NULL; i++) {
                 g_autoptr(GFileEnumerator) enumerator = NULL;
                 g_autoptr(GFile) dir = NULL;
-                g_autofree gchar *path = NULL;
+                const char *path = facesdirs[i];
                 gpointer infoptr;
 
-                path = g_build_filename (dirs[i], "pixmaps", "faces", NULL);
                 dir = g_file_new_for_path (path);
-
                 enumerator = g_file_enumerate_children (dir,
                                                         G_FILE_ATTRIBUTE_STANDARD_NAME ","
                                                         G_FILE_ATTRIBUTE_STANDARD_TYPE ","
@@ -261,6 +279,7 @@ setup_photo_popup (UmPhotoDialog *um)
                                                         G_FILE_ATTRIBUTE_STANDARD_SYMLINK_TARGET,
                                                         G_FILE_QUERY_INFO_NONE,
                                                         NULL, NULL);
+
                 if (enumerator == NULL)
                         continue;
 
@@ -268,8 +287,6 @@ setup_photo_popup (UmPhotoDialog *um)
                         g_autoptr (GFileInfo) info = infoptr;
                         g_autoptr (GFile) face_file = NULL;
 
-                        added_faces = TRUE;
-
                         type = g_file_info_get_file_type (info);
                         if (type != G_FILE_TYPE_REGULAR && type != G_FILE_TYPE_SYMBOLIC_LINK)
                                 continue;
@@ -279,12 +296,51 @@ setup_photo_popup (UmPhotoDialog *um)
                                 continue;
 
                         face_file = g_file_get_child (dir, g_file_info_get_name (info));
-                        g_list_store_append (um->faces, face_file);
+                        g_list_store_append (faces, face_file);
+                        added_faces = TRUE;
                 }
 
-                if (added_faces)
+                g_file_enumerator_close (enumerator, NULL, NULL);
+
+                if (added_faces && !add_all)
                         break;
         }
+        return added_faces;
+}
+
+static void
+setup_photo_popup (UmPhotoDialog *um)
+{
+        g_auto(GStrv) facesdirs;
+        gboolean added_faces = FALSE;
+
+        um->faces = g_list_store_new (G_TYPE_FILE);
+        gtk_flow_box_bind_model (GTK_FLOW_BOX (um->flowbox),
+                                 G_LIST_MODEL (um->faces),
+                                 create_face_widget,
+                                 um,
+                                 NULL);
+
+        g_signal_connect (um->flowbox, "child-activated",
+                          G_CALLBACK (face_widget_activated), um);
+
+        um->recent_faces = g_list_store_new (G_TYPE_FILE);
+        gtk_flow_box_bind_model (GTK_FLOW_BOX (um->recent_pictures),
+                                 G_LIST_MODEL (um->recent_faces),
+                                 create_face_widget,
+                                 um,
+                                 NULL);
+        g_signal_connect (um->recent_pictures, "child-activated",
+                          G_CALLBACK (generated_avatar_activated), um);
+        um->custom_avatar_was_chosen = FALSE;
+
+        facesdirs = get_settings_facesdirs ();
+        added_faces = add_faces_from_dirs (um->faces, facesdirs, TRUE);
+
+        if (!added_faces) {
+                facesdirs = get_system_facesdirs ();
+                add_faces_from_dirs (um->faces, facesdirs, FALSE);
+        }
 
 #ifdef HAVE_CHEESE
         um->cancellable = g_cancellable_new ();


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]