[gnome-chat] embed: Send messages
- From: Debarshi Ray <debarshir src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-chat] embed: Send messages
- Date: Fri, 13 Sep 2013 16:27:46 +0000 (UTC)
commit 202822370acbb73fe93bdbcf4e50ee4720a9a378
Author: Debarshi Ray <debarshir gnome org>
Date: Fri Sep 13 18:22:25 2013 +0200
embed: Send messages
src/chat-embed.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++++----
1 files changed, 61 insertions(+), 5 deletions(-)
---
diff --git a/src/chat-embed.c b/src/chat-embed.c
index f33c8b3..5d10064 100644
--- a/src/chat-embed.c
+++ b/src/chat-embed.c
@@ -46,6 +46,7 @@ struct _ChatEmbedPrivate
GtkWidget *current_view;
GtkWidget *conversations_stack;
GtkWidget *main_input_area;
+ GtkWidget *message_entry;
GtkWidget *sidebar_frame;
GtkWidget *status_area;
GtkWidget *status_area_grid0;
@@ -54,6 +55,7 @@ struct _ChatEmbedPrivate
GtkWidget *status_area_presence_icon;
GtkWidget *status_area_presence_message;
GtkWidget *toolbar;
+ TpContact *current_contact;
TplLogManager *lm;
};
@@ -67,6 +69,35 @@ G_DEFINE_TYPE_WITH_CODE (ChatEmbed, chat_embed, GTK_TYPE_BOX,
static void
+chat_embed_ensure_and_handle_channel (GObject *source_object, GAsyncResult *res, gpointer user_data)
+{
+ ChatEmbed *self = CHAT_EMBED (user_data);
+ ChatEmbedPrivate *priv = self->priv;
+ TpAccountChannelRequest *request = TP_ACCOUNT_CHANNEL_REQUEST (source_object);
+ GError *error;
+ TpChannel *channel;
+ TpMessage *message;
+ const gchar *text;
+
+ gtk_widget_set_sensitive (priv->conversations_list, TRUE);
+ gtk_widget_set_sensitive (priv->message_entry, TRUE);
+
+ error = NULL;
+ channel = tp_account_channel_request_ensure_and_handle_channel_finish (request, res, NULL, &error);
+ if (error != NULL)
+ {
+ g_warning ("Unable to EnsureChannel: %s", error->message);
+ g_error_free (error);
+ return;
+ }
+
+ text = gtk_entry_get_text (GTK_ENTRY (priv->message_entry));
+ message = tp_client_message_new_text (TP_CHANNEL_TEXT_MESSAGE_TYPE_NORMAL, text);
+ tp_text_channel_send_message_async (TP_TEXT_CHANNEL (channel), message, 0, NULL, NULL);
+}
+
+
+static void
chat_embed_ensure_new_line (ChatEmbed *self)
{
GtkTextBuffer *buffer;
@@ -121,13 +152,32 @@ chat_embed_get_filtered_events (GObject *source_object, GAsyncResult *res, gpoin
static void
+chat_embed_message_entry_activate (ChatEmbed *self)
+{
+ ChatEmbedPrivate *priv = self->priv;
+ TpAccount *account;
+ TpAccountChannelRequest *request;
+
+ account = tp_contact_get_account (priv->current_contact);
+ request = tp_account_channel_request_new_text (account, TP_USER_ACTION_TIME_CURRENT_TIME);
+ tp_account_channel_request_set_target_contact (request, priv->current_contact);
+
+ tp_account_channel_request_ensure_and_handle_channel_async (request,
+ NULL,
+ chat_embed_ensure_and_handle_channel,
+ g_object_ref (self));
+ gtk_widget_set_sensitive (priv->conversations_list, FALSE);
+ gtk_widget_set_sensitive (priv->message_entry, FALSE);
+}
+
+
+static void
chat_embed_row_activated (ChatEmbed *self, GtkListBoxRow *row)
{
ChatEmbedPrivate *priv = self->priv;
GtkWidget *sw;
TpAccount *account;
TpConnectionPresenceType presence;
- TpContact *contact;
TplEntity *entity;
const gchar *icon_name;
const gchar *identifier;
@@ -135,8 +185,10 @@ chat_embed_row_activated (ChatEmbed *self, GtkListBoxRow *row)
gchar *markup = NULL;
gchar *status_message = NULL;
- contact = g_object_get_data (G_OBJECT (row), "chat-conversations-list-contact");
- account = tp_contact_get_account (contact);
+ g_clear_object (&priv->current_contact);
+ priv->current_contact = g_object_ref (g_object_get_data (G_OBJECT (row),
"chat-conversations-list-contact"));
+
+ account = tp_contact_get_account (priv->current_contact);
if (priv->avatar_chooser != NULL)
gtk_widget_destroy (priv->avatar_chooser);
@@ -161,7 +213,7 @@ chat_embed_row_activated (ChatEmbed *self, GtkListBoxRow *row)
gtk_image_set_from_icon_name (GTK_IMAGE (priv->status_area_presence_icon), icon_name, GTK_ICON_SIZE_MENU);
gtk_label_set_label (GTK_LABEL (priv->status_area_presence_message), status_message);
- identifier = tp_contact_get_identifier (contact);
+ identifier = tp_contact_get_identifier (priv->current_contact);
priv->current_view = g_hash_table_lookup (priv->conversations, identifier);
if (priv->current_view != NULL)
goto out;
@@ -177,7 +229,7 @@ chat_embed_row_activated (ChatEmbed *self, GtkListBoxRow *row)
gtk_container_add (GTK_CONTAINER (sw), priv->current_view);
g_hash_table_insert (priv->conversations, g_strdup (identifier), g_object_ref (priv->current_view));
- entity = tpl_entity_new_from_tp_contact (contact, TPL_ENTITY_CONTACT);
+ entity = tpl_entity_new_from_tp_contact (priv->current_contact, TPL_ENTITY_CONTACT);
if (tpl_log_manager_exists (priv->lm, account, entity, TPL_EVENT_MASK_TEXT))
{
tpl_log_manager_get_filtered_events_async (priv->lm,
@@ -250,6 +302,7 @@ chat_embed_dispose (GObject *object)
g_clear_object (&priv->size_group_bottom);
g_clear_object (&priv->size_group_left);
+ g_clear_object (&priv->current_contact);
g_clear_object (&priv->lm);
G_OBJECT_CLASS (chat_embed_parent_class)->dispose (object);
@@ -289,6 +342,8 @@ chat_embed_init (ChatEmbed *self)
g_signal_connect_swapped (priv->conversations_list, "add", G_CALLBACK (chat_embed_conversation_add), self);
g_signal_connect_swapped (priv->conversations_list, "row-activated", G_CALLBACK
(chat_embed_row_activated), self);
+
+ g_signal_connect_swapped (priv->message_entry, "activate", G_CALLBACK (chat_embed_message_entry_activate),
self);
}
@@ -306,6 +361,7 @@ chat_embed_class_init (ChatEmbedClass *class)
gtk_widget_class_bind_template_child_private (widget_class, ChatEmbed, conversations_list);
gtk_widget_class_bind_template_child_private (widget_class, ChatEmbed, conversations_stack);
gtk_widget_class_bind_template_child_private (widget_class, ChatEmbed, main_input_area);
+ gtk_widget_class_bind_template_child_private (widget_class, ChatEmbed, message_entry);
gtk_widget_class_bind_template_child_private (widget_class, ChatEmbed, sidebar_frame);
gtk_widget_class_bind_template_child_private (widget_class, ChatEmbed, status_area);
gtk_widget_class_bind_template_child_private (widget_class, ChatEmbed, status_area_grid0);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]