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:
parent
a732b6a110
commit
ab7416020b
3 changed files with 46 additions and 6 deletions
|
@ -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));
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Reference in a new issue