From add05052afddb11b158dd08075ffbe2c0404692a Mon Sep 17 00:00:00 2001 From: Jonny Lamb Date: Mon, 16 May 2011 10:35:56 +0100 Subject: chat: add {get,set}_text methods Signed-off-by: Jonny Lamb --- libempathy-gtk/empathy-chat.c | 23 +++++++++++++++++++++++ libempathy-gtk/empathy-chat.h | 4 ++++ 2 files changed, 27 insertions(+) diff --git a/libempathy-gtk/empathy-chat.c b/libempathy-gtk/empathy-chat.c index 183b49bf9..59f2b3c09 100644 --- a/libempathy-gtk/empathy-chat.c +++ b/libempathy-gtk/empathy-chat.c @@ -3921,3 +3921,26 @@ empathy_chat_get_n_messages_sending (EmpathyChat *self) return n_messages; } } + +gchar * +empathy_chat_get_text (EmpathyChat *self) +{ + GtkTextBuffer *buffer; + GtkTextIter start, end; + + buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (self->input_text_view)); + + gtk_text_buffer_get_bounds (buffer, &start, &end); + return gtk_text_buffer_get_text (buffer, &start, &end, FALSE); +} + +void +empathy_chat_set_text (EmpathyChat *self, + const gchar *text) +{ + GtkTextBuffer *buffer; + + buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (self->input_text_view)); + + gtk_text_buffer_set_text (buffer, text, -1); +} diff --git a/libempathy-gtk/empathy-chat.h b/libempathy-gtk/empathy-chat.h index 47892d6c9..0543f3661 100644 --- a/libempathy-gtk/empathy-chat.h +++ b/libempathy-gtk/empathy-chat.h @@ -97,6 +97,10 @@ gboolean empathy_chat_is_composing (EmpathyChat *chat); gboolean empathy_chat_is_sms_channel (EmpathyChat *self); guint empathy_chat_get_n_messages_sending (EmpathyChat *self); +gchar * empathy_chat_get_text (EmpathyChat *self); +void empathy_chat_set_text (EmpathyChat *self, + const gchar *text); + G_END_DECLS #endif /* __EMPATHY_CHAT_H__ */ -- cgit v1.2.3 From 809e62df3bc50be5ee22a7bf5c4e14db94cc12eb Mon Sep 17 00:00:00 2001 From: Jonny Lamb Date: Mon, 16 May 2011 10:36:48 +0100 Subject: chat-manager: keep a hash table with messages left when the chat closed Signed-off-by: Jonny Lamb --- src/empathy-chat-manager.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/src/empathy-chat-manager.c b/src/empathy-chat-manager.c index a90c2d08c..3ffd87ba7 100644 --- a/src/empathy-chat-manager.c +++ b/src/empathy-chat-manager.c @@ -51,6 +51,9 @@ struct _EmpathyChatManagerPriv guint num_displayed_chat; + /* account path -> GHashTable non-NULL message> */ + GHashTable *messages; + TpBaseClient *handler; }; @@ -138,6 +141,8 @@ process_tp_chat (EmpathyChatManager *self, } else { + GHashTable *chats = NULL; + chat = empathy_chat_new (tp_chat); /* empathy_chat_new returns a floating reference as EmpathyChat is * a GtkWidget. This reference will be taken by a container @@ -151,6 +156,18 @@ process_tp_chat (EmpathyChatManager *self, g_signal_emit (self, signals[DISPLAYED_CHATS_CHANGED], 0, priv->num_displayed_chat); + /* Set the saved message in the channel if we have one. */ + chats = g_hash_table_lookup (priv->messages, + tp_proxy_get_object_path (account)); + + if (chats != NULL) + { + const gchar *msg = g_hash_table_lookup (chats, id); + + if (msg != NULL) + empathy_chat_set_text (chat, msg); + } + g_object_weak_ref ((GObject *) chat, chat_destroyed_cb, self); } empathy_chat_window_present_chat (chat, user_action_time); @@ -275,6 +292,8 @@ empathy_chat_manager_init (EmpathyChatManager *self) GError *error = NULL; priv->closed_queue = g_queue_new (); + priv->messages = g_hash_table_new_full (g_str_hash, g_str_equal, + g_free, (GDestroyNotify) g_hash_table_unref); dbus = tp_dbus_daemon_dup (&error); if (dbus == NULL) @@ -333,6 +352,8 @@ empathy_chat_manager_finalize (GObject *object) priv->closed_queue = NULL; } + tp_clear_pointer (&priv->messages, g_hash_table_unref); + tp_clear_object (&priv->handler); tp_clear_object (&priv->chatroom_mgr); @@ -407,6 +428,8 @@ empathy_chat_manager_closed_chat (EmpathyChatManager *self, { EmpathyChatManagerPriv *priv = GET_PRIV (self); ChatData *data; + GHashTable *chats; + gchar *message; data = chat_data_new (chat); @@ -417,6 +440,42 @@ empathy_chat_manager_closed_chat (EmpathyChatManager *self, g_signal_emit (self, signals[CLOSED_CHATS_CHANGED], 0, g_queue_get_length (priv->closed_queue)); + + /* If there was a message saved from last time it was closed + * (perhaps by accident?) save it to our hash table so it can be + * used again when the same chat pops up. Hot. */ + message = empathy_chat_get_text (chat); + + chats = g_hash_table_lookup (priv->messages, + tp_proxy_get_object_path (data->account)); + + /* Don't create a new hash table if we don't already have one and we + * don't actually have a message to save. */ + if (chats == NULL && tp_str_empty (message)) + { + return; + } + else if (chats == null && !tp_str_empty (message)) + { + chats = g_hash_table_new_full (g_str_hash, g_str_equal, + g_free, g_free); + + g_hash_table_insert (priv->messages, + g_strdup (tp_proxy_get_object_path (data->account)), + chats); + } + + if (tp_str_empty (message)) + { + g_hash_table_remove (chats, data->id); + /* might be '\0' */ + g_free (message); + } + else + { + /* takes ownership of message */ + g_hash_table_insert (chats, g_strdup (data->id), message); + } } void -- cgit v1.2.3 From f5d7d6d3a1d7a09e9e3c0cbf013a8456d33537dd Mon Sep 17 00:00:00 2001 From: Jonny Lamb Date: Wed, 18 May 2011 14:14:05 +0100 Subject: chat: rename get to dup Signed-off-by: Jonny Lamb --- libempathy-gtk/empathy-chat.c | 2 +- libempathy-gtk/empathy-chat.h | 2 +- src/empathy-chat-manager.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/libempathy-gtk/empathy-chat.c b/libempathy-gtk/empathy-chat.c index 59f2b3c09..25203b46e 100644 --- a/libempathy-gtk/empathy-chat.c +++ b/libempathy-gtk/empathy-chat.c @@ -3923,7 +3923,7 @@ empathy_chat_get_n_messages_sending (EmpathyChat *self) } gchar * -empathy_chat_get_text (EmpathyChat *self) +empathy_chat_dup_text (EmpathyChat *self) { GtkTextBuffer *buffer; GtkTextIter start, end; diff --git a/libempathy-gtk/empathy-chat.h b/libempathy-gtk/empathy-chat.h index 0543f3661..4b0540b20 100644 --- a/libempathy-gtk/empathy-chat.h +++ b/libempathy-gtk/empathy-chat.h @@ -97,7 +97,7 @@ gboolean empathy_chat_is_composing (EmpathyChat *chat); gboolean empathy_chat_is_sms_channel (EmpathyChat *self); guint empathy_chat_get_n_messages_sending (EmpathyChat *self); -gchar * empathy_chat_get_text (EmpathyChat *self); +gchar * empathy_chat_dup_text (EmpathyChat *self); void empathy_chat_set_text (EmpathyChat *self, const gchar *text); diff --git a/src/empathy-chat-manager.c b/src/empathy-chat-manager.c index 3ffd87ba7..705d70d68 100644 --- a/src/empathy-chat-manager.c +++ b/src/empathy-chat-manager.c @@ -444,7 +444,7 @@ empathy_chat_manager_closed_chat (EmpathyChatManager *self, /* If there was a message saved from last time it was closed * (perhaps by accident?) save it to our hash table so it can be * used again when the same chat pops up. Hot. */ - message = empathy_chat_get_text (chat); + message = empathy_chat_dup_text (chat); chats = g_hash_table_lookup (priv->messages, tp_proxy_get_object_path (data->account)); -- cgit v1.2.3 From 8894350602117306df0038ff7cd622b910f70fa5 Mon Sep 17 00:00:00 2001 From: Jonny Lamb Date: Wed, 18 May 2011 14:15:09 +0100 Subject: chat-manager: add missing free Signed-off-by: Jonny Lamb --- src/empathy-chat-manager.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/empathy-chat-manager.c b/src/empathy-chat-manager.c index 705d70d68..9732e2513 100644 --- a/src/empathy-chat-manager.c +++ b/src/empathy-chat-manager.c @@ -453,6 +453,7 @@ empathy_chat_manager_closed_chat (EmpathyChatManager *self, * don't actually have a message to save. */ if (chats == NULL && tp_str_empty (message)) { + g_free (message); return; } else if (chats == null && !tp_str_empty (message)) -- cgit v1.2.3 From 48eeafcb8aabeca933067ae45a39a7349dce6083 Mon Sep 17 00:00:00 2001 From: Jonny Lamb Date: Wed, 18 May 2011 14:15:58 +0100 Subject: chat-manager: s/null/NULL/ Signed-off-by: Jonny Lamb --- src/empathy-chat-manager.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/empathy-chat-manager.c b/src/empathy-chat-manager.c index 9732e2513..7d984abb5 100644 --- a/src/empathy-chat-manager.c +++ b/src/empathy-chat-manager.c @@ -456,7 +456,7 @@ empathy_chat_manager_closed_chat (EmpathyChatManager *self, g_free (message); return; } - else if (chats == null && !tp_str_empty (message)) + else if (chats == NULL && !tp_str_empty (message)) { chats = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); -- cgit v1.2.3 From cbbf2cd51ed0f7bd51c617fe75596511415b076f Mon Sep 17 00:00:00 2001 From: Jonny Lamb Date: Wed, 18 May 2011 14:16:54 +0100 Subject: chat-manager: clarify ownership of messages hash table Signed-off-by: Jonny Lamb --- src/empathy-chat-manager.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/empathy-chat-manager.c b/src/empathy-chat-manager.c index 7d984abb5..714939f53 100644 --- a/src/empathy-chat-manager.c +++ b/src/empathy-chat-manager.c @@ -51,7 +51,9 @@ struct _EmpathyChatManagerPriv guint num_displayed_chat; - /* account path -> GHashTable non-NULL message> */ + /* account path -> (GHashTable<(owned gchar *) contact ID + * -> (owned gchar *) non-NULL message>) + */ GHashTable *messages; TpBaseClient *handler; -- cgit v1.2.3