diff src/buddy.c @ 1032:643a4d81c18a

[gaim-migrate @ 1042] buddy list menus are based on connections/protocol. pretty spiffy. committer: Tailor Script <tailor@pidgin.im>
author Eric Warmenhoven <eric@warmenhoven.org>
date Tue, 31 Oct 2000 06:09:47 +0000
parents 38452403563b
children 099748ff3a0a
line wrap: on
line diff
--- a/src/buddy.c	Fri Oct 27 08:10:29 2000 +0000
+++ b/src/buddy.c	Tue Oct 31 06:09:47 2000 +0000
@@ -250,29 +250,12 @@
 	}
 }
 
-void pressed_info(GtkWidget *widget, struct buddy_show *b)
-{
-        serv_get_info(b->name);
-}
-
 void pressed_alias(GtkWidget *widget, struct buddy_show *b)
 {
 	struct buddy *m = find_buddy(connections->data, b->name);
 	alias_dialog(m);
 }
 
-void pressed_dir_info(GtkWidget *widget, struct buddy_show *b)
-{
-        serv_get_dir(b->name);
-
-}
-
-void pressed_away_msg(GtkWidget *widget, struct buddy_show *b)
-{
-        serv_get_away_msg(b->name);
-
-}
-
 void handle_click_buddy(GtkWidget *widget, GdkEventButton *event, struct buddy_show *b)
 {
         if (event->type == GDK_2BUTTON_PRESS && event->button == 1) {
@@ -286,10 +269,12 @@
                         c = new_conversation(b->name);
                 }
 	} else if (event->type == GDK_BUTTON_PRESS && event->button == 3) {
-		/* FIXME: first, create a menu of each signed on name. then for each of those,
-		 * make a submenu based on which protocol is being used. this will help clarify
-		 * a lot of the UI and connection issues */
-                GtkWidget *menu, *button;
+		GtkWidget *menu;
+		GtkWidget *button;
+		GtkWidget *menuitem;
+		GtkWidget *conmenu;
+		GSList *cn = b->connlist;
+		struct gaim_connection *g;
 		/* We're gonna make us a menu right here */
 
 		menu = gtk_menu_new();
@@ -300,43 +285,43 @@
 		gtk_menu_append(GTK_MENU(menu), button);
 		gtk_widget_show(button);
 
-		button = gtk_menu_item_new_with_label(_("Info"));
-		gtk_signal_connect(GTK_OBJECT(button), "activate",
-				   GTK_SIGNAL_FUNC(pressed_info), b);
-		gtk_menu_append(GTK_MENU(menu), button);
-		gtk_widget_show(button);
-
 		button = gtk_menu_item_new_with_label(_("Alias"));
 		gtk_signal_connect(GTK_OBJECT(button), "activate",
 				   GTK_SIGNAL_FUNC(pressed_alias), b);
 		gtk_menu_append(GTK_MENU(menu), button);
 		gtk_widget_show(button);
 
-		button = gtk_menu_item_new_with_label(_("Dir Info"));
-		gtk_signal_connect(GTK_OBJECT(button), "activate",
-				   GTK_SIGNAL_FUNC(pressed_dir_info), b);
-		gtk_menu_append(GTK_MENU(menu), button);
-		gtk_widget_show(button);
-
-		button = gtk_menu_item_new_with_label(_("Away Msg"));
-		gtk_signal_connect(GTK_OBJECT(button), "activate",
-				   GTK_SIGNAL_FUNC(pressed_away_msg), b);
-		gtk_menu_append(GTK_MENU(menu), button);
-		gtk_widget_show(button);
-
-		button = gtk_menu_item_new_with_label(_("Toggle Logging"));
-		gtk_signal_connect(GTK_OBJECT(button), "activate",
-				   GTK_SIGNAL_FUNC(log_callback), b->name);
-		gtk_menu_append(GTK_MENU(menu), button);
-		gtk_widget_show(button);
-
+		/* FIXME: for now, we're not going to do buddy pounces from the menu,
+		 * since the person is already online. when we do per-connection pounces,
+		 * then this'll come back
 		button = gtk_menu_item_new_with_label(_("Add Buddy Pounce"));
 		gtk_signal_connect(GTK_OBJECT(button), "activate",
 				   GTK_SIGNAL_FUNC(new_bp_callback), b->name);
 		gtk_menu_append(GTK_MENU(menu), button);
 		gtk_widget_show(button);
+		*/
 
-                
+		if (g_slist_length(cn) > 1) {
+			while (cn) {
+				g = (struct gaim_connection *)cn->data;
+				if (g->prpl->action_menu) {
+					menuitem = gtk_menu_item_new_with_label(g->username);
+					gtk_menu_append(GTK_MENU(menu), menuitem);
+					gtk_widget_show(menuitem);
+					
+					conmenu = gtk_menu_new();
+					gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), conmenu);
+					gtk_widget_show(conmenu);
+
+					(*g->prpl->action_menu)(conmenu, g, b->name);
+				}
+				cn = g_slist_next(cn);
+			}
+		} else {
+			g = (struct gaim_connection *)cn->data;
+			if (g->prpl->action_menu)
+				(*g->prpl->action_menu)(menu, g, b->name);
+		}
 		
 		gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL,
 			       event->button, event->time);
