summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel GarcĂ­a Moreno <daniel@endlessm.com>2019-09-17 18:29:48 +0200
committerBenjamin Berg <benjamin@sipsolutions.net>2020-05-07 15:06:02 +0000
commit3bcea691b8d4ab06ec2e01ca240217cc5a615635 (patch)
tree4e8ffcf5902c5d92a7dea73b9ba90595823eab75
parentc0e0ffa267b86abe15a306c53cc7160c6dec5917 (diff)
downloadgnome-control-center-3bcea691b8d4ab06ec2e01ca240217cc5a615635.tar.gz
user-accounts: Use custom setting to override faces
This patch provides an easy way to override default faces using org.gnome.desktop.interface.avatar-directories settings configuration that can be used in gnome-initial-setup too so downstream can override default avatar faces without the need of a patch. Fix https://gitlab.gnome.org/GNOME/gnome-control-center/issues/678
-rw-r--r--panels/user-accounts/cc-avatar-chooser.c96
1 files changed, 71 insertions, 25 deletions
diff --git a/panels/user-accounts/cc-avatar-chooser.c b/panels/user-accounts/cc-avatar-chooser.c
index 60c4010e3..13d290a71 100644
--- a/panels/user-accounts/cc-avatar-chooser.c
+++ b/panels/user-accounts/cc-avatar-chooser.c
@@ -406,35 +406,57 @@ cheese_camera_device_monitor_new_cb (GObject *source,
}
#endif /* HAVE_CHEESE */
-static void
-setup_photo_popup (CcAvatarChooser *self)
+static GStrv
+get_settings_facesdirs (void)
+{
+ g_autoptr(GSettings) settings = g_settings_new ("org.gnome.desktop.interface");
+ g_auto(GStrv) settings_dirs = g_settings_get_strv (settings, "avatar-directories");
+ GPtrArray *facesdirs = g_ptr_array_new ();
+
+ if (settings_dirs != NULL) {
+ int i;
+ for (i = 0; settings_dirs[i] != NULL; i++) {
+ char *path = settings_dirs[i];
+ if (g_strcmp0 (path, "") != 0)
+ g_ptr_array_add (facesdirs, g_strdup (path));
+ }
+ }
+ g_ptr_array_add (facesdirs, NULL);
+
+ return (GStrv) g_ptr_array_steal (facesdirs, NULL);
+}
+
+static GStrv
+get_system_facesdirs (void)
+{
+ const char * const * data_dirs;
+ GPtrArray *facesdirs;
+ int i;
+
+ 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);
+ }
+ g_ptr_array_add (facesdirs, NULL);
+ return (GStrv) g_ptr_array_steal (facesdirs, NULL);
+}
+
+static gboolean
+add_faces_from_dirs (GListStore *faces, GStrv facesdirs, gboolean add_all)
{
GFile *file, *dir;
GFileInfo *info;
GFileEnumerator *enumerator;
GFileType type;
const gchar *target;
- const gchar * const * dirs;
guint i;
- gboolean added_faces;
-
- self->faces = g_list_store_new (G_TYPE_FILE);
- gtk_flow_box_bind_model (GTK_FLOW_BOX (self->flowbox),
- G_LIST_MODEL (self->faces),
- create_face_widget,
- self,
- NULL);
-
- g_signal_connect_object (self->flowbox, "child-activated",
- G_CALLBACK (face_widget_activated), self, G_CONNECT_SWAPPED);
-
- dirs = g_get_system_data_dirs ();
- for (i = 0; dirs[i] != NULL; i++) {
- char *path;
+ gboolean added_faces = FALSE;
- path = g_build_filename (dirs[i], "pixmaps", "faces", NULL);
- dir = g_file_new_for_path (path);
- g_free (path);
+ for (i = 0; facesdirs[i] != NULL; i++) {
+ dir = g_file_new_for_path (facesdirs[i]);
enumerator = g_file_enumerate_children (dir,
G_FILE_ATTRIBUTE_STANDARD_NAME ","
@@ -449,8 +471,6 @@ setup_photo_popup (CcAvatarChooser *self)
}
while ((info = g_file_enumerator_next_file (enumerator, NULL, NULL)) != NULL) {
- added_faces = TRUE;
-
type = g_file_info_get_file_type (info);
if (type != G_FILE_TYPE_REGULAR &&
type != G_FILE_TYPE_SYMBOLIC_LINK) {
@@ -465,18 +485,44 @@ setup_photo_popup (CcAvatarChooser *self)
}
file = g_file_get_child (dir, g_file_info_get_name (info));
- g_list_store_append (self->faces, file);
+ g_list_store_append (faces, file);
g_object_unref (info);
+ added_faces = TRUE;
}
g_file_enumerator_close (enumerator, NULL, NULL);
g_object_unref (enumerator);
g_object_unref (dir);
- if (added_faces)
+ if (added_faces && !add_all)
break;
}
+ return added_faces;
+}
+
+
+static void
+setup_photo_popup (CcAvatarChooser *self)
+{
+ g_auto(GStrv) settings_facesdirs = NULL;
+
+ self->faces = g_list_store_new (G_TYPE_FILE);
+ gtk_flow_box_bind_model (GTK_FLOW_BOX (self->flowbox),
+ G_LIST_MODEL (self->faces),
+ create_face_widget,
+ self,
+ NULL);
+
+ g_signal_connect_object (self->flowbox, "child-activated",
+ G_CALLBACK (face_widget_activated), self, G_CONNECT_SWAPPED);
+
+ settings_facesdirs = get_settings_facesdirs ();
+
+ if (!add_faces_from_dirs (self->faces, settings_facesdirs, TRUE)) {
+ g_auto(GStrv) system_facesdirs = get_system_facesdirs ();
+ add_faces_from_dirs (self->faces, system_facesdirs, FALSE);
+ }
#ifdef HAVE_CHEESE
gtk_widget_set_visible (self->take_picture_button, TRUE);