[gnome-initial-setup: 1/3] account: Use facesdirs setting to override faces
- From: Will Thompson <wjt src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-initial-setup: 1/3] account: Use facesdirs setting to override faces
- Date: Fri, 26 Jun 2020 10:27:00 +0000 (UTC)
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]