[empathy] contact_list: displays an icon showing the protocol by the contact (#603877)



commit fbaeb693027d63d94488702635630644971dfc2f
Author: chantra <chantra debuntu org>
Date:   Wed Dec 16 16:20:36 2009 +0000

    contact_list: displays an icon showing the protocol by the contact (#603877)

 data/empathy.schemas.in                     |   15 +++
 libempathy-gtk/empathy-conf.h               |    1 +
 libempathy-gtk/empathy-contact-list-store.c |  143 ++++++++++++++++++++++++++-
 libempathy-gtk/empathy-contact-list-store.h |    8 ++
 libempathy-gtk/empathy-contact-list-view.c  |   14 ++-
 libempathy-gtk/empathy-contact-selector.c   |    2 +-
 libempathy-gtk/empathy-ui-utils.c           |  112 +++++++++++++++++++++
 libempathy-gtk/empathy-ui-utils.h           |    9 ++
 src/empathy-main-window.c                   |   63 +++++++++++-
 src/empathy-main-window.ui                  |    7 ++
 10 files changed, 360 insertions(+), 14 deletions(-)
---
diff --git a/data/empathy.schemas.in b/data/empathy.schemas.in
index faba263..11b5652 100644
--- a/data/empathy.schemas.in
+++ b/data/empathy.schemas.in
@@ -47,6 +47,21 @@
     </schema>
 
     <schema>
+      <key>/schemas/apps/empathy/ui/show_protocols</key>
+      <applyto>/apps/empathy/ui/show_protocols</applyto>
+      <owner>empathy</owner>
+      <type>bool</type>
+      <default>true</default>
+      <locale name="C">
+        <short>Show protocols</short>
+        <long>
+        Whether or not to show protocols for contacts in the contact
+        list.
+        </long>
+      </locale>
+    </schema>
+
+    <schema>
       <key>/schemas/apps/empathy/ui/compact_contact_list</key>
       <applyto>/apps/empathy/ui/compact_contact_list</applyto>
       <owner>empathy</owner>
diff --git a/libempathy-gtk/empathy-conf.h b/libempathy-gtk/empathy-conf.h
index 8d0066d..5516273 100644
--- a/libempathy-gtk/empathy-conf.h
+++ b/libempathy-gtk/empathy-conf.h
@@ -73,6 +73,7 @@ struct _EmpathyConfClass {
 #define EMPATHY_PREFS_UI_MAIN_WINDOW_HIDDEN        EMPATHY_PREFS_PATH "/ui/main_window_hidden"
 #define EMPATHY_PREFS_UI_AVATAR_DIRECTORY          EMPATHY_PREFS_PATH "/ui/avatar_directory"
 #define EMPATHY_PREFS_UI_SHOW_AVATARS              EMPATHY_PREFS_PATH "/ui/show_avatars"
+#define EMPATHY_PREFS_UI_SHOW_PROTOCOLS            EMPATHY_PREFS_PATH "/ui/show_protocols"
 #define EMPATHY_PREFS_UI_COMPACT_CONTACT_LIST      EMPATHY_PREFS_PATH "/ui/compact_contact_list"
 #define EMPATHY_PREFS_UI_CHAT_WINDOW_PANED_POS     EMPATHY_PREFS_PATH "/ui/chat_window_paned_pos"
 #define EMPATHY_PREFS_CONTACTS_SHOW_OFFLINE        EMPATHY_PREFS_PATH "/contacts/show_offline"
diff --git a/libempathy-gtk/empathy-contact-list-store.c b/libempathy-gtk/empathy-contact-list-store.c
index c516dbf..4660a0b 100644
--- a/libempathy-gtk/empathy-contact-list-store.c
+++ b/libempathy-gtk/empathy-contact-list-store.c
@@ -60,11 +60,13 @@ typedef struct {
 	gboolean                    show_avatars;
 	gboolean                    show_groups;
 	gboolean                    is_compact;
+	gboolean                    show_protocols;
 	gboolean                    show_active;
 	EmpathyContactListStoreSort sort_criterium;
 	guint                       inhibit_active;
 	guint                       setup_idle_id;
 	gboolean                    dispose_has_run;
+	GHashTable                  *status_icons;
 } EmpathyContactListStorePriv;
 
 typedef struct {
@@ -165,6 +167,7 @@ enum {
 	PROP_CONTACT_LIST,
 	PROP_SHOW_OFFLINE,
 	PROP_SHOW_AVATARS,
+	PROP_SHOW_PROTOCOLS,
 	PROP_SHOW_GROUPS,
 	PROP_IS_COMPACT,
 	PROP_SORT_CRITERIUM
@@ -256,6 +259,14 @@ empathy_contact_list_store_class_init (EmpathyContactListStoreClass *klass)
 								TRUE,
 								G_PARAM_READWRITE));
 	 g_object_class_install_property (object_class,
+					  PROP_SHOW_PROTOCOLS,
+					  g_param_spec_boolean ("show-protocols",
+								"Show Protocols",
+								"Whether contact list should display "
+								"protocols for contacts",
+								FALSE,
+								G_PARAM_READWRITE));
+	 g_object_class_install_property (object_class,
 					  PROP_SHOW_GROUPS,
 					  g_param_spec_boolean ("show-groups",
 								"Show Groups",
@@ -292,9 +303,11 @@ empathy_contact_list_store_init (EmpathyContactListStore *store)
 	store->priv = priv;
 	priv->show_avatars = TRUE;
 	priv->show_groups = TRUE;
+	priv->show_protocols = FALSE;
 	priv->inhibit_active = g_timeout_add_seconds (ACTIVE_USER_WAIT_TO_ENABLE_TIME,
 						      (GSourceFunc) contact_list_store_inibit_active_cb,
 						      store);
+	priv->status_icons = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref);
 	contact_list_store_setup (store);
 }
 
@@ -337,6 +350,7 @@ contact_list_store_dispose (GObject *object)
 		g_source_remove (priv->setup_idle_id);
 	}
 
+	g_hash_table_destroy (priv->status_icons);
 	G_OBJECT_CLASS (empathy_contact_list_store_parent_class)->dispose (object);
 }
 
@@ -360,6 +374,9 @@ contact_list_store_get_property (GObject    *object,
 	case PROP_SHOW_AVATARS:
 		g_value_set_boolean (value, priv->show_avatars);
 		break;
+	case PROP_SHOW_PROTOCOLS:
+		g_value_set_boolean (value, priv->show_protocols);
+		break;
 	case PROP_SHOW_GROUPS:
 		g_value_set_boolean (value, priv->show_groups);
 		break;
@@ -398,6 +415,10 @@ contact_list_store_set_property (GObject      *object,
 		empathy_contact_list_store_set_show_avatars (EMPATHY_CONTACT_LIST_STORE (object),
 							    g_value_get_boolean (value));
 		break;
+	case PROP_SHOW_PROTOCOLS:
+		empathy_contact_list_store_set_show_protocols (EMPATHY_CONTACT_LIST_STORE (object),
+							    g_value_get_boolean (value));
+		break;
 	case PROP_SHOW_GROUPS:
 		empathy_contact_list_store_set_show_groups (EMPATHY_CONTACT_LIST_STORE (object),
 							    g_value_get_boolean (value));
@@ -517,6 +538,42 @@ empathy_contact_list_store_set_show_avatars (EmpathyContactListStore *store,
 	g_object_notify (G_OBJECT (store), "show-avatars");
 }
 
+
+gboolean
+empathy_contact_list_store_get_show_protocols (EmpathyContactListStore *store)
+{
+	EmpathyContactListStorePriv *priv;
+
+	g_return_val_if_fail (EMPATHY_IS_CONTACT_LIST_STORE (store), TRUE);
+
+	priv = GET_PRIV (store);
+
+	return priv->show_protocols;
+}
+
+void
+empathy_contact_list_store_set_show_protocols (EmpathyContactListStore *store,
+					    gboolean                show_protocols)
+{
+	EmpathyContactListStorePriv *priv;
+	GtkTreeModel               *model;
+
+	g_return_if_fail (EMPATHY_IS_CONTACT_LIST_STORE (store));
+
+	priv = GET_PRIV (store);
+
+	priv->show_protocols = show_protocols;
+
+	model = GTK_TREE_MODEL (store);
+
+	gtk_tree_model_foreach (model,
+				(GtkTreeModelForeachFunc)
+				contact_list_store_update_list_mode_foreach,
+				store);
+
+	g_object_notify (G_OBJECT (store), "show-protocols");
+}
+
 gboolean
 empathy_contact_list_store_get_show_groups (EmpathyContactListStore *store)
 {
@@ -753,7 +810,7 @@ contact_list_store_setup (EmpathyContactListStore *store)
 {
 	EmpathyContactListStorePriv *priv;
 	GType types[] = {
-		G_TYPE_STRING,        /* Status icon-name */
+		GDK_TYPE_PIXBUF,      /* Status pixbuf */
 		GDK_TYPE_PIXBUF,      /* Avatar pixbuf */
 		G_TYPE_BOOLEAN,       /* Avatar pixbuf visible */
 		G_TYPE_STRING,        /* Name */
@@ -1055,7 +1112,9 @@ contact_list_store_contact_update (EmpathyContactListStore *store,
 	gboolean                    do_set_active = FALSE;
 	gboolean                    do_set_refresh = FALSE;
 	gboolean                    show_avatar = FALSE;
+	gboolean                    show_protocol = FALSE;
 	GdkPixbuf                  *pixbuf_avatar;
+	GdkPixbuf                  *pixbuf_status;
 
 	priv = GET_PRIV (store);
 
@@ -1148,10 +1207,14 @@ contact_list_store_contact_update (EmpathyContactListStore *store,
 	if (priv->show_avatars && !priv->is_compact) {
 		show_avatar = TRUE;
 	}
+	if (priv->show_protocols && !priv->is_compact) {
+		show_protocol = TRUE;
+	}
 	pixbuf_avatar = empathy_pixbuf_avatar_from_contact_scaled (contact, 32, 32);
+	pixbuf_status = contact_list_store_get_contact_status_icon (store, contact);
 	for (l = iters; l && set_model; l = l->next) {
 		gtk_tree_store_set (GTK_TREE_STORE (store), l->data,
-				    EMPATHY_CONTACT_LIST_STORE_COL_ICON_STATUS, empathy_icon_name_for_contact (contact),
+				    EMPATHY_CONTACT_LIST_STORE_COL_ICON_STATUS, pixbuf_status,
 				    EMPATHY_CONTACT_LIST_STORE_COL_PIXBUF_AVATAR, pixbuf_avatar,
 				    EMPATHY_CONTACT_LIST_STORE_COL_PIXBUF_AVATAR_VISIBLE, show_avatar,
 				    EMPATHY_CONTACT_LIST_STORE_COL_NAME, empathy_contact_get_name (contact),
@@ -1581,15 +1644,32 @@ contact_list_store_update_list_mode_foreach (GtkTreeModel           *model,
 					     EmpathyContactListStore *store)
 {
 	EmpathyContactListStorePriv *priv;
-	gboolean                    show_avatar = FALSE;
+	gboolean                     show_avatar = FALSE;
+	gboolean                     show_protocol = FALSE;
+	EmpathyContact              *contact;
+	GdkPixbuf                   *pixbuf_status;
 
 	priv = GET_PRIV (store);
 
 	if (priv->show_avatars && !priv->is_compact) {
 		show_avatar = TRUE;
 	}
+	if (priv->show_protocols && !priv->is_compact) {
+		show_protocol = TRUE;
+	}
+
+	gtk_tree_model_get (model, iter,
+			    EMPATHY_CONTACT_LIST_STORE_COL_CONTACT, &contact,
+			    -1);
+
+	if (contact == NULL){
+		return FALSE;
+	}
+	/* get icon from hash_table */
+	pixbuf_status = contact_list_store_get_contact_status_icon (store, contact);
 
 	gtk_tree_store_set (GTK_TREE_STORE (store), iter,
+			    EMPATHY_CONTACT_LIST_STORE_COL_ICON_STATUS, pixbuf_status,
 			    EMPATHY_CONTACT_LIST_STORE_COL_PIXBUF_AVATAR_VISIBLE, show_avatar,
 			    EMPATHY_CONTACT_LIST_STORE_COL_STATUS_VISIBLE, !priv->is_compact,
 			    -1);
@@ -1597,3 +1677,60 @@ contact_list_store_update_list_mode_foreach (GtkTreeModel           *model,
 	return FALSE;
 }
 
+GdkPixbuf *
+contact_list_store_get_contact_status_icon (EmpathyContactListStore *store,
+					    EmpathyContact *contact)
+{
+	GdkPixbuf                   *pixbuf_status = NULL;
+	const gchar                 *status_icon_name = NULL;
+
+	status_icon_name = empathy_icon_name_for_contact (contact);
+	pixbuf_status = contact_list_store_get_contact_status_icon_with_icon_name (
+			    store,
+			    contact,
+			    status_icon_name);
+
+	return pixbuf_status;
+}
+
+GdkPixbuf *
+contact_list_store_get_contact_status_icon_with_icon_name (
+					EmpathyContactListStore *store,
+					EmpathyContact *contact,
+					const gchar *status_icon_name)
+{
+	GdkPixbuf                   *pixbuf_status = NULL;
+	EmpathyContactListStorePriv *priv;
+	const gchar                 *protocol_name = NULL;
+	gchar                       *icon_name = NULL;
+	gboolean                     show_protocol = FALSE;
+
+	priv = GET_PRIV (store);
+
+	if (priv->show_protocols && !priv->is_compact) {
+		show_protocol = TRUE;
+	}
+	if (show_protocol) {
+		protocol_name = empathy_protocol_name_for_contact (contact);
+		icon_name = g_strdup_printf ("%s-%s", status_icon_name, protocol_name);
+	} else {
+		icon_name = g_strdup_printf ("%s", status_icon_name);
+	}
+	pixbuf_status = g_hash_table_lookup (priv->status_icons, icon_name);
+	if (pixbuf_status == NULL) {
+		pixbuf_status = empathy_pixbuf_contact_status_icon_with_icon_name (contact,
+				    status_icon_name,
+				    show_protocol);
+		if (pixbuf_status != NULL) {
+			g_hash_table_insert (priv->status_icons,
+			    g_strdup (icon_name),
+			    pixbuf_status);
+			DEBUG( "Created status icon %s\n", icon_name);
+		}
+	} else {
+		DEBUG( "retrieved from cache status icon %s\n", icon_name);
+	}
+	g_free (icon_name);
+	return pixbuf_status;
+}
+
diff --git a/libempathy-gtk/empathy-contact-list-store.h b/libempathy-gtk/empathy-contact-list-store.h
index f978539..c46e9e8 100644
--- a/libempathy-gtk/empathy-contact-list-store.h
+++ b/libempathy-gtk/empathy-contact-list-store.h
@@ -90,6 +90,9 @@ void                       empathy_contact_list_store_set_show_groups   (Empathy
 gboolean                   empathy_contact_list_store_get_is_compact     (EmpathyContactListStore     *store);
 void                       empathy_contact_list_store_set_is_compact     (EmpathyContactListStore     *store,
 									 gboolean                    is_compact);
+gboolean                   empathy_contact_list_store_get_show_protocols   (EmpathyContactListStore     *store);
+void                       empathy_contact_list_store_set_show_protocols   (EmpathyContactListStore     *store,
+									 gboolean                    show_protocols);
 EmpathyContactListStoreSort empathy_contact_list_store_get_sort_criterium (EmpathyContactListStore     *store);
 void                       empathy_contact_list_store_set_sort_criterium (EmpathyContactListStore     *store,
 									 EmpathyContactListStoreSort  sort_criterium);
@@ -104,6 +107,11 @@ gboolean                   empathy_contact_list_store_search_equal_func  (GtkTre
 									 const gchar                *key,
 									 GtkTreeIter                *iter,
 									 gpointer                    search_data);
+GdkPixbuf *                contact_list_store_get_contact_status_icon ( EmpathyContactListStore *store,
+									 EmpathyContact             *contact);
+GdkPixbuf *                contact_list_store_get_contact_status_icon_with_icon_name (EmpathyContactListStore *store,
+									 EmpathyContact             *contact,
+									 const gchar                *status_icon_name);
 
 G_END_DECLS
 
diff --git a/libempathy-gtk/empathy-contact-list-view.c b/libempathy-gtk/empathy-contact-list-view.c
index 6b25cc1..e11a2e9 100644
--- a/libempathy-gtk/empathy-contact-list-view.c
+++ b/libempathy-gtk/empathy-contact-list-view.c
@@ -842,22 +842,24 @@ contact_list_view_pixbuf_cell_data_func (GtkTreeViewColumn     *tree_column,
 					 GtkTreeIter           *iter,
 					 EmpathyContactListView *view)
 {
-	gchar    *icon_name;
-	gboolean  is_group;
-	gboolean  is_active;
+	GdkPixbuf *pixbuf;
+	gboolean   is_group;
+	gboolean   is_active;
 
 	gtk_tree_model_get (model, iter,
 			    EMPATHY_CONTACT_LIST_STORE_COL_IS_GROUP, &is_group,
 			    EMPATHY_CONTACT_LIST_STORE_COL_IS_ACTIVE, &is_active,
-			    EMPATHY_CONTACT_LIST_STORE_COL_ICON_STATUS, &icon_name,
+			    EMPATHY_CONTACT_LIST_STORE_COL_ICON_STATUS, &pixbuf,
 			    -1);
 
 	g_object_set (cell,
 		      "visible", !is_group,
-		      "icon-name", icon_name,
+		      "pixbuf", pixbuf,
 		      NULL);
 
-	g_free (icon_name);
+	if (pixbuf != NULL) {
+		g_object_unref (pixbuf);
+	}
 
 	contact_list_view_cell_set_background (view, cell, is_group, is_active);
 }
diff --git a/libempathy-gtk/empathy-contact-selector.c b/libempathy-gtk/empathy-contact-selector.c
index 8aa02fa..027ca41 100644
--- a/libempathy-gtk/empathy-contact-selector.c
+++ b/libempathy-gtk/empathy-contact-selector.c
@@ -211,7 +211,7 @@ contact_selector_constructor (GType type,
   priv->store = empathy_contact_list_store_new (priv->contact_list);
 
   g_object_set (priv->store, "is-compact", TRUE, "show-avatars", FALSE,
-      "show-offline", FALSE, "show-groups", FALSE,
+      "show-offline", FALSE, "show-groups", FALSE, "show-protocols", FALSE,
       "sort-criterium", EMPATHY_CONTACT_LIST_STORE_SORT_NAME, NULL);
 
   g_signal_connect_swapped (priv->store, "row-changed",
diff --git a/libempathy-gtk/empathy-ui-utils.c b/libempathy-gtk/empathy-ui-utils.c
index 2d8f409..3fa39d5 100644
--- a/libempathy-gtk/empathy-ui-utils.c
+++ b/libempathy-gtk/empathy-ui-utils.c
@@ -230,6 +230,21 @@ empathy_icon_name_for_contact (EmpathyContact *contact)
 	return empathy_icon_name_for_presence (presence);
 }
 
+const gchar *
+empathy_protocol_name_for_contact (EmpathyContact   *contact)
+{
+	TpAccount     *account;
+
+	g_return_val_if_fail (EMPATHY_IS_CONTACT (contact), NULL);
+
+	account = empathy_contact_get_account (contact);
+	if (account == NULL) {
+		return NULL;
+	}
+
+	return tp_account_get_icon_name (account);
+}
+
 GdkPixbuf *
 empathy_pixbuf_from_data (gchar *data,
 			  gsize  data_size)
@@ -491,6 +506,103 @@ empathy_pixbuf_avatar_from_contact_scaled (EmpathyContact *contact,
 }
 
 GdkPixbuf *
+empathy_pixbuf_contact_status_icon (EmpathyContact *contact,
+				   gboolean       show_protocol)
+{
+	const gchar *icon_name;
+
+	g_return_val_if_fail (EMPATHY_IS_CONTACT (contact), NULL);
+
+	icon_name = empathy_icon_name_for_contact (contact);
+
+	if (icon_name == NULL) {
+		return NULL;
+	}
+	return empathy_pixbuf_contact_status_icon_with_icon_name (contact,
+	    icon_name,
+	    show_protocol);
+}
+
+GdkPixbuf *
+empathy_pixbuf_contact_status_icon_with_icon_name (EmpathyContact *contact,
+					  const gchar    *icon_name,
+					  gboolean       show_protocol)
+{
+	GdkPixbuf *pix_status;
+	GdkPixbuf *pix_protocol;
+	gchar     *icon_filename;
+	gint       height, width;
+	gint       numerator, denominator;
+
+	g_return_val_if_fail (EMPATHY_IS_CONTACT (contact), NULL);
+
+	numerator = 3;
+	denominator = 4;
+
+	icon_filename = empathy_filename_from_icon_name (icon_name,
+							 GTK_ICON_SIZE_MENU);
+	if (icon_filename == NULL) {
+		DEBUG ("icon name: %s could not be found\n", icon_name);
+		return NULL;
+	}
+
+	pix_status = gdk_pixbuf_new_from_file (icon_filename, NULL);
+
+	g_free (icon_filename);
+
+	if (pix_status == NULL) {
+		DEBUG ("Could not open icon %s\n", icon_filename);
+		return NULL;
+	}
+
+	if (!show_protocol)
+		return pix_status;
+
+	height = gdk_pixbuf_get_height (pix_status);
+	width = gdk_pixbuf_get_width (pix_status);
+
+	pix_protocol = empathy_pixbuf_protocol_from_contact_scaled (contact,
+								    width * numerator / denominator,
+								    height * numerator / denominator);
+
+	if (pix_protocol == NULL) {
+		return pix_status;
+	}
+	gdk_pixbuf_composite (pix_protocol, pix_status,
+	    0, height - height * numerator / denominator,
+	    width * numerator / denominator, height * numerator / denominator,
+	    0, height - height * numerator / denominator,
+	    1, 1,
+	    GDK_INTERP_BILINEAR, 255);
+
+	g_object_unref (pix_protocol);
+
+	return pix_status;
+}
+
+GdkPixbuf *
+empathy_pixbuf_protocol_from_contact_scaled (EmpathyContact *contact,
+					  gint           width,
+					  gint           height)
+{
+	TpAccount *account;
+	gchar     *filename;
+	GdkPixbuf *pixbuf = NULL;
+
+	g_return_val_if_fail (EMPATHY_IS_CONTACT (contact), NULL);
+
+	account = empathy_contact_get_account (contact);
+	filename = empathy_filename_from_icon_name (tp_account_get_icon_name (account),
+						    GTK_ICON_SIZE_MENU);
+	if (filename != NULL) {
+		pixbuf = gdk_pixbuf_new_from_file_at_size (filename, width, height, NULL);
+		g_free (filename);
+	}
+
+	return pixbuf;
+}
+
+GdkPixbuf *
 empathy_pixbuf_scale_down_if_necessary (GdkPixbuf *pixbuf, gint max_size)
 {
 	gint      width, height;
diff --git a/libempathy-gtk/empathy-ui-utils.h b/libempathy-gtk/empathy-ui-utils.h
index 0eacd49..925ecc5 100644
--- a/libempathy-gtk/empathy-ui-utils.h
+++ b/libempathy-gtk/empathy-ui-utils.h
@@ -63,6 +63,7 @@ GtkWidget     *empathy_builder_unref_and_keep_widget    (GtkBuilder       *gui,
 /* Pixbufs */
 const gchar * empathy_icon_name_for_presence            (TpConnectionPresenceType  presence);
 const gchar * empathy_icon_name_for_contact             (EmpathyContact   *contact);
+const gchar * empathy_protocol_name_for_contact         (EmpathyContact   *contact);
 GdkPixbuf *   empathy_pixbuf_from_data                  (gchar            *data,
 							 gsize             data_size);
 GdkPixbuf *   empathy_pixbuf_from_data_and_mime         (gchar            *data,
@@ -74,6 +75,14 @@ GdkPixbuf *   empathy_pixbuf_from_avatar_scaled         (EmpathyAvatar    *avata
 GdkPixbuf *   empathy_pixbuf_avatar_from_contact_scaled (EmpathyContact   *contact,
 							 gint              width,
 							 gint              height);
+GdkPixbuf *   empathy_pixbuf_protocol_from_contact_scaled (EmpathyContact   *contact,
+							 gint              width,
+							 gint              height);
+GdkPixbuf *   empathy_pixbuf_contact_status_icon (EmpathyContact   *contact,
+							 gboolean          show_protocol);
+GdkPixbuf *   empathy_pixbuf_contact_status_icon_with_icon_name (EmpathyContact   *contact,
+							 const gchar       *icon_name,
+							 gboolean          show_protocol);
 GdkPixbuf *   empathy_pixbuf_scale_down_if_necessary    (GdkPixbuf        *pixbuf,
 							 gint              max_size);
 GdkPixbuf *   empathy_pixbuf_from_icon_name             (const gchar      *icon_name,
diff --git a/src/empathy-main-window.c b/src/empathy-main-window.c
index 447e25b..cbb6f10 100644
--- a/src/empathy-main-window.c
+++ b/src/empathy-main-window.c
@@ -94,6 +94,7 @@ typedef struct {
 	GtkWidget              *presence_chooser;
 	GtkWidget              *errors_vbox;
 
+	GtkToggleAction        *show_protocols;
 	GtkRadioAction         *sort_by_name;
 	GtkRadioAction         *sort_by_status;
 	GtkRadioAction         *normal_with_avatars;
@@ -131,8 +132,9 @@ main_window_flash_stop (EmpathyMainWindow *window)
 }
 
 typedef struct {
-	EmpathyEvent *event;
-	gboolean      on;
+	EmpathyEvent       *event;
+	gboolean            on;
+	EmpathyMainWindow  *window;
 } FlashForeachData;
 
 static gboolean
@@ -146,6 +148,7 @@ main_window_flash_foreach (GtkTreeModel *model,
 	const gchar      *icon_name;
 	GtkTreePath      *parent_path = NULL;
 	GtkTreeIter       parent_iter;
+	GdkPixbuf        *pixbuf = NULL;
 
 	/* To be used with gtk_tree_model_foreach, update the status icon
 	 * of the contact to show the event icon (on=TRUE) or the presence
@@ -163,12 +166,17 @@ main_window_flash_foreach (GtkTreeModel *model,
 
 	if (data->on) {
 		icon_name = data->event->icon_name;
+		pixbuf = contact_list_store_get_contact_status_icon_with_icon_name (
+						data->window->list_store,
+						contact, icon_name);
 	} else {
-		icon_name = empathy_icon_name_for_contact (contact);
+		pixbuf = contact_list_store_get_contact_status_icon (
+						data->window->list_store,
+						contact);
 	}
 
 	gtk_tree_store_set (GTK_TREE_STORE (model), iter,
-			    EMPATHY_CONTACT_LIST_STORE_COL_ICON_STATUS, icon_name,
+			    EMPATHY_CONTACT_LIST_STORE_COL_ICON_STATUS, pixbuf,
 			    -1);
 
 	/* To make sure the parent is shown correctly, we emit
@@ -203,6 +211,7 @@ main_window_flash_cb (EmpathyMainWindow *window)
 	events = empathy_event_manager_get_events (window->event_manager);
 	for (l = events; l; l = l->next) {
 		data.event = l->data;
+		data.window = window;
 		if (!data.event->contact || !data.event->must_ack) {
 			continue;
 		}
@@ -257,6 +266,7 @@ main_window_event_removed_cb (EmpathyEventManager *manager,
 
 	data.on = FALSE;
 	data.event = event;
+	data.window = window;
 	gtk_tree_model_foreach (GTK_TREE_MODEL (window->list_store),
 				main_window_flash_foreach,
 				&data);
@@ -747,6 +757,21 @@ main_window_view_sort_contacts_cb (GtkRadioAction    *action,
 	empathy_contact_list_store_set_sort_criterium (window->list_store, value);
 }
 
+static void
+main_window_view_show_protocols_cb (GtkToggleAction *action,
+					EmpathyMainWindow *window)
+{
+	gboolean value;
+
+	value = gtk_toggle_action_get_active (action);
+
+	empathy_conf_set_bool (empathy_conf_get (),
+					 EMPATHY_PREFS_UI_SHOW_PROTOCOLS,
+					 value == TRUE);
+	empathy_contact_list_store_set_show_protocols (window->list_store,
+					 value == TRUE);
+}
+
 /* Matches GtkRadioAction values set in empathy-main-window.ui */
 #define CONTACT_LIST_NORMAL_SIZE_WITH_AVATARS		0
 #define CONTACT_LIST_NORMAL_SIZE			1
@@ -772,8 +797,26 @@ main_window_view_contacts_list_size_cb (GtkRadioAction    *action,
 						     value == CONTACT_LIST_NORMAL_SIZE_WITH_AVATARS);
 	empathy_contact_list_store_set_is_compact (window->list_store,
 						   value == CONTACT_LIST_COMPACT_SIZE);
+
+	gtk_action_set_sensitive (GTK_ACTION (window->show_protocols),
+						value != CONTACT_LIST_COMPACT_SIZE );
+}
+
+static void main_window_notify_show_protocols_cb (EmpathyConf       *conf,
+					const gchar       *key,
+					EmpathyMainWindow *window)
+{
+	gboolean show_protocols;
+
+	if (empathy_conf_get_bool (conf,
+				   EMPATHY_PREFS_UI_SHOW_PROTOCOLS,
+				   &show_protocols)) {
+		gtk_toggle_action_set_active (window->show_protocols,
+					      show_protocols);
+	}
 }
 
+
 static void
 main_window_notify_contact_list_size_cb (EmpathyConf       *conf,
 					 const gchar       *key,
@@ -1193,6 +1236,7 @@ empathy_main_window_show (void)
 				       "errors_vbox", &window->errors_vbox,
 				       "ui_manager", &window->ui_manager,
 				       "view_show_offline", &show_offline_widget,
+				       "view_show_protocols", &window->show_protocols,
 				       "view_sort_by_name", &window->sort_by_name,
 				       "view_sort_by_status", &window->sort_by_status,
 				       "view_normal_size_with_avatars", &window->normal_with_avatars,
@@ -1217,6 +1261,7 @@ empathy_main_window_show (void)
 			      "chat_add_contact", "activate", main_window_chat_add_contact_cb,
 			      "view_show_ft_manager", "activate", main_window_view_show_ft_manager,
 			      "view_show_offline", "toggled", main_window_view_show_offline_cb,
+			      "view_show_protocols", "toggled", main_window_view_show_protocols_cb,
 			      "view_sort_by_name", "changed", main_window_view_sort_contacts_cb,
 			      "view_normal_size_with_avatars", "changed", main_window_view_contacts_list_size_cb,
 			      "view_show_map", "activate", main_window_view_show_map_cb,
@@ -1354,6 +1399,16 @@ empathy_main_window_show (void)
 
 	gtk_toggle_action_set_active (show_offline_widget, show_offline);
 
+	/* Show protocol ? */
+	empathy_conf_notify_add (conf,
+				 EMPATHY_PREFS_UI_SHOW_PROTOCOLS,
+				 (EmpathyConfNotifyFunc) main_window_notify_show_protocols_cb,
+				 window);
+
+	main_window_notify_show_protocols_cb (conf,
+					    EMPATHY_PREFS_UI_SHOW_PROTOCOLS,
+					    window);
+
 	/* Sort by name / by status ? */
 	empathy_conf_notify_add (conf,
 				 EMPATHY_PREFS_CONTACTS_SORT_CRITERIUM,
diff --git a/src/empathy-main-window.ui b/src/empathy-main-window.ui
index 26edc6b..b74f4ac 100644
--- a/src/empathy-main-window.ui
+++ b/src/empathy-main-window.ui
@@ -48,6 +48,12 @@
           <accelerator key="H" modifiers="GDK_CONTROL_MASK"/>
         </child>
         <child>
+          <object class="GtkToggleAction" id="view_show_protocols">
+            <property name="name">view_show_protocols</property>
+            <property name="label" translatable="yes">Show P_rotocols</property>
+          </object>
+        </child>
+        <child>
           <object class="GtkAction" id="view_show_map">
             <property name="name">view_show_map</property>
             <property name="label" translatable="yes">Contacts on a _Map</property>
@@ -221,6 +227,7 @@
         </menu>
         <menu action="view">
           <menuitem action="view_show_offline"/>
+          <menuitem action="view_show_protocols"/>
           <separator/>
           <menuitem action="view_sort_by_name"/>
           <menuitem action="view_sort_by_status"/>



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]