diff options
Diffstat (limited to 'libempathy-gtk/empathy-chat.c')
-rw-r--r-- | libempathy-gtk/empathy-chat.c | 164 |
1 files changed, 109 insertions, 55 deletions
diff --git a/libempathy-gtk/empathy-chat.c b/libempathy-gtk/empathy-chat.c index fd5adcdf7..d2f59a6cc 100644 --- a/libempathy-gtk/empathy-chat.c +++ b/libempathy-gtk/empathy-chat.c @@ -63,6 +63,7 @@ struct _EmpathyChatPriv { McAccount *account; gchar *name; gchar *subject; + gchar *tooltip; EmpathyContact *selected_contact; gchar *id; @@ -111,6 +112,7 @@ enum { PROP_ACCOUNT, PROP_NAME, PROP_SUBJECT, + PROP_TOOLTIP, PROP_SELECTED_CONTACT, PROP_ID }; @@ -140,6 +142,9 @@ chat_get_property (GObject *object, case PROP_SUBJECT: g_value_set_string (value, priv->subject); break; + case PROP_TOOLTIP: + g_value_set_string (value, priv->tooltip); + break; case PROP_SELECTED_CONTACT: g_value_set_object (value, priv->selected_contact); break; @@ -260,58 +265,6 @@ chat_composing_stop (EmpathyChat *chat) } static void -chat_finalize (GObject *object) -{ - EmpathyChat *chat; - EmpathyChatPriv *priv; - - chat = EMPATHY_CHAT (object); - priv = GET_PRIV (chat); - - empathy_debug (DEBUG_DOMAIN, "Finalized: %p", object); - - g_slist_foreach (priv->sent_messages, (GFunc) g_free, NULL); - g_slist_free (priv->sent_messages); - - g_list_foreach (priv->compositors, (GFunc) g_object_unref, NULL); - g_list_free (priv->compositors); - - g_list_foreach (priv->backlog_messages, (GFunc) g_object_unref, NULL); - g_list_free (priv->backlog_messages); - - chat_composing_remove_timeout (chat); - - dbus_g_proxy_disconnect_signal (DBUS_G_PROXY (priv->mc), "AccountStatusChanged", - G_CALLBACK (chat_status_changed_cb), - chat); - g_object_unref (priv->mc); - g_object_unref (priv->log_manager); - - - if (priv->tp_chat) { - g_object_unref (priv->tp_chat); - } - - if (priv->account) { - g_object_unref (priv->account); - } - - if (priv->selected_contact) { - g_object_unref (priv->selected_contact); - } - - if (priv->block_events_timeout_id) { - g_source_remove (priv->block_events_timeout_id); - } - - g_free (priv->id); - g_free (priv->name); - g_free (priv->subject); - - G_OBJECT_CLASS (empathy_chat_parent_class)->finalize (object); -} - -static void chat_destroy_cb (EmpathyTpChat *tp_chat, EmpathyChat *chat) { @@ -643,7 +596,31 @@ chat_property_changed_cb (EmpathyTpChat *tp_chat, g_free (priv->name); priv->name = g_value_dup_string (value); g_object_notify (G_OBJECT (chat), "name"); + } else { + return; } + + g_free (priv->tooltip); + priv->tooltip = g_strconcat (priv->name, "\n", + _("Topic: "), priv->subject, NULL); + g_object_notify (G_OBJECT (chat), "tooltip"); +} + +static void +chat_selected_contact_notify_cb (EmpathyChat *chat) +{ + EmpathyChatPriv *priv = GET_PRIV (chat); + + g_free (priv->name); + priv->name = g_strdup (empathy_contact_get_name (priv->selected_contact)); + g_object_notify (G_OBJECT (chat), "name"); + + g_free (priv->tooltip); + priv->tooltip = g_strconcat (empathy_contact_get_id (priv->selected_contact), + "\n", + empathy_contact_get_status (priv->selected_contact), + NULL); + g_object_notify (G_OBJECT (chat), "tooltip"); } static void @@ -658,15 +635,19 @@ chat_remote_contact_notify_cb (EmpathyChat *chat) } if (priv->selected_contact) { + g_signal_handlers_disconnect_by_func (contact, + chat_selected_contact_notify_cb, + chat); g_object_unref (priv->selected_contact); priv->selected_contact = NULL; } if (contact) { - g_free (priv->name); priv->selected_contact = g_object_ref (contact); - priv->name = g_strdup (empathy_contact_get_name (contact)); - g_object_notify (G_OBJECT (chat), "name"); + g_signal_connect_swapped (contact, "notify", + G_CALLBACK (chat_selected_contact_notify_cb), + chat); + chat_selected_contact_notify_cb (chat); } g_object_notify (G_OBJECT (chat), "selected-contact"); @@ -1350,6 +1331,62 @@ chat_create_ui (EmpathyChat *chat) } static void +chat_finalize (GObject *object) +{ + EmpathyChat *chat; + EmpathyChatPriv *priv; + + chat = EMPATHY_CHAT (object); + priv = GET_PRIV (chat); + + empathy_debug (DEBUG_DOMAIN, "Finalized: %p", object); + + g_slist_foreach (priv->sent_messages, (GFunc) g_free, NULL); + g_slist_free (priv->sent_messages); + + g_list_foreach (priv->compositors, (GFunc) g_object_unref, NULL); + g_list_free (priv->compositors); + + g_list_foreach (priv->backlog_messages, (GFunc) g_object_unref, NULL); + g_list_free (priv->backlog_messages); + + chat_composing_remove_timeout (chat); + + dbus_g_proxy_disconnect_signal (DBUS_G_PROXY (priv->mc), "AccountStatusChanged", + G_CALLBACK (chat_status_changed_cb), + chat); + g_object_unref (priv->mc); + g_object_unref (priv->log_manager); + + + if (priv->tp_chat) { + g_object_unref (priv->tp_chat); + } + + if (priv->account) { + g_object_unref (priv->account); + } + + if (priv->selected_contact) { + g_signal_handlers_disconnect_by_func (priv->selected_contact, + chat_selected_contact_notify_cb, + chat); + g_object_unref (priv->selected_contact); + } + + if (priv->block_events_timeout_id) { + g_source_remove (priv->block_events_timeout_id); + } + + g_free (priv->id); + g_free (priv->name); + g_free (priv->subject); + g_free (priv->tooltip); + + G_OBJECT_CLASS (empathy_chat_parent_class)->finalize (object); +} + +static void chat_constructed (GObject *object) { chat_add_logs (EMPATHY_CHAT (object)); @@ -1397,6 +1434,13 @@ empathy_chat_class_init (EmpathyChatClass *klass) NULL, G_PARAM_READABLE)); g_object_class_install_property (object_class, + PROP_TOOLTIP, + g_param_spec_string ("tooltip", + "Chat's tooltip", + "The tooltip of the chat", + NULL, + G_PARAM_READABLE)); + g_object_class_install_property (object_class, PROP_SELECTED_CONTACT, g_param_spec_object ("selected-contact", "The selected contact", @@ -1614,6 +1658,16 @@ empathy_chat_get_subject (EmpathyChat *chat) return priv->subject; } +const gchar * +empathy_chat_get_tooltip (EmpathyChat *chat) +{ + EmpathyChatPriv *priv = GET_PRIV (chat); + + g_return_val_if_fail (EMPATHY_IS_CHAT (chat), NULL); + + return priv->tooltip; +} + EmpathyContact * empathy_chat_get_selected_contact (EmpathyChat *chat) { |