changeset 15563:2286aac43694

merge of '0d5d80abe3087a1a7c7e47fb7b0c226936a3e5e5' and '7d7d9644534bad89792e5e0d891bece00e51e968'
author Richard Laager <rlaager@wiktel.com>
date Mon, 05 Feb 2007 03:37:35 +0000
parents 7ebe32203e67 (diff) 0b5db3387ded (current diff)
children 45d3dd67fa13
files
diffstat 2 files changed, 68 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/libpurple/plugins/perl/libgaimperl.c	Mon Feb 05 03:37:27 2007 +0000
+++ b/libpurple/plugins/perl/libgaimperl.c	Mon Feb 05 03:37:35 2007 +0000
@@ -1,7 +1,16 @@
 #include <gmodule.h>
+
+#ifdef  __SUNPRO_C
+#pragma init (my_init)
+void my_init(void);
+
+void my_init() {
+#else
 void __attribute__ ((constructor)) my_init(void);
 
 void __attribute__ ((constructor)) my_init() {
+#endif
+
 	/* Very evil hack...puts perl.so's symbols in the global table
 	 * but does not create a circular dependancy because g_module_open
 	 * will only open the library once. */
--- a/pidgin/gtklog.c	Mon Feb 05 03:37:27 2007 +0000
+++ b/pidgin/gtklog.c	Mon Feb 05 03:37:35 2007 +0000
@@ -205,13 +205,40 @@
 		gtk_tree_view_expand_row(tv, path, FALSE);
 }
 
-static void delete_log_cb(GaimLog *log)
+static void delete_log_cleanup_cb(gpointer *data)
 {
-	if (!gaim_log_delete(log))
+	g_free(data[1]); /* iter */
+	g_free(data);
+}
+
+static void delete_log_cb(gpointer *data)
+{
+	if (!gaim_log_delete((GaimLog *)data[2]))
 	{
 		gaim_notify_error(NULL, NULL, "Log Deletion Failed",
 		                  "Check permissions and try again.");
 	}
+	else
+	{
+		GtkTreeStore *treestore = data[0];
+		GtkTreeIter *iter = (GtkTreeIter *)data[1];
+		GtkTreePath *path = gtk_tree_model_get_path(GTK_TREE_MODEL(treestore), iter);
+		gboolean first = !gtk_tree_path_prev(path);
+
+		if (!gtk_tree_store_remove(treestore, iter) && first)
+		{
+			/* iter was the last child at its level */
+
+			if (gtk_tree_path_up(path))
+			{
+				gtk_tree_model_get_iter(GTK_TREE_MODEL(treestore), iter, path);
+				gtk_tree_store_remove(treestore, iter);
+			}
+		}
+		gtk_tree_path_free(path);
+	}
+
+	delete_log_cleanup_cb(data);
 }
 
 static void log_delete_log_cb(GtkWidget *menuitem, gpointer *data)
@@ -221,6 +248,7 @@
 	const char *time = log_get_date(log);
 	const char *name;
 	char *tmp;
+	gpointer *data2;
 
 	if (log->type == GAIM_LOG_IM)
 	{
@@ -252,8 +280,17 @@
 	else
 		g_return_if_reached();
 
+	/* The only way to free data in all cases is to tie it to the menuitem with
+	 * g_object_set_data_full().  But, since we need to get some data down to
+	 * delete_log_cb() to delete the log from the log viewer after the file is
+	 * deleted, we have to allocate a new data array and make sure it gets freed
+	 * either way. */
+	data2 = g_new(gpointer, 3);
+	data2[0] = lv->treestore;
+	data2[1] = data[3]; /* iter */
+	data2[2] = log;
 	gaim_request_action(lv, NULL, "Delete Log?", tmp,
-	                    0, log, 2, _("Delete"), delete_log_cb, _("Cancel"), NULL);
+	                    0, data2, 2, _("Delete"), delete_log_cb, _("Cancel"), delete_log_cleanup_cb);
 	g_free(tmp);
 }
 
@@ -266,11 +303,11 @@
 		gtk_widget_set_sensitive(menuitem, FALSE);
 
 	g_signal_connect(menuitem, "activate", G_CALLBACK(log_delete_log_cb), data);
-	g_object_set_data_full(menuitem, "log-viewer-data", data, g_free);
+	g_object_set_data_full(G_OBJECT(menuitem), "log-viewer-data", data, g_free);
 	gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
 	gtk_widget_show_all(menu);
 
-	gtk_menu_popup(GTK_MENU(menu), NULL, (GtkMenuPositionFunc)data[2], NULL, NULL,
+	gtk_menu_popup(GTK_MENU(menu), NULL, NULL, (GtkMenuPositionFunc)data[2], NULL,
 	               (event != NULL) ? event->button : 0,
 	               gdk_event_get_time((GdkEvent *)event));
 }
@@ -280,26 +317,31 @@
 	if (event->type == GDK_BUTTON_PRESS && event->button == 3)
 	{
 		GtkTreePath *path;
-		GtkTreeIter iter;
+		GtkTreeIter *iter;
 		GValue val;
 		GaimLog *log;
 		gpointer *data;
 
 		if (!gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(treeview), event->x, event->y, &path, NULL, NULL, NULL))
 			return FALSE;
-		gtk_tree_model_get_iter(GTK_TREE_MODEL(lv->treestore), &iter, path);
+		iter = g_new(GtkTreeIter, 1);
+		gtk_tree_model_get_iter(GTK_TREE_MODEL(lv->treestore), iter, path);
 		val.g_type = 0;
-		gtk_tree_model_get_value(GTK_TREE_MODEL(lv->treestore), &iter, 1, &val);
+		gtk_tree_model_get_value(GTK_TREE_MODEL(lv->treestore), iter, 1, &val);
 
 		log = g_value_get_pointer(&val);
 
 		if (log == NULL)
+		{
+			g_free(iter);
 			return FALSE;
+		}
 
-		data = g_new(gpointer, 3);
+		data = g_new(gpointer, 4);
 		data[0] = lv;
 		data[1] = log;
 		data[2] = NULL;
+		data[3] = iter;
 
 		log_show_popup_menu(treeview, event, data);
 		return TRUE;
@@ -311,28 +353,32 @@
 static gboolean log_popup_menu_cb(GtkWidget *treeview, PidginLogViewer *lv)
 {
 	GtkTreeSelection *sel;
-	GtkTreeIter iter;
+	GtkTreeIter *iter;
 	GValue val;
 	GaimLog *log;
 	gpointer *data;
 
+	iter = g_new(GtkTreeIter, 1);
 	sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(lv));
-	if (!gtk_tree_selection_get_selected(sel, NULL, &iter))
+	if (!gtk_tree_selection_get_selected(sel, NULL, iter))
+	{
 		return FALSE;
+	}
 
 	val.g_type = 0;
 	gtk_tree_model_get_value(GTK_TREE_MODEL(lv->treestore),
-	                         &iter, NODE_COLUMN, &val);
+	                         iter, NODE_COLUMN, &val);
 
 	log = g_value_get_pointer(&val);
 
 	if (log == NULL)
 		return FALSE;
 
-	data = g_new(gpointer, 3);
+	data = g_new(gpointer, 4);
 	data[0] = lv;
 	data[1] = log;
 	data[2] = pidgin_treeview_popup_menu_position_func;
+	data[3] = iter;
 
 	log_show_popup_menu(treeview, NULL, data);
 	return TRUE;