]> git.0d.be Git - empathy.git/commitdiff
contact_list: displays an icon showing the protocol by the contact (#603877)
authorchantra <chantra@debuntu.org>
Wed, 16 Dec 2009 16:20:36 +0000 (16:20 +0000)
committerGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>
Wed, 16 Dec 2009 16:22:01 +0000 (16:22 +0000)
data/empathy.schemas.in
libempathy-gtk/empathy-conf.h
libempathy-gtk/empathy-contact-list-store.c
libempathy-gtk/empathy-contact-list-store.h
libempathy-gtk/empathy-contact-list-view.c
libempathy-gtk/empathy-contact-selector.c
libempathy-gtk/empathy-ui-utils.c
libempathy-gtk/empathy-ui-utils.h
src/empathy-main-window.c
src/empathy-main-window.ui

index faba263a5c87e611e72191789d9a16916965f176..11b5652af90879dc387763e76f7ab8a42b9ec39e 100644 (file)
       </locale>
     </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>
index 8d0066d900d54c794cff2d884f2020987e7f0805..551627364d9f9fe3ce253e8cb80a43416176b8d5 100644 (file)
@@ -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"
index c516dbf7cff8f87c4ff432072b31f6863bd2e727..4660a0b148d3d7d1fee07d49df3c77a0fe0405ef 100644 (file)
@@ -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
@@ -255,6 +258,14 @@ empathy_contact_list_store_class_init (EmpathyContactListStoreClass *klass)
                                                                "avatars for contacts",
                                                                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",
@@ -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;
+}
+
index f9785399115de60d99dd93a17fccabeed586dea1..c46e9e8317b8e97f664261b17185fc18bc2b0091 100644 (file)
@@ -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
 
index 6b25cc10f42a8a7cc6f8232909ef0ef2d4630a33..e11a2e93f34eba4743710f9c62cf36000917635a 100644 (file)
@@ -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);
 }
index 8aa02fa6d451eb6be69489cb3633a52381d9924d..027ca41c2e7fe43b4413c29c45b84bab95cc4673 100644 (file)
@@ -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",
index 2d8f4091cb6dc8f1ba85aafca2be721134061f3f..3fa39d53fb8ec504c44dd312fc2faa0979f74566 100644 (file)
@@ -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)
@@ -490,6 +505,103 @@ empathy_pixbuf_avatar_from_contact_scaled (EmpathyContact *contact,
        return empathy_pixbuf_from_avatar_scaled (avatar, width, height);
 }
 
+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)
 {
index 0eacd49b897e9af114a7ffe3da6f4b59725fe325..925ecc5cb00c5db4fca2887a751bf1a56b6afe3b 100644 (file)
@@ -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,
index 447e25b4858cfbe2f9cec6853d41ea769c2f7483..cbb6f10b0ddfe18418fbb46b112d7cad033e993e 100644 (file)
@@ -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,
index 26edc6bdf9a3c3e09aea128f58da098960d5fcd2..b74f4acb92b0a2abcc8969d030f72e41dd5a9460 100644 (file)
           </object>
           <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>
         </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"/>