Mercurial > pidgin
changeset 15070:97ae8709d6dc
[gaim-migrate @ 17854]
Added ability to keep track of non-cached buddy icons
committer: Tailor Script <tailor@pidgin.im>
author | Mark Huetsch <markhuetsch> |
---|---|
date | Thu, 30 Nov 2006 10:19:09 +0000 |
parents | 3d6f2568457c |
children | 902f3621aa13 |
files | gtk/gtkaccount.c gtk/gtkstatusbox.c libgaim/account.c libgaim/account.h libgaim/buddyicon.c libgaim/buddyicon.h libgaim/prpl.h |
diffstat | 7 files changed, 119 insertions(+), 26 deletions(-) [+] |
line wrap: on
line diff
--- a/gtk/gtkaccount.c Thu Nov 30 05:56:29 2006 +0000 +++ b/gtk/gtkaccount.c Thu Nov 30 10:19:09 2006 +0000 @@ -118,6 +118,7 @@ GtkWidget *icon_hbox; GtkWidget *icon_check; GtkWidget *icon_entry; + char *cached_icon_path; char *icon_path; GtkWidget *icon_filesel; GtkWidget *icon_preview; @@ -190,15 +191,17 @@ } static void -set_dialog_icon(AccountPrefsDialog *dialog, gchar *new_icon_path) +set_dialog_icon(AccountPrefsDialog *dialog, gchar *new_cached_icon_path, gchar *new_icon_path) { char *filename; GdkPixbuf *pixbuf = NULL; + g_free(dialog->cached_icon_path); g_free(dialog->icon_path); + dialog->cached_icon_path = new_cached_icon_path; dialog->icon_path = new_icon_path; - filename = gaim_buddy_icons_get_full_path(dialog->icon_path); + filename = gaim_buddy_icons_get_full_path(dialog->cached_icon_path); if (filename != NULL) { pixbuf = gdk_pixbuf_new_from_file(filename, NULL); g_free(filename); @@ -298,7 +301,7 @@ dialog = data; if (filename != NULL) - set_dialog_icon(dialog, gaim_gtk_convert_buddy_icon(dialog->plugin, filename)); + set_dialog_icon(dialog, gaim_gtk_convert_buddy_icon(dialog->plugin, filename), g_strdup(filename)); dialog->icon_filesel = NULL; } @@ -313,7 +316,7 @@ static void icon_reset_cb(GtkWidget *button, AccountPrefsDialog *dialog) { - set_dialog_icon(dialog, NULL); + set_dialog_icon(dialog, NULL, NULL); } static void @@ -338,7 +341,7 @@ } if ((rtmp = strchr(tmp, '\r')) || (rtmp = strchr(tmp, '\n'))) *rtmp = '\0'; - set_dialog_icon(dialog, gaim_gtk_convert_buddy_icon(dialog->plugin, tmp)); + set_dialog_icon(dialog, gaim_gtk_convert_buddy_icon(dialog->plugin, tmp), g_strdup(tmp)); g_free(tmp); } gtk_drag_finish(dc, TRUE, FALSE, t); @@ -586,6 +589,7 @@ gtk_widget_show(dialog->icon_entry); /* TODO: Uh, isn't this next line pretty useless? */ gaim_set_accessible_label (dialog->icon_entry, label); + dialog->cached_icon_path = NULL; dialog->icon_path = NULL; vbox2 = gtk_vbox_new(FALSE, 0); @@ -617,12 +621,15 @@ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dialog->icon_check), !gaim_account_get_ui_bool(dialog->account, GAIM_GTK_UI, "use-global-buddyicon", TRUE)); + set_dialog_icon(dialog, + g_strdup(gaim_account_get_ui_string(dialog->account, + GAIM_GTK_UI, "non-global-buddyicon-cached-path", NULL)), + g_strdup(gaim_account_get_ui_string(dialog->account, + GAIM_GTK_UI, "non-global-buddyicon-path", NULL))); + } else { + set_dialog_icon(dialog, NULL, NULL); } - set_dialog_icon(dialog, dialog->account ? - g_strdup(gaim_account_get_ui_string(dialog->account, - GAIM_GTK_UI, "non-global-buddyicon", NULL)) : NULL); - if (!dialog->prpl_info || (!(dialog->prpl_info->options & OPT_PROTO_MAIL_CHECK) && (dialog->prpl_info->icon_spec.format == NULL))) { @@ -1061,20 +1068,23 @@ g_list_free(dialog->protocol_opt_entries); g_free(dialog->protocol_id); - if (dialog->icon_path != NULL) + if (dialog->cached_icon_path != NULL) { - const char *icon = gaim_account_get_ui_string(dialog->account, GAIM_GTK_UI, "non-global-buddyicon", NULL); - if (dialog->icon_path != NULL && (icon == NULL || strcmp(dialog->icon_path, icon))) + const char *icon = gaim_account_get_ui_string(dialog->account, GAIM_GTK_UI, "non-global-buddyicon-cached-path", NULL); + if (dialog->cached_icon_path != NULL && (icon == NULL || strcmp(dialog->cached_icon_path, icon))) { /* The user set an icon, which would've been cached by convert_buddy_icon, * but didn't save the changes. Delete the cache file. */ - char *filename = g_build_filename(gaim_buddy_icons_get_cache_dir(), dialog->icon_path, NULL); + char *filename = g_build_filename(gaim_buddy_icons_get_cache_dir(), dialog->cached_icon_path, NULL); g_unlink(filename); g_free(filename); } + g_free(dialog->cached_icon_path); + } + + if (dialog->cached_icon_path != NULL) g_free(dialog->icon_path); - } if (dialog->icon_filesel) gtk_widget_destroy(dialog->icon_filesel); @@ -1136,14 +1146,18 @@ icon_change = TRUE; } gaim_account_set_ui_bool(account, GAIM_GTK_UI, "use-global-buddyicon", !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dialog->icon_check))); - gaim_account_set_ui_string(account, GAIM_GTK_UI, "non-global-buddyicon", dialog->icon_path); + gaim_account_set_ui_string(account, GAIM_GTK_UI, "non-global-buddyicon-cached-path", dialog->cached_icon_path); + gaim_account_set_ui_string(account, GAIM_GTK_UI, "non-global-buddyicon-path", dialog->icon_path); if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dialog->icon_check))) { - gaim_account_set_buddy_icon(account, dialog->icon_path); + gaim_account_set_buddy_icon_path(account, dialog->icon_path); + gaim_account_set_buddy_icon(account, dialog->cached_icon_path); } else if (gaim_prefs_get_string("/gaim/gtk/accounts/buddyicon") && icon_change) { - char *icon = gaim_gtk_convert_buddy_icon(dialog->plugin, gaim_prefs_get_string("/gaim/gtk/accounts/buddyicon")); + const char *filename = gaim_prefs_get_string("/gaim/gtk/accounts/buddyicon"); + char *icon = gaim_gtk_convert_buddy_icon(dialog->plugin, gaim_prefs_get_string(filename)); + gaim_account_set_buddy_icon_path(account, filename); gaim_account_set_buddy_icon(account, icon); g_free(icon); }
--- a/gtk/gtkstatusbox.c Thu Nov 30 05:56:29 2006 +0000 +++ b/gtk/gtkstatusbox.c Thu Nov 30 10:19:09 2006 +0000 @@ -1228,7 +1228,8 @@ if (filename) icon = gaim_gtk_convert_buddy_icon(plug, filename); gaim_account_set_ui_bool(box->account, GAIM_GTK_UI, "use-global-buddyicon", (filename != NULL)); - gaim_account_set_ui_string(box->account, GAIM_GTK_UI, "non-global-buddyicon", icon); + gaim_account_set_ui_string(box->account, GAIM_GTK_UI, "non-global-buddyicon-cached-path", icon); + gaim_account_set_buddy_icon_path(box->account, filename); gaim_account_set_buddy_icon(box->account, icon); g_free(icon); } @@ -1246,6 +1247,7 @@ char *icon = NULL; if (filename) icon = gaim_gtk_convert_buddy_icon(plug, filename); + gaim_account_set_buddy_icon_path(account, filename); gaim_account_set_buddy_icon(account, icon); g_free(icon); }
--- a/libgaim/account.c Thu Nov 30 05:56:29 2006 +0000 +++ b/libgaim/account.c Thu Nov 30 10:19:09 2006 +0000 @@ -872,6 +872,8 @@ g_free(account->alias); g_free(account->password); g_free(account->user_info); + g_free(account->buddy_icon); + g_free(account->buddy_icon_path); g_free(account->protocol_id); g_hash_table_destroy(account->settings); @@ -1281,15 +1283,25 @@ if (prpl_info && prpl_info->set_buddy_icon) { - char *filename = gaim_buddy_icons_get_full_path(icon); - prpl_info->set_buddy_icon(gc, filename); - g_free(filename); + char *cached_path = gaim_buddy_icons_get_full_path(icon); + prpl_info->set_buddy_icon(gc, cached_path); + g_free(cached_path); } } schedule_accounts_save(); } +void gaim_account_set_buddy_icon_path(GaimAccount *account, const char *path) +{ + g_return_if_fail(account != NULL); + + g_free(account->buddy_icon_path); + account->buddy_icon_path = g_strdup(path); + + schedule_accounts_save(); +} + void gaim_account_set_protocol_id(GaimAccount *account, const char *protocol_id) { @@ -1663,6 +1675,14 @@ } const char * +gaim_account_get_buddy_icon_path(const GaimAccount *account) +{ + g_return_val_if_fail(account != NULL, NULL); + + return account->buddy_icon_path; +} + +const char * gaim_account_get_protocol_id(const GaimAccount *account) { g_return_val_if_fail(account != NULL, NULL);
--- a/libgaim/account.h Thu Nov 30 05:56:29 2006 +0000 +++ b/libgaim/account.h Thu Nov 30 10:19:09 2006 +0000 @@ -64,7 +64,8 @@ char *password; /**< The account password. */ char *user_info; /**< User information. */ - char *buddy_icon; /**< The buddy icon. */ + char *buddy_icon; /**< The buddy icon's cached path. */ + char *buddy_icon_path; /**< The buddy icon's non-cached path. */ gboolean remember_pass; /**< Remember the password. */ @@ -251,6 +252,14 @@ void gaim_account_set_buddy_icon(GaimAccount *account, const char *icon); /** + * Sets the account's buddy icon path. + * + * @param account The account. + * @param info The buddy icon non-cached path. + */ +void gaim_account_set_buddy_icon_path(GaimAccount *account, const char *path); + +/** * Sets the account's protocol ID. * * @param account The account. @@ -485,6 +494,15 @@ const char *gaim_account_get_buddy_icon(const GaimAccount *account); /** + * Gets the account's buddy icon path. + * + * @param account The account. + * + * @return The buddy icon's non-cached path. + */ +const char *gaim_account_get_buddy_icon_path(const GaimAccount *account); + +/** * Returns the account's protocol ID. * * @param account The account.
--- a/libgaim/buddyicon.c Thu Nov 30 05:56:29 2006 +0000 +++ b/libgaim/buddyicon.c Thu Nov 30 10:19:09 2006 +0000 @@ -77,6 +77,7 @@ gaim_buddy_icon_ref(icon); gaim_buddy_icon_set_data(icon, icon_data, icon_len); + gaim_buddy_icon_set_path(icon, NULL); /* gaim_buddy_icon_set_data() makes blist.c or * conversation.c, or both, take a reference. @@ -134,6 +135,7 @@ g_free(icon->username); g_free(icon->data); + g_free(icon->path); GAIM_DBUS_UNREGISTER_POINTER(icon); g_free(icon); } @@ -339,6 +341,15 @@ gaim_buddy_icon_update(icon); } +void +gaim_buddy_icon_set_path(GaimBuddyIcon *icon, const gchar *path) +{ + g_return_if_fail(icon != NULL); + + g_free(icon->path); + icon->path = (path != NULL ? g_strdup(path) : NULL); +} + GaimAccount * gaim_buddy_icon_get_account(const GaimBuddyIcon *icon) { @@ -367,6 +378,14 @@ } const char * +gaim_buddy_icon_get_path(GaimBuddyIcon *icon) +{ + g_return_val_if_fail(icon != NULL, NULL); + + return icon->path; +} + +const char * gaim_buddy_icon_get_type(const GaimBuddyIcon *icon) { const void *data; @@ -394,7 +413,7 @@ void gaim_buddy_icons_set_for_user(GaimAccount *account, const char *username, - void *icon_data, size_t icon_len) + void *icon_data, size_t icon_len) { g_return_if_fail(account != NULL); g_return_if_fail(username != NULL);
--- a/libgaim/buddyicon.h Thu Nov 30 05:56:29 2006 +0000 +++ b/libgaim/buddyicon.h Thu Nov 30 10:19:09 2006 +0000 @@ -38,6 +38,7 @@ void *data; /**< The buddy icon data. */ size_t len; /**< The length of the buddy icon data. */ + char *path; /**< The buddy icon's non-cached path. */ int ref_count; /**< The buddy icon reference count. */ }; @@ -62,7 +63,7 @@ * @return The buddy icon structure. */ GaimBuddyIcon *gaim_buddy_icon_new(GaimAccount *account, const char *username, - void *icon_data, size_t icon_len); + void *icon_data, size_t icon_len); /** * Destroys a buddy icon structure. @@ -142,6 +143,14 @@ void gaim_buddy_icon_set_data(GaimBuddyIcon *icon, void *data, size_t len); /** + * Sets the buddy icon's path. + * + * @param icon The buddy icon. + * @param path The buddy icon's non-cached path. + */ +void gaim_buddy_icon_set_path(GaimBuddyIcon *icon, const gchar *path); + +/** * Returns the buddy icon's account. * * @param icon The buddy icon. @@ -170,6 +179,15 @@ const guchar *gaim_buddy_icon_get_data(const GaimBuddyIcon *icon, size_t *len); /** + * Returns the buddy icon's path. + * + * @param icon The buddy icon. + * + * @preturn The buddy icon's non-cached path. + */ +const gchar *gaim_buddy_icon_get_path(GaimBuddyIcon *icon); + +/** * Returns an extension corresponding to the buddy icon's file type. * * @param icon The buddy icon. @@ -192,9 +210,11 @@ * @param username The username of the user. * @param icon_data The icon data. * @param icon_len The length of the icon data. + * + * @return The buddy icon set, or NULL if no icon was set. */ void gaim_buddy_icons_set_for_user(GaimAccount *account, const char *username, - void *icon_data, size_t icon_len); + void *icon_data, size_t icon_len); /** * Returns the buddy icon information for a user.
--- a/libgaim/prpl.h Thu Nov 30 05:56:29 2006 +0000 +++ b/libgaim/prpl.h Thu Nov 30 10:19:09 2006 +0000 @@ -276,7 +276,7 @@ const char *(*normalize)(const GaimAccount *, const char *); - void (*set_buddy_icon)(GaimConnection *, const char *filename); + void (*set_buddy_icon)(GaimConnection *, const char *cached_path); void (*remove_group)(GaimConnection *gc, GaimGroup *group);