user: Store source of user avatar inside PNG

We can store whether we generated the user avatar inside the PNG
itself. Unfortunately  this won't work for old installations but in future
we can use the metadata introduced by this commit.
This commit is contained in:
Julian Sparber 2023-10-09 18:41:58 +02:00
parent a732b6a110
commit ab7416020b
3 changed files with 46 additions and 6 deletions

View file

@ -72,7 +72,7 @@ crop_dialog_response (CcAvatarChooser *self,
pb2 = gdk_pixbuf_scale_simple (pb, AVATAR_PIXEL_SIZE, AVATAR_PIXEL_SIZE, GDK_INTERP_BILINEAR);
texture = gdk_texture_new_for_pixbuf (pb2);
set_user_icon_data (self->user, texture);
set_user_icon_data (self->user, texture, IMAGE_SOURCE_VALUE_CUSTOM);
self->crop_area = NULL;
gtk_window_destroy (GTK_WINDOW (dialog));
@ -187,11 +187,20 @@ face_widget_activated (CcAvatarChooser *self,
const gchar *filename;
GtkWidget *image;
g_autoptr(GdkTexture) texture = NULL;
g_autoptr(GError) error = NULL;
image = gtk_flow_box_child_get_child (child);
filename = g_object_get_data (G_OBJECT (image), "filename");
act_user_set_icon_file (self->user, filename);
if (filename != NULL) {
texture = gdk_texture_new_from_filename (filename, &error);
}
if (error != NULL) {
g_warning ("Failed to load selected avatar image: %s", error->message);
} else {
set_user_icon_data (self->user, texture, IMAGE_SOURCE_VALUE_FACE);
}
gtk_popover_popdown (GTK_POPOVER (self));
}

View file

@ -311,8 +311,9 @@ draw_avatar_to_texture (AdwAvatar *avatar, int size)
}
void
set_user_icon_data (ActUser *user,
GdkTexture *texture)
set_user_icon_data (ActUser *user,
GdkTexture *texture,
const gchar *image_source)
{
g_autofree gchar *path = NULL;
g_autoptr(GError) error = NULL;
@ -325,7 +326,13 @@ set_user_icon_data (ActUser *user,
return;
}
gdk_texture_save_to_png (texture, path);
g_autoptr(GdkPixbuf) pixbuf = gdk_pixbuf_get_from_texture (texture);
gdk_pixbuf_save (pixbuf, path, "png", &error, IMAGE_SOURCE_KEY, image_source, NULL);
if (error != NULL) {
g_warning ("Failed to create temporary user icon: %s", error->message);
}
close (fd);
act_user_set_icon_file (user, path);
@ -359,12 +366,26 @@ setup_avatar_for_user (AdwAvatar *avatar, ActUser *user)
avatar_file = act_user_get_icon_file (user);
if (avatar_file) {
g_autoptr(GdkPixbuf) pixbuf = NULL;
const gchar *image_source;
gboolean is_generated = TRUE;
pixbuf = gdk_pixbuf_new_from_file_at_size (avatar_file,
adw_avatar_get_size (avatar),
adw_avatar_get_size (avatar),
NULL);
if (pixbuf) {
image_source = gdk_pixbuf_get_option (pixbuf, IMAGE_SOURCE_KEY);
if (image_source == NULL)
g_debug ("User avatar's source isn't defined");
else
g_debug ("User avatar's source is %s", image_source);
is_generated = g_strcmp0 (image_source, "gnome-generated") == 0;
}
if (!is_generated) {
g_autoptr(GdkTexture) texture = NULL;
texture = gdk_texture_new_for_pixbuf (pixbuf);

View file

@ -28,6 +28,15 @@ G_BEGIN_DECLS
#define AVATAR_PIXEL_SIZE 512
/* Key and values that are written as metadata to the exported user avatar this
* way it's possible to know how the image was initially created.
* If set to generated we can regenerated the avatar when the style changes or
* when the users full name changes. The other two values don't have a specific use yet */
#define IMAGE_SOURCE_KEY "tEXt::source"
#define IMAGE_SOURCE_VALUE_GENERATED "gnome-generated"
#define IMAGE_SOURCE_VALUE_FACE "gnome-face"
#define IMAGE_SOURCE_VALUE_CUSTOM "gnome-custom"
void set_entry_generation_icon (GtkEntry *entry);
void set_entry_validation_checkmark (GtkEntry *entry);
void set_entry_validation_error (GtkEntry *entry,
@ -49,7 +58,8 @@ gboolean is_valid_username_finish (GAsyncResult *result,
GdkTexture *draw_avatar_to_texture (AdwAvatar *avatar,
int size);
void set_user_icon_data (ActUser *user,
GdkTexture *texture);
GdkTexture *texture,
const gchar *image_source);
void setup_avatar_for_user (AdwAvatar *avatar,
ActUser *user);
GSettings *settings_or_null (const gchar *schema);