diff gtk/gtkaccount.c @ 15071: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 f227feab8c78
children 58a23f416729
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);
 		}