diff pidgin/gtksmiley.c @ 23136:6c4f47b9d201

Make PurpleSmiley a GObject. Removed some functions from the API that are not really necessary, including purple_smileys_add and purple_smileys_remove. They are called automatically when a new smiley is created or removed. PurpleSmiley has a 'destroy' signal, and 'shortcut' and 'image' properties. These might be of interest to UIs.
author Sadrul Habib Chowdhury <imadil@gmail.com>
date Sat, 10 May 2008 16:31:06 +0000
parents 9c0a47402f7a
children b37b9e53a31b
line wrap: on
line diff
--- a/pidgin/gtksmiley.c	Wed May 07 18:53:13 2008 +0000
+++ b/pidgin/gtksmiley.c	Sat May 10 16:31:06 2008 +0000
@@ -76,6 +76,7 @@
 /******************************************************************************
  * GtkIMHtmlSmileys stuff
  *****************************************************************************/
+/* Perhaps these should be in gtkimhtml.c instead. -- sadrul */
 static void add_gtkimhtml_to_list(GtkIMHtmlSmiley *gtksmiley)
 {
 	gtk_smileys = g_slist_prepend(gtk_smileys, gtksmiley);
@@ -83,7 +84,13 @@
 	purple_debug_info("gtksmiley", "adding %s to gtk_smileys\n", gtksmiley->smile);
 }
 
-/* Perhaps this should be in gtkimhtml.c instead. -- sad */
+static void
+shortcut_changed_cb(PurpleSmiley *smiley, gpointer dontcare, GtkIMHtmlSmiley *gtksmiley)
+{
+	g_free(gtksmiley->smile);
+	gtksmiley->smile = g_strdup(purple_smiley_get_shortcut(smiley));
+}
+
 static GtkIMHtmlSmiley *smiley_purple_to_gtkimhtml(PurpleSmiley *smiley)
 {
 	GtkIMHtmlSmiley *gtksmiley;
@@ -92,21 +99,17 @@
 
 	file = purple_imgstore_get_filename(purple_smiley_get_stored_image(smiley));
 
-	filename = g_build_filename(purple_smileys_get_storing_dir(),file, NULL);
+	filename = g_build_filename(purple_smileys_get_storing_dir(), file, NULL);
 
 	gtksmiley = gtk_imhtml_smiley_create(filename, purple_smiley_get_shortcut(smiley),
 			FALSE, GTK_IMHTML_SMILEY_CUSTOM);
 	g_free(filename);
 
-	return gtksmiley;
-}
+	/* Make sure the shortcut for the GtkIMHtmlSmiley is updated with the PurpleSmiley */
+	g_signal_connect(G_OBJECT(smiley), "notify::shortcut",
+			G_CALLBACK(shortcut_changed_cb), gtksmiley);
 
-void pidgin_smiley_add_to_list(PurpleSmiley *smiley)
-{
-	GtkIMHtmlSmiley *gtksmiley;
-
-	gtksmiley = smiley_purple_to_gtkimhtml(smiley);
-	add_gtkimhtml_to_list(gtksmiley);
+	return gtksmiley;
 }
 
 void pidgin_smiley_del_from_list(PurpleSmiley *smiley)
@@ -126,6 +129,8 @@
 			continue;
 
 		gtk_imhtml_smiley_destroy(gtksmiley);
+		g_signal_handlers_disconnect_matched(G_OBJECT(smiley), G_SIGNAL_MATCH_DATA,
+				0, 0, NULL, NULL, gtksmiley);
 		break;
 	}
 
@@ -133,6 +138,15 @@
 		gtk_smileys = g_slist_delete_link(gtk_smileys, list);
 }
 
