diff src/gtkconv.c @ 6392:e9974608b319

[gaim-migrate @ 6897] deryni absolutely rocks. Amazing guy. We now have these beautiful protocol icons on tabs that update to reflect status. Away, grey on idle, even the sign on/off doors. Wow. This will no doubt be known as the highlight of 0.67. committer: Tailor Script <tailor@pidgin.im>
author Christian Hammond <chipx86@chipx86.com>
date Wed, 06 Aug 2003 11:38:57 +0000
parents 8f94cce8faa5
children 2a4b93b57518
line wrap: on
line diff
--- a/src/gtkconv.c	Wed Aug 06 09:43:11 2003 +0000
+++ b/src/gtkconv.c	Wed Aug 06 11:38:57 2003 +0000
@@ -3816,6 +3816,8 @@
 	gboolean new_ui;
 	GaimConversationType conv_type;
 	const char *name;
+	struct buddy *b = NULL;
+	GaimAccount *account;
 
 	name      = gaim_conversation_get_name(conv);
 	conv_type = gaim_conversation_get_type(conv);
@@ -3952,6 +3954,16 @@
 	g_signal_connect(G_OBJECT(gtkconv->close), "clicked",
 					 G_CALLBACK(close_conv_cb), conv);
 
+	/* Status icon. */
+	account = gaim_conversation_get_account(conv);
+	b = gaim_find_buddy(account, name);
+	if (b != NULL)
+		gtkconv->icon = gtk_image_new_from_pixbuf(
+										gaim_gtk_blist_get_status_icon((GaimBlistNode *)b,
+																									 GAIM_STATUS_ICON_SMALL));
+	else
+		gtkconv->icon = gtk_image_new();
+
 	/* Tab label. */
 	gtkconv->tab_label = gtk_label_new(gaim_conversation_get_title(conv));
 #if 0
@@ -3961,10 +3973,14 @@
 
 
 	/* Pack it all together. */
+	gtk_box_pack_start(GTK_BOX(tabby), gtkconv->icon, FALSE, FALSE, 0);
+	if (gaim_prefs_get_bool("/gaim/gtk/conversations/icons_on_tabs"))
+		gtk_widget_show_all(gtkconv->icon);
+
 	gtk_box_pack_start(GTK_BOX(tabby), gtkconv->tab_label, TRUE, TRUE, 0);
 	gtk_widget_show(gtkconv->tab_label);
+
 	gtk_box_pack_start(GTK_BOX(tabby), gtkconv->close, FALSE, FALSE, 0);
-
 	if (gaim_prefs_get_bool("/gaim/gtk/conversations/close_on_tabs"))
 		gtk_widget_show_all(gtkconv->close);
 
@@ -4754,6 +4770,29 @@
 }
 
 static void
+update_tab_icon(GaimConversation *conv)
+{
+	GaimGtkConversation *gtkconv;
+	GaimAccount *account;
+	const char *name;
+	struct buddy *b;
+
+	gtkconv = GAIM_GTK_CONVERSATION(conv);
+	name = gaim_conversation_get_name(conv);
+	account = gaim_conversation_get_account(conv);
+	b = gaim_find_buddy(account, name);
+
+	if (b != NULL)
+	gtk_image_set_from_pixbuf(GTK_IMAGE(gtkconv->icon),
+								gaim_gtk_blist_get_status_icon((GaimBlistNode *)b,
+																							 GAIM_STATUS_ICON_SMALL));
+	else {
+		g_object_unref(gtkconv->icon);
+		gtkconv->icon = gtk_image_new();
+	}
+}
+
+static void
 gaim_gtkconv_updated(GaimConversation *conv, GaimConvUpdateType type)
 {
 	GaimWindow *win;
@@ -4840,6 +4879,12 @@
 			 type == GAIM_CONV_ACCOUNT_OFFLINE) {
 
 		generate_send_as_items(win, NULL);
+		if (gaim_prefs_get_bool("/gaim/gtk/conversations/icons_on_tabs"))
+			update_tab_icon(conv);
+	}
+	else if (type == GAIM_CONV_UPDATE_AWAY) {
+		if (gaim_prefs_get_bool("/gaim/gtk/conversations/icons_on_tabs"))
+			update_tab_icon(conv);
 	}
 	else if(type == GAIM_CONV_UPDATE_ADD ||
 			type == GAIM_CONV_UPDATE_REMOVE) {
@@ -5491,8 +5536,31 @@
 }
 
 static void
+icons_on_tabs_pref_cb(const char *name, GaimPrefType type, gpointer value,
+						gpointer data)
+{
+	GList *l;
+	GaimConversation *conv;
+	GaimGtkConversation *gtkconv;
+
+	for (l = gaim_get_conversations(); l != NULL; l = l->next) {
+		conv = (GaimConversation *)l->data;
+
+		if (!GAIM_IS_GTK_CONVERSATION(conv))
+			continue;
+
+		gtkconv = GAIM_GTK_CONVERSATION(conv);
+
+		if (value)
+			gtk_widget_show(gtkconv->icon);
+		else
+			gtk_widget_hide(gtkconv->icon);
+	}
+}
+
+static void
 close_on_tabs_pref_cb(const char *name, GaimPrefType type, gpointer value,
-					  gpointer data)
+						gpointer data)
 {
 	GList *l;
 	GaimConversation *conv;
@@ -5719,6 +5787,7 @@
 {
 	/* Conversations */
 	gaim_prefs_add_none("/gaim/gtk/conversations");
+	gaim_prefs_add_bool("/gaim/gtk/conversations/icons_on_tabs", TRUE);
 	gaim_prefs_add_bool("/gaim/gtk/conversations/close_on_tabs", TRUE);
 	gaim_prefs_add_bool("/gaim/gtk/conversations/ctrl_enter_sends", FALSE);
 	gaim_prefs_add_bool("/gaim/gtk/conversations/enter_sends", TRUE);
@@ -5773,6 +5842,8 @@
 	gaim_prefs_add_int("/gaim/gtk/conversations/im/entry_height", 50);
 
 	/* Connect callbacks. */
+	gaim_prefs_connect_callback("/gaim/gtk/conversations/icons_on_tabs",
+								icons_on_tabs_pref_cb, NULL);
 	gaim_prefs_connect_callback("/gaim/gtk/conversations/close_on_tabs",
 								close_on_tabs_pref_cb, NULL);
 	gaim_prefs_connect_callback("/gaim/gtk/conversations/show_smileys",