diff src/buddy.c @ 4695:4bdd9a5fd026

[gaim-migrate @ 5006] This may very well have issues, but it's a slightly better core/ui split, removing global variables and fixing some GTK+ runtime errors and a couple segfaults. It's some progress. committer: Tailor Script <tailor@pidgin.im>
author Christian Hammond <chipx86@chipx86.com>
date Mon, 10 Mar 2003 18:16:29 +0000
parents 8f523dbb970e
children abec345c8c92
line wrap: on
line diff
--- a/src/buddy.c	Mon Mar 10 16:39:46 2003 +0000
+++ b/src/buddy.c	Mon Mar 10 18:16:29 2003 +0000
@@ -54,6 +54,8 @@
 #include "win32dep.h"
 #endif
 
+static struct gaim_gtk_buddy_list *gtkblist = NULL;
+
 static void gaim_gtk_blist_update(struct gaim_buddy_list *list, GaimBlistNode *node);
 
 /***************************************************
@@ -482,6 +484,16 @@
 /**********************************************************************************
  * Public API Functions                                                           *
  **********************************************************************************/
+static void gaim_gtk_blist_new_list(struct gaim_buddy_list *blist)
+{
+	blist->ui_data = g_new0(struct gaim_gtk_buddy_list, 1);
+}
+
+static void gaim_gtk_blist_new_node(GaimBlistNode *node)
+{
+	node->ui_data = g_new0(struct gaim_gtk_blist_node, 1);
+}
+
 static void gaim_gtk_blist_show(struct gaim_buddy_list *list)
 {
 	GtkItemFactory *ift;
@@ -496,7 +508,8 @@
 		return;
 	}
 
-	gtkblist = g_new0(struct gaim_gtk_buddy_list , 1);
+	gtkblist = GAIM_GTK_BLIST(list);
+
 	gtkblist->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
 	gtk_window_set_title(GTK_WINDOW(gtkblist->window), _("Buddy List"));
 
@@ -608,17 +621,23 @@
 
 static void gaim_gtk_blist_update(struct gaim_buddy_list *list, GaimBlistNode *node)
 {
-	GtkTreeIter *iter = node->ui_data;
+	struct gaim_gtk_blist_node *gtknode;
+	GtkTreeIter *iter;
 	gboolean expand = FALSE;
 
 	if (!gtkblist)
 		return;
+	
+	gtknode = GAIM_GTK_BLIST_NODE(node);
+	iter = gtknode->iter;
+
 
 	if (!iter) { /* This is a newly added node */
 		if (GAIM_BLIST_NODE_IS_BUDDY(node)) {
 			if (((struct buddy*)node)->present) {
-				if(node->parent && node->parent && !node->parent->ui_data) {
-
+				if(node->parent && node->parent &&
+				   !GAIM_GTK_BLIST_NODE(node->parent)->iter) {
+					
 					/* This buddy's group has not yet been added.  We do that here */
 
 					char *mark = g_strdup_printf("<span weight='bold'>%s</span>",  ((struct group*)node->parent)->name);
@@ -627,36 +646,41 @@
 					GtkTreeIter *insertatiter = NULL;
 
 					/* We traverse backwards through the buddy list to find the node in the tree to insert it after */
-					while (insertat && !insertat->ui_data)
+					while (insertat && !GAIM_GTK_BLIST_NODE(insertat)->iter)
 						insertat = insertat->prev;
+
 					if (insertat)
-						insertatiter = insertat->ui_data;
+						insertatiter = GAIM_GTK_BLIST_NODE(insertat)->iter;
 
 					/* This is where we create the node and add it. */
 					gtk_tree_store_insert_after(gtkblist->treemodel, iter2, 
-								    node->parent->parent ? node->parent->parent->ui_data : NULL, insertatiter);
+								    node->parent->parent ?
+									GAIM_GTK_BLIST_NODE(node->parent->parent)->iter : NULL, insertatiter);
 					gtk_tree_store_set(gtkblist->treemodel, iter2, 
 							   STATUS_ICON_COLUMN, gtk_widget_render_icon
 							   (gtkblist->treeview,GTK_STOCK_OPEN,GTK_ICON_SIZE_SMALL_TOOLBAR,NULL),
 							   NAME_COLUMN, mark,
 							   NODE_COLUMN, node->parent,
 							   -1);
-					node->parent->ui_data = iter2;
+
+					GAIM_GTK_BLIST_NODE(node->parent)->iter = iter2;
 					expand = TRUE;
 				}
 				iter = g_new0(GtkTreeIter, 1);
-				node->ui_data = iter;
-				
-				gtk_tree_store_insert_after (gtkblist->treemodel, iter, node->parent  ? node->parent->ui_data : NULL,
-							     node->prev ? node->prev->ui_data : NULL);
+
+				GAIM_GTK_BLIST_NODE(node)->iter = iter;
+
+				gtk_tree_store_insert_after (gtkblist->treemodel, iter, node->parent  ? GAIM_GTK_BLIST_NODE(node->parent)->iter : NULL,
+							     node->prev ? GAIM_GTK_BLIST_NODE(node->prev)->iter : NULL);
 			
 							   
 				if (expand) {       /* expand was set to true if this is the first element added to a group.  In such case
 						     * we expand the group node */
-					GtkTreePath *path = gtk_tree_model_get_path(GTK_TREE_MODEL(gtkblist->treemodel), node->parent->ui_data);
+					GtkTreePath *path = gtk_tree_model_get_path(GTK_TREE_MODEL(gtkblist->treemodel), GAIM_GTK_BLIST_NODE(node->parent)->iter);
 					gtk_tree_view_expand_row(GTK_TREE_VIEW(gtkblist->treeview), path, TRUE);	
 				}
-				node->ui_data = iter;
+
+				GAIM_GTK_BLIST_NODE(node)->iter = iter;
 			}
 		} 
 	}
@@ -679,23 +703,36 @@
 				   -1);
 			
 		g_free(mark);