+void pidgin_smiley_add_to_list(PurpleSmiley *smiley)
+{
+	GtkIMHtmlSmiley *gtksmiley;
+
+	gtksmiley = smiley_purple_to_gtkimhtml(smiley);
+	add_gtkimhtml_to_list(gtksmiley);
+	g_signal_connect(G_OBJECT(smiley), "destroy", G_CALLBACK(pidgin_smiley_del_from_list), NULL);
+}
+
 void pidgin_smileys_init(void)
 {
 	GList *smileys;
@@ -224,7 +238,6 @@
 
 		purple_debug_info("gtksmiley", "adding a new smiley\n");
 		emoticon = purple_smiley_new_from_file(entry, s->filename);
-		purple_smileys_add(emoticon);
 		if (gtk_smileys != NULL)
 			pidgin_smiley_add_to_list(emoticon);
 	}
@@ -371,36 +384,45 @@
 static void delete_foreach(GtkTreeModel *model, GtkTreePath *path,
 		GtkTreeIter *iter, gpointer data)
 {
-	PurpleSmiley *smiley;
-	char *shortcut;
+	PurpleSmiley *smiley = NULL;
 	SmileyManager *dialog;
 
 	dialog = (SmileyManager*)data;
 
 	gtk_tree_model_get(model, iter,
-			SHORTCUT, &shortcut,
+			SMILEY, &smiley,
 			-1);
 
-	purple_debug_info("gtksmiley", "delete_foreach shortcut = %s\n", shortcut);
-
-	smiley = purple_smileys_find_by_shortcut(shortcut);
-
-	if(smiley == NULL)
-		purple_debug_error("gtksmiley", "%s not found\n", shortcut);
-	else {
+	if(smiley != NULL) {
+		g_object_unref(G_OBJECT(smiley));
 		pidgin_smiley_del_from_list(smiley);
 		purple_smiley_delete(smiley);
 	}
+}
 
-	g_free(shortcut);
+static void append_to_list(GtkTreeModel *model, GtkTreePath *path,
+		GtkTreeIter *iter, gpointer data)
+{
+	GList **list = data;
+	*list = g_list_prepend(*list, gtk_tree_path_copy(path));
 }
 
 static void smiley_delete(SmileyManager *dialog)
 {
 	GtkTreeSelection *selection;
+	GList *list = NULL;
 
 	selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(dialog->treeview));
 	gtk_tree_selection_selected_foreach(selection, delete_foreach, dialog);
+	gtk_tree_selection_selected_foreach(selection, append_to_list, &list);
+
+	while (list) {
+		GtkTreeIter iter;
+		if (gtk_tree_model_get_iter(GTK_TREE_MODEL(dialog->model), &iter, list->data))
+			gtk_list_store_remove(GTK_LIST_STORE(dialog->model), &iter);
+		gtk_tree_path_free(list->data);
+		list = g_list_delete_link(list, list);
+	}
 }
 /******************************************************************************
  * The Smiley Manager
@@ -499,6 +521,7 @@
 	gtk_tree_model_get_iter(GTK_TREE_MODEL(dialog->model), &iter, path);
 	gtk_tree_model_get(GTK_TREE_MODEL(dialog->model), &iter, SMILEY, &smiley, -1);
 	pidgin_smiley_edit(gtk_widget_get_toplevel(GTK_WIDGET(treeview)), smiley);
+	g_object_unref(G_OBJECT(smiley));
 }
 
 static GtkWidget *smiley_list_create(SmileyManager *dialog)
@@ -519,7 +542,7 @@
 	dialog->model = gtk_list_store_new(N_COL,
 			GDK_TYPE_PIXBUF,	/* ICON */
 			G_TYPE_STRING,		/* SHORTCUT */
-			G_TYPE_POINTER		/* SMILEY */
+			G_TYPE_OBJECT		/* SMILEY */
 			);
 
 	/* the actual treeview */
@@ -557,7 +580,6 @@
 			break;
 		case GTK_RESPONSE_NO:
 			smiley_delete(dialog);
-			refresh_list();
 			break;
 		case GTK_RESPONSE_DELETE_EVENT:
 		case GTK_RESPONSE_CLOSE: