static void contact_widget_presence_notify_cb (EmpathyContactWidget *information) { gtk_label_set_text (GTK_LABEL (information->label_status), empathy_contact_get_status (information->contact)); gtk_image_set_from_icon_name (GTK_IMAGE (information->image_state), empathy_icon_name_for_contact (information->contact), GTK_ICON_SIZE_BUTTON); }
static GdkPixbuf * get_persona_status_icon (EmpathyPersonaStore *self, FolksPersona *persona) { EmpathyPersonaStorePriv *priv = GET_PRIV (self); EmpathyContact *contact; const gchar *protocol_name = NULL; gchar *icon_name = NULL; GdkPixbuf *pixbuf_status = NULL; const gchar *status_icon_name = NULL; contact = empathy_contact_dup_from_tp_contact (tpf_persona_get_contact ( TPF_PERSONA (persona))); status_icon_name = empathy_icon_name_for_contact (contact); if (status_icon_name == NULL) { g_object_unref (contact); return NULL; } if (priv->show_protocols) { 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, priv->show_protocols); if (pixbuf_status != NULL) { g_hash_table_insert (priv->status_icons, g_strdup (icon_name), pixbuf_status); } } g_object_unref (contact); g_free (icon_name); return pixbuf_status; }
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); }
static void contact_widget_presence_notify_cb (EmpathyContactWidget *information) { const gchar *status; gchar *markup_text = NULL; status = empathy_contact_get_status (information->contact); if (status != NULL) markup_text = empathy_add_link_markup (status); gtk_label_set_markup (GTK_LABEL (information->label_status), markup_text); g_free (markup_text); gtk_image_set_from_icon_name (GTK_IMAGE (information->image_state), empathy_icon_name_for_contact (information->contact), GTK_ICON_SIZE_BUTTON); gtk_widget_show (information->image_state); }
static void chat_window_update_chat_tab (EmpathyChat *chat) { EmpathyChatWindow *window; EmpathyChatWindowPriv *priv; EmpathyContact *remote_contact; const gchar *name; const gchar *subject; GtkWidget *widget; GString *tooltip; gchar *str; const gchar *icon_name; window = chat_window_find_chat (chat); if (!window) { return; } priv = GET_PRIV (window); /* Get information */ name = chat_window_get_chat_name (chat); subject = empathy_chat_get_subject (chat); remote_contact = empathy_chat_get_remote_contact (chat); DEBUG ("Updating chat tab, name=%s, subject=%s, remote_contact=%p", name, subject, remote_contact); /* Update tab image */ if (g_list_find (priv->chats_new_msg, chat)) { icon_name = EMPATHY_IMAGE_MESSAGE; } else if (g_list_find (priv->chats_composing, chat)) { icon_name = EMPATHY_IMAGE_TYPING; } else if (remote_contact) { icon_name = empathy_icon_name_for_contact (remote_contact); } else { icon_name = EMPATHY_IMAGE_GROUP_MESSAGE; } widget = g_object_get_data (G_OBJECT (chat), "chat-window-tab-image"); gtk_image_set_from_icon_name (GTK_IMAGE (widget), icon_name, GTK_ICON_SIZE_MENU); /* Update tab tooltip */ tooltip = g_string_new (NULL); if (remote_contact) { g_string_append_printf (tooltip, "%s\n%s", empathy_contact_get_id (remote_contact), empathy_contact_get_status (remote_contact)); } else { g_string_append (tooltip, name); } if (subject) { g_string_append_printf (tooltip, "\n%s %s", _("Topic:"), subject); } if (g_list_find (priv->chats_composing, chat)) { g_string_append_printf (tooltip, "\n%s", _("Typing a message.")); } str = g_string_free (tooltip, FALSE); widget = g_object_get_data (G_OBJECT (chat), "chat-window-tab-tooltip-widget"); gtk_widget_set_tooltip_text (widget, str); g_free (str); /* Update tab label */ widget = g_object_get_data (G_OBJECT (chat), "chat-window-tab-label"); gtk_label_set_text (GTK_LABEL (widget), name); /* Update the window if it's the current chat */ if (priv->current_chat == chat) { chat_window_update (window); } }
static void contact_list_store_contact_update (EmpathyContactListStore *store, EmpathyContact *contact) { EmpathyContactListStorePriv *priv; ShowActiveData *data; GtkTreeModel *model; GList *iters, *l; gboolean in_list; gboolean should_be_in_list; gboolean was_online = TRUE; gboolean now_online = FALSE; gboolean set_model = FALSE; gboolean do_remove = FALSE; gboolean do_set_active = FALSE; gboolean do_set_refresh = FALSE; gboolean show_avatar = FALSE; GdkPixbuf *pixbuf_avatar; priv = GET_PRIV (store); model = GTK_TREE_MODEL (store); iters = contact_list_store_find_contact (store, contact); if (!iters) { in_list = FALSE; } else { in_list = TRUE; } /* Get online state now. */ now_online = empathy_contact_is_online (contact); if (priv->show_offline || now_online) { should_be_in_list = TRUE; } else { should_be_in_list = FALSE; } if (!in_list && !should_be_in_list) { /* Nothing to do. */ DEBUG ("Contact:'%s' in list:NO, should be:NO", empathy_contact_get_name (contact)); g_list_foreach (iters, (GFunc) gtk_tree_iter_free, NULL); g_list_free (iters); return; } else if (in_list && !should_be_in_list) { DEBUG ("Contact:'%s' in list:YES, should be:NO", empathy_contact_get_name (contact)); if (priv->show_active) { do_remove = TRUE; do_set_active = TRUE; do_set_refresh = TRUE; set_model = TRUE; DEBUG ("Remove item (after timeout)"); } else { DEBUG ("Remove item (now)!"); contact_list_store_remove_contact (store, contact); } } else if (!in_list && should_be_in_list) { DEBUG ("Contact:'%s' in list:NO, should be:YES", empathy_contact_get_name (contact)); contact_list_store_add_contact (store, contact); if (priv->show_active) { do_set_active = TRUE; DEBUG ("Set active (contact added)"); } } else { DEBUG ("Contact:'%s' in list:YES, should be:YES", empathy_contact_get_name (contact)); /* Get online state before. */ if (iters && g_list_length (iters) > 0) { gtk_tree_model_get (model, iters->data, EMPATHY_CONTACT_LIST_STORE_COL_IS_ONLINE, &was_online, -1); } /* Is this really an update or an online/offline. */ if (priv->show_active) { if (was_online != now_online) { do_set_active = TRUE; do_set_refresh = TRUE; DEBUG ("Set active (contact updated %s)", was_online ? "online -> offline" : "offline -> online"); } else { /* Was TRUE for presence updates. */ /* do_set_active = FALSE; */ do_set_refresh = TRUE; DEBUG ("Set active (contact updated)"); } } set_model = TRUE; } if (priv->show_avatars && !priv->is_compact) { show_avatar = TRUE; } pixbuf_avatar = empathy_pixbuf_avatar_from_contact_scaled (contact, 32, 32); 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_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), EMPATHY_CONTACT_LIST_STORE_COL_STATUS, empathy_contact_get_status (contact), EMPATHY_CONTACT_LIST_STORE_COL_STATUS_VISIBLE, !priv->is_compact, EMPATHY_CONTACT_LIST_STORE_COL_IS_GROUP, FALSE, EMPATHY_CONTACT_LIST_STORE_COL_IS_ONLINE, now_online, EMPATHY_CONTACT_LIST_STORE_COL_IS_SEPARATOR, FALSE, EMPATHY_CONTACT_LIST_STORE_COL_CAN_AUDIO_CALL, empathy_contact_get_capabilities (contact) & EMPATHY_CAPABILITIES_AUDIO, EMPATHY_CONTACT_LIST_STORE_COL_CAN_VIDEO_CALL, empathy_contact_get_capabilities (contact) & EMPATHY_CAPABILITIES_VIDEO, -1); } if (pixbuf_avatar) { g_object_unref (pixbuf_avatar); } if (priv->show_active && do_set_active) { contact_list_store_contact_set_active (store, contact, do_set_active, do_set_refresh); if (do_set_active) { data = contact_list_store_contact_active_new (store, contact, do_remove); g_timeout_add_seconds (ACTIVE_USER_SHOW_TIME, (GSourceFunc) contact_list_store_contact_active_cb, data); } } /* FIXME: when someone goes online then offline quickly, the * first timeout sets the user to be inactive and the second * timeout removes the user from the contact list, really we * should remove the first timeout. */ g_list_foreach (iters, (GFunc) gtk_tree_iter_free, NULL); g_list_free (iters); }