-		g_object_unref(status);
-		if (avatar) {
-				g_object_unref(avatar);
-		}
-	} else if (GAIM_BLIST_NODE_IS_BUDDY(node) && node->ui_data){
-		gtk_tree_store_remove(GTK_TREE_STORE(gtkblist->treemodel), (GtkTreeIter*)(node->ui_data));
-		g_free(node->ui_data);
-		node->ui_data = NULL;
+
+		if (status != NULL)
+			g_object_unref(status);
+
+		if (avatar != NULL)
+			g_object_unref(avatar);
+
+	} else if (GAIM_BLIST_NODE_IS_BUDDY(node) && GAIM_GTK_BLIST_NODE(node)->iter){
+		gtk_tree_store_remove(GTK_TREE_STORE(gtkblist->treemodel), GAIM_GTK_BLIST_NODE(node)->iter);
+
+		g_free(GAIM_GTK_BLIST_NODE(node)->iter);
+		GAIM_GTK_BLIST_NODE(node)->iter = NULL;
 	}
 	
 }
 
 static void gaim_gtk_blist_remove(struct gaim_buddy_list *list, GaimBlistNode *node)
 {
+	struct gaim_gtk_blist_node *gtknode;
+
 	if (!node->ui_data)
 		return;
-	gtk_tree_store_remove(gtkblist->treemodel, (GtkTreeIter*)(node->ui_data));
+
+	gtknode = (struct gaim_gtk_blist_node *)node->ui_data;
+
+	if (gtknode->timer > 0)
+		g_source_remove(gtknode->timer);
+
+	if (gtknode->iter != NULL)
+		gtk_tree_store_remove(gtkblist->treemodel, gtknode->iter);
 }
 
 static void gaim_gtk_blist_destroy(struct gaim_buddy_list *list)
@@ -713,6 +750,8 @@
 
 static struct gaim_blist_ui_ops blist_ui_ops =
 {
+	gaim_gtk_blist_new_list,
+	gaim_gtk_blist_new_node,
 	gaim_gtk_blist_show,
 	gaim_gtk_blist_update,
 	gaim_gtk_blist_remove,