You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
131 lines
4.8 KiB
131 lines
4.8 KiB
Description: get user icon from accountsservice instead of looking in ~/.face |
|
Author: Marc Deslauriers <marc.deslauriers@canonical.com> |
|
Forwarded: yes |
|
Bug: https://bugzilla.gnome.org/show_bug.cgi?id=669857 |
|
Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/policykit-1-gnome/+bug/928249 |
|
|
|
Index: policykit-1-gnome-0.105/src/polkitgnomeauthenticationdialog.c |
|
=================================================================== |
|
--- policykit-1-gnome-0.105.orig/src/polkitgnomeauthenticationdialog.c 2012-02-11 00:10:48.850913210 -0500 |
|
+++ policykit-1-gnome-0.105/src/polkitgnomeauthenticationdialog.c 2012-02-11 00:22:04.462930509 -0500 |
|
@@ -135,6 +135,102 @@ |
|
} |
|
} |
|
|
|
+static GdkPixbuf * |
|
+get_user_icon (char *username) |
|
+{ |
|
+ GError *error; |
|
+ GDBusConnection *connection; |
|
+ GVariant *find_user_result; |
|
+ GVariant *get_icon_result; |
|
+ GVariant *icon_result_variant; |
|
+ const gchar *user_path; |
|
+ const gchar *icon_filename; |
|
+ GdkPixbuf *pixbuf; |
|
+ |
|
+ error = NULL; |
|
+ connection = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error); |
|
+ |
|
+ if (connection == NULL) |
|
+ { |
|
+ g_warning ("Unable to connect to system bus: %s", error->message); |
|
+ g_error_free (error); |
|
+ return NULL; |
|
+ } |
|
+ |
|
+ find_user_result = g_dbus_connection_call_sync (connection, |
|
+ "org.freedesktop.Accounts", |
|
+ "/org/freedesktop/Accounts", |
|
+ "org.freedesktop.Accounts", |
|
+ "FindUserByName", |
|
+ g_variant_new ("(s)", |
|
+ username), |
|
+ G_VARIANT_TYPE ("(o)"), |
|
+ G_DBUS_CALL_FLAGS_NONE, |
|
+ -1, |
|
+ NULL, |
|
+ &error); |
|
+ |
|
+ if (find_user_result == NULL) |
|
+ { |
|
+ g_warning ("Accounts couldn't find user: %s", error->message); |
|
+ g_error_free (error); |
|
+ return NULL; |
|
+ } |
|
+ |
|
+ user_path = g_variant_get_string (g_variant_get_child_value (find_user_result, 0), |
|
+ NULL); |
|
+ |
|
+ get_icon_result = g_dbus_connection_call_sync (connection, |
|
+ "org.freedesktop.Accounts", |
|
+ user_path, |
|
+ "org.freedesktop.DBus.Properties", |
|
+ "Get", |
|
+ g_variant_new ("(ss)", |
|
+ "org.freedesktop.Accounts.User", |
|
+ "IconFile"), |
|
+ G_VARIANT_TYPE ("(v)"), |
|
+ G_DBUS_CALL_FLAGS_NONE, |
|
+ -1, |
|
+ NULL, |
|
+ &error); |
|
+ |
|
+ g_variant_unref (find_user_result); |
|
+ |
|
+ if (get_icon_result == NULL) |
|
+ { |
|
+ g_warning ("Accounts couldn't find user icon: %s", error->message); |
|
+ g_error_free (error); |
|
+ return NULL; |
|
+ } |
|
+ |
|
+ g_variant_get_child (get_icon_result, 0, "v", &icon_result_variant); |
|
+ icon_filename = g_variant_get_string (icon_result_variant, NULL); |
|
+ |
|
+ if (icon_filename == NULL) |
|
+ { |
|
+ g_warning ("Accounts didn't return a valid filename for user icon"); |
|
+ pixbuf = NULL; |
|
+ } |
|
+ else |
|
+ { |
|
+ /* TODO: we probably shouldn't hard-code the size to 16x16 */ |
|
+ pixbuf = gdk_pixbuf_new_from_file_at_size (icon_filename, |
|
+ 16, |
|
+ 16, |
|
+ &error); |
|
+ if (pixbuf == NULL) |
|
+ { |
|
+ g_warning ("Couldn't open user icon: %s", error->message); |
|
+ g_error_free (error); |
|
+ } |
|
+ } |
|
+ |
|
+ g_variant_unref (icon_result_variant); |
|
+ g_variant_unref (get_icon_result); |
|
+ |
|
+ return pixbuf; |
|
+} |
|
+ |
|
static void |
|
create_user_combobox (PolkitGnomeAuthenticationDialog *dialog) |
|
{ |
|
@@ -197,16 +293,7 @@ |
|
g_free (gecos); |
|
|
|
/* Load users face */ |
|
- pixbuf = NULL; |
|
- if (passwd->pw_dir != NULL) |
|
- { |
|
- gchar *path; |
|
- path = g_strdup_printf ("%s/.face", passwd->pw_dir); |
|
- /* TODO: we probably shouldn't hard-code the size to 16x16 */ |
|
- pixbuf = gdk_pixbuf_new_from_file_at_scale (path, 16, 16, TRUE, NULL); |
|
- g_free (path); |
|
- } |
|
- |
|
+ pixbuf = get_user_icon (dialog->priv->users[n]); |
|
/* fall back to avatar-default icon */ |
|
if (pixbuf == NULL) |
|
{
|
|
|