@@ -630,6 +615,8 @@
 	struct buddy *b;
 	char *text[1];
 
+	if (!blist) return;
+
 	gtk_clist_freeze(GTK_CLIST(edittree));
 	gtk_clist_clear(GTK_CLIST(edittree));
 	
@@ -858,7 +845,7 @@
 static void im_callback(GtkWidget *widget, GtkTree *tree)
 {
 	GList *i;
-	struct buddy *b = NULL;
+	struct buddy_show *b = NULL;
 	struct conversation *c;
 	i = GTK_TREE_SELECTION(tree);
 	if (i) {
@@ -882,7 +869,7 @@
 static void info_callback(GtkWidget *widget, GtkTree *tree)
 {
 	GList *i;
-	struct buddy *b = NULL;
+	struct buddy_show *b = NULL;
 	i = GTK_TREE_SELECTION(tree);
 	if (i) {
 		b = gtk_object_get_user_data(GTK_OBJECT(i->data));
@@ -892,7 +879,7 @@
         }
 	if (!b->name)
 		return;
-        serv_get_info(b->name);
+        serv_get_info(b->connlist->data, b->name);
 }
 
 
@@ -1414,11 +1401,11 @@
 		if (b->present == 1) {
 			play_sound(BUDDY_ARRIVE);
 			b->present = 2;
-			if (b->log_timer > 0)
-				gtk_timeout_remove(b->log_timer);
+			if (bs->log_timer > 0)
+				gtk_timeout_remove(bs->log_timer);
 			if (!g_slist_find(bs->connlist, gc))
 				bs->connlist = g_slist_append(bs->connlist, gc);
-			b->log_timer = gtk_timeout_add(10000, (GtkFunction)log_timeout, bs);
+			bs->log_timer = gtk_timeout_add(10000, (GtkFunction)log_timeout, bs);
 		} else {
 			if (gc->prpl->list_icon)
 				xpm = (*gc->prpl->list_icon)(b->uc);
@@ -1438,9 +1425,9 @@
 		gs = find_group_show(g->name);
 		bs = find_buddy_show(gs, b->name);
 		bs->connlist = g_slist_remove(bs->connlist, gc);
-		if (b->log_timer > 0)
-			gtk_timeout_remove(b->log_timer);
-		b->log_timer = gtk_timeout_add(10000, (GtkFunction)log_timeout, bs);
+		if (bs->log_timer > 0)
+			gtk_timeout_remove(bs->log_timer);
+		bs->log_timer = gtk_timeout_add(10000, (GtkFunction)log_timeout, bs);
 		pm = gdk_pixmap_create_from_xpm_d(blist->window, &bm, NULL, logout_icon_xpm);
 		gtk_widget_hide(bs->pix);
 		gtk_pixmap_set(GTK_PIXMAP(bs->pix), pm, bm);